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);
{
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)
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,
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];
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,
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;
}