diff --git a/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties b/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties index 8ca3d9ae8..e2bed1873 100644 --- a/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties +++ b/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties @@ -344,6 +344,7 @@ invalidPathReservedOnWindows=Invalid path (''{0}'' is reserved on Windows): {1} invalidReflogRevision=Invalid reflog revision: {0} invalidRefName=Invalid ref name: {0} invalidRemote=Invalid remote: {0} +invalidShallowObject=invalid shallow object {0}, expected commit invalidStageForPath=Invalid stage {0} for path {1} invalidTagOption=Invalid tag option: {0} invalidTimeout=Invalid timeout: {0} diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java index c227884d5..d6cf6e6a7 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java @@ -403,6 +403,7 @@ public static JGitText get() { /***/ public String invalidReflogRevision; /***/ public String invalidRefName; /***/ public String invalidRemote; + /***/ public String invalidShallowObject; /***/ public String invalidStageForPath; /***/ public String invalidTagOption; /***/ public String invalidTimeout; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java index afb208ecf..1176d958b 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java @@ -1406,6 +1406,8 @@ void carryFlagsImpl(final RevCommit c) { /** * Assume additional commits are shallow (have no parents). + *

+ * This method is a No-op if the collection is empty. * * @param ids * commits that should be treated as shallow commits, in addition 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 e0d900db8..101057fb4 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java @@ -735,6 +735,8 @@ else if (requestValidator instanceof AnyRequestValidator) else multiAck = MultiAck.OFF; + if (!clientShallowCommits.isEmpty()) + verifyClientShallow(); if (depth != 0) processShallow(); if (!clientShallowCommits.isEmpty()) @@ -820,6 +822,35 @@ private void processShallow() throws IOException { pckOut.end(); } + private void verifyClientShallow() + throws IOException, PackProtocolException { + AsyncRevObjectQueue q = walk.parseAny(clientShallowCommits, true); + try { + for (;;) { + try { + // Shallow objects named by the client must be commits. + RevObject o = q.next(); + if (o == null) { + break; + } + if (!(o instanceof RevCommit)) { + throw new PackProtocolException( + MessageFormat.format( + JGitText.get().invalidShallowObject, + o.name())); + } + } catch (MissingObjectException notCommit) { + // shallow objects not known at the server are ignored + // by git-core upload-pack, match that behavior. + clientShallowCommits.remove(notCommit.getObjectId()); + continue; + } + } + } finally { + q.release(); + } + } + /** * Generate an advertisement of available refs and capabilities. *