From: Linus Torvalds Date: Mon, 13 Jun 2005 17:06:50 +0000 (-0700) Subject: Add 'git-rev-parse' helper script X-Git-Tag: v0.99~273 X-Git-Url: https://git.octo.it/?a=commitdiff_plain;h=178cb243387a24b1dec7613c4c5e97158163ac60;p=git.git 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. --- diff --git a/Makefile b/Makefile index ec624240..8216c990 100644 --- a/Makefile +++ b/Makefile @@ -33,7 +33,7 @@ PROG= git-update-cache git-diff-files git-init-db git-write-tree \ git-http-pull git-ssh-push git-ssh-pull git-rev-list git-mktag \ git-diff-helper git-tar-tree git-local-pull git-write-blob \ git-get-tar-commit-id git-mkdelta git-apply git-stripspace \ - git-cvs2git git-diff-stages + git-cvs2git git-diff-stages git-rev-parse all: $(PROG) @@ -118,6 +118,7 @@ git-mkdelta: mkdelta.c git-stripspace: stripspace.c git-cvs2git: cvs2git.c git-diff-stages: diff-stages.c +git-rev-parse: rev-parse.c git-http-pull: LIBS += -lcurl git-rev-list: LIBS += -lssl diff --git a/rev-parse.c b/rev-parse.c new file mode 100644 index 00000000..69749f5b --- /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; +}