[PATCH] Add 'git show-branch'.

The 'git show-branches' command turns out to be reasonably useful,
but painfully slow.  So rewrite it in C, using ideas from merge-base
while enhancing it a bit more.

 - Unlike show-branches, it can take --heads (show me all my
   heads), --tags (show me all my tags), or --all (both).

 - It can take --more=<number> to show beyond the merge-base.

 - It shows the short name for each commit in the extended SHA1
   syntax.

 - It can find merge-base for more than two heads.

Examples:

    $ git show-branch --more=6 HEAD

    is almost the same as "git log --pretty=oneline --max-count=6".

    $ git show-branch --merge-base master mhf misc

    finds the merge base of the three given heads.

    $ git show-branch master mhf misc

    shows logs from the top of these three branch heads, up to their
    common ancestor commit is shown.

    $ git show-branch --all --more=10

    is poor-man's gitk, showing all the tags and heads, and
    going back 10 commits beyond the merge base of those refs.

Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Junio C Hamano
2005-08-21 02:51:10 -07:00
parent 4f7599ac25
commit f76412ed6d
4 changed files with 343 additions and 7 deletions

View File

@ -38,23 +38,32 @@ enum cmit_fmt get_commit_format(const char *arg)
die("invalid --pretty format");
}
static struct commit *check_commit(struct object *obj, const unsigned char *sha1)
static struct commit *check_commit(struct object *obj,
const unsigned char *sha1,
int quiet)
{
if (obj->type != commit_type) {
error("Object %s is a %s, not a commit",
sha1_to_hex(sha1), obj->type);
if (!quiet)
error("Object %s is a %s, not a commit",
sha1_to_hex(sha1), obj->type);
return NULL;
}
return (struct commit *) obj;
}
struct commit *lookup_commit_reference(const unsigned char *sha1)
struct commit *lookup_commit_reference_gently(const unsigned char *sha1,
int quiet)
{
struct object *obj = deref_tag(parse_object(sha1));
if (!obj)
return NULL;
return check_commit(obj, sha1);
return check_commit(obj, sha1, quiet);
}
struct commit *lookup_commit_reference(const unsigned char *sha1)
{
return lookup_commit_reference_gently(sha1, 0);
}
struct commit *lookup_commit(const unsigned char *sha1)
@ -69,7 +78,7 @@ struct commit *lookup_commit(const unsigned char *sha1)
}
if (!obj->type)
obj->type = commit_type;
return check_commit(obj, sha1);
return check_commit(obj, sha1, 0);
}
static unsigned long parse_commit_date(const char *buf)