summaryrefslogtreecommitdiff
path: root/show-diff.c
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2005-04-16 21:29:45 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-16 21:29:45 -0700
commitb8f80925e3cdf229f03245f2ebb02323ddd98118 (patch)
tree0e70cb482c7d76069b93da00d3fac97526b9aeee /show-diff.c
parent0f2303f71957ec68c92487f185435fbec6bd1c79 (diff)
downloadgit-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.c38
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;