There are references which are returned by
RefDatabase.getAdditionalRefs() which are allowed to point to
non-existing objects. These refs should not save objects from being
garbage collected. Examples for these references are ORIG_HEAD,
MERGE_HEAD, FETCH_HEAD and CHERRY_PICK_HEAD. Native git will not take
these references into account when doing a gc and therefore these
references may point to non-existing objects after a gc. Teach JGit's
GC to behave the same: ignore additional refs if they don't start with
"refs/". Examples for refs returned by getAdditionalRefs() which do
start with "refs/" are the bootstrap refs when using reftree's (see
commit
115f1ad3974d1162b33d1c8eff466019d1f249f3). See also
http://article.gmane.org/gmane.comp.version-control.git/294126.
Bug: 479697
Change-Id: I10e40589f13e72aacdd9f86f3b44696fd1cd068a
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
if (!addl.isEmpty()) {
List<Ref> all = new ArrayList<>(refs.size() + addl.size());
all.addAll(refs);
- all.addAll(addl);
+ // add additional refs which start with refs/
+ for (Ref r : addl) {
+ if (r.getName().startsWith(Constants.R_REFS)) {
+ all.add(r);
+ }
+ }
return all;
}
return refs;
}
/**
- * Returns a collection of all refs and additional refs (e.g. FETCH_HEAD,
- * MERGE_HEAD, ...)
+ * Returns a collection of all refs and additional refs.
+ *
+ * Additional refs which don't start with "refs/" are not returned because
+ * they should not save objects from being garbage collected. Examples for
+ * such references are ORIG_HEAD, MERGE_HEAD, FETCH_HEAD and
+ * CHERRY_PICK_HEAD.
*
* @return a collection of refs pointing to live objects.
* @throws IOException
if (!addl.isEmpty()) {
List<Ref> all = new ArrayList<>(refs.size() + addl.size());
all.addAll(refs);
- all.addAll(addl);
+ // add additional refs which start with refs/
+ for (Ref r : addl) {
+ if (r.getName().startsWith(Constants.R_REFS)) {
+ all.add(r);
+ }
+ }
return all;
}
return refs;