diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-13 10:06:50 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-13 10:06:50 -0700 |
commit | 178cb243387a24b1dec7613c4c5e97158163ac60 (patch) | |
tree | 4ee26dbeb5e1fc42caddbc977e8f282a3f976639 /rev-parse.c | |
parent | 84fb9a4dca7efe1427c917e2f46a045e48180826 (diff) | |
download | git-178cb243387a24b1dec7613c4c5e97158163ac60.tar.gz git-178cb243387a24b1dec7613c4c5e97158163ac60.tar.xz |
Add 'git-rev-parse' helper script
It's an incredibly cheesy helper that changes human-readable revision
arguments into the git-rev-list argument format.
You can use it to do something like this:
git-rev-list --pretty $(git-rev-parse --default HEAD "$@")
which is what git-log-script will become. Here git-rev-parse will
then allow you to use arguments like "v2.6.12-rc5.." or similar
human-readable ranges.
It's really quite stupid: "a..b" will be converted into "a" and "^b" if
"a" and "b" are valid object pointers. And the "--default" case will be
used if nothing but flags have been seen, so that you can default to a
certain argument if there are no other ranges.
Diffstat (limited to 'rev-parse.c')
-rw-r--r-- | rev-parse.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/rev-parse.c b/rev-parse.c new file mode 100644 index 000000000..69749f5b7 --- /dev/null +++ b/rev-parse.c @@ -0,0 +1,70 @@ +/* + * rev-parse.c + * + * Copyright (C) Linus Torvalds, 2005 + */ +#include "cache.h" + +int main(int argc, char **argv) +{ + int i, as_is = 0; + char *def = NULL; + unsigned char sha1[20]; + + for (i = 1; i < argc; i++) { + char *arg = argv[i]; + char *dotdot; + + if (as_is) { + printf("%s\n", arg); + continue; + } + if (*arg == '-') { + if (!strcmp(arg, "--")) { + if (def) { + printf("%s\n", def); + def = NULL; + } + as_is = 1; + } + if (!strcmp(arg, "--default")) { + if (def) + printf("%s\n", def); + def = argv[i+1]; + i++; + continue; + } + printf("%s\n", arg); + continue; + } + def = NULL; + if (!get_sha1(arg, sha1)) { + printf("%s\n", sha1_to_hex(sha1)); + continue; + } + if (*arg == '^' && !get_sha1(arg+1, sha1)) { + printf("^%s\n", sha1_to_hex(sha1)); + continue; + } + dotdot = strstr(arg, ".."); + if (dotdot) { + unsigned char end[20]; + char *n = dotdot+2; + *dotdot = 0; + if (!get_sha1(arg, sha1)) { + if (!*n) + n = "HEAD"; + if (!get_sha1(n, end)) { + printf("%s\n", sha1_to_hex(end)); + printf("^%s\n", sha1_to_hex(sha1)); + continue; + } + } + *dotdot = '.'; + } + printf("%s\n", arg); + } + if (def) + printf("%s\n", def); + return 0; +} |