Support +<src>:<dst> format in push as well.
Signed-off-by: Junio C Hamano <junkio@cox.net>maint
parent
efe9bf0f3b
commit
ff27adf3da
1
cache.h
1
cache.h
|
@ -309,6 +309,7 @@ struct ref {
|
||||||
struct ref *next;
|
struct ref *next;
|
||||||
unsigned char old_sha1[20];
|
unsigned char old_sha1[20];
|
||||||
unsigned char new_sha1[20];
|
unsigned char new_sha1[20];
|
||||||
|
unsigned char force;
|
||||||
struct ref *peer_ref; /* when renaming */
|
struct ref *peer_ref; /* when renaming */
|
||||||
char name[0];
|
char name[0];
|
||||||
};
|
};
|
||||||
|
|
17
connect.c
17
connect.c
|
@ -82,15 +82,26 @@ int path_match(const char *path, int nr, char **match)
|
||||||
struct refspec {
|
struct refspec {
|
||||||
char *src;
|
char *src;
|
||||||
char *dst;
|
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)
|
static struct refspec *parse_ref_spec(int nr_refspec, char **refspec)
|
||||||
{
|
{
|
||||||
int i;
|
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++) {
|
for (i = 0; i < nr_refspec; i++) {
|
||||||
char *sp, *dp, *ep;
|
char *sp, *dp, *ep;
|
||||||
sp = refspec[i];
|
sp = refspec[i];
|
||||||
|
if (*sp == '+') {
|
||||||
|
rs[i].force = 1;
|
||||||
|
sp++;
|
||||||
|
}
|
||||||
ep = strchr(sp, ':');
|
ep = strchr(sp, ':');
|
||||||
if (ep) {
|
if (ep) {
|
||||||
dp = ep + 1;
|
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.",
|
error("dst ref %s receives from more than one src.",
|
||||||
matched_dst->name);
|
matched_dst->name);
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
matched_dst->peer_ref = matched_src;
|
matched_dst->peer_ref = matched_src;
|
||||||
|
matched_dst->force = rs[i].force;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return -errs;
|
return -errs;
|
||||||
}
|
}
|
||||||
|
|
12
send-pack.c
12
send-pack.c
|
@ -206,7 +206,8 @@ static int send_pack(int in, int out, int nr_refspec, char **refspec)
|
||||||
/* This part determines what can overwrite what.
|
/* This part determines what can overwrite what.
|
||||||
* The rules are:
|
* 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.
|
* (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.
|
* 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)) {
|
if (!has_sha1_file(ref->old_sha1)) {
|
||||||
error("remote '%s' object %s does not "
|
error("remote '%s' object %s does not "
|
||||||
"exist on local",
|
"exist on local",
|
||||||
ref->name, sha1_to_hex(ref->old_sha1));
|
ref->name, sha1_to_hex(ref->old_sha1));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We assume that local is fsck-clean. Otherwise
|
/* We assume that local is fsck-clean. Otherwise
|
||||||
* you _could_ have a old tag which points at
|
* you _could_ have an old tag which points at
|
||||||
* something you do not have which may or may not
|
* something you do not have, which may or may not
|
||||||
* be a commit.
|
* be a commit.
|
||||||
*/
|
*/
|
||||||
if (!ref_newer(ref->peer_ref->new_sha1,
|
if (!ref_newer(ref->peer_ref->new_sha1,
|
||||||
|
|
Loading…
Reference in New Issue