{"thread":{"id":"4066","subject":"[PATCH] fmt-patch: implement -o <dir>","startedAt":"2006-05-05T01:33:32Z","lastAt":"2006-05-05T01:33:32Z","messageCount":1,"participants":["Johannes Schindelin"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"19540","messageId":"Pine.LNX.4.63.0605050333150.25591@wbgn013.biozentrum.uni-wuerzburg.de","threadId":"4066","inReplyTo":null,"subject":"[PATCH] fmt-patch: implement -o <dir>","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2006-05-05T01:33:32Z","receivedAt":"2006-05-05T01:33:32Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"\nI had to move the command line parsing around a little; setup_revisions()\ncould mistaken <dir> for a valid ref.\n\nSigned-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>\n\n---\n\n builtin-log.c |   44 ++++++++++++++++++++++++++++++++++----------\n 1 files changed, 34 insertions(+), 10 deletions(-)\n\ndiff --git a/builtin-log.c b/builtin-log.c\nindex 1649f49..53a47c9 100644\n--- a/builtin-log.c\n+++ b/builtin-log.c\n@@ -76,15 +76,22 @@ static int istitlechar(char c)\n }\n \n static FILE *realstdout = NULL;\n+static char *output_directory = NULL;\n \n static void reopen_stdout(struct commit *commit, int nr)\n {\n \tchar filename[1024];\n \tchar *sol;\n-\tint len;\n+\tint len = 0;\n \n+\tif (output_directory) {\n+\t\tstrncpy(filename, output_directory, 1010);\n+\t\tlen = strlen(filename);\n+\t\tif (filename[len - 1] != '/')\n+\t\t\tfilename[len++] = '/';\n+\t}\n \n-\tsprintf(filename, \"%04d\", nr);\n+\tsprintf(filename + len, \"%04d\", nr);\n \tlen = strlen(filename);\n \n \tsol = strstr(commit->buffer, \"\\n\\n\");\n@@ -128,7 +135,7 @@ int cmd_format_patch(int argc, const cha\n \tstruct commit *commit;\n \tstruct commit **list = NULL;\n \tstruct rev_info rev;\n-\tint nr = 0, total;\n+\tint nr = 0, total, i, j;\n \tint use_stdout = 0;\n \n \tinit_revisions(&rev);\n@@ -140,16 +147,31 @@ int cmd_format_patch(int argc, const cha\n \trev.combine_merges = 0;\n \trev.ignore_merges = 1;\n \trev.diffopt.output_format = DIFF_FORMAT_PATCH;\n-\targc = setup_revisions(argc, argv, &rev, \"HEAD\");\n \n-\twhile (argc > 1) {\n-\t\tif (!strcmp(argv[1], \"--stdout\"))\n+\t/*\n+\t * Parse the arguments before setup_revisions(), or something\n+\t * like \"git fmt-patch -o a123 HEAD^..\" may fail; a123 is\n+\t * possibly a valid SHA1.\n+\t */\n+\tfor (i = 1, j = 1; i < argc; i++) {\n+\t\tif (!strcmp(argv[i], \"--stdout\"))\n \t\t\tuse_stdout = 1;\n-\t\telse\n-\t\t\tdie (\"unrecognized argument: %s\", argv[1]);\n-\t\targc--;\n-\t\targv++;\n+\t\telse if (!strcmp(argv[i], \"-o\")) {\n+\t\t\tif (argc < 3)\n+\t\t\t\tdie (\"Which directory?\");\n+\t\t\tif (mkdir(argv[i + 1], 0777) < 0 && errno != EEXIST)\n+\t\t\t\tdie(\"Could not create directory %s\",\n+\t\t\t\t\t\targv[i + 1]);\n+\t\t\toutput_directory = strdup(argv[i + 1]);\n+\t\t\ti++;\n+\t\t} else\n+\t\t\targv[j++] = argv[i];\n \t}\n+\targc = j;\n+\n+\targc = setup_revisions(argc, argv, &rev, \"HEAD\");\n+\tif (argc > 1)\n+\t\tdie (\"unrecognized argument: %s\", argv[1]);\n \n \tif (!use_stdout)\n \t\trealstdout = fdopen(dup(1), \"w\");\n@@ -177,6 +199,8 @@ int cmd_format_patch(int argc, const cha\n \t\tif (!use_stdout)\n \t\t\tfclose(stdout);\n \t}\n+\tif (output_directory)\n+\t\tfree(output_directory);\n \tfree(list);\n \treturn 0;\n }\n-- \n1.3.1.g6d0e-dirty\n"}]}