List of usage examples for org.eclipse.jgit.lib RefUpdate setRefLogIdent
public void setRefLogIdent(PersonIdent pi)
From source file:com.google.gerrit.server.git.MergeOp.java
License:Apache License
private RefUpdate updateBranch(Branch.NameKey destBranch) throws MergeException { RefUpdate branchUpdate = getPendingRefUpdate(destBranch); CodeReviewCommit branchTip = getBranchTip(destBranch); MergeTip mergeTip = mergeTips.get(destBranch); CodeReviewCommit currentTip = mergeTip != null ? mergeTip.getCurrentTip() : null; if (Objects.equals(branchTip, currentTip)) { if (currentTip != null) { logDebug("Branch already at merge tip {}, no update to perform", currentTip.name()); } else {/*www . ja v a 2 s . c om*/ logDebug("Both branch and merge tip are nonexistent, no update"); } return null; } else if (currentTip == null) { logDebug("No merge tip, no update to perform"); return null; } if (RefNames.REFS_CONFIG.equals(branchUpdate.getName())) { logDebug("Loading new configuration from {}", RefNames.REFS_CONFIG); try { ProjectConfig cfg = new ProjectConfig(destProject.getProject().getNameKey()); cfg.load(repo, currentTip); } catch (Exception e) { throw new MergeException("Submit would store invalid" + " project configuration " + currentTip.name() + " for " + destProject.getProject().getName(), e); } } branchUpdate.setRefLogIdent(refLogIdent); branchUpdate.setForceUpdate(false); branchUpdate.setNewObjectId(currentTip); branchUpdate.setRefLogMessage("merged", true); try { RefUpdate.Result result = branchUpdate.update(rw); logDebug("Update of {}: {}..{} returned status {}", branchUpdate.getName(), branchUpdate.getOldObjectId(), branchUpdate.getNewObjectId(), result); switch (result) { case NEW: case FAST_FORWARD: if (branchUpdate.getResult() == RefUpdate.Result.FAST_FORWARD) { tagCache.updateFastForward(destBranch.getParentKey(), branchUpdate.getName(), branchUpdate.getOldObjectId(), currentTip); } if (RefNames.REFS_CONFIG.equals(branchUpdate.getName())) { Project p = destProject.getProject(); projectCache.evict(p); destProject = projectCache.get(p.getNameKey()); repoManager.setProjectDescription(p.getNameKey(), p.getDescription()); } return branchUpdate; case LOCK_FAILURE: throw new MergeException("Failed to lock " + branchUpdate.getName()); default: throw new IOException(branchUpdate.getResult().name() + '\n' + branchUpdate); } } catch (IOException e) { throw new MergeException("Cannot update " + branchUpdate.getName(), e); } }
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 www . ja va 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.project.CreateBranch.java
License:Apache License
@Override public BranchInfo apply(ProjectResource rsrc, Input input) throws BadRequestException, AuthException, ResourceConflictException, IOException { if (input == null) { input = new Input(); }//from w w w . j a v a 2 s. co m if (input.ref != null && !ref.equals(input.ref)) { throw new BadRequestException("ref must match URL"); } if (input.revision == null) { input.revision = Constants.HEAD; } while (ref.startsWith("/")) { ref = ref.substring(1); } ref = RefNames.fullName(ref); if (!Repository.isValidRefName(ref)) { throw new BadRequestException("invalid branch name \"" + ref + "\""); } if (MagicBranch.isMagicBranch(ref)) { throw new BadRequestException( "not allowed to create branches under \"" + MagicBranch.getMagicRefNamePrefix(ref) + "\""); } final Branch.NameKey name = new Branch.NameKey(rsrc.getNameKey(), ref); final RefControl refControl = rsrc.getControl().controlForRef(name); try (Repository repo = repoManager.openRepository(rsrc.getNameKey())) { final ObjectId revid = parseBaseRevision(repo, rsrc.getNameKey(), input.revision); final RevWalk rw = verifyConnected(repo, revid); RevObject object = rw.parseAny(revid); if (ref.startsWith(Constants.R_HEADS)) { // Ensure that what we start the branch from is a commit. If we // were given a tag, deference to the commit instead. // try { object = rw.parseCommit(object); } catch (IncorrectObjectTypeException notCommit) { throw new BadRequestException("\"" + input.revision + "\" not a commit"); } } rw.reset(); if (!refControl.canCreate(db.get(), rw, object)) { throw new AuthException("Cannot create \"" + ref + "\""); } try { final RefUpdate u = repo.updateRef(ref); u.setExpectedOldObjectId(ObjectId.zeroId()); u.setNewObjectId(object.copy()); u.setRefLogIdent(identifiedUser.get().newRefLogIdent()); u.setRefLogMessage("created via REST from " + input.revision, false); final RefUpdate.Result result = u.update(rw); switch (result) { case FAST_FORWARD: case NEW: case NO_CHANGE: referenceUpdated.fire(name.getParentKey(), u, ReceiveCommand.Type.CREATE); hooks.doRefUpdatedHook(name, u, identifiedUser.get().getAccount()); break; case LOCK_FAILURE: if (repo.getRefDatabase().exactRef(ref) != null) { throw new ResourceConflictException("branch \"" + ref + "\" already exists"); } String refPrefix = getRefPrefix(ref); while (!Constants.R_HEADS.equals(refPrefix)) { if (repo.getRefDatabase().exactRef(refPrefix) != null) { throw new ResourceConflictException("Cannot create branch \"" + ref + "\" since it conflicts with branch \"" + refPrefix + "\"."); } refPrefix = getRefPrefix(refPrefix); } //$FALL-THROUGH$ default: { throw new IOException(result.name()); } } BranchInfo info = new BranchInfo(); info.ref = ref; info.revision = revid.getName(); info.canDelete = refControl.canDelete() ? true : null; return info; } catch (IOException err) { log.error("Cannot create branch \"" + name + "\"", err); throw err; } } catch (InvalidRevisionException e) { throw new BadRequestException("invalid revision \"" + input.revision + "\""); } }
From source file:com.google.gerrit.server.project.SetHead.java
License:Apache License
@Override public String apply(final ProjectResource rsrc, Input input) throws AuthException, ResourceNotFoundException, BadRequestException, UnprocessableEntityException, IOException { if (!rsrc.getControl().isOwner()) { throw new AuthException("restricted to project owner"); }//from w w w. j a va 2s. c om if (input == null || Strings.isNullOrEmpty(input.ref)) { throw new BadRequestException("ref required"); } String ref = RefNames.fullName(input.ref); try (Repository repo = repoManager.openRepository(rsrc.getNameKey())) { Map<String, Ref> cur = repo.getRefDatabase().exactRef(Constants.HEAD, ref); if (!cur.containsKey(ref)) { throw new UnprocessableEntityException(String.format("Ref Not Found: %s", ref)); } final String oldHead = cur.get(Constants.HEAD).getTarget().getName(); final String newHead = ref; if (!oldHead.equals(newHead)) { final RefUpdate u = repo.updateRef(Constants.HEAD, true); u.setRefLogIdent(identifiedUser.get().newRefLogIdent()); RefUpdate.Result res = u.link(newHead); switch (res) { case NO_CHANGE: case RENAMED: case FORCED: case NEW: break; default: throw new IOException("Setting HEAD failed with " + res); } HeadUpdatedListener.Event event = new HeadUpdatedListener.Event() { @Override public String getProjectName() { return rsrc.getNameKey().get(); } @Override public String getOldHeadName() { return oldHead; } @Override public String getNewHeadName() { return newHead; } }; for (HeadUpdatedListener l : headUpdatedListener) { try { l.onHeadUpdated(event); } catch (RuntimeException e) { log.warn("Failure in HeadUpdatedListener", e); } } } return ref; } catch (RepositoryNotFoundException e) { throw new ResourceNotFoundException(rsrc.getName()); } }
From source file:com.google.gerrit.server.schema.Schema_146.java
License:Apache License
private void rewriteUserBranch(Repository repo, RevWalk rw, ObjectInserter oi, ObjectId emptyTree, Ref ref, Account account) throws IOException { ObjectId current = createInitialEmptyCommit(oi, emptyTree, account.getRegisteredOn()); rw.reset();/* ww w.j a v a2s. com*/ rw.sort(RevSort.TOPO); rw.sort(RevSort.REVERSE, true); rw.markStart(rw.parseCommit(ref.getObjectId())); RevCommit c; while ((c = rw.next()) != null) { if (isInitialEmptyCommit(emptyTree, c)) { return; } CommitBuilder cb = new CommitBuilder(); cb.setParentId(current); cb.setTreeId(c.getTree()); cb.setAuthor(c.getAuthorIdent()); cb.setCommitter(c.getCommitterIdent()); cb.setMessage(c.getFullMessage()); cb.setEncoding(c.getEncoding()); current = oi.insert(cb); } oi.flush(); RefUpdate ru = repo.updateRef(ref.getName()); ru.setExpectedOldObjectId(ref.getObjectId()); ru.setNewObjectId(current); ru.setForceUpdate(true); ru.setRefLogIdent(serverIdent); ru.setRefLogMessage(getClass().getSimpleName(), true); Result result = ru.update(); if (result != Result.FORCED) { throw new IOException(String.format("Failed to update ref %s: %s", ref.getName(), result.name())); } }
From source file:com.google.gerrit.server.StarredChangesUtil.java
License:Apache License
public void unstar(Account.Id accountId, Project.NameKey project, Change.Id changeId) throws OrmException { try (Repository repo = repoManager.openRepository(allUsers); RevWalk rw = new RevWalk(repo)) { RefUpdate u = repo.updateRef(RefNames.refsStarredChanges(changeId, accountId)); u.setForceUpdate(true);//from www .ja v a2s . com u.setRefLogIdent(serverIdent); u.setRefLogMessage("Unstar change " + changeId.get(), true); RefUpdate.Result result = u.delete(); switch (result) { case FORCED: indexer.index(dbProvider.get(), project, changeId); return; case FAST_FORWARD: case IO_FAILURE: case LOCK_FAILURE: case NEW: case NOT_ATTEMPTED: case NO_CHANGE: case REJECTED: case REJECTED_CURRENT_BRANCH: case RENAMED: default: throw new OrmException(String.format("Unstar change %d for account %d failed: %s", changeId.get(), accountId.get(), result.name())); } } catch (IOException e) { throw new OrmException( String.format("Unstar change %d for account %d failed", changeId.get(), accountId.get()), e); } }
From source file:com.google.gerrit.server.StarredChangesUtil.java
License:Apache License
private void updateLabels(Repository repo, String refName, ObjectId oldObjectId, SortedSet<String> labels) throws IOException, OrmException { try (RevWalk rw = new RevWalk(repo)) { RefUpdate u = repo.updateRef(refName); u.setExpectedOldObjectId(oldObjectId); u.setForceUpdate(true);/*from w w w . j a v a 2 s . c o m*/ u.setNewObjectId(writeLabels(repo, labels)); u.setRefLogIdent(serverIdent); u.setRefLogMessage("Update star labels", true); RefUpdate.Result result = u.update(rw); switch (result) { case NEW: case FORCED: case NO_CHANGE: case FAST_FORWARD: return; case IO_FAILURE: case LOCK_FAILURE: case NOT_ATTEMPTED: case REJECTED: case REJECTED_CURRENT_BRANCH: case RENAMED: throw new OrmException( String.format("Update star labels on ref %s failed: %s", refName, result.name())); } } }
From source file:com.microsoft.gittf.core.util.StashUtil.java
License:Open Source License
/** * Creates a stash// w ww . ja v a 2 s . c o m * * @param repository * the git repository * @param repositoryInserter * the repository inserter object to use * @param rootBaseTree * the tree id for the base commit of the stash * @param rootStashTree * the tree id for the commit of the stash * @param rootIndexTree * the tree id for the index commit of the stash * @param baseParentId * the parent of the base tree commit * @param ownerDisplayName * the owner display name of the stash * @param ownerName * the owner name of the stash * @param stashComment * the comment used to for the stash * @param stashName * the stash name * @return * @throws IOException */ public static final ObjectId create(final Repository repository, final ObjectInserter repositoryInserter, final ObjectId rootBaseTree, final ObjectId rootStashTree, final ObjectId rootIndexTree, final ObjectId baseParentId, final String ownerDisplayName, final String ownerName, final String stashComment, final String stashName) throws IOException { Check.notNull(repository, "repository"); //$NON-NLS-1$ Check.notNull(repositoryInserter, "repositoryInserter"); //$NON-NLS-1$ Check.notNull(rootBaseTree, "rootBaseTree"); //$NON-NLS-1$ Check.notNull(rootStashTree, "rootStashTree"); //$NON-NLS-1$ Check.notNull(rootIndexTree, "rootIndexTree"); //$NON-NLS-1$ /* identifies the head and the branch we are creating the stash for */ Ref headReference = repository.getRef(Constants.HEAD); RevCommit headCommit = new RevWalk(repository).parseCommit(headReference.getObjectId()); String currentBranchName = Repository.shortenRefName(headReference.getTarget().getName()); PersonIdent author = new PersonIdent(ownerDisplayName, ownerName); /* create the base commit */ CommitBuilder commitBuilder = new CommitBuilder(); commitBuilder.setTreeId(rootBaseTree); if (baseParentId != null) { commitBuilder.setParentId(baseParentId); } commitBuilder.setMessage(stashComment); commitBuilder.setAuthor(author); commitBuilder.setCommitter(author); ObjectId baseCommit = repositoryInserter.insert(commitBuilder); /* create the index commit */ commitBuilder.setTreeId(rootIndexTree); commitBuilder.setParentId(baseCommit); commitBuilder.setMessage(MessageFormat.format(STASH_INDEX_COMMENT, currentBranchName, headCommit.abbreviate(7).name(), stashName)); commitBuilder.setAuthor(author); commitBuilder.setCommitter(author); ObjectId indexCommit = repositoryInserter.insert(commitBuilder); /* create the stash commit */ commitBuilder.setTreeId(rootStashTree); commitBuilder.setParentId(baseCommit); commitBuilder.addParentId(indexCommit); String stashRefLogComment = MessageFormat.format(STASH_COMMENT, currentBranchName, headCommit.abbreviate(7).name(), stashName); commitBuilder.setMessage(stashRefLogComment); ObjectId stashCommit = repositoryInserter.insert(commitBuilder); repositoryInserter.flush(); /* Update the stash reference and ref log */ RefUpdate stashReferenceUpdate = repository.updateRef(Constants.R_STASH); stashReferenceUpdate.setNewObjectId(stashCommit); stashReferenceUpdate.setRefLogIdent(author); stashReferenceUpdate.setRefLogMessage(stashRefLogComment, false); Ref currentStashRef = repository.getRef(Constants.R_STASH); if (currentStashRef != null) { stashReferenceUpdate.setExpectedOldObjectId(currentStashRef.getObjectId()); } else { stashReferenceUpdate.setExpectedOldObjectId(ObjectId.zeroId()); } stashReferenceUpdate.forceUpdate(); return stashCommit; }
From source file:playRepository.BareCommit.java
License:Apache License
private void refUpdate(ObjectId commitId, String refName) throws IOException { RefUpdate ru = this.repository.updateRef(refName); ru.setForceUpdate(false);/* w w w . j a v a 2s . c o m*/ ru.setRefLogIdent(getPersonIdent()); ru.setNewObjectId(commitId); if (hasOldCommit(refName)) { ru.setExpectedOldObjectId(getCurrentMomentHeadObjectId()); } ru.setRefLogMessage(getCommitMessage(), false); ru.update(); }