зеркало из https://github.com/microsoft/git.git
Merge branch 'dr/ref-filter-push-track-fix'
%(push:track) token used in the --format option to "git for-each-ref" and friends was not showing the right branch, which has been fixed. * dr/ref-filter-push-track-fix: ref-filter: use correct branch for %(push:track)
This commit is contained in:
Коммит
f560a4d159
|
@ -1392,7 +1392,8 @@ static void fill_remote_ref_details(struct used_atom *atom, const char *refname,
|
||||||
*s = show_ref(&atom->u.remote_ref.refname, refname);
|
*s = show_ref(&atom->u.remote_ref.refname, refname);
|
||||||
else if (atom->u.remote_ref.option == RR_TRACK) {
|
else if (atom->u.remote_ref.option == RR_TRACK) {
|
||||||
if (stat_tracking_info(branch, &num_ours, &num_theirs,
|
if (stat_tracking_info(branch, &num_ours, &num_theirs,
|
||||||
NULL, AHEAD_BEHIND_FULL) < 0) {
|
NULL, atom->u.remote_ref.push,
|
||||||
|
AHEAD_BEHIND_FULL) < 0) {
|
||||||
*s = xstrdup(msgs.gone);
|
*s = xstrdup(msgs.gone);
|
||||||
} else if (!num_ours && !num_theirs)
|
} else if (!num_ours && !num_theirs)
|
||||||
*s = xstrdup("");
|
*s = xstrdup("");
|
||||||
|
@ -1410,7 +1411,8 @@ static void fill_remote_ref_details(struct used_atom *atom, const char *refname,
|
||||||
}
|
}
|
||||||
} else if (atom->u.remote_ref.option == RR_TRACKSHORT) {
|
} else if (atom->u.remote_ref.option == RR_TRACKSHORT) {
|
||||||
if (stat_tracking_info(branch, &num_ours, &num_theirs,
|
if (stat_tracking_info(branch, &num_ours, &num_theirs,
|
||||||
NULL, AHEAD_BEHIND_FULL) < 0) {
|
NULL, atom->u.remote_ref.push,
|
||||||
|
AHEAD_BEHIND_FULL) < 0) {
|
||||||
*s = xstrdup("");
|
*s = xstrdup("");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
68
remote.c
68
remote.c
|
@ -1880,37 +1880,27 @@ int resolve_remote_symref(struct ref *ref, struct ref *list)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Lookup the upstream branch for the given branch and if present, optionally
|
* Compute the commit ahead/behind values for the pair branch_name, base.
|
||||||
* compute the commit ahead/behind values for the pair.
|
|
||||||
*
|
*
|
||||||
* If abf is AHEAD_BEHIND_FULL, compute the full ahead/behind and return the
|
* If abf is AHEAD_BEHIND_FULL, compute the full ahead/behind and return the
|
||||||
* counts in *num_ours and *num_theirs. If abf is AHEAD_BEHIND_QUICK, skip
|
* counts in *num_ours and *num_theirs. If abf is AHEAD_BEHIND_QUICK, skip
|
||||||
* the (potentially expensive) a/b computation (*num_ours and *num_theirs are
|
* the (potentially expensive) a/b computation (*num_ours and *num_theirs are
|
||||||
* set to zero).
|
* set to zero).
|
||||||
*
|
*
|
||||||
* The name of the upstream branch (or NULL if no upstream is defined) is
|
* Returns -1 if num_ours and num_theirs could not be filled in (e.g., ref
|
||||||
* returned via *upstream_name, if it is not itself NULL.
|
* does not exist). Returns 0 if the commits are identical. Returns 1 if
|
||||||
*
|
* commits are different.
|
||||||
* Returns -1 if num_ours and num_theirs could not be filled in (e.g., no
|
|
||||||
* upstream defined, or ref does not exist). Returns 0 if the commits are
|
|
||||||
* identical. Returns 1 if commits are different.
|
|
||||||
*/
|
*/
|
||||||
int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs,
|
|
||||||
const char **upstream_name, enum ahead_behind_flags abf)
|
static int stat_branch_pair(const char *branch_name, const char *base,
|
||||||
|
int *num_ours, int *num_theirs,
|
||||||
|
enum ahead_behind_flags abf)
|
||||||
{
|
{
|
||||||
struct object_id oid;
|
struct object_id oid;
|
||||||
struct commit *ours, *theirs;
|
struct commit *ours, *theirs;
|
||||||
struct rev_info revs;
|
struct rev_info revs;
|
||||||
const char *base;
|
|
||||||
struct argv_array argv = ARGV_ARRAY_INIT;
|
struct argv_array argv = ARGV_ARRAY_INIT;
|
||||||
|
|
||||||
/* Cannot stat unless we are marked to build on top of somebody else. */
|
|
||||||
base = branch_get_upstream(branch, NULL);
|
|
||||||
if (upstream_name)
|
|
||||||
*upstream_name = base;
|
|
||||||
if (!base)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* Cannot stat if what we used to build on no longer exists */
|
/* Cannot stat if what we used to build on no longer exists */
|
||||||
if (read_ref(base, &oid))
|
if (read_ref(base, &oid))
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -1918,7 +1908,7 @@ int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs,
|
||||||
if (!theirs)
|
if (!theirs)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (read_ref(branch->refname, &oid))
|
if (read_ref(branch_name, &oid))
|
||||||
return -1;
|
return -1;
|
||||||
ours = lookup_commit_reference(the_repository, &oid);
|
ours = lookup_commit_reference(the_repository, &oid);
|
||||||
if (!ours)
|
if (!ours)
|
||||||
|
@ -1932,7 +1922,7 @@ int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs,
|
||||||
if (abf == AHEAD_BEHIND_QUICK)
|
if (abf == AHEAD_BEHIND_QUICK)
|
||||||
return 1;
|
return 1;
|
||||||
if (abf != AHEAD_BEHIND_FULL)
|
if (abf != AHEAD_BEHIND_FULL)
|
||||||
BUG("stat_tracking_info: invalid abf '%d'", abf);
|
BUG("stat_branch_pair: invalid abf '%d'", abf);
|
||||||
|
|
||||||
/* Run "rev-list --left-right ours...theirs" internally... */
|
/* Run "rev-list --left-right ours...theirs" internally... */
|
||||||
argv_array_push(&argv, ""); /* ignored */
|
argv_array_push(&argv, ""); /* ignored */
|
||||||
|
@ -1966,6 +1956,42 @@ int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Lookup the tracking branch for the given branch and if present, optionally
|
||||||
|
* compute the commit ahead/behind values for the pair.
|
||||||
|
*
|
||||||
|
* If for_push is true, the tracking branch refers to the push branch,
|
||||||
|
* otherwise it refers to the upstream branch.
|
||||||
|
*
|
||||||
|
* The name of the tracking branch (or NULL if it is not defined) is
|
||||||
|
* returned via *tracking_name, if it is not itself NULL.
|
||||||
|
*
|
||||||
|
* If abf is AHEAD_BEHIND_FULL, compute the full ahead/behind and return the
|
||||||
|
* counts in *num_ours and *num_theirs. If abf is AHEAD_BEHIND_QUICK, skip
|
||||||
|
* the (potentially expensive) a/b computation (*num_ours and *num_theirs are
|
||||||
|
* set to zero).
|
||||||
|
*
|
||||||
|
* Returns -1 if num_ours and num_theirs could not be filled in (e.g., no
|
||||||
|
* upstream defined, or ref does not exist). Returns 0 if the commits are
|
||||||
|
* identical. Returns 1 if commits are different.
|
||||||
|
*/
|
||||||
|
int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs,
|
||||||
|
const char **tracking_name, int for_push,
|
||||||
|
enum ahead_behind_flags abf)
|
||||||
|
{
|
||||||
|
const char *base;
|
||||||
|
|
||||||
|
/* Cannot stat unless we are marked to build on top of somebody else. */
|
||||||
|
base = for_push ? branch_get_push(branch, NULL) :
|
||||||
|
branch_get_upstream(branch, NULL);
|
||||||
|
if (tracking_name)
|
||||||
|
*tracking_name = base;
|
||||||
|
if (!base)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return stat_branch_pair(branch->refname, base, num_ours, num_theirs, abf);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return true when there is anything to report, otherwise false.
|
* Return true when there is anything to report, otherwise false.
|
||||||
*/
|
*/
|
||||||
|
@ -1977,7 +2003,7 @@ int format_tracking_info(struct branch *branch, struct strbuf *sb,
|
||||||
char *base;
|
char *base;
|
||||||
int upstream_is_gone = 0;
|
int upstream_is_gone = 0;
|
||||||
|
|
||||||
sti = stat_tracking_info(branch, &ours, &theirs, &full_base, abf);
|
sti = stat_tracking_info(branch, &ours, &theirs, &full_base, 0, abf);
|
||||||
if (sti < 0) {
|
if (sti < 0) {
|
||||||
if (!full_base)
|
if (!full_base)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
3
remote.h
3
remote.h
|
@ -255,7 +255,8 @@ enum ahead_behind_flags {
|
||||||
|
|
||||||
/* Reporting of tracking info */
|
/* Reporting of tracking info */
|
||||||
int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs,
|
int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs,
|
||||||
const char **upstream_name, enum ahead_behind_flags abf);
|
const char **upstream_name, int for_push,
|
||||||
|
enum ahead_behind_flags abf);
|
||||||
int format_tracking_info(struct branch *branch, struct strbuf *sb,
|
int format_tracking_info(struct branch *branch, struct strbuf *sb,
|
||||||
enum ahead_behind_flags abf);
|
enum ahead_behind_flags abf);
|
||||||
|
|
||||||
|
|
|
@ -392,8 +392,15 @@ test_atom head upstream:track '[ahead 1]'
|
||||||
test_atom head upstream:trackshort '>'
|
test_atom head upstream:trackshort '>'
|
||||||
test_atom head upstream:track,nobracket 'ahead 1'
|
test_atom head upstream:track,nobracket 'ahead 1'
|
||||||
test_atom head upstream:nobracket,track 'ahead 1'
|
test_atom head upstream:nobracket,track 'ahead 1'
|
||||||
test_atom head push:track '[ahead 1]'
|
|
||||||
test_atom head push:trackshort '>'
|
test_expect_success 'setup for push:track[short]' '
|
||||||
|
test_commit third &&
|
||||||
|
git update-ref refs/remotes/myfork/master master &&
|
||||||
|
git reset master~1
|
||||||
|
'
|
||||||
|
|
||||||
|
test_atom head push:track '[behind 1]'
|
||||||
|
test_atom head push:trackshort '<'
|
||||||
|
|
||||||
test_expect_success 'Check that :track[short] cannot be used with other atoms' '
|
test_expect_success 'Check that :track[short] cannot be used with other atoms' '
|
||||||
test_must_fail git for-each-ref --format="%(refname:track)" 2>/dev/null &&
|
test_must_fail git for-each-ref --format="%(refname:track)" 2>/dev/null &&
|
||||||
|
@ -420,8 +427,10 @@ test_expect_success 'Check for invalid refname format' '
|
||||||
test_expect_success 'set up color tests' '
|
test_expect_success 'set up color tests' '
|
||||||
cat >expected.color <<-EOF &&
|
cat >expected.color <<-EOF &&
|
||||||
$(git rev-parse --short refs/heads/master) <GREEN>master<RESET>
|
$(git rev-parse --short refs/heads/master) <GREEN>master<RESET>
|
||||||
|
$(git rev-parse --short refs/remotes/myfork/master) <GREEN>myfork/master<RESET>
|
||||||
$(git rev-parse --short refs/remotes/origin/master) <GREEN>origin/master<RESET>
|
$(git rev-parse --short refs/remotes/origin/master) <GREEN>origin/master<RESET>
|
||||||
$(git rev-parse --short refs/tags/testtag) <GREEN>testtag<RESET>
|
$(git rev-parse --short refs/tags/testtag) <GREEN>testtag<RESET>
|
||||||
|
$(git rev-parse --short refs/tags/third) <GREEN>third<RESET>
|
||||||
$(git rev-parse --short refs/tags/two) <GREEN>two<RESET>
|
$(git rev-parse --short refs/tags/two) <GREEN>two<RESET>
|
||||||
EOF
|
EOF
|
||||||
sed "s/<[^>]*>//g" <expected.color >expected.bare &&
|
sed "s/<[^>]*>//g" <expected.color >expected.bare &&
|
||||||
|
|
|
@ -1857,7 +1857,7 @@ static void wt_shortstatus_print_tracking(struct wt_status *s)
|
||||||
color_fprintf(s->fp, branch_color_local, "%s", branch_name);
|
color_fprintf(s->fp, branch_color_local, "%s", branch_name);
|
||||||
|
|
||||||
sti = stat_tracking_info(branch, &num_ours, &num_theirs, &base,
|
sti = stat_tracking_info(branch, &num_ours, &num_theirs, &base,
|
||||||
s->ahead_behind_flags);
|
0, s->ahead_behind_flags);
|
||||||
if (sti < 0) {
|
if (sti < 0) {
|
||||||
if (!base)
|
if (!base)
|
||||||
goto conclude;
|
goto conclude;
|
||||||
|
@ -1996,7 +1996,7 @@ static void wt_porcelain_v2_print_tracking(struct wt_status *s)
|
||||||
branch = branch_get(branch_name);
|
branch = branch_get(branch_name);
|
||||||
base = NULL;
|
base = NULL;
|
||||||
ab_info = stat_tracking_info(branch, &nr_ahead, &nr_behind,
|
ab_info = stat_tracking_info(branch, &nr_ahead, &nr_behind,
|
||||||
&base, s->ahead_behind_flags);
|
&base, 0, s->ahead_behind_flags);
|
||||||
if (base) {
|
if (base) {
|
||||||
base = shorten_unambiguous_ref(base, 0);
|
base = shorten_unambiguous_ref(base, 0);
|
||||||
fprintf(s->fp, "# branch.upstream %s%c", base, eol);
|
fprintf(s->fp, "# branch.upstream %s%c", base, eol);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче