diff options
author | Junio C Hamano <junkio@cox.net> | 2005-04-16 21:29:45 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 21:29:45 -0700 |
commit | b8f80925e3cdf229f03245f2ebb02323ddd98118 (patch) | |
tree | 0e70cb482c7d76069b93da00d3fac97526b9aeee /show-diff.c | |
parent | 0f2303f71957ec68c92487f185435fbec6bd1c79 (diff) | |
download | git-b8f80925e3cdf229f03245f2ebb02323ddd98118.tar.gz |
[PATCH] Optionally tell show-diff to show only named files
SCMs have ways to say "I want diff only this particular file",
or "I want diff files under this directory". This patch teaches
show-diff to do something similar. Without command line
arguments, it still examines everything in the dircache as
before.
Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'show-diff.c')
-rw-r--r-- | show-diff.c | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/show-diff.c b/show-diff.c index 6f343c56bd..f9e8c12f90 100644 --- a/show-diff.c +++ b/show-diff.c @@ -55,6 +55,23 @@ static void show_diff_empty(struct cache_entry *ce) } } +static const char *show_diff_usage = "show-diff [-s] [-q] [paths...]"; + +static int matches_pathspec(struct cache_entry *ce, char **spec, int cnt) +{ + int i; + int namelen = ce_namelen(ce); + for (i = 0; i < cnt; i++) { + int speclen = strlen(spec[i]); + if (! strncmp(spec[i], ce->name, speclen) && + speclen <= namelen && + (ce->name[speclen] == 0 || + ce->name[speclen] == '/')) + return 1; + } + return 0; +} + int main(int argc, char **argv) { int silent = 0; @@ -62,18 +79,19 @@ int main(int argc, char **argv) int entries = read_cache(); int i; - for (i = 1; i < argc; i++) { - if (!strcmp(argv[i], "-s")) { + while (1 < argc && argv[1][0] == '-') { + if (!strcmp(argv[1], "-s")) silent_on_nonexisting_files = silent = 1; - continue; - } - if (!strcmp(argv[i], "-q")) { + else if (!strcmp(argv[1], "-q")) silent_on_nonexisting_files = 1; - continue; - } - usage("show-diff [-s] [-q]"); + else + usage(show_diff_usage); + argv++; argc--; } + /* At this point, if argc == 1, then we are doing everything. + * Otherwise argv[1] .. argv[argc-1] have the explicit paths. + */ if (entries < 0) { perror("read_cache"); exit(1); @@ -86,6 +104,10 @@ int main(int argc, char **argv) char type[20]; void *new; + if (1 <argc && + ! matches_pathspec(ce, argv+1, argc-1)) + continue; + if (stat(ce->name, &st) < 0) { if (errno == ENOENT && silent_on_nonexisting_files) continue; |