builtin-mv: readability patch

The old version was not liked at all. This is hopefully better. Oh, and it
gets rid of the goto.

Note that it does not change any functionality.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Johannes Schindelin 2006-08-19 16:52:21 +02:00 committed by Junio C Hamano
parent 6e17886d37
commit 60a6bf5f53

View file

@ -129,48 +129,43 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
/* Checking */ /* Checking */
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
int length; const char *src = source[i], *dst = destination[i];
int length, src_is_dir;
const char *bad = NULL; const char *bad = NULL;
if (show_only) if (show_only)
printf("Checking rename of '%s' to '%s'\n", printf("Checking rename of '%s' to '%s'\n", src, dst);
source[i], destination[i]);
if (lstat(source[i], &st) < 0) length = strlen(src);
if (lstat(src, &st) < 0)
bad = "bad source"; bad = "bad source";
else if (!strncmp(src, dst, length) &&
if (!bad && (dst[length] == 0 || dst[length] == '/')) {
(length = strlen(source[i])) >= 0 &&
!strncmp(destination[i], source[i], length) &&
(destination[i][length] == 0 || destination[i][length] == '/'))
bad = "can not move directory into itself"; bad = "can not move directory into itself";
} else if ((src_is_dir = S_ISDIR(st.st_mode))
if (S_ISDIR(st.st_mode)) { && lstat(dst, &st) == 0)
const char *dir = source[i], *dest_dir = destination[i];
int first, last, len = strlen(dir);
if (lstat(dest_dir, &st) == 0) {
bad = "cannot move directory over file"; bad = "cannot move directory over file";
goto next; else if (src_is_dir) {
} int first, last;
modes[i] = WORKING_DIRECTORY; modes[i] = WORKING_DIRECTORY;
first = cache_name_pos(source[i], len); first = cache_name_pos(src, length);
if (first >= 0) if (first >= 0)
die ("Huh? %s/ is in index?", dir); die ("Huh? %s/ is in index?", src);
first = -1 - first; first = -1 - first;
for (last = first; last < active_nr; last++) { for (last = first; last < active_nr; last++) {
const char *path = active_cache[last]->name; const char *path = active_cache[last]->name;
if (strncmp(path, dir, len) || path[len] != '/') if (strncmp(path, src, length)
|| path[length] != '/')
break; break;
} }
if (last - first < 1) if (last - first < 1)
bad = "source directory is empty"; bad = "source directory is empty";
else if (!bad) { else {
int j, dst_len = strlen(dest_dir); int j, dst_len;
if (last - first > 0) { if (last - first > 0) {
source = realloc(source, source = realloc(source,
@ -184,24 +179,21 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
* sizeof(enum update_mode)); * sizeof(enum update_mode));
} }
dest_dir = add_slash(dest_dir); dst = add_slash(dst);
dst_len = strlen(dst) - 1;
for (j = 0; j < last - first; j++) { for (j = 0; j < last - first; j++) {
const char *path = const char *path =
active_cache[first + j]->name; active_cache[first + j]->name;
source[count + j] = path; source[count + j] = path;
destination[count + j] = destination[count + j] =
prefix_path(dest_dir, dst_len, prefix_path(dst, dst_len,
path + len); path + length);
modes[count + j] = INDEX; modes[count + j] = INDEX;
} }
count += last - first; count += last - first;
} }
} else if (lstat(dst, &st) == 0) {
goto next;
}
if (!bad && lstat(destination[i], &st) == 0) {
bad = "destination exists"; bad = "destination exists";
if (force) { if (force) {
/* /*
@ -213,24 +205,17 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
" will overwrite!\n", " will overwrite!\n",
bad); bad);
bad = NULL; bad = NULL;
path_list_insert(destination[i], path_list_insert(dst, &overwritten);
&overwritten);
} else } else
bad = "Cannot overwrite"; bad = "Cannot overwrite";
} }
} } else if (cache_name_pos(src, length) < 0)
if (!bad && cache_name_pos(source[i], strlen(source[i])) < 0)
bad = "not under version control"; bad = "not under version control";
else if (path_list_has_path(&src_for_dst, dst))
if (!bad) {
if (path_list_has_path(&src_for_dst, destination[i]))
bad = "multiple sources for the same target"; bad = "multiple sources for the same target";
else else
path_list_insert(destination[i], &src_for_dst); path_list_insert(dst, &src_for_dst);
}
next:
if (bad) { if (bad) {
if (ignore_errors) { if (ignore_errors) {
if (--count > 0) { if (--count > 0) {
@ -242,33 +227,32 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
} }
} else } else
die ("%s, source=%s, destination=%s", die ("%s, source=%s, destination=%s",
bad, source[i], destination[i]); bad, src, dst);
} }
} }
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
const char *src = source[i], *dst = destination[i];
enum update_mode mode = modes[i];
if (show_only || verbose) if (show_only || verbose)
printf("Renaming %s to %s\n", printf("Renaming %s to %s\n", src, dst);
source[i], destination[i]); if (!show_only && mode != INDEX &&
if (!show_only && modes[i] != INDEX && rename(src, dst) < 0 && !ignore_errors)
rename(source[i], destination[i]) < 0 && die ("renaming %s failed: %s", src, strerror(errno));
!ignore_errors)
die ("renaming %s failed: %s",
source[i], strerror(errno));
if (modes[i] == WORKING_DIRECTORY) if (mode == WORKING_DIRECTORY)
continue; continue;
if (cache_name_pos(source[i], strlen(source[i])) >= 0) { if (cache_name_pos(src, strlen(src)) >= 0) {
path_list_insert(source[i], &deleted); path_list_insert(src, &deleted);
/* destination can be a directory with 1 file inside */ /* destination can be a directory with 1 file inside */
if (path_list_has_path(&overwritten, destination[i])) if (path_list_has_path(&overwritten, dst))
path_list_insert(destination[i], &changed); path_list_insert(dst, &changed);
else else
path_list_insert(destination[i], &added); path_list_insert(dst, &added);
} else } else
path_list_insert(destination[i], &added); path_list_insert(dst, &added);
} }
if (show_only) { if (show_only) {