diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java index cf504d25a..988901526 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java @@ -1903,7 +1903,6 @@ private static void checkNotAdvertisedWants(UploadPack up, try (RevWalk walk = new RevWalk(reader)) { walk.setRetainBody(false); - Set reachableFrom = refIdSet(visibleRefs); // Missing "wants" throw exception here List wantsAsObjs = objectIdsToRevObjects(walk, notAdvertisedWants); @@ -1930,12 +1929,15 @@ private static void checkNotAdvertisedWants(UploadPack up, } try (ObjectWalk objWalk = walk.toObjectWalkWithSameObjects()) { - List havesAsObjs = objectIdsToRevObjects(objWalk, - reachableFrom); + Stream startersAsObjs = importantRefsFirst(visibleRefs) + .map(UploadPack::refToObjectId) + .map(objId -> objectIdToRevObject(objWalk, objId)) + .filter(Objects::nonNull); // Ignore missing tips + ObjectReachabilityChecker reachabilityChecker = objWalk .createObjectReachabilityChecker(); Optional unreachable = reachabilityChecker - .areAllReachable(wantsAsObjs, havesAsObjs.stream()); + .areAllReachable(wantsAsObjs, startersAsObjs); if (unreachable.isPresent()) { throw new WantNotValidException(unreachable.get()); } @@ -2007,6 +2009,29 @@ private static RevCommit objectIdToRevCommit(RevWalk walk, } } + /** + * Translate an object id to a RevObject. + * + * @param walk + * walk on the relevant object storage + * @param objectId + * Object Id + * @return RevObject instance or null if the object is missing + */ + @Nullable + private static RevObject objectIdToRevObject(RevWalk walk, + ObjectId objectId) { + if (objectId == null) { + return null; + } + + try { + return walk.parseAny(objectId); + } catch (IOException e) { + return null; + } + } + // Resolve the ObjectIds into RevObjects. Any missing object raises an // exception private static List objectIdsToRevObjects(RevWalk walk,