Skip to content

Commit

Permalink
Merge branch 'js/diff-ni' (early part)
Browse files Browse the repository at this point in the history
* 'js/diff-ni' (early part):
  diff: make more cases implicit --no-index
  • Loading branch information
Junio C Hamano committed Mar 4, 2007
2 parents 253e772 + fcfa33e commit e551208
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 2 deletions.
5 changes: 4 additions & 1 deletion builtin-diff-files.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,10 @@ int cmd_diff_files(int argc, const char **argv, const char *prefix)
git_config(git_default_config); /* no "diff" UI options */
rev.abbrev = 0;

argc = setup_revisions(argc, argv, &rev, NULL);
if (!setup_diff_no_index(&rev, argc, argv, nongit, prefix))
argc = 0;
else
argc = setup_revisions(argc, argv, &rev, NULL);
if (!rev.diffopt.output_format)
rev.diffopt.output_format = DIFF_FORMAT_RAW;
return run_diff_files_cmd(&rev, argc, argv);
Expand Down
5 changes: 4 additions & 1 deletion builtin-diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,10 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
git_config(git_diff_ui_config);
init_revisions(&rev, prefix);

argc = setup_revisions(argc, argv, &rev, NULL);
if (!setup_diff_no_index(&rev, argc, argv, nongit, prefix))
argc = 0;
else
argc = setup_revisions(argc, argv, &rev, NULL);
if (!rev.diffopt.output_format) {
rev.diffopt.output_format = DIFF_FORMAT_PATCH;
if (diff_setup_done(&rev.diffopt) < 0)
Expand Down
54 changes: 54 additions & 0 deletions diff-lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,60 @@ static int handle_diff_files_args(struct rev_info *revs,
return 0;
}

static int is_outside_repo(const char *path, int nongit, const char *prefix)
{
int i;
if (nongit || !strcmp(path, "-") || path[0] == '/')
return 1;
if (prefixcmp(path, "../"))
return 0;
if (!prefix)
return 1;
for (i = strlen(prefix); !prefixcmp(path, "../"); ) {
while (i > 0 && prefix[i - 1] != '/')
i--;
if (--i < 0)
return 1;
path += 3;
}
return 0;
}

int setup_diff_no_index(struct rev_info *revs,
int argc, const char ** argv, int nongit, const char *prefix)
{
int i;
for (i = 1; i < argc; i++)
if (argv[i][0] != '-')
break;
else if (!strcmp(argv[i], "--")) {
i++;
break;
} else if (i < argc - 3 && !strcmp(argv[i], "--no-index")) {
i = argc - 3;
break;
}
if (argc != i + 2 || (!is_outside_repo(argv[i + 1], nongit, prefix) &&
!is_outside_repo(argv[i], nongit, prefix)))
return -1;

diff_setup(&revs->diffopt);
for (i = 1; i < argc - 2; )
if (!strcmp(argv[i], "--no-index"))
i++;
else {
int j = diff_opt_parse(&revs->diffopt,
argv + i, argc - i);
if (!j)
die("invalid diff option/value: %s", argv[i]);
i += j;
}
revs->diffopt.paths = argv + argc - 2;
revs->diffopt.nr_paths = 2;
revs->max_count = -2;
return 0;
}

int run_diff_files_cmd(struct rev_info *revs, int argc, const char **argv)
{
int silent_on_removed;
Expand Down
2 changes: 2 additions & 0 deletions diff.h
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,8 @@ extern void diff_flush(struct diff_options*);
extern const char *diff_unique_abbrev(const unsigned char *, int);

extern int run_diff_files(struct rev_info *revs, int silent_on_removed);
extern int setup_diff_no_index(struct rev_info *revs,
int argc, const char ** argv, int nongit, const char *prefix);
extern int run_diff_files_cmd(struct rev_info *revs, int argc, const char **argv);

extern int run_diff_index(struct rev_info *revs, int cached);
Expand Down

0 comments on commit e551208

Please sign in to comment.