Add a command line option to rev-list so the command 'git rev-list --bouquet' shows all revisions that are ancestors of refs which share history with HEAD. Signed-off-by: Nathan W. Panike <nathan.panike@xxxxxxxxx> --- I have a repository with the following structure: B / A'--A--C \ D E'--E Thus the command 'git merge base E A' returns nothing, as there is no common history. The E history contains stuff that is derived from the other history (A, B, C, or D). Often I find myself doing the following: git checkout C gitk $(include_forks) & <View history, make changes, merges, et cetera> git checkout E <go back to gitk, only see history for B, C, etc> Now the 'include_forks' command is a bash function in my .bashrc: include_forks () { local head="$(git show -s --pretty=format:'%H' HEAD)"; echo "HEAD $(git for-each-ref --format='%(refname)' \ refs/heads refs/remotes | while read ref; do \ if test "$(git merge-base HEAD ${ref}^{commit})" != ""; \ then echo ${ref}; fi; done)" } The shell thus intercepts my command and I must restart gitk to see the history of E. With this patch, I can issue the command 'gitk --bouquet' and when I checkout E, I can 'reload' in gitk and see the history of E automatically. If there is an easier way to do this in git, please let me know. Otherwise, please let me know how to improve this patch. revision.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 files changed, 38 insertions(+), 0 deletions(-) diff --git a/revision.c b/revision.c index a8a3c3a..ba367cc 100644 --- a/revision.c +++ b/revision.c @@ -699,6 +699,31 @@ static int handle_one_ref(const char *path, const unsigned char *sha1, int flag, return 0; } +static int handle_one_connected_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data) +{ + struct all_refs_cb *cb = cb_data; + struct object *object = get_reference(cb->all_revs, path, sha1, + cb->all_flags); + struct commit *r; + static int got_head = 1; + static struct commit *head_commit; + static int head_nr = 0; + if(got_head) { + got_head=head_ref(handle_one_ref,cb); + if(got_head) + return 1; + if(cb && cb->all_revs && cb->all_revs->pending.nr > 0) { + head_nr = cb->all_revs->pending.nr - 1; + head_commit = (struct commit*)&cb->all_revs->pending.objects->item[head_nr]; + } + } + r = lookup_commit_reference_gently(sha1,1); + if(r != NULL && head_commit) + if(get_merge_bases_many(head_commit,1,&r,1)) + add_pending_object(cb->all_revs, object, path); + return 0; +} + static void handle_refs(struct rev_info *revs, unsigned flags, int (*for_each)(each_ref_fn, void *)) { @@ -708,6 +733,15 @@ static void handle_refs(struct rev_info *revs, unsigned flags, for_each(handle_one_ref, &cb); } +static void handle_connected_refs(struct rev_info *revs, unsigned flags, + int (*for_each)(each_ref_fn, void *)) +{ + struct all_refs_cb cb; + cb.all_revs = revs; + cb.all_flags = flags; + for_each(handle_one_connected_ref, &cb); +} + static void handle_one_reflog_commit(unsigned char *sha1, void *cb_data) { struct all_refs_cb *cb = cb_data; @@ -1352,6 +1386,10 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch handle_refs(revs, flags, for_each_remote_ref); continue; } + if (!strcmp(arg, "--bouquet")) { + handle_connected_refs(revs, flags, for_each_ref); + continue; + } if (!strcmp(arg, "--reflog")) { handle_reflog(revs, flags); continue; -- 1.6.5.3 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html