git-branch: add support for --merged and --no-merged
These options filter the output from git branch to only include branches whose tip is either merged or not merged into HEAD. The use-case for these options is when working with integration of branches from many remotes: `git branch --no-merged -a` will show a nice list of merge candidates while `git branch --merged -a` will show the progress of your integration work. Also, a plain `git branch --merged` is a quick way to find local branches which you might want to delete. Signed-off-by: Lars Hjemli <hjemli@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
5909ca92d8
commit
e8b404c27e
@ -15,7 +15,7 @@
|
||||
#include "branch.h"
|
||||
|
||||
static const char * const builtin_branch_usage[] = {
|
||||
"git-branch [options] [-r | -a]",
|
||||
"git-branch [options] [-r | -a] [--merged | --no-merged]",
|
||||
"git-branch [options] [-l] [-f] <branchname> [<start-point>]",
|
||||
"git-branch [options] [-r] (-d | -D) <branchname>",
|
||||
"git-branch [options] (-m | -M) [<oldbranch>] <newbranch>",
|
||||
@ -46,6 +46,8 @@ enum color_branch {
|
||||
COLOR_BRANCH_CURRENT = 4,
|
||||
};
|
||||
|
||||
static int mergefilter = -1;
|
||||
|
||||
static int parse_branch_color_slot(const char *var, int ofs)
|
||||
{
|
||||
if (!strcasecmp(var+ofs, "plain"))
|
||||
@ -210,6 +212,7 @@ static int append_ref(const char *refname, const unsigned char *sha1, int flags,
|
||||
struct ref_item *newitem;
|
||||
int kind = REF_UNKNOWN_TYPE;
|
||||
int len;
|
||||
static struct commit_list branch;
|
||||
|
||||
/* Detect kind */
|
||||
if (!prefixcmp(refname, "refs/heads/")) {
|
||||
@ -231,6 +234,16 @@ static int append_ref(const char *refname, const unsigned char *sha1, int flags,
|
||||
if ((kind & ref_list->kinds) == 0)
|
||||
return 0;
|
||||
|
||||
if (mergefilter > -1) {
|
||||
branch.item = lookup_commit_reference_gently(sha1, 1);
|
||||
if (!branch.item)
|
||||
die("Unable to lookup tip of branch %s", refname);
|
||||
if (mergefilter == 0 && has_commit(head_sha1, &branch))
|
||||
return 0;
|
||||
if (mergefilter == 1 && !has_commit(head_sha1, &branch))
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Resize buffer */
|
||||
if (ref_list->index >= ref_list->alloc) {
|
||||
ref_list->alloc = alloc_nr(ref_list->alloc);
|
||||
@ -444,6 +457,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
|
||||
OPT_BIT('M', NULL, &rename, "move/rename a branch, even if target exists", 2),
|
||||
OPT_BOOLEAN('l', NULL, &reflog, "create the branch's reflog"),
|
||||
OPT_BOOLEAN('f', NULL, &force_create, "force creation (when already exists)"),
|
||||
OPT_SET_INT(0, "merged", &mergefilter, "list only merged branches", 1),
|
||||
OPT_END(),
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user