Notedb: Add 'Commit' footer
This makes it possible to map a patch set id to the commit object under review particularly when no inline-comment has been made. Change-Id: I01042c15399f7aa315eb9ab8ae0519cfae608f6a
This commit is contained in:
		
				
					committed by
					
						
						Dave Borowitz
					
				
			
			
				
	
			
			
			
						parent
						
							6c8e2cbeca
						
					
				
				
					commit
					028bc2747a
				
			@@ -28,6 +28,7 @@ import com.google.gwtorm.server.OrmException;
 | 
				
			|||||||
import com.google.inject.Inject;
 | 
					import com.google.inject.Inject;
 | 
				
			||||||
import com.google.inject.Singleton;
 | 
					import com.google.inject.Singleton;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.eclipse.jgit.lib.ObjectId;
 | 
				
			||||||
import org.eclipse.jgit.revwalk.RevCommit;
 | 
					import org.eclipse.jgit.revwalk.RevCommit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.sql.Timestamp;
 | 
					import java.sql.Timestamp;
 | 
				
			||||||
@@ -36,6 +37,7 @@ import java.util.Collections;
 | 
				
			|||||||
/** Utilities for manipulating patch sets. */
 | 
					/** Utilities for manipulating patch sets. */
 | 
				
			||||||
@Singleton
 | 
					@Singleton
 | 
				
			||||||
public class PatchSetUtil {
 | 
					public class PatchSetUtil {
 | 
				
			||||||
 | 
					  @SuppressWarnings("unused") // TODO(dborowitz): Read from notedb.
 | 
				
			||||||
  private final NotesMigration migration;
 | 
					  private final NotesMigration migration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @Inject
 | 
					  @Inject
 | 
				
			||||||
@@ -83,13 +85,11 @@ public class PatchSetUtil {
 | 
				
			|||||||
    ps.setPushCertificate(pushCertificate);
 | 
					    ps.setPushCertificate(pushCertificate);
 | 
				
			||||||
    db.patchSets().insert(Collections.singleton(ps));
 | 
					    db.patchSets().insert(Collections.singleton(ps));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    update.setCommit(ObjectId.fromString(ps.getRevision().get()));
 | 
				
			||||||
    if (!update.getChange().getSubject().equals(commit.getShortMessage())) {
 | 
					    if (!update.getChange().getSubject().equals(commit.getShortMessage())) {
 | 
				
			||||||
      update.setSubject(commit.getShortMessage());
 | 
					      update.setSubject(commit.getShortMessage());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (migration.writeChanges()) {
 | 
					 | 
				
			||||||
      // TODO(dborowitz): Write to notedb.
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return ps;
 | 
					    return ps;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,6 +29,7 @@ public class ChangeNoteUtil {
 | 
				
			|||||||
  static final String GERRIT_PLACEHOLDER_HOST = "gerrit";
 | 
					  static final String GERRIT_PLACEHOLDER_HOST = "gerrit";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static final FooterKey FOOTER_BRANCH = new FooterKey("Branch");
 | 
					  static final FooterKey FOOTER_BRANCH = new FooterKey("Branch");
 | 
				
			||||||
 | 
					  static final FooterKey FOOTER_COMMIT = new FooterKey("Commit");
 | 
				
			||||||
  static final FooterKey FOOTER_HASHTAGS = new FooterKey("Hashtags");
 | 
					  static final FooterKey FOOTER_HASHTAGS = new FooterKey("Hashtags");
 | 
				
			||||||
  static final FooterKey FOOTER_LABEL = new FooterKey("Label");
 | 
					  static final FooterKey FOOTER_LABEL = new FooterKey("Label");
 | 
				
			||||||
  static final FooterKey FOOTER_PATCH_SET = new FooterKey("Patch-set");
 | 
					  static final FooterKey FOOTER_PATCH_SET = new FooterKey("Patch-set");
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -126,6 +126,7 @@ public class ChangeNotes extends AbstractChangeNotes<ChangeNotes> {
 | 
				
			|||||||
  private ImmutableListMultimap<RevId, PatchLineComment> comments;
 | 
					  private ImmutableListMultimap<RevId, PatchLineComment> comments;
 | 
				
			||||||
  private ImmutableSet<String> hashtags;
 | 
					  private ImmutableSet<String> hashtags;
 | 
				
			||||||
  NoteMap noteMap;
 | 
					  NoteMap noteMap;
 | 
				
			||||||
 | 
					  private PatchSet currentPatchSet;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private final AllUsersName allUsers;
 | 
					  private final AllUsersName allUsers;
 | 
				
			||||||
  private DraftCommentNotes draftCommentNotes;
 | 
					  private DraftCommentNotes draftCommentNotes;
 | 
				
			||||||
@@ -246,6 +247,10 @@ public class ChangeNotes extends AbstractChangeNotes<ChangeNotes> {
 | 
				
			|||||||
    return ChangeNoteUtil.changeRefName(getChangeId());
 | 
					    return ChangeNoteUtil.changeRefName(getChangeId());
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public PatchSet getCurrentPatchSet() {
 | 
				
			||||||
 | 
					    return currentPatchSet;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @Override
 | 
					  @Override
 | 
				
			||||||
  protected void onLoad() throws IOException, ConfigInvalidException {
 | 
					  protected void onLoad() throws IOException, ConfigInvalidException {
 | 
				
			||||||
    ObjectId rev = getRevision();
 | 
					    ObjectId rev = getRevision();
 | 
				
			||||||
@@ -274,6 +279,7 @@ public class ChangeNotes extends AbstractChangeNotes<ChangeNotes> {
 | 
				
			|||||||
      change.setLastUpdatedOn(parser.lastUpdatedOn);
 | 
					      change.setLastUpdatedOn(parser.lastUpdatedOn);
 | 
				
			||||||
      change.setOwner(parser.ownerId);
 | 
					      change.setOwner(parser.ownerId);
 | 
				
			||||||
      change.setSubmissionId(parser.submissionId);
 | 
					      change.setSubmissionId(parser.submissionId);
 | 
				
			||||||
 | 
					      currentPatchSet = parser.getCurrentPatchSet();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (parser.hashtags != null) {
 | 
					      if (parser.hashtags != null) {
 | 
				
			||||||
        hashtags = ImmutableSet.copyOf(parser.hashtags);
 | 
					        hashtags = ImmutableSet.copyOf(parser.hashtags);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,6 +15,7 @@
 | 
				
			|||||||
package com.google.gerrit.server.notedb;
 | 
					package com.google.gerrit.server.notedb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_BRANCH;
 | 
					import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_BRANCH;
 | 
				
			||||||
 | 
					import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_COMMIT;
 | 
				
			||||||
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_HASHTAGS;
 | 
					import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_HASHTAGS;
 | 
				
			||||||
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_LABEL;
 | 
					import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_LABEL;
 | 
				
			||||||
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_PATCH_SET;
 | 
					import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_PATCH_SET;
 | 
				
			||||||
@@ -58,6 +59,7 @@ import com.google.gerrit.server.git.GitRepositoryManager;
 | 
				
			|||||||
import com.google.gerrit.server.util.LabelVote;
 | 
					import com.google.gerrit.server.util.LabelVote;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import org.eclipse.jgit.errors.ConfigInvalidException;
 | 
					import org.eclipse.jgit.errors.ConfigInvalidException;
 | 
				
			||||||
 | 
					import org.eclipse.jgit.errors.InvalidObjectIdException;
 | 
				
			||||||
import org.eclipse.jgit.errors.RepositoryNotFoundException;
 | 
					import org.eclipse.jgit.errors.RepositoryNotFoundException;
 | 
				
			||||||
import org.eclipse.jgit.lib.ObjectId;
 | 
					import org.eclipse.jgit.lib.ObjectId;
 | 
				
			||||||
import org.eclipse.jgit.lib.PersonIdent;
 | 
					import org.eclipse.jgit.lib.PersonIdent;
 | 
				
			||||||
@@ -95,6 +97,7 @@ class ChangeNotesParser implements AutoCloseable {
 | 
				
			|||||||
  String subject;
 | 
					  String subject;
 | 
				
			||||||
  String originalSubject;
 | 
					  String originalSubject;
 | 
				
			||||||
  String submissionId;
 | 
					  String submissionId;
 | 
				
			||||||
 | 
					  PatchSet.Id currentPatchSetId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private final Change.Id changeId;
 | 
					  private final Change.Id changeId;
 | 
				
			||||||
  private final ObjectId tip;
 | 
					  private final ObjectId tip;
 | 
				
			||||||
@@ -104,6 +107,7 @@ class ChangeNotesParser implements AutoCloseable {
 | 
				
			|||||||
      Table<Account.Id, String, Optional<PatchSetApproval>>> approvals;
 | 
					      Table<Account.Id, String, Optional<PatchSetApproval>>> approvals;
 | 
				
			||||||
  private final List<ChangeMessage> allChangeMessages;
 | 
					  private final List<ChangeMessage> allChangeMessages;
 | 
				
			||||||
  private final Multimap<PatchSet.Id, ChangeMessage> changeMessagesByPatchSet;
 | 
					  private final Multimap<PatchSet.Id, ChangeMessage> changeMessagesByPatchSet;
 | 
				
			||||||
 | 
					  private final Map<PatchSet.Id, PatchSet> patchSets;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ChangeNotesParser(Change change, ObjectId tip, RevWalk walk,
 | 
					  ChangeNotesParser(Change change, ObjectId tip, RevWalk walk,
 | 
				
			||||||
      GitRepositoryManager repoManager) throws RepositoryNotFoundException,
 | 
					      GitRepositoryManager repoManager) throws RepositoryNotFoundException,
 | 
				
			||||||
@@ -119,6 +123,11 @@ class ChangeNotesParser implements AutoCloseable {
 | 
				
			|||||||
    allChangeMessages = Lists.newArrayList();
 | 
					    allChangeMessages = Lists.newArrayList();
 | 
				
			||||||
    changeMessagesByPatchSet = LinkedListMultimap.create();
 | 
					    changeMessagesByPatchSet = LinkedListMultimap.create();
 | 
				
			||||||
    comments = ArrayListMultimap.create();
 | 
					    comments = ArrayListMultimap.create();
 | 
				
			||||||
 | 
					    patchSets = Maps.newHashMap();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public PatchSet getCurrentPatchSet() {
 | 
				
			||||||
 | 
					    return patchSets.get(currentPatchSetId);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @Override
 | 
					  @Override
 | 
				
			||||||
@@ -177,7 +186,12 @@ class ChangeNotesParser implements AutoCloseable {
 | 
				
			|||||||
    if (status == null) {
 | 
					    if (status == null) {
 | 
				
			||||||
      status = parseStatus(commit);
 | 
					      status = parseStatus(commit);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    PatchSet.Id psId = parsePatchSetId(commit);
 | 
					    PatchSet.Id psId = parsePatchSetId(commit);
 | 
				
			||||||
 | 
					    if (currentPatchSetId == null) {
 | 
				
			||||||
 | 
					      currentPatchSetId = psId;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Account.Id accountId = parseIdent(commit);
 | 
					    Account.Id accountId = parseIdent(commit);
 | 
				
			||||||
    ownerId = accountId;
 | 
					    ownerId = accountId;
 | 
				
			||||||
    if (subject == null) {
 | 
					    if (subject == null) {
 | 
				
			||||||
@@ -193,6 +207,11 @@ class ChangeNotesParser implements AutoCloseable {
 | 
				
			|||||||
      submissionId = parseSubmissionId(commit);
 | 
					      submissionId = parseSubmissionId(commit);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ObjectId currRev = parseRevision(commit);
 | 
				
			||||||
 | 
					    if (currRev != null) {
 | 
				
			||||||
 | 
					      parsePatchSet(psId, currRev);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (submitRecords.isEmpty()) {
 | 
					    if (submitRecords.isEmpty()) {
 | 
				
			||||||
      // Only parse the most recent set of submit records; any older ones are
 | 
					      // Only parse the most recent set of submit records; any older ones are
 | 
				
			||||||
      // still there, but not currently used.
 | 
					      // still there, but not currently used.
 | 
				
			||||||
@@ -239,6 +258,35 @@ class ChangeNotesParser implements AutoCloseable {
 | 
				
			|||||||
    return footerLines.get(0);
 | 
					    return footerLines.get(0);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private ObjectId parseRevision(RevCommit commit)
 | 
				
			||||||
 | 
					      throws ConfigInvalidException {
 | 
				
			||||||
 | 
					    String sha = parseOneFooter(commit, FOOTER_COMMIT);
 | 
				
			||||||
 | 
					    if (sha == null) {
 | 
				
			||||||
 | 
					      return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      return ObjectId.fromString(sha);
 | 
				
			||||||
 | 
					    } catch (InvalidObjectIdException e) {
 | 
				
			||||||
 | 
					      ConfigInvalidException cie = invalidFooter(FOOTER_COMMIT, sha);
 | 
				
			||||||
 | 
					      cie.initCause(e);
 | 
				
			||||||
 | 
					      throw cie;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private void parsePatchSet(PatchSet.Id psId, ObjectId rev)
 | 
				
			||||||
 | 
					      throws ConfigInvalidException {
 | 
				
			||||||
 | 
					    if (patchSets.containsKey(psId)) {
 | 
				
			||||||
 | 
					      throw new ConfigInvalidException(
 | 
				
			||||||
 | 
					          String.format(
 | 
				
			||||||
 | 
					              "Multiple revisions parsed for patch set %s: %s and %s",
 | 
				
			||||||
 | 
					              psId.get(), patchSets.get(psId).getRevision(), rev.name()));
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      PatchSet ps = new PatchSet(psId);
 | 
				
			||||||
 | 
					      ps.setRevision(new RevId(rev.name()));
 | 
				
			||||||
 | 
					      patchSets.put(psId, ps);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private void parseHashtags(RevCommit commit) throws ConfigInvalidException {
 | 
					  private void parseHashtags(RevCommit commit) throws ConfigInvalidException {
 | 
				
			||||||
    // Commits are parsed in reverse order and only the last set of hashtags should be used.
 | 
					    // Commits are parsed in reverse order and only the last set of hashtags should be used.
 | 
				
			||||||
    if (hashtags != null) {
 | 
					    if (hashtags != null) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,6 +16,7 @@ package com.google.gerrit.server.notedb;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import static com.google.common.base.Preconditions.checkArgument;
 | 
					import static com.google.common.base.Preconditions.checkArgument;
 | 
				
			||||||
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_BRANCH;
 | 
					import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_BRANCH;
 | 
				
			||||||
 | 
					import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_COMMIT;
 | 
				
			||||||
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_HASHTAGS;
 | 
					import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_HASHTAGS;
 | 
				
			||||||
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_LABEL;
 | 
					import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_LABEL;
 | 
				
			||||||
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_PATCH_SET;
 | 
					import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_PATCH_SET;
 | 
				
			||||||
@@ -105,6 +106,7 @@ public class ChangeUpdate extends AbstractChangeUpdate {
 | 
				
			|||||||
  private final CommentsInNotesUtil commentsUtil;
 | 
					  private final CommentsInNotesUtil commentsUtil;
 | 
				
			||||||
  private List<PatchLineComment> comments;
 | 
					  private List<PatchLineComment> comments;
 | 
				
			||||||
  private String topic;
 | 
					  private String topic;
 | 
				
			||||||
 | 
					  private ObjectId commit;
 | 
				
			||||||
  private Set<String> hashtags;
 | 
					  private Set<String> hashtags;
 | 
				
			||||||
  private String changeMessage;
 | 
					  private String changeMessage;
 | 
				
			||||||
  private ChangeNotes notes;
 | 
					  private ChangeNotes notes;
 | 
				
			||||||
@@ -357,6 +359,11 @@ public class ChangeUpdate extends AbstractChangeUpdate {
 | 
				
			|||||||
    this.topic = Strings.nullToEmpty(topic);
 | 
					    this.topic = Strings.nullToEmpty(topic);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public void setCommit(ObjectId commit) {
 | 
				
			||||||
 | 
					    checkArgument(commit != null);
 | 
				
			||||||
 | 
					    this.commit = commit;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public void setHashtags(Set<String> hashtags) {
 | 
					  public void setHashtags(Set<String> hashtags) {
 | 
				
			||||||
    this.hashtags = hashtags;
 | 
					    this.hashtags = hashtags;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -432,12 +439,12 @@ public class ChangeUpdate extends AbstractChangeUpdate {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @Override
 | 
					  @Override
 | 
				
			||||||
  protected boolean onSave(CommitBuilder commit) {
 | 
					  protected boolean onSave(CommitBuilder cb) {
 | 
				
			||||||
    if (getRevision() != null && isEmpty()) {
 | 
					    if (getRevision() != null && isEmpty()) {
 | 
				
			||||||
      return false;
 | 
					      return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    commit.setAuthor(newIdent(getUser().getAccount(), when));
 | 
					    cb.setAuthor(newIdent(getUser().getAccount(), when));
 | 
				
			||||||
    commit.setCommitter(new PersonIdent(serverIdent, when));
 | 
					    cb.setCommitter(new PersonIdent(serverIdent, when));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int ps = psId != null ? psId.get() : getChange().currentPatchSetId().get();
 | 
					    int ps = psId != null ? psId.get() : getChange().currentPatchSetId().get();
 | 
				
			||||||
    StringBuilder msg = new StringBuilder();
 | 
					    StringBuilder msg = new StringBuilder();
 | 
				
			||||||
@@ -472,6 +479,10 @@ public class ChangeUpdate extends AbstractChangeUpdate {
 | 
				
			|||||||
      addFooter(msg, FOOTER_TOPIC, topic);
 | 
					      addFooter(msg, FOOTER_TOPIC, topic);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (commit != null) {
 | 
				
			||||||
 | 
					      addFooter(msg, FOOTER_COMMIT, commit.name());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (hashtags != null) {
 | 
					    if (hashtags != null) {
 | 
				
			||||||
      addFooter(msg, FOOTER_HASHTAGS, Joiner.on(",").join(hashtags));
 | 
					      addFooter(msg, FOOTER_HASHTAGS, Joiner.on(",").join(hashtags));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -526,7 +537,7 @@ public class ChangeUpdate extends AbstractChangeUpdate {
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    commit.setMessage(msg.toString());
 | 
					    cb.setMessage(msg.toString());
 | 
				
			||||||
    return true;
 | 
					    return true;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -547,7 +558,8 @@ public class ChangeUpdate extends AbstractChangeUpdate {
 | 
				
			|||||||
        && submissionId == null
 | 
					        && submissionId == null
 | 
				
			||||||
        && submitRecords == null
 | 
					        && submitRecords == null
 | 
				
			||||||
        && hashtags == null
 | 
					        && hashtags == null
 | 
				
			||||||
        && topic == null;
 | 
					        && topic == null
 | 
				
			||||||
 | 
					        && commit == null;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private static StringBuilder addFooter(StringBuilder sb, FooterKey footer) {
 | 
					  private static StringBuilder addFooter(StringBuilder sb, FooterKey footer) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -272,6 +272,29 @@ public class ChangeNotesParserTest extends AbstractChangeNotesTest {
 | 
				
			|||||||
        + "Subject: Some other subject\n");
 | 
					        + "Subject: Some other subject\n");
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @Test
 | 
				
			||||||
 | 
					  public void parseCommit() throws Exception {
 | 
				
			||||||
 | 
					    assertParseSucceeds("Update change\n"
 | 
				
			||||||
 | 
					        + "\n"
 | 
				
			||||||
 | 
					        + "Patch-set: 1\n"
 | 
				
			||||||
 | 
					        + "Branch: refs/heads/master\n"
 | 
				
			||||||
 | 
					        + "Subject: Some subject of a change\n"
 | 
				
			||||||
 | 
					        + "Commit: abcd1234abcd1234abcd1234abcd1234abcd1234");
 | 
				
			||||||
 | 
					    assertParseFails("Update change\n"
 | 
				
			||||||
 | 
					        + "\n"
 | 
				
			||||||
 | 
					        + "Patch-set: 1\n"
 | 
				
			||||||
 | 
					        + "Branch: refs/heads/master\n"
 | 
				
			||||||
 | 
					        + "Subject: Some subject of a change\n"
 | 
				
			||||||
 | 
					        + "Commit: abcd1234abcd1234abcd1234abcd1234abcd1234\n"
 | 
				
			||||||
 | 
					        + "Commit: deadbeefdeadbeefdeadbeefdeadbeefdeadbeef");
 | 
				
			||||||
 | 
					    assertParseFails("Update patch set 1\n"
 | 
				
			||||||
 | 
					        + "Uploaded patch set 1.\n"
 | 
				
			||||||
 | 
					        + "Patch-set: 1\n"
 | 
				
			||||||
 | 
					        + "Branch: refs/heads/master\n"
 | 
				
			||||||
 | 
					        + "Subject: Some subject of a change\n"
 | 
				
			||||||
 | 
					        + "Commit: beef");
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private RevCommit writeCommit(String body) throws Exception {
 | 
					  private RevCommit writeCommit(String body) throws Exception {
 | 
				
			||||||
    return writeCommit(body, ChangeNoteUtil.newIdent(
 | 
					    return writeCommit(body, ChangeNoteUtil.newIdent(
 | 
				
			||||||
        changeOwner.getAccount(), TimeUtil.nowTs(), serverIdent,
 | 
					        changeOwner.getAccount(), TimeUtil.nowTs(), serverIdent,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -42,6 +42,7 @@ import com.google.gerrit.reviewdb.client.PatchSet;
 | 
				
			|||||||
import com.google.gerrit.reviewdb.client.PatchSetApproval;
 | 
					import com.google.gerrit.reviewdb.client.PatchSetApproval;
 | 
				
			||||||
import com.google.gerrit.reviewdb.client.RevId;
 | 
					import com.google.gerrit.reviewdb.client.RevId;
 | 
				
			||||||
import com.google.gerrit.server.git.VersionedMetaData.BatchMetaDataUpdate;
 | 
					import com.google.gerrit.server.git.VersionedMetaData.BatchMetaDataUpdate;
 | 
				
			||||||
 | 
					import com.google.gwtorm.server.OrmException;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import org.eclipse.jgit.lib.BatchRefUpdate;
 | 
					import org.eclipse.jgit.lib.BatchRefUpdate;
 | 
				
			||||||
import org.eclipse.jgit.lib.Constants;
 | 
					import org.eclipse.jgit.lib.Constants;
 | 
				
			||||||
@@ -583,6 +584,62 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
 | 
				
			|||||||
        .isGreaterThan(lastUpdatedOn);
 | 
					        .isGreaterThan(lastUpdatedOn);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @Test
 | 
				
			||||||
 | 
					  public void commitChangeNotesUnique() throws Exception {
 | 
				
			||||||
 | 
					    // PatchSetId -> RevId must be a one to one mapping
 | 
				
			||||||
 | 
					    Change c = newChange();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ChangeNotes notes = newNotes(c);
 | 
				
			||||||
 | 
					    assertThat(notes.getCurrentPatchSet()).isNull();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // ps1
 | 
				
			||||||
 | 
					    ObjectId commit =
 | 
				
			||||||
 | 
					        ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef");
 | 
				
			||||||
 | 
					    ChangeUpdate update = newUpdate(c, changeOwner);
 | 
				
			||||||
 | 
					    update.setCommit(commit);
 | 
				
			||||||
 | 
					    update.commit();
 | 
				
			||||||
 | 
					    notes = newNotes(c);
 | 
				
			||||||
 | 
					    assertThat(notes.getCurrentPatchSet().getRevision().get())
 | 
				
			||||||
 | 
					        .isEqualTo(commit.name());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // new revId for the same patch set, ps1
 | 
				
			||||||
 | 
					    commit =
 | 
				
			||||||
 | 
					        ObjectId.fromString("badc0feebadc0feebadc0feebadc0feebadc0fee");
 | 
				
			||||||
 | 
					    update.setCommit(commit);
 | 
				
			||||||
 | 
					    update.commit();
 | 
				
			||||||
 | 
					    exception.expect(OrmException.class);
 | 
				
			||||||
 | 
					    exception.expectMessage("Multiple revisions parsed for patch set");
 | 
				
			||||||
 | 
					    notes = newNotes(c);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @Test
 | 
				
			||||||
 | 
					  public void commitChangeNotes() throws Exception {
 | 
				
			||||||
 | 
					    Change c = newChange();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ChangeNotes notes = newNotes(c);
 | 
				
			||||||
 | 
					    assertThat(notes.getCurrentPatchSet()).isNull();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // ps1
 | 
				
			||||||
 | 
					    ObjectId commit =
 | 
				
			||||||
 | 
					        ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef");
 | 
				
			||||||
 | 
					    ChangeUpdate update = newUpdate(c, changeOwner);
 | 
				
			||||||
 | 
					    update.setCommit(commit);
 | 
				
			||||||
 | 
					    update.commit();
 | 
				
			||||||
 | 
					    notes = newNotes(c);
 | 
				
			||||||
 | 
					    assertThat(notes.getCurrentPatchSet().getRevision().get())
 | 
				
			||||||
 | 
					        .isEqualTo(commit.name());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // ps2
 | 
				
			||||||
 | 
					    incrementPatchSet(c);
 | 
				
			||||||
 | 
					    commit =
 | 
				
			||||||
 | 
					        ObjectId.fromString("badc0feebadc0feebadc0feebadc0feebadc0fee");
 | 
				
			||||||
 | 
					    update.setCommit(commit);
 | 
				
			||||||
 | 
					    update.commit();
 | 
				
			||||||
 | 
					    notes = newNotes(c);
 | 
				
			||||||
 | 
					    assertThat(notes.getCurrentPatchSet().getRevision().get())
 | 
				
			||||||
 | 
					        .isEqualTo(commit.name());
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @Test
 | 
					  @Test
 | 
				
			||||||
  public void emptyExceptSubject() throws Exception {
 | 
					  public void emptyExceptSubject() throws Exception {
 | 
				
			||||||
    ChangeUpdate update = newUpdate(newChange(), changeOwner);
 | 
					    ChangeUpdate update = newUpdate(newChange(), changeOwner);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -88,6 +88,25 @@ public class CommitMessageOutputTest extends AbstractChangeNotesTest {
 | 
				
			|||||||
        update.getRevision());
 | 
					        update.getRevision());
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @Test
 | 
				
			||||||
 | 
					  public void changeWithRevision() throws Exception {
 | 
				
			||||||
 | 
					    Change c = TestChanges.newChange(project, changeOwner.getAccountId(), 1);
 | 
				
			||||||
 | 
					    ChangeUpdate update = newUpdate(c, changeOwner);
 | 
				
			||||||
 | 
					    update.setChangeMessage("Foo");
 | 
				
			||||||
 | 
					    update.setCommit(
 | 
				
			||||||
 | 
					        ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
 | 
				
			||||||
 | 
					    update.commit();
 | 
				
			||||||
 | 
					    assertThat(update.getRefName()).isEqualTo("refs/changes/01/1/meta");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assertBodyEquals("Update patch set 1\n"
 | 
				
			||||||
 | 
					        + "\n"
 | 
				
			||||||
 | 
					        + "Foo\n"
 | 
				
			||||||
 | 
					        + "\n"
 | 
				
			||||||
 | 
					        + "Patch-set: 1\n"
 | 
				
			||||||
 | 
					        + "Commit: deadbeefdeadbeefdeadbeefdeadbeefdeadbeef\n",
 | 
				
			||||||
 | 
					        update.getRevision());
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @Test
 | 
					  @Test
 | 
				
			||||||
  public void approvalTombstoneCommitFormat() throws Exception {
 | 
					  public void approvalTombstoneCommitFormat() throws Exception {
 | 
				
			||||||
    Change c = newChange();
 | 
					    Change c = newChange();
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user