Merge branch 'jk/branch-verbose-merged'
The "--verbose" option no longer breaks "git branch --merged $it". * jk/branch-verbose-merged: branch: clean up commit flags after merge-filter walk
This commit is contained in:
commit
5500095ff4
@ -280,6 +280,7 @@ struct ref_item {
|
|||||||
char *dest;
|
char *dest;
|
||||||
unsigned int kind, width;
|
unsigned int kind, width;
|
||||||
struct commit *commit;
|
struct commit *commit;
|
||||||
|
int ignore;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ref_list {
|
struct ref_list {
|
||||||
@ -385,6 +386,7 @@ static int append_ref(const char *refname, const unsigned char *sha1, int flags,
|
|||||||
newitem->commit = commit;
|
newitem->commit = commit;
|
||||||
newitem->width = utf8_strwidth(refname);
|
newitem->width = utf8_strwidth(refname);
|
||||||
newitem->dest = resolve_symref(orig_refname, prefix);
|
newitem->dest = resolve_symref(orig_refname, prefix);
|
||||||
|
newitem->ignore = 0;
|
||||||
/* adjust for "remotes/" */
|
/* adjust for "remotes/" */
|
||||||
if (newitem->kind == REF_REMOTE_BRANCH &&
|
if (newitem->kind == REF_REMOTE_BRANCH &&
|
||||||
ref_list->kinds != REF_REMOTE_BRANCH)
|
ref_list->kinds != REF_REMOTE_BRANCH)
|
||||||
@ -484,17 +486,6 @@ static void fill_tracking_info(struct strbuf *stat, const char *branch_name,
|
|||||||
free(ref);
|
free(ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int matches_merge_filter(struct commit *commit)
|
|
||||||
{
|
|
||||||
int is_merged;
|
|
||||||
|
|
||||||
if (merge_filter == NO_FILTER)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
is_merged = !!(commit->object.flags & UNINTERESTING);
|
|
||||||
return (is_merged == (merge_filter == SHOW_MERGED));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void add_verbose_info(struct strbuf *out, struct ref_item *item,
|
static void add_verbose_info(struct strbuf *out, struct ref_item *item,
|
||||||
int verbose, int abbrev)
|
int verbose, int abbrev)
|
||||||
{
|
{
|
||||||
@ -522,10 +513,9 @@ static void print_ref_item(struct ref_item *item, int maxwidth, int verbose,
|
|||||||
{
|
{
|
||||||
char c;
|
char c;
|
||||||
int color;
|
int color;
|
||||||
struct commit *commit = item->commit;
|
|
||||||
struct strbuf out = STRBUF_INIT, name = STRBUF_INIT;
|
struct strbuf out = STRBUF_INIT, name = STRBUF_INIT;
|
||||||
|
|
||||||
if (!matches_merge_filter(commit))
|
if (item->ignore)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
switch (item->kind) {
|
switch (item->kind) {
|
||||||
@ -575,7 +565,7 @@ static int calc_maxwidth(struct ref_list *refs)
|
|||||||
{
|
{
|
||||||
int i, w = 0;
|
int i, w = 0;
|
||||||
for (i = 0; i < refs->index; i++) {
|
for (i = 0; i < refs->index; i++) {
|
||||||
if (!matches_merge_filter(refs->list[i].commit))
|
if (refs->list[i].ignore)
|
||||||
continue;
|
continue;
|
||||||
if (refs->list[i].width > w)
|
if (refs->list[i].width > w)
|
||||||
w = refs->list[i].width;
|
w = refs->list[i].width;
|
||||||
@ -618,6 +608,7 @@ static void show_detached(struct ref_list *ref_list)
|
|||||||
item.kind = REF_LOCAL_BRANCH;
|
item.kind = REF_LOCAL_BRANCH;
|
||||||
item.dest = NULL;
|
item.dest = NULL;
|
||||||
item.commit = head_commit;
|
item.commit = head_commit;
|
||||||
|
item.ignore = 0;
|
||||||
if (item.width > ref_list->maxwidth)
|
if (item.width > ref_list->maxwidth)
|
||||||
ref_list->maxwidth = item.width;
|
ref_list->maxwidth = item.width;
|
||||||
print_ref_item(&item, ref_list->maxwidth, ref_list->verbose, ref_list->abbrev, 1, "");
|
print_ref_item(&item, ref_list->maxwidth, ref_list->verbose, ref_list->abbrev, 1, "");
|
||||||
@ -656,6 +647,20 @@ static int print_ref_list(int kinds, int detached, int verbose, int abbrev, stru
|
|||||||
|
|
||||||
if (prepare_revision_walk(&ref_list.revs))
|
if (prepare_revision_walk(&ref_list.revs))
|
||||||
die(_("revision walk setup failed"));
|
die(_("revision walk setup failed"));
|
||||||
|
|
||||||
|
for (i = 0; i < ref_list.index; i++) {
|
||||||
|
struct ref_item *item = &ref_list.list[i];
|
||||||
|
struct commit *commit = item->commit;
|
||||||
|
int is_merged = !!(commit->object.flags & UNINTERESTING);
|
||||||
|
item->ignore = is_merged != (merge_filter == SHOW_MERGED);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < ref_list.index; i++) {
|
||||||
|
struct ref_item *item = &ref_list.list[i];
|
||||||
|
clear_commit_marks(item->commit, ALL_REV_FLAGS);
|
||||||
|
}
|
||||||
|
clear_commit_marks(filter, ALL_REV_FLAGS);
|
||||||
|
|
||||||
if (verbose)
|
if (verbose)
|
||||||
ref_list.maxwidth = calc_maxwidth(&ref_list);
|
ref_list.maxwidth = calc_maxwidth(&ref_list);
|
||||||
}
|
}
|
||||||
|
@ -130,4 +130,33 @@ test_expect_success 'implicit --list conflicts with modification options' '
|
|||||||
|
|
||||||
'
|
'
|
||||||
|
|
||||||
|
# We want to set up a case where the walk for the tracking info
|
||||||
|
# of one branch crosses the tip of another branch (and make sure
|
||||||
|
# that the latter walk does not mess up our flag to see if it was
|
||||||
|
# merged).
|
||||||
|
#
|
||||||
|
# Here "topic" tracks "master" with one extra commit, and "zzz" points to the
|
||||||
|
# same tip as master The name "zzz" must come alphabetically after "topic"
|
||||||
|
# as we process them in that order.
|
||||||
|
test_expect_success 'branch --merged with --verbose' '
|
||||||
|
git branch --track topic master &&
|
||||||
|
git branch zzz topic &&
|
||||||
|
git checkout topic &&
|
||||||
|
test_commit foo &&
|
||||||
|
git branch --merged topic >actual &&
|
||||||
|
cat >expect <<-\EOF &&
|
||||||
|
master
|
||||||
|
* topic
|
||||||
|
zzz
|
||||||
|
EOF
|
||||||
|
test_cmp expect actual &&
|
||||||
|
git branch --verbose --merged topic >actual &&
|
||||||
|
cat >expect <<-\EOF &&
|
||||||
|
master c77a0a9 second on master
|
||||||
|
* topic 2c939f4 [ahead 1] foo
|
||||||
|
zzz c77a0a9 second on master
|
||||||
|
EOF
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user