Browse Source

Allow adding single refs or all tags to NameRevCommand

Change-Id: I90e85bc835d11278631afd0e801425a292578bba
stable-3.0
Dave Borowitz 12 years ago
parent
commit
d2a6c4b955
  1. 20
      org.eclipse.jgit.test/tst/org/eclipse/jgit/api/NameRevCommandTest.java
  2. 95
      org.eclipse.jgit/src/org/eclipse/jgit/api/NameRevCommand.java

20
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/NameRevCommandTest.java

@ -88,6 +88,26 @@ public class NameRevCommandTest extends RepositoryTestCase {
c); c);
} }
@Test
public void ref() throws Exception {
RevCommit c = tr.commit().create();
tr.update("refs/heads/master", c);
tr.update("refs/tags/tag", c);
assertOneResult("master",
git.nameRev().addRef(db.getRef("refs/heads/master")), c);
assertOneResult("tag",
git.nameRev().addRef(db.getRef("refs/tags/tag")), c);
}
@Test
public void annotatedTags() throws Exception {
RevCommit c = tr.commit().create();
tr.update("refs/heads/master", c);
tr.update("refs/tags/tag1", c);
tr.update("refs/tags/tag2", tr.tag("tag2", c));
assertOneResult("tag2", git.nameRev().addAnnotatedTags(), c);
}
@Test @Test
public void simpleAncestor() throws Exception { public void simpleAncestor() throws Exception {
// 0--1--2 // 0--1--2

95
org.eclipse.jgit/src/org/eclipse/jgit/api/NameRevCommand.java

@ -110,6 +110,7 @@ public class NameRevCommand extends GitCommand<Map<ObjectId, String>> {
private final RevWalk walk; private final RevWalk walk;
private final List<String> prefixes; private final List<String> prefixes;
private final List<Ref> refs;
private final List<ObjectId> revs; private final List<ObjectId> revs;
/** /**
@ -120,6 +121,7 @@ public class NameRevCommand extends GitCommand<Map<ObjectId, String>> {
protected NameRevCommand(Repository repo) { protected NameRevCommand(Repository repo) {
super(repo); super(repo);
prefixes = new ArrayList<String>(2); prefixes = new ArrayList<String>(2);
refs = new ArrayList<Ref>();
revs = new ArrayList<ObjectId>(2); revs = new ArrayList<ObjectId>(2);
walk = new RevWalk(repo) { walk = new RevWalk(repo) {
@Override @Override
@ -134,6 +136,8 @@ public class NameRevCommand extends GitCommand<Map<ObjectId, String>> {
try { try {
Map<ObjectId, String> nonCommits = new HashMap<ObjectId, String>(); Map<ObjectId, String> nonCommits = new HashMap<ObjectId, String>();
FIFORevQueue pending = new FIFORevQueue(); FIFORevQueue pending = new FIFORevQueue();
for (Ref ref : refs)
addRef(ref, nonCommits, pending);
addPrefixes(nonCommits, pending); addPrefixes(nonCommits, pending);
int cutoff = minCommitTime() - COMMIT_TIME_SLOP; int cutoff = minCommitTime() - COMMIT_TIME_SLOP;
@ -235,10 +239,11 @@ public class NameRevCommand extends GitCommand<Map<ObjectId, String>> {
} }
/** /**
* Add a ref prefix that all results must match. * Add a ref prefix to the set that results must match.
* <p> * <p>
* If an object matches refs under multiple prefixes equally well, the first * If an object matches multiple refs equally well, the first matching ref
* prefix added to this command is preferred. * added with {@link #addRef(Ref)} is preferred, or else the first matching
* prefix added by {@link #addPrefix(String)}.
* *
* @param prefix * @param prefix
* prefix to add; see {@link RefDatabase#getRefs(String)} * prefix to add; see {@link RefDatabase#getRefs(String)}
@ -250,35 +255,83 @@ public class NameRevCommand extends GitCommand<Map<ObjectId, String>> {
return this; return this;
} }
/**
* Add all annotated tags under {@code refs/tags/} to the set that all results
* must match.
* <p>
* Calls {@link #addRef(Ref)}; see that method for a note on matching
* priority.
*
* @return {@code this}
* @throws JGitInternalException
* a low-level exception of JGit has occurred. The original
* exception can be retrieved by calling
* {@link Exception#getCause()}.
*/
public NameRevCommand addAnnotatedTags() {
checkCallable();
try {
for (Ref ref : repo.getRefDatabase().getRefs(Constants.R_TAGS).values()) {
ObjectId id = ref.getObjectId();
if (id != null && (walk.parseAny(id) instanceof RevTag))
addRef(ref);
}
} catch (IOException e) {
throw new JGitInternalException(e.getMessage(), e);
}
return this;
}
/**
* Add a ref to the set that all results must match.
* <p>
* If an object matches multiple refs equally well, the first matching ref
* added with {@link #addRef(Ref)} is preferred, or else the first matching
* prefix added by {@link #addPrefix(String)}.
*
* @param ref
* ref to add.
* @return {@code this}
*/
public NameRevCommand addRef(Ref ref) {
checkCallable();
refs.add(ref);
return this;
}
private void addPrefixes(Map<ObjectId, String> nonCommits, private void addPrefixes(Map<ObjectId, String> nonCommits,
FIFORevQueue pending) throws IOException { FIFORevQueue pending) throws IOException {
if (!prefixes.isEmpty()) { if (!prefixes.isEmpty()) {
for (String prefix : prefixes) for (String prefix : prefixes)
addPrefix(prefix, nonCommits, pending); addPrefix(prefix, nonCommits, pending);
} else } else if (refs.isEmpty())
addPrefix(Constants.R_REFS, nonCommits, pending); addPrefix(Constants.R_REFS, nonCommits, pending);
} }
private void addPrefix(String prefix, Map<ObjectId, String> nonCommits, private void addPrefix(String prefix, Map<ObjectId, String> nonCommits,
FIFORevQueue pending) throws IOException { FIFORevQueue pending) throws IOException {
for (Ref ref : repo.getRefDatabase().getRefs(prefix).values()) { for (Ref ref : repo.getRefDatabase().getRefs(prefix).values())
if (ref.getObjectId() == null) addRef(ref, nonCommits, pending);
continue; }
RevObject o = walk.parseAny(ref.getObjectId());
while (o instanceof RevTag) { private void addRef(Ref ref, Map<ObjectId, String> nonCommits,
RevTag t = (RevTag) o; FIFORevQueue pending) throws IOException {
nonCommits.put(o, ref.getName()); if (ref.getObjectId() == null)
o = t.getObject(); return;
walk.parseHeaders(o); RevObject o = walk.parseAny(ref.getObjectId());
} while (o instanceof RevTag) {
if (o instanceof NameRevCommit) { RevTag t = (RevTag) o;
NameRevCommit c = (NameRevCommit) o; nonCommits.put(o, ref.getName());
if (c.tip == null) o = t.getObject();
c.tip = ref.getName(); walk.parseHeaders(o);
pending.add(c);
} else if (!nonCommits.containsKey(o))
nonCommits.put(o, ref.getName());
} }
if (o instanceof NameRevCommit) {
NameRevCommit c = (NameRevCommit) o;
if (c.tip == null)
c.tip = ref.getName();
pending.add(c);
} else if (!nonCommits.containsKey(o))
nonCommits.put(o, ref.getName());
} }
private int minCommitTime() throws IOException { private int minCommitTime() throws IOException {

Loading…
Cancel
Save