Merge branch 'jk/at-push-sha1'
Introduce <branch>@{push} short-hand to denote the remote-tracking branch that tracks the branch at the remote the <branch> would be pushed to. * jk/at-push-sha1: for-each-ref: accept "%(push)" format for-each-ref: use skip_prefix instead of starts_with sha1_name: implement @{push} shorthand sha1_name: refactor interpret_upstream_mark sha1_name: refactor upstream_mark remote.c: add branch_get_push remote.c: return upstream name from stat_tracking_info remote.c: untangle error logic in branch_get_upstream remote.c: report specific errors from branch_get_upstream remote.c: introduce branch_get_upstream helper remote.c: hoist read_config into remote_get_1 remote.c: provide per-branch pushremote name remote.c: hoist branch.*.remote lookup out of remote_get_1 remote.c: drop "remote" pointer from "struct branch" remote.c: refactor setup of branch->merge list remote.c: drop default_remote_name variable
This commit is contained in:
81
sha1_name.c
81
sha1_name.c
@ -416,12 +416,12 @@ static int ambiguous_path(const char *path, int len)
|
||||
return slash;
|
||||
}
|
||||
|
||||
static inline int upstream_mark(const char *string, int len)
|
||||
static inline int at_mark(const char *string, int len,
|
||||
const char **suffix, int nr)
|
||||
{
|
||||
const char *suffix[] = { "@{upstream}", "@{u}" };
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(suffix); i++) {
|
||||
for (i = 0; i < nr; i++) {
|
||||
int suffix_len = strlen(suffix[i]);
|
||||
if (suffix_len <= len
|
||||
&& !memcmp(string, suffix[i], suffix_len))
|
||||
@ -430,6 +430,18 @@ static inline int upstream_mark(const char *string, int len)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int upstream_mark(const char *string, int len)
|
||||
{
|
||||
const char *suffix[] = { "@{upstream}", "@{u}" };
|
||||
return at_mark(string, len, suffix, ARRAY_SIZE(suffix));
|
||||
}
|
||||
|
||||
static inline int push_mark(const char *string, int len)
|
||||
{
|
||||
const char *suffix[] = { "@{push}" };
|
||||
return at_mark(string, len, suffix, ARRAY_SIZE(suffix));
|
||||
}
|
||||
|
||||
static int get_sha1_1(const char *name, int len, unsigned char *sha1, unsigned lookup_flags);
|
||||
static int interpret_nth_prior_checkout(const char *name, int namelen, struct strbuf *buf);
|
||||
|
||||
@ -477,7 +489,8 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1,
|
||||
nth_prior = 1;
|
||||
continue;
|
||||
}
|
||||
if (!upstream_mark(str + at, len - at)) {
|
||||
if (!upstream_mark(str + at, len - at) &&
|
||||
!push_mark(str + at, len - at)) {
|
||||
reflog_len = (len-1) - (at+2);
|
||||
len = at;
|
||||
}
|
||||
@ -1056,46 +1069,36 @@ static void set_shortened_ref(struct strbuf *buf, const char *ref)
|
||||
free(s);
|
||||
}
|
||||
|
||||
static const char *get_upstream_branch(const char *branch_buf, int len)
|
||||
{
|
||||
char *branch = xstrndup(branch_buf, len);
|
||||
struct branch *upstream = branch_get(*branch ? branch : NULL);
|
||||
|
||||
/*
|
||||
* Upstream can be NULL only if branch refers to HEAD and HEAD
|
||||
* points to something different than a branch.
|
||||
*/
|
||||
if (!upstream)
|
||||
die(_("HEAD does not point to a branch"));
|
||||
if (!upstream->merge || !upstream->merge[0]->dst) {
|
||||
if (!ref_exists(upstream->refname))
|
||||
die(_("No such branch: '%s'"), branch);
|
||||
if (!upstream->merge) {
|
||||
die(_("No upstream configured for branch '%s'"),
|
||||
upstream->name);
|
||||
}
|
||||
die(
|
||||
_("Upstream branch '%s' not stored as a remote-tracking branch"),
|
||||
upstream->merge[0]->src);
|
||||
}
|
||||
free(branch);
|
||||
|
||||
return upstream->merge[0]->dst;
|
||||
}
|
||||
|
||||
static int interpret_upstream_mark(const char *name, int namelen,
|
||||
int at, struct strbuf *buf)
|
||||
static int interpret_branch_mark(const char *name, int namelen,
|
||||
int at, struct strbuf *buf,
|
||||
int (*get_mark)(const char *, int),
|
||||
const char *(*get_data)(struct branch *,
|
||||
struct strbuf *))
|
||||
{
|
||||
int len;
|
||||
struct branch *branch;
|
||||
struct strbuf err = STRBUF_INIT;
|
||||
const char *value;
|
||||
|
||||
len = upstream_mark(name + at, namelen - at);
|
||||
len = get_mark(name + at, namelen - at);
|
||||
if (!len)
|
||||
return -1;
|
||||
|
||||
if (memchr(name, ':', at))
|
||||
return -1;
|
||||
|
||||
set_shortened_ref(buf, get_upstream_branch(name, at));
|
||||
if (at) {
|
||||
char *name_str = xmemdupz(name, at);
|
||||
branch = branch_get(name_str);
|
||||
free(name_str);
|
||||
} else
|
||||
branch = branch_get(NULL);
|
||||
|
||||
value = get_data(branch, &err);
|
||||
if (!value)
|
||||
die("%s", err.buf);
|
||||
|
||||
set_shortened_ref(buf, value);
|
||||
return len + at;
|
||||
}
|
||||
|
||||
@ -1146,7 +1149,13 @@ int interpret_branch_name(const char *name, int namelen, struct strbuf *buf)
|
||||
if (len > 0)
|
||||
return reinterpret(name, namelen, len, buf);
|
||||
|
||||
len = interpret_upstream_mark(name, namelen, at - name, buf);
|
||||
len = interpret_branch_mark(name, namelen, at - name, buf,
|
||||
upstream_mark, branch_get_upstream);
|
||||
if (len > 0)
|
||||
return len;
|
||||
|
||||
len = interpret_branch_mark(name, namelen, at - name, buf,
|
||||
push_mark, branch_get_push);
|
||||
if (len > 0)
|
||||
return len;
|
||||
}
|
||||
|
Reference in New Issue
Block a user