List of usage examples for org.eclipse.jgit.lib ObjectId equals
@SuppressWarnings({ "NonOverridingEquals", "AmbiguousMethodReference" }) public final boolean equals(AnyObjectId other)
From source file:com.google.gerrit.server.account.externalids.ExternalIdReader.java
License:Apache License
/** Reads and returns the specified external ID. */ @Nullable//from w w w . ja v a2 s . co m ExternalId get(ReviewDb db, ExternalId.Key key) throws IOException, ConfigInvalidException, OrmException { checkReadEnabled(); if (readFromGit) { try (Repository repo = repoManager.openRepository(allUsersName); RevWalk rw = new RevWalk(repo)) { ObjectId rev = readRevision(repo); if (rev.equals(ObjectId.zeroId())) { return null; } return parse(key, rw, rev); } } return ExternalId.from(db.accountExternalIds().get(key.asAccountExternalIdKey())); }
From source file:com.google.gerrit.server.account.externalids.ExternalIdReader.java
License:Apache License
/** Reads and returns the specified external ID from the given revision. */ @Nullable/*www. j av a 2 s.c om*/ ExternalId get(ExternalId.Key key, ObjectId rev) throws IOException, ConfigInvalidException { checkReadEnabled(); if (rev.equals(ObjectId.zeroId())) { return null; } try (Repository repo = repoManager.openRepository(allUsersName); RevWalk rw = new RevWalk(repo)) { return parse(key, rw, rev); } }
From source file:com.google.gerrit.server.account.externalids.ExternalIdsUpdate.java
License:Apache License
/** Commits updates to the external IDs. */ public static ObjectId commit(Repository repo, RevWalk rw, ObjectInserter ins, ObjectId rev, NoteMap noteMap, String commitMessage, PersonIdent committerIdent, PersonIdent authorIdent) throws IOException { CommitBuilder cb = new CommitBuilder(); cb.setMessage(commitMessage);//from www . ja v a2 s .co m cb.setTreeId(noteMap.writeTree(ins)); cb.setAuthor(authorIdent); cb.setCommitter(committerIdent); if (!rev.equals(ObjectId.zeroId())) { cb.setParentId(rev); } else { cb.setParentIds(); // Ref is currently nonexistent, commit has no parents. } if (cb.getTreeId() == null) { if (rev.equals(ObjectId.zeroId())) { cb.setTreeId(emptyTree(ins)); // No parent, assume empty tree. } else { RevCommit p = rw.parseCommit(rev); cb.setTreeId(p.getTree()); // Copy tree from parent. } } ObjectId commitId = ins.insert(cb); ins.flush(); RefUpdate u = repo.updateRef(RefNames.REFS_EXTERNAL_IDS); u.setRefLogIdent(committerIdent); u.setRefLogMessage("Update external IDs", false); u.setExpectedOldObjectId(rev); u.setNewObjectId(commitId); RefUpdate.Result res = u.update(); switch (res) { case NEW: case FAST_FORWARD: case NO_CHANGE: case RENAMED: case FORCED: break; case LOCK_FAILURE: throw new LockFailureException("Updating external IDs failed with " + res); case IO_FAILURE: case NOT_ATTEMPTED: case REJECTED: case REJECTED_CURRENT_BRANCH: default: throw new IOException("Updating external IDs failed with " + res); } return rw.parseCommit(commitId); }
From source file:com.google.gerrit.server.change.ConsistencyChecker.java
License:Apache License
private boolean checkPatchSets() { List<PatchSet> all;// w ww . ja v a 2 s. co m try { all = Lists.newArrayList(db.get().patchSets().byChange(change.getId())); } catch (OrmException e) { return error("Failed to look up patch sets", e); } // Iterate in descending order so deletePatchSet can assume the latest patch // set exists. Collections.sort(all, PS_ID_ORDER.reverse()); patchSetsBySha = MultimapBuilder.hashKeys(all.size()).treeSetValues(PS_ID_ORDER).build(); Map<String, Ref> refs; try { refs = repo.getRefDatabase().exactRef(Lists.transform(all, new Function<PatchSet, String>() { @Override public String apply(PatchSet ps) { return ps.getId().toRefName(); } }).toArray(new String[all.size()])); } catch (IOException e) { error("error reading refs", e); refs = Collections.emptyMap(); } for (PatchSet ps : all) { // Check revision format. int psNum = ps.getId().get(); String refName = ps.getId().toRefName(); ObjectId objId = parseObjectId(ps.getRevision().get(), "patch set " + psNum); if (objId == null) { continue; } patchSetsBySha.put(objId, ps); // Check ref existence. ProblemInfo refProblem = null; Ref ref = refs.get(refName); if (ref == null) { refProblem = problem("Ref missing: " + refName); } else if (!objId.equals(ref.getObjectId())) { String actual = ref.getObjectId() != null ? ref.getObjectId().name() : "null"; refProblem = problem( String.format("Expected %s to point to %s, found %s", ref.getName(), objId.name(), actual)); } // Check object existence. RevCommit psCommit = parseCommit(objId, String.format("patch set %d", psNum)); if (psCommit == null) { if (fix != null && fix.deletePatchSetIfCommitMissing) { deletePatchSet(lastProblem(), ps.getId()); } continue; } else if (refProblem != null && fix != null) { fixPatchSetRef(refProblem, ps); } if (ps.getId().equals(change.currentPatchSetId())) { currPsCommit = psCommit; } } // Check for duplicates. for (Map.Entry<ObjectId, Collection<PatchSet>> e : patchSetsBySha.asMap().entrySet()) { if (e.getValue().size() > 1) { problem(String.format("Multiple patch sets pointing to %s: %s", e.getKey().name(), Collections2.transform(e.getValue(), TO_PS_ID))); } } return currPs != null && currPsCommit != null; }
From source file:com.google.gerrit.server.change.RebaseChangeOp.java
License:Apache License
/** * Rebase a commit./*from w w w . j a va2 s.c o m*/ * * @param ctx repo context. * @param original the commit to rebase. * @param base base to rebase against. * @return the rebased commit. * @throws MergeConflictException the rebase failed due to a merge conflict. * @throws IOException the merge failed for another reason. */ private RevCommit rebaseCommit(RepoContext ctx, RevCommit original, ObjectId base) throws ResourceConflictException, MergeConflictException, IOException { RevCommit parentCommit = original.getParent(0); if (base.equals(parentCommit)) { throw new ResourceConflictException("Change is already up to date."); } ThreeWayMerger merger = newMergeUtil().newThreeWayMerger(ctx.getRepository(), ctx.getInserter()); merger.setBase(parentCommit); merger.merge(original, base); if (merger.getResultTreeId() == null) { throw new MergeConflictException("The change could not be rebased due to a conflict during merge."); } CommitBuilder cb = new CommitBuilder(); cb.setTreeId(merger.getResultTreeId()); cb.setParentId(base); cb.setAuthor(original.getAuthorIdent()); cb.setMessage(original.getFullMessage()); if (committerIdent != null) { cb.setCommitter(committerIdent); } else { cb.setCommitter(ctx.getUser().asIdentifiedUser().newCommitterIdent(ctx.getWhen(), ctx.getTimeZone())); } ObjectId objectId = ctx.getInserter().insert(cb); ctx.getInserter().flush(); return ctx.getRevWalk().parseCommit(objectId); }
From source file:com.google.gerrit.server.git.ChainedReceiveCommands.java
License:Apache License
private static ObjectId zeroToNull(ObjectId id) { if (id == null || id.equals(ObjectId.zeroId())) { return null; }/*from ww w . j a v a2 s. c o m*/ return id; }
From source file:com.google.gerrit.server.git.MergeUtil.java
License:Apache License
public CodeReviewCommit createCherryPickFromCommit(Repository repo, ObjectInserter inserter, RevCommit mergeTip, RevCommit originalCommit, PersonIdent cherryPickCommitterIdent, String commitMsg, CodeReviewRevWalk rw) throws MissingObjectException, IncorrectObjectTypeException, IOException, MergeIdenticalTreeException, MergeConflictException {/* w w w . j a v a 2 s.c o m*/ final ThreeWayMerger m = newThreeWayMerger(repo, inserter); m.setBase(originalCommit.getParent(0)); if (m.merge(mergeTip, originalCommit)) { ObjectId tree = m.getResultTreeId(); if (tree.equals(mergeTip.getTree())) { throw new MergeIdenticalTreeException("identical tree"); } CommitBuilder mergeCommit = new CommitBuilder(); mergeCommit.setTreeId(tree); mergeCommit.setParentId(mergeTip); mergeCommit.setAuthor(originalCommit.getAuthorIdent()); mergeCommit.setCommitter(cherryPickCommitterIdent); mergeCommit.setMessage(commitMsg); return rw.parseCommit(commit(inserter, mergeCommit)); } else { throw new MergeConflictException("merge conflict"); } }
From source file:com.google.gerrit.server.git.TagSet.java
License:Apache License
boolean updateFastForward(String refName, ObjectId oldValue, ObjectId newValue) { CachedRef ref = refs.get(refName);//from w w w. jav a2s . co m if (ref != null) { // compareAndSet works on reference equality, but this operation // wants to use object equality. Switch out oldValue with cur so the // compareAndSet will function correctly for this operation. // ObjectId cur = ref.get(); if (cur.equals(oldValue)) { return ref.compareAndSet(cur, newValue); } } return false; }
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 w w w .jav a2 s. com*/ * 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.notedb.ChangeNotesState.java
License:Apache License
private void checkMetaId(Change change) throws IOException { NoteDbChangeState state = NoteDbChangeState.parse(change); if (state == null) { return; // Can happen during small NoteDb tests. } else if (state.getPrimaryStorage() == PrimaryStorage.NOTE_DB) { return;/* ww w . j a v a 2 s . c o m*/ } checkState(state.getRefState().isPresent(), "expected RefState: %s", state); ObjectId idFromState = state.getRefState().get().changeMetaId(); if (!idFromState.equals(metaId())) { throw new IOException("cannot copy ChangeNotesState into Change " + changeId() + "; this ChangeNotesState was created from " + metaId() + ", but change requires state " + idFromState); } }