Add 'git-rev-parse' helper script
authorLinus Torvalds <torvalds@ppc970.osdl.org>
Mon, 13 Jun 2005 17:06:50 +0000 (10:06 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Mon, 13 Jun 2005 17:06:50 +0000 (10:06 -0700)
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.

Makefile
rev-parse.c [new file with mode: 0644]

index ec62424..8216c99 100644 (file)
--- 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 (file)
index 0000000..69749f5
--- /dev/null
@@ -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;
+}