GC should not pack objects only referenced by ORIG_HEAD,...

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>
This commit is contained in:
Christian Halstrick 2016-05-11 22:36:10 +02:00 committed by Matthias Sohn
parent 0afd62efa8
commit 6590c0a92a
2 changed files with 18 additions and 4 deletions

View File

@ -241,7 +241,12 @@ private Collection<Ref> getAllRefs() 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;

View File

@ -655,8 +655,12 @@ private Set<ObjectId> listRefLogObjects(Ref ref, long minTime) throws IOExceptio
}
/**
* 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
@ -668,7 +672,12 @@ private Collection<Ref> getAllRefs() 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;