[PATCH] git-merge-cache -q doesn't complain about failing merge program
[git.git] / rev-parse.c
index d62efda..4bd58eb 100644 (file)
@@ -13,6 +13,9 @@ 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;
+static int output_sq = 0;
 
 #define NORMAL 0
 #define REVERSED 1
@@ -47,30 +50,57 @@ static int is_rev_argument(const char *arg)
        }
 }
 
+static void show(const char *arg)
+{
+       if (output_sq) {
+               int sq = '\'', ch;
+
+               putchar(sq);
+               while ((ch = *arg++)) {
+                       if (ch == sq)
+                               fputs("'\\'", stdout);
+                       putchar(ch);
+               }
+               putchar(sq);
+               putchar(' ');
+       }
+       else
+               puts(arg);
+}
+
 static void show_rev(int type, const unsigned char *sha1)
 {
        if (no_revs)
                return;
        output_revs++;
-       printf("%s%s\n", type == show_type ? "" : "^", sha1_to_hex(sha1));
+
+       /* Hexadecimal string plus possibly a carret;
+        * this does not have to be quoted even under output_sq.
+        */
+       printf("%s%s%c", type == show_type ? "" : "^", sha1_to_hex(sha1),
+              output_sq ? ' ' : '\n');
 }
 
 static void show_rev_arg(char *rev)
 {
        if (no_revs)
                return;
-       puts(rev);
+       show(rev);
 }
 
 static void show_norev(char *norev)
 {
+       if (flags_only)
+               return;
        if (revs_only)
                return;
-       puts(norev);
+       show(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 +121,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) {
@@ -232,7 +266,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--;
        }
@@ -304,12 +338,24 @@ 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;
                                single_rev = 1;
                                continue;
                        }
+                       if (!strcmp(arg, "--sq")) {
+                               output_sq = 1;
+                               continue;
+                       }
                        if (!strcmp(arg, "--not")) {
                                show_type ^= REVERSED;
                                continue;