From 1471fb4e0ff76e9254fa82080b9a03aee0e7b30c Mon Sep 17 00:00:00 2001 From: Greg Hill Date: Fri, 26 Jul 2013 12:08:31 -0700 Subject: [PATCH] Change RequestValidator parameter to ObjectId list Instead of RevObject list, this allows a custom request validator to be called on SHA-1's corresponding to objects that may not exist in repository storage Change-Id: I19bb667beff0d0c144150a61d7a1dc6c9703be7f Signed-off-by: Greg Hill --- .../eclipse/jgit/transport/UploadPack.java | 55 ++++++++++++------- 1 file changed, 34 insertions(+), 21 deletions(-) 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 0d23cf792..836376ce1 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java @@ -161,7 +161,7 @@ public class UploadPack { * if a low-level exception occurred. * @since 3.1 */ - void checkWants(UploadPack up, List wants) + void checkWants(UploadPack up, List wants) throws PackProtocolException, IOException; } @@ -1034,16 +1034,21 @@ public class UploadPack { } private void parseWants() throws IOException { + List notAdvertisedWants = null; + for (ObjectId obj : wantIds) { + if (!advertised.contains(obj)) { + if (notAdvertisedWants == null) + notAdvertisedWants = new ArrayList(); + notAdvertisedWants.add(obj); + } + } + if (notAdvertisedWants != null) + requestValidator.checkWants(this, notAdvertisedWants); + AsyncRevObjectQueue q = walk.parseAny(wantIds, true); try { - List notAdvertisedWants = null; RevObject obj; while ((obj = q.next()) != null) { - if (!advertised.contains(obj)) { - if (notAdvertisedWants == null) - notAdvertisedWants = new ArrayList(); - notAdvertisedWants.add(obj); - } want(obj); if (!(obj instanceof RevCommit)) @@ -1054,8 +1059,6 @@ public class UploadPack { want(obj); } } - if (notAdvertisedWants != null) - requestValidator.checkWants(this, notAdvertisedWants); wantIds.clear(); } catch (MissingObjectException notFound) { ObjectId id = notFound.getObjectId(); @@ -1080,7 +1083,7 @@ public class UploadPack { */ public static final class AdvertisedRequestValidator implements RequestValidator { - public void checkWants(UploadPack up, List wants) + public void checkWants(UploadPack up, List wants) throws PackProtocolException, IOException { if (!up.isBiDirectionalPipe()) new ReachableCommitRequestValidator().checkWants(up, wants); @@ -1097,7 +1100,7 @@ public class UploadPack { */ public static final class ReachableCommitRequestValidator implements RequestValidator { - public void checkWants(UploadPack up, List wants) + public void checkWants(UploadPack up, List wants) throws PackProtocolException, IOException { checkNotAdvertisedWants(up.getRevWalk(), wants, refIdSet(up.getAdvertisedRefs().values())); @@ -1110,14 +1113,14 @@ public class UploadPack { * @since 3.1 */ public static final class TipRequestValidator implements RequestValidator { - public void checkWants(UploadPack up, List wants) + public void checkWants(UploadPack up, List wants) throws PackProtocolException, IOException { if (!up.isBiDirectionalPipe()) new ReachableCommitTipRequestValidator().checkWants(up, wants); else if (!wants.isEmpty()) { Set refIds = refIdSet(up.getRepository().getAllRefs().values()); - for (RevObject obj : wants) { + for (ObjectId obj : wants) { if (!refIds.contains(obj)) throw new PackProtocolException(MessageFormat.format( JGitText.get().wantNotValid, obj.name())); @@ -1133,7 +1136,7 @@ public class UploadPack { */ public static final class ReachableCommitTipRequestValidator implements RequestValidator { - public void checkWants(UploadPack up, List wants) + public void checkWants(UploadPack up, List wants) throws PackProtocolException, IOException { checkNotAdvertisedWants(up.getRevWalk(), wants, refIdSet(up.getRepository().getAllRefs().values())); @@ -1146,14 +1149,14 @@ public class UploadPack { * @since 3.1 */ public static final class AnyRequestValidator implements RequestValidator { - public void checkWants(UploadPack up, List wants) + public void checkWants(UploadPack up, List wants) throws PackProtocolException, IOException { // All requests are valid. } } private static void checkNotAdvertisedWants(RevWalk walk, - List notAdvertisedWants, Set reachableFrom) + List notAdvertisedWants, Set reachableFrom) throws MissingObjectException, IncorrectObjectTypeException, IOException { // Walk the requested commits back to the provided set of commits. If any // commit exists, a branch was deleted or rewound and the repository owner @@ -1161,11 +1164,21 @@ public class UploadPack { // into an advertised branch it will be marked UNINTERESTING and no commits // return. - for (RevObject obj : notAdvertisedWants) { - if (!(obj instanceof RevCommit)) - throw new PackProtocolException(MessageFormat.format( - JGitText.get().wantNotValid, obj.name())); - walk.markStart((RevCommit) obj); + AsyncRevObjectQueue q = walk.parseAny(notAdvertisedWants, true); + try { + RevObject obj; + while ((obj = q.next()) != null) { + if (!(obj instanceof RevCommit)) + throw new PackProtocolException(MessageFormat.format( + JGitText.get().wantNotValid, obj.name())); + walk.markStart((RevCommit) obj); + } + } catch (MissingObjectException notFound) { + ObjectId id = notFound.getObjectId(); + throw new PackProtocolException(MessageFormat.format( + JGitText.get().wantNotValid, id.name()), notFound); + } finally { + q.release(); } for (ObjectId id : reachableFrom) { try {