提交 ff27adf3 编写于 作者: J Junio C Hamano

Support +<src>:<dst> format in push as well.

Signed-off-by: NJunio C Hamano <junkio@cox.net>
上级 efe9bf0f
......@@ -309,6 +309,7 @@ struct ref {
struct ref *next;
unsigned char old_sha1[20];
unsigned char new_sha1[20];
unsigned char force;
struct ref *peer_ref; /* when renaming */
char name[0];
};
......
......@@ -82,15 +82,26 @@ int path_match(const char *path, int nr, char **match)
struct refspec {
char *src;
char *dst;
char force;
};
/*
* A:B means fast forward remote B with local A.
* +A:B means overwrite remote B with local A.
* +A is a shorthand for +A:A.
* A is a shorthand for A:A.
*/
static struct refspec *parse_ref_spec(int nr_refspec, char **refspec)
{
int i;
struct refspec *rs = xmalloc(sizeof(*rs) * (nr_refspec + 1));
struct refspec *rs = xcalloc(sizeof(*rs), (nr_refspec + 1));
for (i = 0; i < nr_refspec; i++) {
char *sp, *dp, *ep;
sp = refspec[i];
if (*sp == '+') {
rs[i].force = 1;
sp++;
}
ep = strchr(sp, ':');
if (ep) {
dp = ep + 1;
......@@ -216,8 +227,10 @@ static int match_explicit_refs(struct ref *src, struct ref *dst,
error("dst ref %s receives from more than one src.",
matched_dst->name);
}
else
else {
matched_dst->peer_ref = matched_src;
matched_dst->force = rs[i].force;
}
}
return -errs;
}
......
......@@ -206,7 +206,8 @@ static int send_pack(int in, int out, int nr_refspec, char **refspec)
/* This part determines what can overwrite what.
* The rules are:
*
* (0) you can always use --force.
* (0) you can always use --force or +A:B notation to
* selectively force individual ref pairs.
*
* (1) if the old thing does not exist, it is OK.
*
......@@ -218,16 +219,19 @@ static int send_pack(int in, int out, int nr_refspec, char **refspec)
* descendant of old, it is OK.
*/
if (!force_update && !is_zero_sha1(ref->old_sha1)) {
if (!force_update &&
!is_zero_sha1(ref->old_sha1) &&
!ref->force) {
if (!has_sha1_file(ref->old_sha1)) {
error("remote '%s' object %s does not "
"exist on local",
ref->name, sha1_to_hex(ref->old_sha1));
continue;
}
/* We assume that local is fsck-clean. Otherwise
* you _could_ have a old tag which points at
* something you do not have which may or may not
* you _could_ have an old tag which points at
* something you do not have, which may or may not
* be a commit.
*/
if (!ref_newer(ref->peer_ref->new_sha1,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册