|
|
@ -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 { |
|
|
|