List of usage examples for org.eclipse.jgit.revwalk RevWalk getRevFilter
@NonNull
public RevFilter getRevFilter()
From source file:com.google.gerrit.server.git.ReceiveCommits.java
License:Apache License
private void parseMagicBranch(final ReceiveCommand cmd) { // Permit exactly one new change request per push. if (magicBranch != null) { reject(cmd, "duplicate request"); return;//from w w w . j a v a 2s . co m } magicBranch = new MagicBranchInput(cmd, labelTypes, notesMigration); magicBranch.reviewer.addAll(reviewersFromCommandLine); magicBranch.cc.addAll(ccFromCommandLine); String ref; CmdLineParser clp = optionParserFactory.create(magicBranch); magicBranch.clp = clp; try { ref = magicBranch.parse(clp, repo, rp.getAdvertisedRefs().keySet()); } catch (CmdLineException e) { if (!clp.wasHelpRequestedByOption()) { reject(cmd, e.getMessage()); return; } ref = null; // never happen } if (clp.wasHelpRequestedByOption()) { StringWriter w = new StringWriter(); w.write("\nHelp for refs/for/branch:\n\n"); clp.printUsage(w, null); addMessage(w.toString()); reject(cmd, "see help"); return; } if (!rp.getAdvertisedRefs().containsKey(ref) && !ref.equals(readHEAD(repo))) { if (ref.startsWith(Constants.R_HEADS)) { String n = ref.substring(Constants.R_HEADS.length()); reject(cmd, "branch " + n + " not found"); } else { reject(cmd, ref + " not found"); } return; } magicBranch.dest = new Branch.NameKey(project.getNameKey(), ref); magicBranch.ctl = projectControl.controlForRef(ref); if (!magicBranch.ctl.canWrite()) { reject(cmd, "project is read only"); return; } if (magicBranch.draft) { if (!receiveConfig.allowDrafts) { errors.put(Error.CODE_REVIEW, ref); reject(cmd, "draft workflow is disabled"); return; } else if (projectControl.controlForRef("refs/drafts/" + ref).isBlocked(Permission.PUSH)) { errors.put(Error.CODE_REVIEW, ref); reject(cmd, "cannot upload drafts"); return; } } if (!magicBranch.ctl.canUpload()) { errors.put(Error.CODE_REVIEW, ref); reject(cmd, "cannot upload review"); return; } if (magicBranch.draft && magicBranch.submit) { reject(cmd, "cannot submit draft"); return; } if (magicBranch.submit && !projectControl.controlForRef(MagicBranch.NEW_CHANGE + ref).canSubmit()) { reject(cmd, "submit not allowed"); return; } RevWalk walk = rp.getRevWalk(); RevCommit tip; try { tip = walk.parseCommit(magicBranch.cmd.getNewId()); } catch (IOException ex) { magicBranch.cmd.setResult(REJECTED_MISSING_OBJECT); log.error("Invalid pack upload; one or more objects weren't sent", ex); return; } // If tip is a merge commit, or the root commit or // if %base was specified, ignore newChangeForAllNotInTarget if (tip.getParentCount() > 1 || magicBranch.base != null || tip.getParentCount() == 0) { newChangeForAllNotInTarget = false; } if (magicBranch.base != null) { magicBranch.baseCommit = Lists.newArrayListWithCapacity(magicBranch.base.size()); for (ObjectId id : magicBranch.base) { try { magicBranch.baseCommit.add(walk.parseCommit(id)); } catch (IncorrectObjectTypeException notCommit) { reject(cmd, "base must be a commit"); return; } catch (MissingObjectException e) { reject(cmd, "base not found"); return; } catch (IOException e) { log.warn(String.format("Project %s cannot read %s", project.getName(), id.name()), e); reject(cmd, "internal server error"); return; } } } else if (newChangeForAllNotInTarget) { String destBranch = magicBranch.dest.get(); try { Ref r = repo.getRefDatabase().exactRef(destBranch); if (r == null) { reject(cmd, destBranch + " not found"); return; } ObjectId baseHead = r.getObjectId(); magicBranch.baseCommit = Collections.singletonList(walk.parseCommit(baseHead)); } catch (IOException ex) { log.warn(String.format("Project %s cannot read %s", project.getName(), destBranch), ex); reject(cmd, "internal server error"); return; } } // Validate that the new commits are connected with the target // branch. If they aren't, we want to abort. We do this check by // looking to see if we can compute a merge base between the new // commits and the target branch head. // try { Ref targetRef = rp.getAdvertisedRefs().get(magicBranch.ctl.getRefName()); if (targetRef == null || targetRef.getObjectId() == null) { // The destination branch does not yet exist. Assume the // history being sent for review will start it and thus // is "connected" to the branch. return; } final RevCommit h = walk.parseCommit(targetRef.getObjectId()); final RevFilter oldRevFilter = walk.getRevFilter(); try { walk.reset(); walk.setRevFilter(RevFilter.MERGE_BASE); walk.markStart(tip); walk.markStart(h); if (walk.next() == null) { reject(magicBranch.cmd, "no common ancestry"); } } finally { walk.reset(); walk.setRevFilter(oldRevFilter); } } catch (IOException e) { magicBranch.cmd.setResult(REJECTED_MISSING_OBJECT); log.error("Invalid pack upload; one or more objects weren't sent", e); } }