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
stable-3.0
Robin Stocker 12 years ago
parent
commit
f448d62d29
  1. 25
      org.eclipse.jgit.test/tst/org/eclipse/jgit/api/FetchCommandTest.java
  2. 2
      org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchProcess.java

25
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/FetchCommandTest.java

@ -52,8 +52,10 @@ import java.util.Collection;
import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException; import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.junit.RepositoryTestCase; import org.eclipse.jgit.junit.RepositoryTestCase;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.RefUpdate;
import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.StoredConfig; import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevCommit;
@ -168,4 +170,27 @@ public class FetchCommandTest extends RepositoryTestCase {
assertEquals(originalId, db.resolve(tagName)); 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));
}
} }

2
org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchProcess.java

@ -412,7 +412,7 @@ class FetchProcess {
private void wantTag(final Ref r) throws TransportException { private void wantTag(final Ref r) throws TransportException {
want(r, new RefSpec().setSource(r.getName()) want(r, new RefSpec().setSource(r.getName())
.setDestination(r.getName())); .setDestination(r.getName()).setForceUpdate(true));
} }
private void want(final Ref src, final RefSpec spec) private void want(final Ref src, final RefSpec spec)

Loading…
Cancel
Save