for-each-ref: add "upstream" format field
The logic for determining the upstream ref of a branch is somewhat complex to perform in a shell script. This patch provides a plumbing mechanism for scripts to access the C logic used internally by git-status, git-branch, etc. For example: $ git for-each-ref \ --format='%(refname:short) %(upstream:short)' \ refs/heads/ master origin/master Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
8db9a4b85d
commit
8cae19d987
@ -85,6 +85,11 @@ objectsize::
|
||||
objectname::
|
||||
The object name (aka SHA-1).
|
||||
|
||||
upstream::
|
||||
The name of a local ref which can be considered ``upstream''
|
||||
from the displayed ref. Respects `:short` in the same way as
|
||||
`refname` above.
|
||||
|
||||
In addition to the above, for commit and tag objects, the header
|
||||
field names (`tree`, `parent`, `object`, `type`, and `tag`) can
|
||||
be used to specify the value in the header field.
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include "blob.h"
|
||||
#include "quote.h"
|
||||
#include "parse-options.h"
|
||||
#include "remote.h"
|
||||
|
||||
/* Quoting styles */
|
||||
#define QUOTE_NONE 0
|
||||
@ -66,6 +67,7 @@ static struct {
|
||||
{ "subject" },
|
||||
{ "body" },
|
||||
{ "contents" },
|
||||
{ "upstream" },
|
||||
};
|
||||
|
||||
/*
|
||||
@ -682,6 +684,18 @@ static void populate_value(struct refinfo *ref)
|
||||
|
||||
if (!prefixcmp(name, "refname"))
|
||||
refname = ref->refname;
|
||||
else if(!prefixcmp(name, "upstream")) {
|
||||
struct branch *branch;
|
||||
/* only local branches may have an upstream */
|
||||
if (prefixcmp(ref->refname, "refs/heads/"))
|
||||
continue;
|
||||
branch = branch_get(ref->refname + 11);
|
||||
|
||||
if (!branch || !branch->merge || !branch->merge[0] ||
|
||||
!branch->merge[0]->dst)
|
||||
continue;
|
||||
refname = branch->merge[0]->dst;
|
||||
}
|
||||
else
|
||||
continue;
|
||||
|
||||
|
@ -26,6 +26,13 @@ test_expect_success 'Create sample commit with known timestamp' '
|
||||
git tag -a -m "Tagging at $datestamp" testtag
|
||||
'
|
||||
|
||||
test_expect_success 'Create upstream config' '
|
||||
git update-ref refs/remotes/origin/master master &&
|
||||
git remote add origin nowhere &&
|
||||
git config branch.master.remote origin &&
|
||||
git config branch.master.merge refs/heads/master
|
||||
'
|
||||
|
||||
test_atom() {
|
||||
case "$1" in
|
||||
head) ref=refs/heads/master ;;
|
||||
@ -39,6 +46,7 @@ test_atom() {
|
||||
}
|
||||
|
||||
test_atom head refname refs/heads/master
|
||||
test_atom head upstream refs/remotes/origin/master
|
||||
test_atom head objecttype commit
|
||||
test_atom head objectsize 171
|
||||
test_atom head objectname 67a36f10722846e891fbada1ba48ed035de75581
|
||||
@ -68,6 +76,7 @@ test_atom head contents 'Initial
|
||||
'
|
||||
|
||||
test_atom tag refname refs/tags/testtag
|
||||
test_atom tag upstream ''
|
||||
test_atom tag objecttype tag
|
||||
test_atom tag objectsize 154
|
||||
test_atom tag objectname 98b46b1d36e5b07909de1b3886224e3e81e87322
|
||||
@ -203,6 +212,7 @@ test_expect_success 'Check format "rfc2822" date fields output' '
|
||||
|
||||
cat >expected <<\EOF
|
||||
refs/heads/master
|
||||
refs/remotes/origin/master
|
||||
refs/tags/testtag
|
||||
EOF
|
||||
|
||||
@ -214,6 +224,7 @@ test_expect_success 'Verify ascending sort' '
|
||||
|
||||
cat >expected <<\EOF
|
||||
refs/tags/testtag
|
||||
refs/remotes/origin/master
|
||||
refs/heads/master
|
||||
EOF
|
||||
|
||||
@ -224,6 +235,7 @@ test_expect_success 'Verify descending sort' '
|
||||
|
||||
cat >expected <<\EOF
|
||||
'refs/heads/master'
|
||||
'refs/remotes/origin/master'
|
||||
'refs/tags/testtag'
|
||||
EOF
|
||||
|
||||
@ -244,6 +256,7 @@ test_expect_success 'Quoting style: python' '
|
||||
|
||||
cat >expected <<\EOF
|
||||
"refs/heads/master"
|
||||
"refs/remotes/origin/master"
|
||||
"refs/tags/testtag"
|
||||
EOF
|
||||
|
||||
@ -273,6 +286,15 @@ test_expect_success 'Check short refname format' '
|
||||
test_cmp expected actual
|
||||
'
|
||||
|
||||
cat >expected <<EOF
|
||||
origin/master
|
||||
EOF
|
||||
|
||||
test_expect_success 'Check short upstream format' '
|
||||
git for-each-ref --format="%(upstream:short)" refs/heads >actual &&
|
||||
test_cmp expected actual
|
||||
'
|
||||
|
||||
test_expect_success 'Check for invalid refname format' '
|
||||
test_must_fail git for-each-ref --format="%(refname:INVALID)"
|
||||
'
|
||||
|
Loading…
Reference in New Issue
Block a user