[PATCH] Add some documentation.
[git.git] / show-branch.c
index c9a6fce..2a4e176 100644 (file)
@@ -141,6 +141,18 @@ static void show_one_commit(struct commit *commit, char **head_name)
 static char *ref_name[MAX_REVS + 1];
 static int ref_name_cnt;
 
+static int compare_ref_name(const void *a_, const void *b_)
+{
+       const char * const*a = a_, * const*b = b_;
+       return strcmp(*a, *b);
+}
+
+static void sort_ref_range(int bottom, int top)
+{
+       qsort(ref_name + bottom, top - bottom, sizeof(ref_name[0]),
+             compare_ref_name);
+}
+
 static int append_ref(const char *refname, const unsigned char *sha1)
 {
        struct commit *commit = lookup_commit_reference_gently(sha1, 1);
@@ -161,7 +173,7 @@ static int append_head_ref(const char *refname, const unsigned char *sha1)
 {
        if (strncmp(refname, "refs/heads/", 11))
                return 0;
-       return append_ref(refname + 5, sha1);
+       return append_ref(refname + 11, sha1);
 }
 
 static int append_tag_ref(const char *refname, const unsigned char *sha1)
@@ -173,10 +185,16 @@ static int append_tag_ref(const char *refname, const unsigned char *sha1)
 
 static void snarf_refs(int head, int tag)
 {
-       if (head)
+       if (head) {
+               int orig_cnt = ref_name_cnt;
                for_each_ref(append_head_ref);
-       if (tag)
+               sort_ref_range(orig_cnt, ref_name_cnt);
+       }
+       if (tag) {
+               int orig_cnt = ref_name_cnt;
                for_each_ref(append_tag_ref);
+               sort_ref_range(orig_cnt, ref_name_cnt);
+       }
 }
 
 static int rev_is_head(char *head_path, int headlen,
@@ -223,6 +241,7 @@ int main(int ac, char **av)
        int head_path_len;
        unsigned char head_sha1[20];
        int merge_base = 0;
+       char **label;
 
        while (1 < ac && av[1][0] == '-') {
                char *arg = av[1];
@@ -297,7 +316,8 @@ int main(int ac, char **av)
        if (merge_base)
                return show_merge_base(seen, num_rev);
 
-       if (1 < num_rev)
+       /* Show list */
+       if (1 < num_rev) {
                for (i = 0; i < num_rev; i++) {
                        int j;
                        int is_head = rev_is_head(head_path,
@@ -310,16 +330,28 @@ int main(int ac, char **av)
                        printf("%c [%s] ", is_head ? '*' : '!', ref_name[i]);
                        show_one_commit(rev[i], NULL);
                }
+               for (i = 0; i < num_rev; i++)
+                       putchar('-');
+               putchar('\n');
+       }
+
+       label = ref_name;
        while (seen) {
                struct commit *commit = pop_one_commit(&seen);
                int this_flag = commit->object.flags;
+               static char *obvious[] = { "" };
+
                if ((this_flag & UNINTERESTING) && (--extra < 0))
                        break;
-               for (i = 0; i < num_rev; i++)
-                       putchar((this_flag & (1u << (i + REV_SHIFT)))
-                               ? '+' : ' ');
-               putchar(' ');
-               show_one_commit(commit, ref_name);
+               if (1 < num_rev) {
+                       for (i = 0; i < num_rev; i++)
+                               putchar((this_flag & (1u << (i + REV_SHIFT)))
+                                       ? '+' : ' ');
+                       putchar(' ');
+               }
+               show_one_commit(commit, label);
+               if (num_rev == 1)
+                       label = obvious;
        }
        return 0;
 }