diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-29 14:09:11 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-29 14:09:11 -0700 |
commit | a3df180138b85a603656582bde6df757095618cf (patch) | |
tree | 5a4d7d606c4ff4ec0d62ce18bce3bc81fe737862 /diff-files.c | |
parent | d840b3b285a0e6d742c687d344ddefd05e02c60a (diff) | |
download | git-a3df180138b85a603656582bde6df757095618cf.tar.gz git-a3df180138b85a603656582bde6df757095618cf.tar.xz |
Rename git core commands to be "git-xxxx" to avoid name clashes.
This also regularizes the make. The source files themselves don't get
the "git-" prefix, because that's just inconvenient. So instead we just
make the rule that "git-xxxx" depends on "xxxx.c", and do that for
all the core programs (ie the old "git-mktag.c" got renamed to just
"mktag.c" to match everything else).
And "show-diff" got renamed to "git-diff-files" while at it, since
that's what it really should be to match the other git-diff-xxx cases.
Diffstat (limited to 'diff-files.c')
-rw-r--r-- | diff-files.c | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/diff-files.c b/diff-files.c new file mode 100644 index 000000000..fdd7dd4b0 --- /dev/null +++ b/diff-files.c @@ -0,0 +1,135 @@ +/* + * GIT - The information manager from hell + * + * Copyright (C) Linus Torvalds, 2005 + */ +#include "cache.h" +#include "diff.h" + +static const char *show_diff_usage = +"show-diff [-p] [-q] [-r] [-z] [paths...]"; + +static int generate_patch = 0; +static int line_termination = '\n'; +static int silent = 0; + +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; +} + +static void show_unmerge(const char *path) +{ + if (generate_patch) + diff_unmerge(path); + else + printf("U %s%c", path, line_termination); +} + +static void show_file(int pfx, struct cache_entry *ce) +{ + if (generate_patch) + diff_addremove(pfx, ntohl(ce->ce_mode), ce->sha1, + ce->name, NULL); + else + printf("%c%06o\t%s\t%s\t%s%c", + pfx, ntohl(ce->ce_mode), "blob", + sha1_to_hex(ce->sha1), ce->name, line_termination); +} + +static void show_modified(int oldmode, int mode, + const char *old_sha1, const char *sha1, + char *path) +{ + char old_sha1_hex[41]; + strcpy(old_sha1_hex, sha1_to_hex(old_sha1)); + + if (generate_patch) + diff_change(oldmode, mode, old_sha1, sha1, path, NULL); + else + printf("*%06o->%06o\tblob\t%s->%s\t%s%c", + oldmode, mode, old_sha1_hex, sha1_to_hex(sha1), path, + line_termination); +} + +int main(int argc, char **argv) +{ + static const char null_sha1[20] = { 0, }; + int entries = read_cache(); + int i; + + while (1 < argc && argv[1][0] == '-') { + if (!strcmp(argv[1], "-p")) + generate_patch = 1; + else if (!strcmp(argv[1], "-q")) + silent = 1; + else if (!strcmp(argv[1], "-r")) + ; /* no-op */ + else if (!strcmp(argv[1], "-s")) + ; /* no-op */ + else if (!strcmp(argv[1], "-z")) + line_termination = 0; + 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); + } + + for (i = 0; i < entries; i++) { + struct stat st; + unsigned int oldmode, mode; + struct cache_entry *ce = active_cache[i]; + int changed; + + if (1 < argc && + ! matches_pathspec(ce, argv+1, argc-1)) + continue; + + if (ce_stage(ce)) { + show_unmerge(ce->name); + while (i < entries && + !strcmp(ce->name, active_cache[i]->name)) + i++; + i--; /* compensate for loop control increments */ + continue; + } + + if (stat(ce->name, &st) < 0) { + if (errno != ENOENT) { + perror(ce->name); + continue; + } + if (silent) + continue; + show_file('-', ce); + continue; + } + changed = cache_match_stat(ce, &st); + if (!changed) + continue; + + oldmode = ntohl(ce->ce_mode); + mode = S_IFREG | ce_permissions(st.st_mode); + + show_modified(oldmode, mode, ce->sha1, null_sha1, + ce->name); + } + return 0; +} |