[PATCH] Install git-verify-tag-script
[git.git] / rev-parse.c
index 95da465..43af88b 100644 (file)
@@ -13,6 +13,8 @@ static int single_rev = 0;
 static int revs_only = 0;
 static int do_rev_argument = 1;
 static int output_revs = 0;
+static int flags_only = 0;
+static int no_flags = 0;
 
 #define NORMAL 0
 #define REVERSED 1
@@ -64,6 +66,8 @@ static void show_rev_arg(char *rev)
 
 static void show_norev(char *norev)
 {
+       if (flags_only)
+               return;
        if (revs_only)
                return;
        puts(norev);
@@ -71,6 +75,8 @@ static void show_norev(char *norev)
 
 static void show_arg(char *arg)
 {
+       if (no_flags)
+               return;
        if (do_rev_argument && is_rev_argument(arg))
                show_rev_arg(arg);
        else
@@ -91,6 +97,10 @@ static int get_parent(char *name, unsigned char *result, int idx)
                return -1;
        if (parse_commit(commit))
                return -1;
+       if (!idx) {
+               memcpy(result, commit->object.sha1, 20);
+               return 0;
+       }
        p = commit->parents;
        while (p) {
                if (!--idx) {
@@ -131,8 +141,57 @@ static int find_short_object_filename(int len, const char *name, unsigned char *
        return 0;
 }
 
+static int match_sha(unsigned len, const unsigned char *a, const unsigned char *b)
+{
+       do {
+               if (*a != *b)
+                       return 0;
+               a++;
+               b++;
+               len -= 2;
+       } while (len > 1);
+       if (len)
+               if ((*a ^ *b) & 0xf0)
+                       return 0;
+       return 1;
+}
+
 static int find_short_packed_object(int len, const unsigned char *match, unsigned char *sha1)
 {
+       struct packed_git *p;
+
+       prepare_packed_git();
+       for (p = packed_git; p; p = p->next) {
+               unsigned num = num_packed_objects(p);
+               unsigned first = 0, last = num;
+               while (first < last) {
+                       unsigned mid = (first + last) / 2;
+                       unsigned char now[20];
+                       int cmp;
+
+                       nth_packed_object_sha1(p, mid, now);
+                       cmp = memcmp(match, now, 20);
+                       if (!cmp) {
+                               first = mid;
+                               break;
+                       }
+                       if (cmp > 0) {
+                               first = mid+1;
+                               continue;
+                       }
+                       last = mid;
+               }
+               if (first < num) {
+                       unsigned char now[20], next[20];
+                       nth_packed_object_sha1(p, first, now);
+                       if (match_sha(len, match, now)) {
+                               if (nth_packed_object_sha1(p, first+1, next) || !match_sha(len, match, next)) {
+                                       memcpy(sha1, now, 20);
+                                       return 1;
+                               }
+                       }
+               }       
+       }
        return 0;
 }
 
@@ -183,7 +242,7 @@ static int get_extended_sha1(char *name, unsigned char *sha1)
        int len = strlen(name);
 
        parent = 1;
-       if (len > 2 && name[len-1] >= '1' && name[len-1] <= '9') {
+       if (len > 2 && name[len-1] >= '0' && name[len-1] <= '9') {
                parent = name[len-1] - '0';
                len--;
        }
@@ -255,6 +314,14 @@ int main(int argc, char **argv)
                                no_revs = 1;
                                continue;
                        }
+                       if (!strcmp(arg, "--flags")) {
+                               flags_only = 1;
+                               continue;
+                       }
+                       if (!strcmp(arg, "--no-flags")) {
+                               no_flags = 1;
+                               continue;
+                       }
                        if (!strcmp(arg, "--verify")) {
                                revs_only = 1;
                                do_rev_argument = 0;