List of usage examples for org.eclipse.jgit.lib CommitBuilder addParentId
public void addParentId(AnyObjectId additionalParent)
From source file:com.google.gerrit.pgm.init.AllProjectsConfig.java
License:Apache License
private void save(PersonIdent ident, String msg) throws IOException { File path = getPath();/*from w w w. j a v a2s. c o m*/ if (path == null) { throw new IOException("All-Projects does not exist."); } Repository repo = new FileRepository(path); try { inserter = repo.newObjectInserter(); reader = repo.newObjectReader(); try { RevWalk rw = new RevWalk(reader); try { RevTree srcTree = revision != null ? rw.parseTree(revision) : null; newTree = readTree(srcTree); saveConfig(ProjectConfig.PROJECT_CONFIG, cfg); ObjectId res = newTree.writeTree(inserter); if (res.equals(srcTree)) { // If there are no changes to the content, don't create the commit. return; } CommitBuilder commit = new CommitBuilder(); commit.setAuthor(ident); commit.setCommitter(ident); commit.setMessage(msg); commit.setTreeId(res); if (revision != null) { commit.addParentId(revision); } ObjectId newRevision = inserter.insert(commit); updateRef(repo, ident, newRevision, "commit: " + msg); revision = newRevision; } finally { rw.release(); } } finally { if (inserter != null) { inserter.release(); inserter = null; } if (reader != null) { reader.release(); reader = null; } } } finally { repo.close(); } }
From source file:com.google.gerrit.pgm.init.api.AllProjectsConfig.java
License:Apache License
private void save(PersonIdent ident, String msg) throws IOException { File path = getPath();/*from www . ja va 2s . c o m*/ if (path == null) { throw new IOException("All-Projects does not exist."); } try (Repository repo = new FileRepository(path)) { inserter = repo.newObjectInserter(); reader = repo.newObjectReader(); try (RevWalk rw = new RevWalk(reader)) { RevTree srcTree = revision != null ? rw.parseTree(revision) : null; newTree = readTree(srcTree); saveConfig(ProjectConfig.PROJECT_CONFIG, cfg); saveGroupList(); ObjectId res = newTree.writeTree(inserter); if (res.equals(srcTree)) { // If there are no changes to the content, don't create the commit. return; } CommitBuilder commit = new CommitBuilder(); commit.setAuthor(ident); commit.setCommitter(ident); commit.setMessage(msg); commit.setTreeId(res); if (revision != null) { commit.addParentId(revision); } ObjectId newRevision = inserter.insert(commit); updateRef(repo, ident, newRevision, "commit: " + msg); revision = newRevision; } finally { if (inserter != null) { inserter.close(); inserter = null; } if (reader != null) { reader.close(); reader = null; } } } // we need to invalidate the JGit cache if the group list is invalidated in // an unattended init step RepositoryCache.clear(); }
From source file:com.google.gerrit.pgm.init.api.VersionedMetaDataOnInit.java
License:Apache License
protected void save(PersonIdent ident, String msg) throws IOException, ConfigInvalidException { File path = getPath();//from w w w.ja va 2 s . c o m if (path == null) { throw new IOException(project + " does not exist."); } try (Repository repo = new FileRepository(path); ObjectInserter i = repo.newObjectInserter(); ObjectReader r = repo.newObjectReader(); RevWalk rw = new RevWalk(r)) { inserter = i; reader = r; RevTree srcTree = revision != null ? rw.parseTree(revision) : null; newTree = readTree(srcTree); CommitBuilder commit = new CommitBuilder(); commit.setAuthor(ident); commit.setCommitter(ident); commit.setMessage(msg); onSave(commit); ObjectId res = newTree.writeTree(inserter); if (res.equals(srcTree)) { return; } commit.setTreeId(res); if (revision != null) { commit.addParentId(revision); } ObjectId newRevision = inserter.insert(commit); updateRef(repo, ident, newRevision, "commit: " + msg); revision = rw.parseCommit(newRevision); } finally { inserter = null; reader = null; } }
From source file:com.google.gerrit.pgm.init.VersionedAuthorizedKeysOnInit.java
License:Apache License
private void save(PersonIdent ident, String msg) throws IOException { File path = getPath();/*from w w w .j a va 2 s . c om*/ if (path == null) { throw new IOException(project + " does not exist."); } try (Repository repo = new FileRepository(path); ObjectInserter i = repo.newObjectInserter(); ObjectReader r = repo.newObjectReader(); RevWalk rw = new RevWalk(reader)) { inserter = i; reader = r; RevTree srcTree = revision != null ? rw.parseTree(revision) : null; newTree = readTree(srcTree); CommitBuilder commit = new CommitBuilder(); commit.setAuthor(ident); commit.setCommitter(ident); commit.setMessage(msg); onSave(commit); ObjectId res = newTree.writeTree(inserter); if (res.equals(srcTree)) { return; } commit.setTreeId(res); if (revision != null) { commit.addParentId(revision); } ObjectId newRevision = inserter.insert(commit); updateRef(repo, ident, newRevision, "commit: " + msg); revision = newRevision; } finally { inserter = null; reader = null; } }
From source file:com.google.gerrit.server.ChangeUtil.java
License:Apache License
public Change.Id revert(ChangeControl ctl, PatchSet.Id patchSetId, String message, PersonIdent myIdent, SshInfo sshInfo) throws NoSuchChangeException, OrmException, MissingObjectException, IncorrectObjectTypeException, IOException, InvalidChangeOperationException { Change.Id changeId = patchSetId.getParentKey(); PatchSet patch = db.get().patchSets().get(patchSetId); if (patch == null) { throw new NoSuchChangeException(changeId); }//from www .j a va 2 s . com Change changeToRevert = db.get().changes().get(changeId); Project.NameKey project = ctl.getChange().getProject(); try (Repository git = gitManager.openRepository(project); RevWalk revWalk = new RevWalk(git)) { RevCommit commitToRevert = revWalk.parseCommit(ObjectId.fromString(patch.getRevision().get())); PersonIdent authorIdent = user().newCommitterIdent(myIdent.getWhen(), myIdent.getTimeZone()); RevCommit parentToCommitToRevert = commitToRevert.getParent(0); revWalk.parseHeaders(parentToCommitToRevert); CommitBuilder revertCommitBuilder = new CommitBuilder(); revertCommitBuilder.addParentId(commitToRevert); revertCommitBuilder.setTreeId(parentToCommitToRevert.getTree()); revertCommitBuilder.setAuthor(authorIdent); revertCommitBuilder.setCommitter(authorIdent); if (message == null) { message = MessageFormat.format(ChangeMessages.get().revertChangeDefaultMessage, changeToRevert.getSubject(), patch.getRevision().get()); } ObjectId computedChangeId = ChangeIdUtil.computeChangeId(parentToCommitToRevert.getTree(), commitToRevert, authorIdent, myIdent, message); revertCommitBuilder.setMessage(ChangeIdUtil.insertId(message, computedChangeId, true)); RevCommit revertCommit; try (ObjectInserter oi = git.newObjectInserter()) { ObjectId id = oi.insert(revertCommitBuilder); oi.flush(); revertCommit = revWalk.parseCommit(id); } RefControl refControl = ctl.getRefControl(); Change change = new Change(new Change.Key("I" + computedChangeId.name()), new Change.Id(db.get().nextChangeId()), user().getAccountId(), changeToRevert.getDest(), TimeUtil.nowTs()); change.setTopic(changeToRevert.getTopic()); ChangeInserter ins = changeInserterFactory.create(refControl.getProjectControl(), change, revertCommit); PatchSet ps = ins.getPatchSet(); String ref = refControl.getRefName(); String cmdRef = MagicBranch.NEW_PUBLISH_CHANGE + ref.substring(ref.lastIndexOf('/') + 1); CommitReceivedEvent commitReceivedEvent = new CommitReceivedEvent( new ReceiveCommand(ObjectId.zeroId(), revertCommit.getId(), cmdRef), refControl.getProjectControl().getProject(), refControl.getRefName(), revertCommit, user()); try { commitValidatorsFactory.create(refControl, sshInfo, git) .validateForGerritCommits(commitReceivedEvent); } catch (CommitValidationException e) { throw new InvalidChangeOperationException(e.getMessage()); } RefUpdate ru = git.updateRef(ps.getRefName()); ru.setExpectedOldObjectId(ObjectId.zeroId()); ru.setNewObjectId(revertCommit); ru.disableRefLog(); if (ru.update(revWalk) != RefUpdate.Result.NEW) { throw new IOException(String.format("Failed to create ref %s in %s: %s", ps.getRefName(), change.getDest().getParentKey().get(), ru.getResult())); } ChangeMessage cmsg = new ChangeMessage(new ChangeMessage.Key(changeId, messageUUID(db.get())), user().getAccountId(), TimeUtil.nowTs(), patchSetId); StringBuilder msgBuf = new StringBuilder(); msgBuf.append("Patch Set ").append(patchSetId.get()).append(": Reverted"); msgBuf.append("\n\n"); msgBuf.append("This patchset was reverted in change: ").append(change.getKey().get()); cmsg.setMessage(msgBuf.toString()); ins.setMessage(cmsg).insert(); try { RevertedSender cm = revertedSenderFactory.create(change.getId()); cm.setFrom(user().getAccountId()); cm.setChangeMessage(cmsg); cm.send(); } catch (Exception err) { log.error("Cannot send email for revert change " + change.getId(), err); } return change.getId(); } catch (RepositoryNotFoundException e) { throw new NoSuchChangeException(changeId, e); } }
From source file:com.google.gerrit.server.edit.ChangeEditModifier.java
License:Apache License
/** * Rebase change edit on latest patch set * * @param edit change edit that contains edit to rebase * @param current patch set to rebase the edit on * @throws AuthException/* w w w . jav a2s .c om*/ * @throws ResourceConflictException thrown if rebase fails due to merge conflicts * @throws InvalidChangeOperationException * @throws IOException */ public void rebaseEdit(ChangeEdit edit, PatchSet current) throws AuthException, ResourceConflictException, InvalidChangeOperationException, IOException { if (!currentUser.get().isIdentifiedUser()) { throw new AuthException("Authentication required"); } Change change = edit.getChange(); IdentifiedUser me = (IdentifiedUser) currentUser.get(); String refName = RefNames.refsEdit(me.getAccountId(), change.getId(), current.getId()); try (Repository repo = gitManager.openRepository(change.getProject()); RevWalk rw = new RevWalk(repo); ObjectInserter inserter = repo.newObjectInserter()) { BatchRefUpdate ru = repo.getRefDatabase().newBatchUpdate(); RevCommit editCommit = edit.getEditCommit(); if (editCommit.getParentCount() == 0) { throw new InvalidChangeOperationException("Rebase edit against root commit not supported"); } RevCommit tip = rw.parseCommit(ObjectId.fromString(current.getRevision().get())); ThreeWayMerger m = MergeStrategy.RESOLVE.newMerger(repo, true); m.setObjectInserter(inserter); m.setBase(ObjectId.fromString(edit.getBasePatchSet().getRevision().get())); if (m.merge(tip, editCommit)) { ObjectId tree = m.getResultTreeId(); CommitBuilder commit = new CommitBuilder(); commit.setTreeId(tree); for (int i = 0; i < tip.getParentCount(); i++) { commit.addParentId(tip.getParent(i)); } commit.setAuthor(editCommit.getAuthorIdent()); commit.setCommitter(new PersonIdent(editCommit.getCommitterIdent(), TimeUtil.nowTs())); commit.setMessage(editCommit.getFullMessage()); ObjectId newEdit = inserter.insert(commit); inserter.flush(); ru.addCommand(new ReceiveCommand(ObjectId.zeroId(), newEdit, refName)); ru.addCommand( new ReceiveCommand(edit.getRef().getObjectId(), ObjectId.zeroId(), edit.getRefName())); ru.execute(rw, NullProgressMonitor.INSTANCE); for (ReceiveCommand cmd : ru.getCommands()) { if (cmd.getResult() != ReceiveCommand.Result.OK) { throw new IOException("failed: " + cmd); } } } else { // TODO(davido): Allow to resolve conflicts inline throw new ResourceConflictException("merge conflict"); } } }
From source file:com.google.gerrit.server.edit.ChangeEditUtil.java
License:Apache License
private static RevCommit writeSquashedCommit(RevWalk rw, ObjectInserter inserter, RevCommit parent, RevCommit edit) throws IOException { CommitBuilder mergeCommit = new CommitBuilder(); for (int i = 0; i < parent.getParentCount(); i++) { mergeCommit.addParentId(parent.getParent(i)); }/*from w w w . j a v a 2 s.c o m*/ mergeCommit.setAuthor(parent.getAuthorIdent()); mergeCommit.setMessage(edit.getFullMessage()); mergeCommit.setCommitter(edit.getCommitterIdent()); mergeCommit.setTreeId(edit.getTree()); return rw.parseCommit(commit(inserter, mergeCommit)); }
From source file:com.google.gerrit.server.git.VersionedMetaData.java
License:Apache License
/** * Open a batch of updates to the same metadata ref. * <p>/*from ww w . j a v a 2 s . c om*/ * This allows making multiple commits to a single metadata ref, at the end of * which is a single ref update. For batching together updates to multiple * refs (each consisting of one or more commits against their respective * refs), create the {@link MetaDataUpdate} with a {@link BatchRefUpdate}. * <p> * A ref update produced by this {@link BatchMetaDataUpdate} is only committed * if there is no associated {@link BatchRefUpdate}. As a result, the * configured ref updated event is not fired if there is an associated batch. * * @param update helper info about the update. * @throws IOException if the update failed. */ public BatchMetaDataUpdate openUpdate(final MetaDataUpdate update) throws IOException { final Repository db = update.getRepository(); reader = db.newObjectReader(); inserter = db.newObjectInserter(); final RevWalk rw = new RevWalk(reader); final RevTree tree = revision != null ? rw.parseTree(revision) : null; newTree = readTree(tree); return new BatchMetaDataUpdate() { AnyObjectId src = revision; AnyObjectId srcTree = tree; @Override public void write(CommitBuilder commit) throws IOException { write(VersionedMetaData.this, commit); } private boolean doSave(VersionedMetaData config, CommitBuilder commit) throws IOException { DirCache nt = config.newTree; ObjectReader r = config.reader; ObjectInserter i = config.inserter; try { config.newTree = newTree; config.reader = reader; config.inserter = inserter; return config.onSave(commit); } catch (ConfigInvalidException e) { throw new IOException( "Cannot update " + getRefName() + " in " + db.getDirectory() + ": " + e.getMessage(), e); } finally { config.newTree = nt; config.reader = r; config.inserter = i; } } @Override public void write(VersionedMetaData config, CommitBuilder commit) throws IOException { if (!doSave(config, commit)) { return; } // Reuse tree from parent commit unless there are contents in newTree or // there is no tree for a parent commit. ObjectId res = newTree.getEntryCount() != 0 || srcTree == null ? newTree.writeTree(inserter) : srcTree.copy(); if (res.equals(srcTree) && !update.allowEmpty() && (commit.getTreeId() == null)) { // If there are no changes to the content, don't create the commit. return; } // If changes are made to the DirCache and those changes are written as // a commit and then the tree ID is set for the CommitBuilder, then // those previous DirCache changes will be ignored and the commit's // tree will be replaced with the ID in the CommitBuilder. The same is // true if you explicitly set tree ID in a commit and then make changes // to the DirCache; that tree ID will be ignored and replaced by that of // the tree for the updated DirCache. if (commit.getTreeId() == null) { commit.setTreeId(res); } else { // In this case, the caller populated the tree without using DirCache. res = commit.getTreeId(); } if (src != null) { commit.addParentId(src); } if (update.insertChangeId()) { ObjectId id = ChangeIdUtil.computeChangeId(res, getRevision(), commit.getAuthor(), commit.getCommitter(), commit.getMessage()); commit.setMessage(ChangeIdUtil.insertId(commit.getMessage(), id)); } src = inserter.insert(commit); srcTree = res; } @Override public RevCommit createRef(String refName) throws IOException { if (Objects.equals(src, revision)) { return revision; } return updateRef(ObjectId.zeroId(), src, refName); } @Override public void removeRef(String refName) throws IOException { RefUpdate ru = db.updateRef(refName); ru.setForceUpdate(true); if (revision != null) { ru.setExpectedOldObjectId(revision); } RefUpdate.Result result = ru.delete(); switch (result) { case FORCED: update.fireGitRefUpdatedEvent(ru); return; default: throw new IOException( "Cannot delete " + ru.getName() + " in " + db.getDirectory() + ": " + ru.getResult()); } } @Override public RevCommit commit() throws IOException { return commitAt(revision); } @Override public RevCommit commitAt(ObjectId expected) throws IOException { if (Objects.equals(src, expected)) { return revision; } return updateRef(MoreObjects.firstNonNull(expected, ObjectId.zeroId()), src, getRefName()); } @Override public void close() { newTree = null; rw.close(); if (inserter != null) { inserter.close(); inserter = null; } if (reader != null) { reader.close(); reader = null; } } private RevCommit updateRef(AnyObjectId oldId, AnyObjectId newId, String refName) throws IOException { BatchRefUpdate bru = update.getBatch(); if (bru != null) { bru.addCommand(new ReceiveCommand(oldId.toObjectId(), newId.toObjectId(), refName)); inserter.flush(); revision = rw.parseCommit(newId); return revision; } RefUpdate ru = db.updateRef(refName); ru.setExpectedOldObjectId(oldId); ru.setNewObjectId(src); ru.setRefLogIdent(update.getCommitBuilder().getAuthor()); String message = update.getCommitBuilder().getMessage(); if (message == null) { message = "meta data update"; } try (BufferedReader reader = new BufferedReader(new StringReader(message))) { // read the subject line and use it as reflog message ru.setRefLogMessage("commit: " + reader.readLine(), true); } inserter.flush(); RefUpdate.Result result = ru.update(); switch (result) { case NEW: case FAST_FORWARD: revision = rw.parseCommit(ru.getNewObjectId()); update.fireGitRefUpdatedEvent(ru); return revision; default: throw new IOException( "Cannot update " + ru.getName() + " in " + db.getDirectory() + ": " + ru.getResult()); } } }; }
From source file:com.google.gerrit.server.patch.AutoMerger.java
License:Apache License
private RevCommit commit(Repository repo, RevWalk rw, ObjectInserter ins, String refName, ObjectId tree, RevCommit merge) throws IOException { rw.parseHeaders(merge);// w w w . j av a 2 s.co m // For maximum stability, choose a single ident using the committer time of // the input commit, using the server name and timezone. PersonIdent ident = new PersonIdent(gerritIdent, merge.getCommitterIdent().getWhen(), gerritIdent.getTimeZone()); CommitBuilder cb = new CommitBuilder(); cb.setAuthor(ident); cb.setCommitter(ident); cb.setTreeId(tree); cb.setMessage("Auto-merge of " + merge.name() + '\n'); for (RevCommit p : merge.getParents()) { cb.addParentId(p); } ObjectId commitId; commitId = ins.insert(cb); if (save) { ins.flush(); RefUpdate ru = repo.updateRef(refName); ru.setNewObjectId(commitId); ru.disableRefLog(); ru.forceUpdate(); } return rw.parseCommit(commitId); }
From source file:com.google.gerrit.server.schema.Schema_65.java
License:Apache License
@Override protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException { Repository git;//from ww w . j a v a2 s .com try { git = mgr.openRepository(allProjects); } catch (IOException e) { throw new OrmException(e); } try { MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, allProjects, git); ProjectConfig config = ProjectConfig.read(md); Map<Integer, ContributorAgreement> agreements = getAgreementToAdd(db, config); if (agreements.isEmpty()) { return; } ui.message("Moved contributor agreements to project.config"); // Create the auto verify groups. List<AccountGroup.UUID> adminGroupUUIDs = getAdministrateServerGroups(db, config); for (ContributorAgreement agreement : agreements.values()) { if (agreement.getAutoVerify() != null) { getOrCreateGroupForIndividuals(db, config, adminGroupUUIDs, agreement); } } // Scan AccountAgreement long minTime = addAccountAgreements(db, config, adminGroupUUIDs, agreements); ProjectConfig base = ProjectConfig.read(md, null); for (ContributorAgreement agreement : agreements.values()) { base.replace(agreement); } base.getAccountsSection().setSameGroupVisibility(config.getAccountsSection().getSameGroupVisibility()); BatchMetaDataUpdate batch = base.openUpdate(md); try { // Scan AccountGroupAgreement List<AccountGroupAgreement> groupAgreements = getAccountGroupAgreements(db, agreements); // Find the earliest change for (AccountGroupAgreement aga : groupAgreements) { minTime = Math.min(minTime, aga.getTime()); } minTime -= 60 * 1000; // 1 Minute CommitBuilder commit = new CommitBuilder(); commit.setAuthor(new PersonIdent(serverUser, new Date(minTime))); commit.setCommitter(new PersonIdent(serverUser, new Date(minTime))); commit.setMessage("Add the ContributorAgreements for upgrade to Gerrit Code Review schema 65\n"); batch.write(commit); for (AccountGroupAgreement aga : groupAgreements) { AccountGroup group = db.accountGroups().get(aga.groupId); if (group == null) { continue; } ContributorAgreement agreement = agreements.get(aga.claId); agreement.getAccepted().add(new PermissionRule(config.resolve(group))); base.replace(agreement); PersonIdent ident = null; if (aga.reviewedBy != null) { Account ua = db.accounts().get(aga.reviewedBy); if (ua != null) { String name = ua.getFullName(); String email = ua.getPreferredEmail(); if (email == null || email.isEmpty()) { // No preferred email is configured. Use a generic identity so we // don't leak an address the user may have given us, but doesn't // necessarily want to publish through Git records. // String user = ua.getUserName(); if (user == null || user.isEmpty()) { user = "account-" + ua.getId().toString(); } String host = SystemReader.getInstance().getHostname(); email = user + "@" + host; } if (name == null || name.isEmpty()) { final int at = email.indexOf('@'); if (0 < at) { name = email.substring(0, at); } else { name = anonymousCowardName; } } ident = new PersonIdent(name, email, new Date(aga.getTime()), TimeZone.getDefault()); } } if (ident == null) { ident = new PersonIdent(serverUser, new Date(aga.getTime())); } // Build the commits such that it keeps track of the date added and // who added it. commit = new CommitBuilder(); commit.setAuthor(ident); commit.setCommitter(new PersonIdent(serverUser, new Date(aga.getTime()))); String msg = String.format("Accept %s contributor agreement for %s\n", agreement.getName(), group.getName()); if (!Strings.isNullOrEmpty(aga.reviewComments)) { msg += "\n" + aga.reviewComments + "\n"; } commit.setMessage(msg); batch.write(commit); } // Merge the agreements with the other data in project.config. commit = new CommitBuilder(); commit.setAuthor(serverUser); commit.setCommitter(serverUser); commit.setMessage("Upgrade to Gerrit Code Review schema 65\n"); commit.addParentId(config.getRevision()); batch.write(config, commit); // Save the the final metadata. batch.commitAt(config.getRevision()); } finally { batch.close(); } } catch (IOException e) { throw new OrmException(e); } catch (ConfigInvalidException e) { throw new OrmException(e); } finally { git.close(); } }