Example usage for org.eclipse.jgit.lib ObjectId fromString

List of usage examples for org.eclipse.jgit.lib ObjectId fromString

Introduction

In this page you can find the example usage for org.eclipse.jgit.lib ObjectId fromString.

Prototype

public static ObjectId fromString(String str) 

Source Link

Document

Convert an ObjectId from hex characters.

Usage

From source file:com.google.gerrit.server.change.WalkSorter.java

License:Apache License

private Multimap<RevCommit, PatchSetData> byCommit(RevWalk rw, Collection<ChangeData> in)
        throws OrmException, IOException {
    Multimap<RevCommit, PatchSetData> byCommit = ArrayListMultimap.create(in.size(), 1);
    for (ChangeData cd : in) {
        PatchSet maxPs = null;//from   w  ww  .  java2  s . co  m
        for (PatchSet ps : cd.patchSets()) {
            if (shouldInclude(ps) && (maxPs == null || ps.getId().get() > maxPs.getId().get())) {
                maxPs = ps;
            }
        }
        if (maxPs == null) {
            continue; // No patch sets matched.
        }
        ObjectId id = ObjectId.fromString(maxPs.getRevision().get());
        try {
            RevCommit c = rw.parseCommit(id);
            byCommit.put(c, PatchSetData.create(cd, maxPs, c));
        } catch (MissingObjectException | IncorrectObjectTypeException e) {
            log.warn("missing commit " + id.name() + " for patch set " + maxPs.getId(), e);
        }
    }
    return byCommit;
}

From source file:com.google.gerrit.server.changedetail.PublishDraft.java

License:Apache License

private void sendNotifications(final boolean newChange, final IdentifiedUser currentUser,
        final Change updatedChange, final PatchSet updatedPatchSet, final LabelTypes labelTypes)
        throws OrmException, IOException, PatchSetInfoNotAvailableException {
    final Repository git = repoManager.openRepository(updatedChange.getProject());
    try {/*from w w  w.  ja  va2  s  .c  o m*/
        final RevWalk revWalk = new RevWalk(git);
        final RevCommit commit;
        try {
            commit = revWalk.parseCommit(ObjectId.fromString(updatedPatchSet.getRevision().get()));
        } finally {
            revWalk.release();
        }
        final PatchSetInfo info = patchSetInfoFactory.get(commit, updatedPatchSet.getId());
        final List<FooterLine> footerLines = commit.getFooterLines();
        final Account.Id me = currentUser.getAccountId();
        final MailRecipients recipients = getRecipientsFromFooters(accountResolver, updatedPatchSet,
                footerLines);
        recipients.remove(me);

        if (newChange) {
            approvalsUtil.addReviewers(db, labelTypes, updatedChange, updatedPatchSet, info,
                    recipients.getReviewers(), Collections.<Account.Id>emptySet());
            try {
                CreateChangeSender cm = createChangeSenderFactory.create(updatedChange);
                cm.setFrom(me);
                cm.setPatchSet(updatedPatchSet, info);
                cm.addReviewers(recipients.getReviewers());
                cm.addExtraCC(recipients.getCcOnly());
                cm.send();
            } catch (Exception e) {
                log.error("Cannot send email for new change " + updatedChange.getId(), e);
            }
        } else {
            final List<PatchSetApproval> patchSetApprovals = db.patchSetApprovals()
                    .byChange(updatedChange.getId()).toList();
            final MailRecipients oldRecipients = getRecipientsFromApprovals(patchSetApprovals);
            approvalsUtil.addReviewers(db, labelTypes, updatedChange, updatedPatchSet, info,
                    recipients.getReviewers(), oldRecipients.getAll());
            final ChangeMessage msg = new ChangeMessage(
                    new ChangeMessage.Key(updatedChange.getId(), ChangeUtil.messageUUID(db)), me,
                    updatedPatchSet.getCreatedOn(), updatedPatchSet.getId());
            msg.setMessage("Uploaded patch set " + updatedPatchSet.getPatchSetId() + ".");
            try {
                ReplacePatchSetSender cm = replacePatchSetFactory.create(updatedChange);
                cm.setFrom(me);
                cm.setPatchSet(updatedPatchSet, info);
                cm.setChangeMessage(msg);
                cm.addReviewers(recipients.getReviewers());
                cm.addExtraCC(recipients.getCcOnly());
                cm.send();
            } catch (Exception e) {
                log.error("Cannot send email for new patch set " + updatedPatchSet.getId(), e);
            }
        }
    } finally {
        git.close();
    }
}

From source file:com.google.gerrit.server.changedetail.RebaseChange.java

License:Apache License

/**
 * Rebases the change of the given patch set on the given base commit.
 *
 * The rebased commit is added as new patch set to the change.
 *
 * E-mail notification and triggering of hooks is only done for the creation of
 * the new patch set if `sendEmail` and `runHooks` are set to true.
 *
 * @param git the repository//from w w  w.  jav a2  s . c o  m
 * @param revWalk the RevWalk
 * @param inserter the object inserter
 * @param patchSetId the id of the patch set
 * @param change the change that should be rebased
 * @param uploader the user that creates the rebased patch set
 * @param baseCommit the commit that should be the new base
 * @param mergeUtil merge utilities for the destination project
 * @param committerIdent the committer's identity
 * @param runHooks if hooks should be run for the new patch set
 * @param validate if commit validation should be run for the new patch set
 * @return the new patch set which is based on the given base commit
 * @throws NoSuchChangeException thrown if the change to which the patch set
 *         belongs does not exist or is not visible to the user
 * @throws OrmException thrown in case accessing the database fails
 * @throws IOException thrown if rebase is not possible or not needed
 * @throws InvalidChangeOperationException thrown if rebase is not allowed
 */
public PatchSet rebase(final Repository git, final RevWalk revWalk, final ObjectInserter inserter,
        final PatchSet.Id patchSetId, final Change change, final IdentifiedUser uploader,
        final RevCommit baseCommit, final MergeUtil mergeUtil, PersonIdent committerIdent, boolean runHooks,
        ValidatePolicy validate) throws NoSuchChangeException, OrmException, IOException,
        InvalidChangeOperationException, MergeConflictException {
    if (!change.currentPatchSetId().equals(patchSetId)) {
        throw new InvalidChangeOperationException("patch set is not current");
    }
    final PatchSet originalPatchSet = db.get().patchSets().get(patchSetId);

    final RevCommit rebasedCommit;
    ObjectId oldId = ObjectId.fromString(originalPatchSet.getRevision().get());
    ObjectId newId = rebaseCommit(git, inserter, revWalk.parseCommit(oldId), baseCommit, mergeUtil,
            committerIdent);

    rebasedCommit = revWalk.parseCommit(newId);

    final ChangeControl changeControl = changeControlFactory.validateFor(change, uploader);

    PatchSetInserter patchSetInserter = patchSetInserterFactory
            .create(git, revWalk, changeControl, rebasedCommit).setValidatePolicy(validate)
            .setDraft(originalPatchSet.isDraft()).setUploader(uploader.getAccountId()).setSendMail(false)
            .setRunHooks(runHooks);

    final PatchSet.Id newPatchSetId = patchSetInserter.getPatchSetId();
    final ChangeMessage cmsg = new ChangeMessage(
            new ChangeMessage.Key(change.getId(), ChangeUtil.messageUUID(db.get())), uploader.getAccountId(),
            TimeUtil.nowTs(), patchSetId);

    cmsg.setMessage("Patch Set " + newPatchSetId.get() + ": Patch Set " + patchSetId.get() + " was rebased");

    Change newChange = patchSetInserter.setMessage(cmsg).insert();

    return db.get().patchSets().get(newChange.currentPatchSetId());
}

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  w w  w.  jav  a2s. co m
    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.ChangeUtil.java

License:Apache License

public String getMessage(Change change) throws NoSuchChangeException, OrmException, MissingObjectException,
        IncorrectObjectTypeException, IOException {
    Change.Id changeId = change.getId();
    PatchSet ps = db.get().patchSets().get(change.currentPatchSetId());
    if (ps == null) {
        throw new NoSuchChangeException(changeId);
    }//ww  w . j  a v a2s . co  m

    try (Repository git = gitManager.openRepository(change.getProject()); RevWalk revWalk = new RevWalk(git)) {
        RevCommit commit = revWalk.parseCommit(ObjectId.fromString(ps.getRevision().get()));
        return commit.getFullMessage();
    } catch (RepositoryNotFoundException e) {
        throw new NoSuchChangeException(changeId, e);
    }
}

From source file:com.google.gerrit.server.edit.ChangeEditModifier.java

License:Apache License

/**
 * Create new change edit./* www  .j  ava  2 s  .c o  m*/
 *
 * @param change to create change edit for
 * @param ps patch set to create change edit on
 * @return result
 * @throws AuthException
 * @throws IOException
 * @throws ResourceConflictException When change edit already
 * exists for the change
 */
public RefUpdate.Result createEdit(Change change, PatchSet ps)
        throws AuthException, IOException, ResourceConflictException {
    if (!currentUser.get().isIdentifiedUser()) {
        throw new AuthException("Authentication required");
    }

    IdentifiedUser me = (IdentifiedUser) currentUser.get();
    String refPrefix = RefNames.refsEditPrefix(me.getAccountId(), change.getId());

    try (Repository repo = gitManager.openRepository(change.getProject())) {
        Map<String, Ref> refs = repo.getRefDatabase().getRefs(refPrefix);
        if (!refs.isEmpty()) {
            throw new ResourceConflictException("edit already exists");
        }

        try (RevWalk rw = new RevWalk(repo)) {
            ObjectId revision = ObjectId.fromString(ps.getRevision().get());
            String editRefName = RefNames.refsEdit(me.getAccountId(), change.getId(), ps.getId());
            Result res = update(repo, me, editRefName, rw, ObjectId.zeroId(), revision);
            indexer.index(reviewDb.get(), change);
            return res;
        }
    }
}

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//from w  w w . j  a v  a  2 s  .c  o  m
 * @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 RevCommit squashEdit(RevWalk rw, ObjectInserter inserter, RevCommit edit, PatchSet basePatchSet)
        throws IOException, ResourceConflictException {
    RevCommit parent = rw.parseCommit(ObjectId.fromString(basePatchSet.getRevision().get()));
    if (parent.getTree().equals(edit.getTree()) && edit.getFullMessage().equals(parent.getFullMessage())) {
        throw new ResourceConflictException("identical tree and message");
    }/* w  w w  .j  a  va2  s. c om*/
    return writeSquashedCommit(rw, inserter, parent, edit);
}

From source file:com.google.gerrit.server.events.StreamEventsApiListener.java

License:Apache License

@Override
public void onGitReferenceUpdated(final GitReferenceUpdatedListener.Event ev) {
    RefUpdatedEvent event = new RefUpdatedEvent();
    if (ev.getUpdater() != null) {
        event.submitter = accountAttributeSupplier(ev.getUpdater());
    }/*from w  w w.  j  ava  2  s  . c o m*/
    final Branch.NameKey refName = new Branch.NameKey(ev.getProjectName(), ev.getRefName());
    event.refUpdate = Suppliers.memoize(new Supplier<RefUpdateAttribute>() {
        @Override
        public RefUpdateAttribute get() {
            return eventFactory.asRefUpdateAttribute(ObjectId.fromString(ev.getOldObjectId()),
                    ObjectId.fromString(ev.getNewObjectId()), refName);
        }
    });
    dispatcher.get().postEvent(refName, event);
}

From source file:com.google.gerrit.server.git.GroupCollector.java

License:Apache License

private ObjectId parseGroup(ObjectId forCommit, String group) {
    try {//from w ww. j  av  a 2 s. c o m
        return ObjectId.fromString(group);
    } catch (IllegalArgumentException e) {
        // Shouldn't happen; some sort of corruption or manual tinkering?
        log.warn("group for commit {} is not a SHA-1: {}", forCommit.name(), group);
        return null;
    }
}