InlineEdit: Implement SBS2 integration

SBS2 now includes "edit" in the list of patch sets at the top, and is
capable of diffing an edit against other patch sets.

Change-Id: I18c185f0209c9d9c8243a44d16030ed9d9c4b85a
This commit is contained in:
David Ostrovsky
2013-12-18 00:55:48 +01:00
parent 88d9b4b831
commit 1580e650c1
8 changed files with 66 additions and 20 deletions

View File

@@ -148,7 +148,7 @@ public class Dispatcher {
if (diffBase != null) { if (diffBase != null) {
p.append(diffBase.get()).append(".."); p.append(diffBase.get()).append("..");
} }
p.append(revision.get()).append("/").append(KeyUtil.encode(fileName)); p.append(revision.getId()).append("/").append(KeyUtil.encode(fileName));
if (type != null && !type.isEmpty()) { if (type != null && !type.isEmpty()) {
p.append(",").append(type); p.append(",").append(type);
} }
@@ -553,16 +553,14 @@ public class Dispatcher {
rest = ""; rest = "";
} }
PatchSet.Id base; PatchSet.Id base = null;
PatchSet.Id ps; PatchSet.Id ps;
int dotdot = psIdStr.indexOf(".."); int dotdot = psIdStr.indexOf("..");
if (1 <= dotdot) { if (1 <= dotdot) {
base = new PatchSet.Id(id, Integer.parseInt(psIdStr.substring(0, dotdot))); base = new PatchSet.Id(id, Integer.parseInt(psIdStr.substring(0, dotdot)));
ps = new PatchSet.Id(id, Integer.parseInt(psIdStr.substring(dotdot + 2))); psIdStr = psIdStr.substring(dotdot + 2);
} else {
base = null;
ps = new PatchSet.Id(id, Integer.parseInt(psIdStr));
} }
ps = toPsId(id, psIdStr);
if (!rest.isEmpty()) { if (!rest.isEmpty()) {
DisplaySide side = DisplaySide.B; DisplaySide side = DisplaySide.B;
@@ -597,6 +595,12 @@ public class Dispatcher {
} }
} }
private static PatchSet.Id toPsId(Change.Id id, String psIdStr) {
return new PatchSet.Id(id, psIdStr.equals("edit")
? 0
: Integer.parseInt(psIdStr));
}
private static void extension(final String token) { private static void extension(final String token) {
ExtensionScreen view = new ExtensionScreen(skip(token)); ExtensionScreen view = new ExtensionScreen(skip(token));
if (view.isFound()) { if (view.isFound()) {

View File

@@ -210,7 +210,7 @@ class PatchSetsBox extends Composite {
.closeSpan() .closeSpan()
.append(' '); .append(' ');
} }
sb.append(r._number()); sb.append(r.id());
sb.closeTd(); sb.closeTd();
sb.openTd() sb.openTd()

View File

@@ -101,8 +101,7 @@ class Header extends Composite {
SafeHtml.setInnerHTML(filePath, formatPath(path, null, null)); SafeHtml.setInnerHTML(filePath, formatPath(path, null, null));
up.setTargetHistoryToken(PageLinks.toChange( up.setTargetHistoryToken(PageLinks.toChange(
patchSetId.getParentKey(), patchSetId.getParentKey(),
base != null ? String.valueOf(base.get()) : null, base != null ? base.getId() : null, patchSetId.getId()));
String.valueOf(patchSetId.get())));
} }
private static SafeHtml formatPath(String path, String project, String commit) { private static SafeHtml formatPath(String path, String project, String commit) {
@@ -191,7 +190,7 @@ class Header extends Composite {
GitwebLink gw = Gerrit.getGitwebLink(); GitwebLink gw = Gerrit.getGitwebLink();
if (gw != null) { if (gw != null) {
for (RevisionInfo rev : Natives.asList(info.revisions().values())) { for (RevisionInfo rev : Natives.asList(info.revisions().values())) {
if (rev._number() == patchSetId.get()) { if (patchSetId.getId().equals(rev.id())) {
String c = rev.name(); String c = rev.name();
SafeHtml.setInnerHTML(filePath, formatPath(path, info.project(), c)); SafeHtml.setInnerHTML(filePath, formatPath(path, info.project(), c));
SafeHtml.setInnerHTML(project, new SafeHtmlBuilder() SafeHtml.setInnerHTML(project, new SafeHtmlBuilder()

View File

@@ -85,10 +85,10 @@ class PatchSetSelectBox2 extends Composite {
} }
for (int i = 0; i < list.length(); i++) { for (int i = 0; i < list.length(); i++) {
RevisionInfo r = list.get(i); RevisionInfo r = list.get(i);
InlineHyperlink link = createLink( InlineHyperlink link = createLink(r.id(),
String.valueOf(r._number()), new PatchSet.Id(changeId, r._number())); new PatchSet.Id(changeId, r._number()));
linkPanel.add(link); linkPanel.add(link);
if (revision != null && r._number() == revision.get()) { if (revision != null && r.id().equals(revision.getId())) {
selectedLink = link; selectedLink = link;
} }
} }

View File

@@ -23,6 +23,7 @@ import com.google.gerrit.client.account.DiffPreferences;
import com.google.gerrit.client.change.ChangeScreen2; import com.google.gerrit.client.change.ChangeScreen2;
import com.google.gerrit.client.changes.ChangeApi; import com.google.gerrit.client.changes.ChangeApi;
import com.google.gerrit.client.changes.ChangeInfo; import com.google.gerrit.client.changes.ChangeInfo;
import com.google.gerrit.client.changes.ChangeInfo.EditInfo;
import com.google.gerrit.client.changes.ChangeInfo.RevisionInfo; import com.google.gerrit.client.changes.ChangeInfo.RevisionInfo;
import com.google.gerrit.client.changes.ChangeList; import com.google.gerrit.client.changes.ChangeList;
import com.google.gerrit.client.diff.DiffInfo.FileMeta; import com.google.gerrit.client.diff.DiffInfo.FileMeta;
@@ -119,6 +120,7 @@ public class SideBySide2 extends Screen {
private ScrollSynchronizer scrollSynchronizer; private ScrollSynchronizer scrollSynchronizer;
private DiffInfo diff; private DiffInfo diff;
private FileSize fileSize; private FileSize fileSize;
private EditInfo edit;
private ChunkManager chunkManager; private ChunkManager chunkManager;
private CommentManager commentManager; private CommentManager commentManager;
private SkipManager skipManager; private SkipManager skipManager;
@@ -190,6 +192,16 @@ public class SideBySide2 extends Screen {
} }
})); }));
if (Gerrit.isSignedIn()) {
ChangeApi.edit(changeId.get(), group.add(
new GerritCallback<EditInfo>() {
@Override
public void onSuccess(EditInfo result) {
edit = result;
}
}));
}
final CommentsCollections comments = new CommentsCollections(); final CommentsCollections comments = new CommentsCollections();
comments.load(base, revision, path, group); comments.load(base, revision, path, group);
@@ -200,6 +212,11 @@ public class SideBySide2 extends Screen {
@Override @Override
public void onSuccess(ChangeInfo info) { public void onSuccess(ChangeInfo info) {
info.revisions().copyKeysIntoChildren("name"); info.revisions().copyKeysIntoChildren("name");
if (edit != null) {
edit.set_name(edit.commit().commit());
info.set_edit(edit);
info.revisions().put(edit.name(), RevisionInfo.fromEdit(edit));
}
JsArray<RevisionInfo> list = info.revisions().values(); JsArray<RevisionInfo> list = info.revisions().values();
RevisionInfo.sortRevisionInfoByNumber(list); RevisionInfo.sortRevisionInfoByNumber(list);
diffTable.set(prefs, list, diff); diffTable.set(prefs, list, diff);
@@ -798,8 +815,8 @@ public class SideBySide2 extends Screen {
group.addListener(new GerritCallback<Void>() { group.addListener(new GerritCallback<Void>() {
@Override @Override
public void onSuccess(Void result) { public void onSuccess(Void result) {
String b = base != null ? String.valueOf(base.get()) : null; String b = base != null ? base.getId() : null;
String rev = String.valueOf(revision.get()); String rev = revision.getId();
Gerrit.display( Gerrit.display(
PageLinks.toChange(changeId, b, rev), PageLinks.toChange(changeId, b, rev),
new ChangeScreen2(changeId, b, rev, openReplyBox)); new ChangeScreen2(changeId, b, rev, openReplyBox));

View File

@@ -33,6 +33,6 @@ class UpToChangeCommand2 extends KeyCommand {
public void onKeyPress(final KeyPressEvent event) { public void onKeyPress(final KeyPressEvent event) {
Gerrit.display(PageLinks.toChange( Gerrit.display(PageLinks.toChange(
revision.getParentKey(), revision.getParentKey(),
String.valueOf(revision.get()))); revision.getId()));
} }
} }

View File

@@ -22,6 +22,7 @@ import com.google.common.collect.Lists;
import com.google.gerrit.common.data.PatchScript; import com.google.gerrit.common.data.PatchScript;
import com.google.gerrit.common.data.PatchScript.DisplayMethod; import com.google.gerrit.common.data.PatchScript.DisplayMethod;
import com.google.gerrit.common.data.PatchScript.FileMode; import com.google.gerrit.common.data.PatchScript.FileMode;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.CacheControl; import com.google.gerrit.extensions.restapi.CacheControl;
import com.google.gerrit.extensions.restapi.IdString; import com.google.gerrit.extensions.restapi.IdString;
import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.extensions.restapi.ResourceConflictException;
@@ -36,6 +37,7 @@ import com.google.gerrit.reviewdb.client.Patch.ChangeType;
import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.server.git.LargeObjectException; import com.google.gerrit.server.git.LargeObjectException;
import com.google.gerrit.server.patch.PatchScriptFactory; import com.google.gerrit.server.patch.PatchScriptFactory;
import com.google.gerrit.server.project.InvalidChangeOperationException;
import com.google.gerrit.server.project.NoSuchChangeException; import com.google.gerrit.server.project.NoSuchChangeException;
import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.project.ProjectCache;
import com.google.gerrit.server.project.ProjectState; import com.google.gerrit.server.project.ProjectState;
@@ -53,6 +55,7 @@ import org.kohsuke.args4j.spi.OptionHandler;
import org.kohsuke.args4j.spi.Parameters; import org.kohsuke.args4j.spi.Parameters;
import org.kohsuke.args4j.spi.Setter; import org.kohsuke.args4j.spi.Setter;
import java.io.IOException;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@@ -84,7 +87,8 @@ public class GetDiff implements RestReadView<FileResource> {
@Override @Override
public Response<Result> apply(FileResource resource) public Response<Result> apply(FileResource resource)
throws ResourceConflictException, ResourceNotFoundException, OrmException { throws ResourceConflictException, ResourceNotFoundException,
OrmException, AuthException, InvalidChangeOperationException, IOException {
PatchSet.Id basePatchSet = null; PatchSet.Id basePatchSet = null;
if (base != null) { if (base != null) {
RevisionResource baseResource = revisions.parse( RevisionResource baseResource = revisions.parse(

View File

@@ -14,9 +14,11 @@
package com.google.gerrit.server.patch; package com.google.gerrit.server.patch;
import com.google.common.base.Optional;
import com.google.gerrit.common.Nullable; import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.data.CommentDetail; import com.google.gerrit.common.data.CommentDetail;
import com.google.gerrit.common.data.PatchScript; import com.google.gerrit.common.data.PatchScript;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.AccountDiffPreference; import com.google.gerrit.reviewdb.client.AccountDiffPreference;
import com.google.gerrit.reviewdb.client.AccountDiffPreference.Whitespace; import com.google.gerrit.reviewdb.client.AccountDiffPreference.Whitespace;
@@ -31,10 +33,13 @@ import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.PatchLineCommentsUtil; import com.google.gerrit.server.PatchLineCommentsUtil;
import com.google.gerrit.server.account.AccountInfoCacheFactory; import com.google.gerrit.server.account.AccountInfoCacheFactory;
import com.google.gerrit.server.edit.ChangeEdit;
import com.google.gerrit.server.edit.ChangeEditUtil;
import com.google.gerrit.server.git.GitRepositoryManager; import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.LargeObjectException; import com.google.gerrit.server.git.LargeObjectException;
import com.google.gerrit.server.notedb.ChangeNotes; import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gerrit.server.project.ChangeControl; import com.google.gerrit.server.project.ChangeControl;
import com.google.gerrit.server.project.InvalidChangeOperationException;
import com.google.gerrit.server.project.NoSuchChangeException; import com.google.gerrit.server.project.NoSuchChangeException;
import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject; import com.google.inject.Inject;
@@ -80,6 +85,7 @@ public class PatchScriptFactory implements Callable<PatchScript> {
private final PatchSet.Id psa; private final PatchSet.Id psa;
private final PatchSet.Id psb; private final PatchSet.Id psb;
private final AccountDiffPreference diffPrefs; private final AccountDiffPreference diffPrefs;
private final ChangeEditUtil editReader;
private final Change.Id changeId; private final Change.Id changeId;
private boolean loadHistory = true; private boolean loadHistory = true;
@@ -99,6 +105,7 @@ public class PatchScriptFactory implements Callable<PatchScript> {
final PatchListCache patchListCache, final ReviewDb db, final PatchListCache patchListCache, final ReviewDb db,
final AccountInfoCacheFactory.Factory aicFactory, final AccountInfoCacheFactory.Factory aicFactory,
PatchLineCommentsUtil plcUtil, PatchLineCommentsUtil plcUtil,
ChangeEditUtil editReader,
@Assisted ChangeControl control, @Assisted ChangeControl control,
@Assisted final String fileName, @Assisted final String fileName,
@Assisted("patchSetA") @Nullable final PatchSet.Id patchSetA, @Assisted("patchSetA") @Nullable final PatchSet.Id patchSetA,
@@ -111,6 +118,7 @@ public class PatchScriptFactory implements Callable<PatchScript> {
this.control = control; this.control = control;
this.aicFactory = aicFactory; this.aicFactory = aicFactory;
this.plcUtil = plcUtil; this.plcUtil = plcUtil;
this.editReader = editReader;
this.fileName = fileName; this.fileName = fileName;
this.psa = patchSetA; this.psa = patchSetA;
@@ -130,7 +138,8 @@ public class PatchScriptFactory implements Callable<PatchScript> {
@Override @Override
public PatchScript call() throws OrmException, NoSuchChangeException, public PatchScript call() throws OrmException, NoSuchChangeException,
LargeObjectException { LargeObjectException, AuthException,
InvalidChangeOperationException, IOException {
validatePatchSetId(psa); validatePatchSetId(psa);
validatePatchSetId(psb); validatePatchSetId(psb);
@@ -197,12 +206,16 @@ public class PatchScriptFactory implements Callable<PatchScript> {
} }
private ObjectId toObjectId(final ReviewDb db, final PatchSet.Id psId) private ObjectId toObjectId(final ReviewDb db, final PatchSet.Id psId)
throws OrmException, NoSuchChangeException { throws OrmException, NoSuchChangeException, AuthException,
InvalidChangeOperationException, NoSuchChangeException, IOException {
if (!changeId.equals(psId.getParentKey())) { if (!changeId.equals(psId.getParentKey())) {
throw new NoSuchChangeException(changeId); throw new NoSuchChangeException(changeId);
} }
final PatchSet ps = db.patchSets().get(psId); if (psId.get() == 0) {
return getEditRev();
}
PatchSet ps = db.patchSets().get(psId);
if (ps == null || ps.getRevision() == null if (ps == null || ps.getRevision() == null
|| ps.getRevision().get() == null) { || ps.getRevision().get() == null) {
throw new NoSuchChangeException(changeId); throw new NoSuchChangeException(changeId);
@@ -216,6 +229,15 @@ public class PatchScriptFactory implements Callable<PatchScript> {
} }
} }
private ObjectId getEditRev() throws AuthException,
NoSuchChangeException, IOException, InvalidChangeOperationException {
Optional<ChangeEdit> edit = editReader.byChange(change);
if (edit.isPresent()) {
return edit.get().getRef().getObjectId();
}
throw new NoSuchChangeException(change.getId());
}
private void validatePatchSetId(final PatchSet.Id psId) private void validatePatchSetId(final PatchSet.Id psId)
throws NoSuchChangeException { throws NoSuchChangeException {
if (psId == null) { // OK, means use base; if (psId == null) { // OK, means use base;