[PATCH 11/25] Make builtin-mv.c use parse-options

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Signed-off-by: Pierre Habouzit <madcoder@xxxxxxxxxx>
---
 builtin-mv.c |   84 ++++++++++++++++++++++++---------------------------------
 1 files changed, 35 insertions(+), 49 deletions(-)

diff --git a/builtin-mv.c b/builtin-mv.c
index b944651..a3f9ad1 100644
--- a/builtin-mv.c
+++ b/builtin-mv.c
@@ -8,9 +8,12 @@
 #include "dir.h"
 #include "cache-tree.h"
 #include "path-list.h"
+#include "parse-options.h"
 
-static const char builtin_mv_usage[] =
-"git-mv [-n] [-f] (<source> <destination> | [-k] <source>... <destination>)";
+static const char * const builtin_mv_usage[] = {
+	"git-mv [options] <source>... <destination>",
+	NULL
+};
 
 static const char **copy_pathspec(const char *prefix, const char **pathspec,
 				  int count, int base_name)
@@ -61,8 +64,14 @@ static struct lock_file lock_file;
 
 int cmd_mv(int argc, const char **argv, const char *prefix)
 {
-	int i, newfd, count;
+	int i, newfd;
 	int verbose = 0, show_only = 0, force = 0, ignore_errors = 0;
+	struct option builtin_mv_options[] = {
+		OPT__DRY_RUN(&show_only),
+		OPT_BOOLEAN('f', NULL, &force, "force move/rename even if target exists"),
+		OPT_BOOLEAN('k', NULL, &ignore_errors, "skip move/rename errors"),
+		OPT_END(),
+	};
 	const char **source, **destination, **dest_path;
 	enum update_mode { BOTH = 0, WORKING_DIRECTORY, INDEX } *modes;
 	struct stat st;
@@ -78,52 +87,29 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 	if (read_cache() < 0)
 		die("index file corrupt");
 
-	for (i = 1; i < argc; i++) {
-		const char *arg = argv[i];
+	argc = parse_options(argc, argv, builtin_mv_options, builtin_mv_usage, 0);
+	if (--argc < 1)
+		usage_with_options(builtin_mv_usage, builtin_mv_options);
 
-		if (arg[0] != '-')
-			break;
-		if (!strcmp(arg, "--")) {
-			i++;
-			break;
-		}
-		if (!strcmp(arg, "-n")) {
-			show_only = 1;
-			continue;
-		}
-		if (!strcmp(arg, "-f")) {
-			force = 1;
-			continue;
-		}
-		if (!strcmp(arg, "-k")) {
-			ignore_errors = 1;
-			continue;
-		}
-		usage(builtin_mv_usage);
-	}
-	count = argc - i - 1;
-	if (count < 1)
-		usage(builtin_mv_usage);
-
-	source = copy_pathspec(prefix, argv + i, count, 0);
-	modes = xcalloc(count, sizeof(enum update_mode));
-	dest_path = copy_pathspec(prefix, argv + argc - 1, 1, 0);
+	source = copy_pathspec(prefix, argv, argc, 0);
+	modes = xcalloc(argc, sizeof(enum update_mode));
+	dest_path = copy_pathspec(prefix, argv + argc, 1, 0);
 
 	if (dest_path[0][0] == '\0')
 		/* special case: "." was normalized to "" */
-		destination = copy_pathspec(dest_path[0], argv + i, count, 1);
+		destination = copy_pathspec(dest_path[0], argv, argc, 1);
 	else if (!lstat(dest_path[0], &st) &&
 			S_ISDIR(st.st_mode)) {
 		dest_path[0] = add_slash(dest_path[0]);
-		destination = copy_pathspec(dest_path[0], argv + i, count, 1);
+		destination = copy_pathspec(dest_path[0], argv, argc, 1);
 	} else {
-		if (count != 1)
-			usage(builtin_mv_usage);
+		if (argc != 1)
+			usage_with_options(builtin_mv_usage, builtin_mv_options);
 		destination = dest_path;
 	}
 
 	/* Checking */
-	for (i = 0; i < count; i++) {
+	for (i = 0; i < argc; i++) {
 		const char *src = source[i], *dst = destination[i];
 		int length, src_is_dir;
 		const char *bad = NULL;
@@ -167,13 +153,13 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 
 				if (last - first > 0) {
 					source = xrealloc(source,
-							(count + last - first)
+							(argc + last - first)
 							* sizeof(char *));
 					destination = xrealloc(destination,
-							(count + last - first)
+							(argc + last - first)
 							* sizeof(char *));
 					modes = xrealloc(modes,
-							(count + last - first)
+							(argc + last - first)
 							* sizeof(enum update_mode));
 				}
 
@@ -183,13 +169,13 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 				for (j = 0; j < last - first; j++) {
 					const char *path =
 						active_cache[first + j]->name;
-					source[count + j] = path;
-					destination[count + j] =
+					source[argc + j] = path;
+					destination[argc + j] =
 						prefix_path(dst, dst_len,
 							path + length);
-					modes[count + j] = INDEX;
+					modes[argc + j] = INDEX;
 				}
-				count += last - first;
+				argc += last - first;
 			}
 		} else if (lstat(dst, &st) == 0) {
 			bad = "destination exists";
@@ -216,12 +202,12 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 
 		if (bad) {
 			if (ignore_errors) {
-				if (--count > 0) {
+				if (--argc > 0) {
 					memmove(source + i, source + i + 1,
-						(count - i) * sizeof(char *));
+						(argc - i) * sizeof(char *));
 					memmove(destination + i,
 						destination + i + 1,
-						(count - i) * sizeof(char *));
+						(argc - i) * sizeof(char *));
 				}
 			} else
 				die ("%s, source=%s, destination=%s",
@@ -229,7 +215,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 		}
 	}
 
-	for (i = 0; i < count; i++) {
+	for (i = 0; i < argc; i++) {
 		const char *src = source[i], *dst = destination[i];
 		enum update_mode mode = modes[i];
 		if (show_only || verbose)
@@ -253,7 +239,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 			path_list_insert(dst, &added);
 	}
 
-        if (show_only) {
+	if (show_only) {
 		show_list("Changed  : ", &changed);
 		show_list("Adding   : ", &added);
 		show_list("Deleting : ", &deleted);
-- 
1.5.3.4.1231.g62b9a

-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux