Browse Source

Update tags on fetch if --tags or tag refspec specified

When either --tags or a tag ref is explicitly specified on fetch, C Git
updates existing local tags if they are different.

Before this change, JGit returned REJECTED in such a case. Now it
updates it and returns FORCED.

Example:

    % mkdir a
    % cd a
    % git init -q
    % touch test.txt
    % git add test.txt
    % git commit -q -m 'Initial'
    % git tag v1
    % cd ..
    % git clone -q a b
    % cd a
    % echo Test > test.txt
    % git commit -q -a -m 'Second'
    % git tag -f v1
    Updated tag 'v1' (was bc85c08)
    % cd ../b
    % git fetch --tags
     - [tag update]      v1         -> v1

Bug: 388095
Change-Id: I5d5494c2ad1a2cdb8e9e614d3de445289734edfe
tags/v3.0.0.201305080800-m7
Robin Stocker 11 years ago
parent
commit
f448d62d29

+ 25
- 0
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/FetchCommandTest.java View File

@@ -52,8 +52,10 @@ import java.util.Collection;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.junit.RepositoryTestCase;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.RefUpdate;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.revwalk.RevCommit;
@@ -168,4 +170,27 @@ public class FetchCommandTest extends RepositoryTestCase {

assertEquals(originalId, db.resolve(tagName));
}

@Test
public void fetchWithExplicitTagsShouldUpdateLocal() throws Exception {
final String tagName = "foo";
remoteGit.commit().setMessage("commit").call();
Ref tagRef1 = remoteGit.tag().setName(tagName).call();

RefSpec spec = new RefSpec("refs/heads/*:refs/remotes/origin/*");
git.fetch().setRemote("test").setRefSpecs(spec)
.setTagOpt(TagOpt.AUTO_FOLLOW).call();
assertEquals(tagRef1.getObjectId(), db.resolve(tagName));

remoteGit.commit().setMessage("commit 2").call();
Ref tagRef2 = remoteGit.tag().setName(tagName).setForceUpdate(true)
.call();

FetchResult result = git.fetch().setRemote("test").setRefSpecs(spec)
.setTagOpt(TagOpt.FETCH_TAGS).call();
TrackingRefUpdate update = result.getTrackingRefUpdate(Constants.R_TAGS
+ tagName);
assertEquals(RefUpdate.Result.FORCED, update.getResult());
assertEquals(tagRef2.getObjectId(), db.resolve(tagName));
}
}

+ 1
- 1
org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchProcess.java View File

@@ -412,7 +412,7 @@ class FetchProcess {

private void wantTag(final Ref r) throws TransportException {
want(r, new RefSpec().setSource(r.getName())
.setDestination(r.getName()));
.setDestination(r.getName()).setForceUpdate(true));
}

private void want(final Ref src, final RefSpec spec)

Loading…
Cancel
Save