[PATCH] fmt-patch: implement -o <dir>

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

 



I had to move the command line parsing around a little; setup_revisions()
could mistaken <dir> for a valid ref.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@xxxxxx>

---

 builtin-log.c |   44 ++++++++++++++++++++++++++++++++++----------
 1 files changed, 34 insertions(+), 10 deletions(-)

diff --git a/builtin-log.c b/builtin-log.c
index 1649f49..53a47c9 100644
--- a/builtin-log.c
+++ b/builtin-log.c
@@ -76,15 +76,22 @@ static int istitlechar(char c)
 }
 
 static FILE *realstdout = NULL;
+static char *output_directory = NULL;
 
 static void reopen_stdout(struct commit *commit, int nr)
 {
 	char filename[1024];
 	char *sol;
-	int len;
+	int len = 0;
 
+	if (output_directory) {
+		strncpy(filename, output_directory, 1010);
+		len = strlen(filename);
+		if (filename[len - 1] != '/')
+			filename[len++] = '/';
+	}
 
-	sprintf(filename, "%04d", nr);
+	sprintf(filename + len, "%04d", nr);
 	len = strlen(filename);
 
 	sol = strstr(commit->buffer, "\n\n");
@@ -128,7 +135,7 @@ int cmd_format_patch(int argc, const cha
 	struct commit *commit;
 	struct commit **list = NULL;
 	struct rev_info rev;
-	int nr = 0, total;
+	int nr = 0, total, i, j;
 	int use_stdout = 0;
 
 	init_revisions(&rev);
@@ -140,16 +147,31 @@ int cmd_format_patch(int argc, const cha
 	rev.combine_merges = 0;
 	rev.ignore_merges = 1;
 	rev.diffopt.output_format = DIFF_FORMAT_PATCH;
-	argc = setup_revisions(argc, argv, &rev, "HEAD");
 
-	while (argc > 1) {
-		if (!strcmp(argv[1], "--stdout"))
+	/*
+	 * Parse the arguments before setup_revisions(), or something
+	 * like "git fmt-patch -o a123 HEAD^.." may fail; a123 is
+	 * possibly a valid SHA1.
+	 */
+	for (i = 1, j = 1; i < argc; i++) {
+		if (!strcmp(argv[i], "--stdout"))
 			use_stdout = 1;
-		else
-			die ("unrecognized argument: %s", argv[1]);
-		argc--;
-		argv++;
+		else if (!strcmp(argv[i], "-o")) {
+			if (argc < 3)
+				die ("Which directory?");
+			if (mkdir(argv[i + 1], 0777) < 0 && errno != EEXIST)
+				die("Could not create directory %s",
+						argv[i + 1]);
+			output_directory = strdup(argv[i + 1]);
+			i++;
+		} else
+			argv[j++] = argv[i];
 	}
+	argc = j;
+
+	argc = setup_revisions(argc, argv, &rev, "HEAD");
+	if (argc > 1)
+		die ("unrecognized argument: %s", argv[1]);
 
 	if (!use_stdout)
 		realstdout = fdopen(dup(1), "w");
@@ -177,6 +199,8 @@ int cmd_format_patch(int argc, const cha
 		if (!use_stdout)
 			fclose(stdout);
 	}
+	if (output_directory)
+		free(output_directory);
 	free(list);
 	return 0;
 }
-- 
1.3.1.g6d0e-dirty

-
: 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]