git/send: fill in 'theirs' object, even if we miss it
When pushing, git/send would sometimes decide we had all the objects that we'd need to update the remote, and would try to pack and send the entire history of the repository. This is because we only set the 'theirs' ref when we had the object. If we didn't have the object, we would set a zero hash, then when deciding if we needed to force, we would think that we were updating a new branch and send everything, which would fail to update the remote.
This commit is contained in:
parent
8319b750ea
commit
08447e5d64
1 changed files with 10 additions and 4 deletions
|
@ -134,8 +134,8 @@ sendpack(Conn *c)
|
||||||
nmap = nours;
|
nmap = nours;
|
||||||
map = eamalloc(nmap, sizeof(Map));
|
map = eamalloc(nmap, sizeof(Map));
|
||||||
for(i = 0; i < nmap; i++){
|
for(i = 0; i < nmap; i++){
|
||||||
map[i].ours = ours[i];
|
|
||||||
map[i].theirs = Zhash;
|
map[i].theirs = Zhash;
|
||||||
|
map[i].ours = ours[i];
|
||||||
map[i].ref = refs[i];
|
map[i].ref = refs[i];
|
||||||
}
|
}
|
||||||
while(1){
|
while(1){
|
||||||
|
@ -155,9 +155,15 @@ sendpack(Conn *c)
|
||||||
theirs = earealloc(theirs, ntheirs+1, sizeof(Hash));
|
theirs = earealloc(theirs, ntheirs+1, sizeof(Hash));
|
||||||
if(hparse(&theirs[ntheirs], sp[0]) == -1)
|
if(hparse(&theirs[ntheirs], sp[0]) == -1)
|
||||||
sysfatal("invalid hash %s", sp[0]);
|
sysfatal("invalid hash %s", sp[0]);
|
||||||
|
if((idx = findkey(map, nmap, sp[1])) != -1)
|
||||||
|
map[idx].theirs = theirs[ntheirs];
|
||||||
|
/*
|
||||||
|
* we only keep their ref if we can read the object to add it
|
||||||
|
* to our reachability; otherwise, discard it; we only care
|
||||||
|
* that we don't have it, so we can tell whether we need to
|
||||||
|
* bail out of pushing.
|
||||||
|
*/
|
||||||
if((o = readobject(theirs[ntheirs])) != nil){
|
if((o = readobject(theirs[ntheirs])) != nil){
|
||||||
if((idx = findkey(map, nmap, sp[1])) != -1)
|
|
||||||
map[idx].theirs = theirs[ntheirs];
|
|
||||||
ntheirs++;
|
ntheirs++;
|
||||||
unref(o);
|
unref(o);
|
||||||
}
|
}
|
||||||
|
@ -180,7 +186,7 @@ sendpack(Conn *c)
|
||||||
p = ancestor(a, b);
|
p = ancestor(a, b);
|
||||||
if(!force && !hasheq(&m->theirs, &Zhash) && (a == nil || p != a)){
|
if(!force && !hasheq(&m->theirs, &Zhash) && (a == nil || p != a)){
|
||||||
fprint(2, "remote has diverged\n");
|
fprint(2, "remote has diverged\n");
|
||||||
werrstr("force needed");
|
werrstr("remote diverged");
|
||||||
flushpkt(c);
|
flushpkt(c);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue