[RFC/PATCH 1/2] remote tracking: return the tracking branch for the given branches
Signed-off-by: Santi Béjar <santi@agolina.net>
---
Documentation/git-remote.txt | 7 +++++++
builtin-remote.c | 35 +++++++++++++++++++++++++++++++++++
2 files changed, 42 insertions(+), 0 deletions(-)
diff --git a/Documentation/git-remote.txt b/Documentation/git-remote.txt
index 9e2b4ea..e444899 100644
--- a/Documentation/git-remote.txt
+++ b/Documentation/git-remote.txt
@@ -17,6 +17,7 @@ SYNOPSIS
'git remote show' [-n] <name>
'git remote prune' [-n | --dry-run] <name>
'git remote update' [-p | --prune] [group | remote]...
+'git remote tracking' <name> <branch>...
DESCRIPTION
-----------
@@ -128,6 +129,12 @@ be updated. (See linkgit:git-config[1]).
+
With `--prune` option, prune all the remotes that are updated.
+'tracking'::
+
+Returns the tracking branch for the given remote (<name>) and branch
+(<branch>). Note that <branch> must exactly match the left hand side of
+the refspec of the given remote.
+
DISCUSSION
----------
diff --git a/builtin-remote.c b/builtin-remote.c
index 709f8a6..bb8e73b 100644
--- a/builtin-remote.c
+++ b/builtin-remote.c
@@ -16,6 +16,7 @@ static const char * const builtin_remote_usage[] = {
"git remote show [-n] <name>",
"git remote prune [-n | --dry-run] <name>",
"git remote [-v | --verbose] update [-p | --prune] [group]",
+ "git remote tracking <name> <branch>...",
NULL
};
@@ -665,6 +666,38 @@ static int remove_branches(struct string_list *branches)
return result;
}
+static int tracking(int argc, const char **argv)
+{
+ struct option options[] = {
+ OPT_END()
+ };
+ struct remote *remote;
+ static const char **refs = NULL;
+ int ref_nr = 0;
+ int i = 0;
+ struct refspec *refspec;
+
+ if (argc < 3)
+ usage_with_options(builtin_remote_usage, options);
+ remote = remote_get(argv[1]);
+ if (!remote)
+ die("No such remote: %s", argv[1]);
+ refs = xcalloc(argc + 1, sizeof(const char *));
+ for (i = 2; i < argc; i++) {
+ refs[ref_nr++] = argv[i];
+ }
+ refs[ref_nr] = NULL;
+ memset(&refspec, 0, sizeof(*refspec));
+ refspec = parse_fetch_refspec(ref_nr, refs);
+ for (i = 0; i < ref_nr ; i++) {
+ if (!remote_find_tracking(remote, &refspec[i]))
+ printf("%s\n", refspec[i].dst);
+ else
+ return 1;
+ }
+ return 0;
+}
+
static int rm(int argc, const char **argv)
{
struct option options[] = {
@@ -1348,6 +1381,8 @@ int cmd_remote(int argc, const char **argv, const char *prefix)
result = show_all();
else if (!strcmp(argv[0], "add"))
result = add(argc, argv);
+ else if (!strcmp(argv[0], "tracking"))
+ result = tracking(argc, argv);
else if (!strcmp(argv[0], "rename"))
result = mv(argc, argv);
else if (!strcmp(argv[0], "rm"))
--
1.6.3.2.406.gd6a466