#include "builtin.h"
 
 static const char show_branch_usage[] =
-"git-show-branch [--dense] [--current] [--all] [--heads] [--tags] [--topo-order] [--more=count | --list | --independent | --merge-base ] [--topics] [<refs>...]";
+"git-show-branch [--sparse] [--current] [--all] [--heads] [--tags] [--topo-order] [--more=count | --list | --independent | --merge-base ] [--topics] [<refs>...]";
 
 static int default_num = 0;
 static int default_alloc = 0;
 #define UNINTERESTING  01
 
 #define REV_SHIFT       2
-#define MAX_REVS       29 /* should not exceed bits_per_int - REV_SHIFT */
+#define MAX_REVS       (FLAG_BITS - REV_SHIFT) /* should not exceed bits_per_int - REV_SHIFT */
 
 static struct commit *interesting(struct commit_list *list)
 {
 static void name_commit(struct commit *commit, const char *head_name, int nth)
 {
        struct commit_name *name;
-       if (!commit->object.util)
-               commit->object.util = xmalloc(sizeof(struct commit_name));
-       name = commit->object.util;
+       if (!commit->util)
+               commit->util = xmalloc(sizeof(struct commit_name));
+       name = commit->util;
        name->head_name = head_name;
        name->generation = nth;
 }
  */
 static void name_parent(struct commit *commit, struct commit *parent)
 {
-       struct commit_name *commit_name = commit->object.util;
-       struct commit_name *parent_name = parent->object.util;
+       struct commit_name *commit_name = commit->util;
+       struct commit_name *parent_name = parent->util;
        if (!commit_name)
                return;
        if (!parent_name ||
        int i = 0;
        while (c) {
                struct commit *p;
-               if (!c->object.util)
+               if (!c->util)
                        break;
                if (!c->parents)
                        break;
                p = c->parents->item;
-               if (!p->object.util) {
+               if (!p->util) {
                        name_parent(c, p);
                        i++;
                }
+               else
+                       break;
                c = p;
        }
        return i;
        /* First give names to the given heads */
        for (cl = list; cl; cl = cl->next) {
                c = cl->item;
-               if (c->object.util)
+               if (c->util)
                        continue;
                for (i = 0; i < num_rev; i++) {
                        if (rev[i] == c) {
                        struct commit_name *n;
                        int nth;
                        c = cl->item;
-                       if (!c->object.util)
+                       if (!c->util)
                                continue;
-                       n = c->object.util;
+                       n = c->util;
                        parents = c->parents;
                        nth = 0;
                        while (parents) {
                                char newname[1000], *en;
                                parents = parents->next;
                                nth++;
-                               if (p->object.util)
+                               if (p->util)
                                        continue;
                                en = newname;
                                switch (n->generation) {
 static int mark_seen(struct commit *commit, struct commit_list **seen_p)
 {
        if (!commit->object.flags) {
-               insert_by_date(commit, seen_p);
+               commit_list_insert(commit, seen_p);
                return 1;
        }
        return 0;
         * Postprocess to complete well-poisoning.
         *
         * At this point we have all the commits we have seen in
-        * seen_p list (which happens to be sorted chronologically but
-        * it does not really matter).  Mark anything that can be
-        * reached from uninteresting commits not interesting.
+        * seen_p list.  Mark anything that can be reached from
+        * uninteresting commits not interesting.
         */
        for (;;) {
                int changed = 0;
 static void show_one_commit(struct commit *commit, int no_name)
 {
        char pretty[256], *cp;
-       struct commit_name *name = commit->object.util;
+       struct commit_name *name = commit->util;
        if (commit->object.parsed)
                pretty_print_commit(CMIT_FMT_ONELINE, commit, ~0,
                                    pretty, sizeof(pretty), 0, NULL, NULL);
        if (0 <= extra)
                join_revs(&list, &seen, num_rev, extra);
 
+       sort_by_date(&seen);
+
        if (merge_base)
                return show_merge_base(seen, num_rev);