{"thread":{"id":"6959","subject":"[PATCH 3/8] diff: make more cases implicit --no-index","startedAt":"2007-02-25T22:35:27Z","lastAt":"2007-02-25T22:35:27Z","messageCount":1,"participants":["Johannes Schindelin"],"isPatch":true,"patchVersion":1,"patchTotal":8},"messages":[{"id":"35465","messageId":"Pine.LNX.4.63.0702252335010.22628@wbgn013.biozentrum.uni-wuerzburg.de","threadId":"6959","inReplyTo":null,"subject":"[PATCH 3/8] diff: make more cases implicit --no-index","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2007-02-25T22:35:27Z","receivedAt":"2007-02-25T22:35:27Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"\nWhen specifying an absolute path, or a relative path pointing outside\nthe working tree, do not fail, but roll your own diffopt parsing,\nand execute a --no-index diff.\n\nSigned-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>\n---\n builtin-diff-files.c |    5 +++-\n builtin-diff.c       |    5 +++-\n diff-lib.c           |   54 ++++++++++++++++++++++++++++++++++++++++++++++++++\n diff.h               |    2 +\n 4 files changed, 64 insertions(+), 2 deletions(-)\n\ndiff --git a/builtin-diff-files.c b/builtin-diff-files.c\nindex e1199f8..aec8338 100644\n--- a/builtin-diff-files.c\n+++ b/builtin-diff-files.c\n@@ -23,7 +23,10 @@ int cmd_diff_files(int argc, const char **argv, const char *prefix)\n \tgit_config(git_default_config); /* no \"diff\" UI options */\n \trev.abbrev = 0;\n \n-\targc = setup_revisions(argc, argv, &rev, NULL);\n+\tif (!setup_diff_no_index(&rev, argc, argv, nongit, prefix))\n+\t\targc = 0;\n+\telse\n+\t\targc = setup_revisions(argc, argv, &rev, NULL);\n \tif (!rev.diffopt.output_format)\n \t\trev.diffopt.output_format = DIFF_FORMAT_RAW;\n \treturn run_diff_files_cmd(&rev, argc, argv);\ndiff --git a/builtin-diff.c b/builtin-diff.c\nindex 814d1fc..e7ece0a 100644\n--- a/builtin-diff.c\n+++ b/builtin-diff.c\n@@ -215,7 +215,10 @@ int cmd_diff(int argc, const char **argv, const char *prefix)\n \tgit_config(git_diff_ui_config);\n \tinit_revisions(&rev, prefix);\n \n-\targc = setup_revisions(argc, argv, &rev, NULL);\n+\tif (!setup_diff_no_index(&rev, argc, argv, nongit, prefix))\n+\t\targc = 0;\n+\telse\n+\t\targc = setup_revisions(argc, argv, &rev, NULL);\n \tif (!rev.diffopt.output_format) {\n \t\trev.diffopt.output_format = DIFF_FORMAT_PATCH;\n \t\tif (diff_setup_done(&rev.diffopt) < 0)\ndiff --git a/diff-lib.c b/diff-lib.c\nindex b164222..6678e22 100644\n--- a/diff-lib.c\n+++ b/diff-lib.c\n@@ -200,6 +200,60 @@ static int handle_diff_files_args(struct rev_info *revs,\n \treturn 0;\n }\n \n+static int is_outside_repo(const char *path, int nongit, const char *prefix)\n+{\n+\tint i;\n+\tif (nongit || !strcmp(path, \"-\") || path[0] == '/')\n+\t\treturn 1;\n+\tif (prefixcmp(path, \"../\"))\n+\t\treturn 0;\n+\tif (!prefix)\n+\t\treturn 1;\n+\tfor (i = strlen(prefix); !prefixcmp(path, \"../\"); ) {\n+\t\twhile (i > 0 && prefix[i - 1] != '/')\n+\t\t\ti--;\n+\t\tif (--i < 0)\n+\t\t\treturn 1;\n+\t\tpath += 3;\n+\t}\n+\treturn 0;\n+}\n+\n+int setup_diff_no_index(struct rev_info *revs,\n+\t\tint argc, const char ** argv, int nongit, const char *prefix)\n+{\n+\tint i;\n+\tfor (i = 1; i < argc; i++)\n+\t\tif (argv[i][0] != '-')\n+\t\t\tbreak;\n+\t\telse if (!strcmp(argv[i], \"--\")) {\n+\t\t\ti++;\n+\t\t\tbreak;\n+\t\t} else if (i < argc - 3 && !strcmp(argv[i], \"--no-index\")) {\n+\t\t\ti = argc - 3;\n+\t\t\tbreak;\n+\t\t}\n+\tif (argc != i + 2 || (!is_outside_repo(argv[i + 1], nongit, prefix) &&\n+\t\t\t\t!is_outside_repo(argv[i], nongit, prefix)))\n+\t\treturn -1;\n+\n+\tdiff_setup(&revs->diffopt);\n+\tfor (i = 1; i < argc - 2; )\n+\t\tif (!strcmp(argv[i], \"--no-index\"))\n+\t\t\ti++;\n+\t\telse {\n+\t\t\tint j = diff_opt_parse(&revs->diffopt,\n+\t\t\t\t\targv + i, argc - i);\n+\t\t\tif (!j)\n+\t\t\t\tdie(\"invalid diff option/value: %s\", argv[i]);\n+\t\t\ti += j;\n+\t\t}\n+\trevs->diffopt.paths = argv + argc - 2;\n+\trevs->diffopt.nr_paths = 2;\n+\trevs->max_count = -2;\n+\treturn 0;\n+}\n+\n int run_diff_files_cmd(struct rev_info *revs, int argc, const char **argv)\n {\n \tint silent_on_removed;\ndiff --git a/diff.h b/diff.h\nindex 4043cec..4b435e8 100644\n--- a/diff.h\n+++ b/diff.h\n@@ -222,6 +222,8 @@ extern void diff_flush(struct diff_options*);\n extern const char *diff_unique_abbrev(const unsigned char *, int);\n \n extern int run_diff_files(struct rev_info *revs, int silent_on_removed);\n+extern int setup_diff_no_index(struct rev_info *revs,\n+\t\tint argc, const char ** argv, int nongit, const char *prefix);\n extern int run_diff_files_cmd(struct rev_info *revs, int argc, const char **argv);\n \n extern int run_diff_index(struct rev_info *revs, int cached);\n-- \n1.5.0.1.788.g8ca52\n"}]}