add EditWebLink class without adding it to the FE Change-Id: Ie3153c4f032190527f7ca269f9a614bfdfb9825a
diff --git a/Documentation/rest-api-changes.txt b/Documentation/rest-api-changes.txt index dab8117..d3635b3 100644 --- a/Documentation/rest-api-changes.txt +++ b/Documentation/rest-api-changes.txt
@@ -7058,6 +7058,9 @@ |`web_links` |optional| Links to the file in external sites as a list of link:rest-api-changes.html#web-link-info[WebLinkInfo] entries. +|`edit_web_links` |optional| +Links to edit the file in external sites as a list of +link:rest-api-changes.html#web-link-info[WebLinkInfo] entries. |========================== [[diff-info]]
diff --git a/java/com/google/gerrit/acceptance/AbstractDaemonTest.java b/java/com/google/gerrit/acceptance/AbstractDaemonTest.java index b05050d..003df28 100644 --- a/java/com/google/gerrit/acceptance/AbstractDaemonTest.java +++ b/java/com/google/gerrit/acceptance/AbstractDaemonTest.java
@@ -1284,6 +1284,7 @@ assertThat(diff.metaB.lines).isEqualTo(expectedLines.size()); assertThat(diff.metaB.name).isEqualTo(path); assertThat(diff.metaB.webLinks).isNull(); + assertThat(diff.metaB.editWebLinks).isNull(); assertThat(diff.content).hasSize(1); DiffInfo.ContentEntry contentEntry = diff.content.get(0);
diff --git a/java/com/google/gerrit/acceptance/ExtensionRegistry.java b/java/com/google/gerrit/acceptance/ExtensionRegistry.java index 35f8ce6..6c6bab0 100644 --- a/java/com/google/gerrit/acceptance/ExtensionRegistry.java +++ b/java/com/google/gerrit/acceptance/ExtensionRegistry.java
@@ -32,6 +32,7 @@ import com.google.gerrit.extensions.registration.DynamicSet; import com.google.gerrit.extensions.registration.PrivateInternals_DynamicMapImpl; import com.google.gerrit.extensions.registration.RegistrationHandle; +import com.google.gerrit.extensions.webui.EditWebLink; import com.google.gerrit.extensions.webui.FileHistoryWebLink; import com.google.gerrit.extensions.webui.PatchSetWebLink; import com.google.gerrit.server.ExceptionHook; @@ -75,6 +76,7 @@ private final DynamicSet<GitReferenceUpdatedListener> refUpdatedListeners; private final DynamicSet<FileHistoryWebLink> fileHistoryWebLinks; private final DynamicSet<PatchSetWebLink> patchSetWebLinks; + private final DynamicSet<EditWebLink> editWebLinks; private final DynamicSet<RevisionCreatedListener> revisionCreatedListeners; private final DynamicSet<GroupBackend> groupBackends; private final DynamicSet<AccountActivationValidationListener> @@ -109,6 +111,7 @@ DynamicSet<GitReferenceUpdatedListener> refUpdatedListeners, DynamicSet<FileHistoryWebLink> fileHistoryWebLinks, DynamicSet<PatchSetWebLink> patchSetWebLinks, + DynamicSet<EditWebLink> editWebLinks, DynamicSet<RevisionCreatedListener> revisionCreatedListeners, DynamicSet<GroupBackend> groupBackends, DynamicSet<AccountActivationValidationListener> accountActivationValidationListeners, @@ -139,6 +142,7 @@ this.refUpdatedListeners = refUpdatedListeners; this.fileHistoryWebLinks = fileHistoryWebLinks; this.patchSetWebLinks = patchSetWebLinks; + this.editWebLinks = editWebLinks; this.revisionCreatedListeners = revisionCreatedListeners; this.groupBackends = groupBackends; this.accountActivationValidationListeners = accountActivationValidationListeners; @@ -240,6 +244,10 @@ return add(patchSetWebLinks, patchSetWebLink); } + public Registration add(EditWebLink editWebLink) { + return add(editWebLinks, editWebLink); + } + public Registration add(RevisionCreatedListener revisionCreatedListener) { return add(revisionCreatedListeners, revisionCreatedListener); }
diff --git a/java/com/google/gerrit/extensions/common/DiffInfo.java b/java/com/google/gerrit/extensions/common/DiffInfo.java index 2511e96..5a59613 100644 --- a/java/com/google/gerrit/extensions/common/DiffInfo.java +++ b/java/com/google/gerrit/extensions/common/DiffInfo.java
@@ -52,6 +52,8 @@ public Integer lines; // Links to the file in external sites public List<WebLinkInfo> webLinks; + // Links to edit the file in external sites + public List<WebLinkInfo> editWebLinks; } public static final class ContentEntry {
diff --git a/java/com/google/gerrit/extensions/common/testing/FileMetaSubject.java b/java/com/google/gerrit/extensions/common/testing/FileMetaSubject.java index 0953bfe..d0212f3 100644 --- a/java/com/google/gerrit/extensions/common/testing/FileMetaSubject.java +++ b/java/com/google/gerrit/extensions/common/testing/FileMetaSubject.java
@@ -64,4 +64,9 @@ isNotNull(); return check("webLinks").that(fileMeta.webLinks); } + + public IterableSubject editWebLinks() { + isNotNull(); + return check("editWebLinks").that(fileMeta.editWebLinks); + } }
diff --git a/java/com/google/gerrit/extensions/webui/EditWebLink.java b/java/com/google/gerrit/extensions/webui/EditWebLink.java new file mode 100644 index 0000000..cd70feb --- /dev/null +++ b/java/com/google/gerrit/extensions/webui/EditWebLink.java
@@ -0,0 +1,36 @@ +// Copyright (C) 2021 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.extensions.webui; + +import com.google.gerrit.extensions.annotations.ExtensionPoint; +import com.google.gerrit.extensions.common.WebLinkInfo; + +@ExtensionPoint +public interface EditWebLink extends WebLink { + + /** + * {@link com.google.gerrit.extensions.common.WebLinkInfo} describing a link from a file to an + * external service for editing. + * + * <p>In order for the web link to be visible {@link WebLinkInfo#url} and {@link WebLinkInfo#name} + * must be set. + * + * @param projectName name of the project + * @param revision name of the revision (e.g. branch or commit ID) + * @param fileName name of the file + * @return WebLinkInfo that links to project in external service, null if there should be no link. + */ + WebLinkInfo getEditWebLink(String projectName, String revision, String fileName); +}
diff --git a/java/com/google/gerrit/server/WebLinks.java b/java/com/google/gerrit/server/WebLinks.java index e66e7f5..3b626ea 100644 --- a/java/com/google/gerrit/server/WebLinks.java +++ b/java/com/google/gerrit/server/WebLinks.java
@@ -27,6 +27,7 @@ import com.google.gerrit.extensions.registration.DynamicSet; import com.google.gerrit.extensions.webui.BranchWebLink; import com.google.gerrit.extensions.webui.DiffWebLink; +import com.google.gerrit.extensions.webui.EditWebLink; import com.google.gerrit.extensions.webui.FileHistoryWebLink; import com.google.gerrit.extensions.webui.FileWebLink; import com.google.gerrit.extensions.webui.ParentWebLink; @@ -56,6 +57,7 @@ private final DynamicSet<PatchSetWebLink> patchSetLinks; private final DynamicSet<ParentWebLink> parentLinks; + private final DynamicSet<EditWebLink> editLinks; private final DynamicSet<FileWebLink> fileLinks; private final DynamicSet<FileHistoryWebLink> fileHistoryLinks; private final DynamicSet<DiffWebLink> diffLinks; @@ -67,6 +69,7 @@ public WebLinks( DynamicSet<PatchSetWebLink> patchSetLinks, DynamicSet<ParentWebLink> parentLinks, + DynamicSet<EditWebLink> editLinks, DynamicSet<FileWebLink> fileLinks, DynamicSet<FileHistoryWebLink> fileLogLinks, DynamicSet<DiffWebLink> diffLinks, @@ -75,6 +78,7 @@ DynamicSet<TagWebLink> tagLinks) { this.patchSetLinks = patchSetLinks; this.parentLinks = parentLinks; + this.editLinks = editLinks; this.fileLinks = fileLinks; this.fileHistoryLinks = fileLogLinks; this.diffLinks = diffLinks; @@ -115,6 +119,18 @@ * @param project Project name. * @param revision SHA1 of revision. * @param file File name. + * @return Links for editing. + */ + public ImmutableList<WebLinkInfo> getEditLinks(String project, String revision, String file) { + return Patch.isMagic(file) + ? ImmutableList.of() + : filterLinks(editLinks, webLink -> webLink.getEditWebLink(project, revision, file)); + } + + /** + * @param project Project name. + * @param revision SHA1 of revision. + * @param file File name. * @return Links for files. */ public ImmutableList<WebLinkInfo> getFileLinks(String project, String revision, String file) {
diff --git a/java/com/google/gerrit/server/config/GerritGlobalModule.java b/java/com/google/gerrit/server/config/GerritGlobalModule.java index 3da3fd3..4709359 100644 --- a/java/com/google/gerrit/server/config/GerritGlobalModule.java +++ b/java/com/google/gerrit/server/config/GerritGlobalModule.java
@@ -66,6 +66,7 @@ import com.google.gerrit.extensions.validators.CommentValidator; import com.google.gerrit.extensions.webui.BranchWebLink; import com.google.gerrit.extensions.webui.DiffWebLink; +import com.google.gerrit.extensions.webui.EditWebLink; import com.google.gerrit.extensions.webui.FileHistoryWebLink; import com.google.gerrit.extensions.webui.FileWebLink; import com.google.gerrit.extensions.webui.ParentWebLink; @@ -395,6 +396,7 @@ DynamicSet.setOf(binder(), FileWebLink.class); DynamicSet.setOf(binder(), FileHistoryWebLink.class); DynamicSet.setOf(binder(), DiffWebLink.class); + DynamicSet.setOf(binder(), EditWebLink.class); DynamicSet.setOf(binder(), ProjectWebLink.class); DynamicSet.setOf(binder(), BranchWebLink.class); DynamicSet.setOf(binder(), TagWebLink.class);
diff --git a/java/com/google/gerrit/server/config/GitwebConfig.java b/java/com/google/gerrit/server/config/GitwebConfig.java index 8214f03..97cc830 100644 --- a/java/com/google/gerrit/server/config/GitwebConfig.java +++ b/java/com/google/gerrit/server/config/GitwebConfig.java
@@ -27,6 +27,7 @@ import com.google.gerrit.extensions.registration.DynamicSet; import com.google.gerrit.extensions.restapi.Url; import com.google.gerrit.extensions.webui.BranchWebLink; +import com.google.gerrit.extensions.webui.EditWebLink; import com.google.gerrit.extensions.webui.FileHistoryWebLink; import com.google.gerrit.extensions.webui.FileWebLink; import com.google.gerrit.extensions.webui.ParentWebLink; @@ -71,6 +72,7 @@ } if (!isNullOrEmpty(type.getFile()) || !isNullOrEmpty(type.getRootTree())) { + DynamicSet.bind(binder(), EditWebLink.class).to(GitwebLinks.class); DynamicSet.bind(binder(), FileWebLink.class).to(GitwebLinks.class); } @@ -253,6 +255,7 @@ @Singleton static class GitwebLinks implements BranchWebLink, + EditWebLink, FileHistoryWebLink, FileWebLink, PatchSetWebLink, @@ -327,6 +330,12 @@ } @Override + public WebLinkInfo getEditWebLink(String projectName, String revision, String fileName) { + // For Gitweb treat edit links the same as file links + return getFileWebLink(projectName, revision, fileName); + } + + @Override public WebLinkInfo getPatchSetWebLink( String projectName, String commit, String commitMessage, String branchName) { if (revision != null) {
diff --git a/java/com/google/gerrit/server/diff/DiffInfoCreator.java b/java/com/google/gerrit/server/diff/DiffInfoCreator.java index c29ffc8..53f0019 100644 --- a/java/com/google/gerrit/server/diff/DiffInfoCreator.java +++ b/java/com/google/gerrit/server/diff/DiffInfoCreator.java
@@ -156,8 +156,10 @@ FileContentUtil.resolveContentType( state, side.fileName(), fileInfo.mode, fileInfo.mimeType); result.lines = fileInfo.content.getSize(); - ImmutableList<WebLinkInfo> links = webLinksProvider.getFileWebLinks(side.type()); - result.webLinks = links.isEmpty() ? null : links; + ImmutableList<WebLinkInfo> fileLinks = webLinksProvider.getFileWebLinks(side.type()); + result.webLinks = fileLinks.isEmpty() ? null : fileLinks; + ImmutableList<WebLinkInfo> editLinks = webLinksProvider.getEditWebLinks(side.type()); + result.editWebLinks = editLinks.isEmpty() ? null : editLinks; result.commitId = fileInfo.commitId; return Optional.of(result); }
diff --git a/java/com/google/gerrit/server/diff/DiffWebLinksProvider.java b/java/com/google/gerrit/server/diff/DiffWebLinksProvider.java index 0f71b17..d4c7f5b 100644 --- a/java/com/google/gerrit/server/diff/DiffWebLinksProvider.java +++ b/java/com/google/gerrit/server/diff/DiffWebLinksProvider.java
@@ -24,6 +24,9 @@ /** Returns links associated with the diff view */ ImmutableList<DiffWebLinkInfo> getDiffLinks(); - /** Returns links associated with the diff side */ + /** Returns file links associated with the diff side */ ImmutableList<WebLinkInfo> getFileWebLinks(DiffSide.Type fileInfoType); + + /** Returns edit links associated with the diff side */ + ImmutableList<WebLinkInfo> getEditWebLinks(DiffSide.Type fileInfoType); }
diff --git a/java/com/google/gerrit/server/restapi/change/GetDiff.java b/java/com/google/gerrit/server/restapi/change/GetDiff.java index b8902b7..d48d76a 100644 --- a/java/com/google/gerrit/server/restapi/change/GetDiff.java +++ b/java/com/google/gerrit/server/restapi/change/GetDiff.java
@@ -226,18 +226,26 @@ } @Override + public ImmutableList<WebLinkInfo> getEditWebLinks(DiffSide.Type type) { + String rev = getSideRev(type); + DiffSide side = getDiffSide(type); + return webLinks.getEditLinks(projectName.get(), rev, side.fileName()); + } + + @Override public ImmutableList<WebLinkInfo> getFileWebLinks(DiffSide.Type type) { - String rev; - DiffSide side; - if (type == DiffSide.Type.SIDE_A) { - rev = revA; - side = sideA; - } else { - rev = revB; - side = sideB; - } + String rev = getSideRev(type); + DiffSide side = getDiffSide(type); return webLinks.getFileLinks(projectName.get(), rev, side.fileName()); } + + private String getSideRev(DiffSide.Type sideType) { + return DiffSide.Type.SIDE_A == sideType ? revA : revB; + } + + private DiffSide getDiffSide(DiffSide.Type sideType) { + return DiffSide.Type.SIDE_A == sideType ? sideA : sideB; + } } public GetDiff setBase(String base) {
diff --git a/java/com/google/gerrit/server/restapi/change/GetFixPreview.java b/java/com/google/gerrit/server/restapi/change/GetFixPreview.java index 6089778..5191fc8 100644 --- a/java/com/google/gerrit/server/restapi/change/GetFixPreview.java +++ b/java/com/google/gerrit/server/restapi/change/GetFixPreview.java
@@ -140,5 +140,10 @@ public ImmutableList<WebLinkInfo> getFileWebLinks(Type fileInfoType) { return ImmutableList.of(); } + + @Override + public ImmutableList<WebLinkInfo> getEditWebLinks(Type fileInfoType) { + return ImmutableList.of(); + } } }
diff --git a/javatests/com/google/gerrit/acceptance/api/revision/RevisionDiffIT.java b/javatests/com/google/gerrit/acceptance/api/revision/RevisionDiffIT.java index 0b18503..37b4a1c 100644 --- a/javatests/com/google/gerrit/acceptance/api/revision/RevisionDiffIT.java +++ b/javatests/com/google/gerrit/acceptance/api/revision/RevisionDiffIT.java
@@ -30,6 +30,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.gerrit.acceptance.AbstractDaemonTest; +import com.google.gerrit.acceptance.ExtensionRegistry; +import com.google.gerrit.acceptance.ExtensionRegistry.Registration; import com.google.gerrit.acceptance.GitUtil; import com.google.gerrit.acceptance.PushOneCommit; import com.google.gerrit.acceptance.PushOneCommit.Result; @@ -40,8 +42,11 @@ import com.google.gerrit.extensions.common.ChangeType; import com.google.gerrit.extensions.common.DiffInfo; import com.google.gerrit.extensions.common.FileInfo; +import com.google.gerrit.extensions.common.WebLinkInfo; import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.BinaryResult; +import com.google.gerrit.extensions.webui.EditWebLink; +import com.google.inject.Inject; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -75,6 +80,8 @@ .collect(joining()); private static final String FILE_CONTENT2 = "1st line\n2nd line\n3rd line\n"; + @Inject private ExtensionRegistry extensionRegistry; + private boolean intraline; private boolean useNewDiffCacheListFiles; private boolean useNewDiffCacheGetDiff; @@ -142,6 +149,24 @@ } @Test + public void editWebLinkIncludedInDiff() throws Exception { + try (Registration registration = newEditWebLink()) { + String fileName = "a_new_file.txt"; + String fileContent = "First line\nSecond line\n"; + PushOneCommit.Result result = createChange("Add a file", fileName, fileContent); + DiffInfo info = + gApi.changes() + .id(result.getChangeId()) + .revision(result.getCommit().name()) + .file(fileName) + .diff(); + assertThat(info.metaB.editWebLinks).hasSize(1); + assertThat(info.metaB.editWebLinks.get(0).url) + .isEqualTo("http://edit/" + project + "/" + fileName); + } + } + + @Test public void deletedFileIsIncludedInDiff() throws Exception { gApi.changes().id(changeId).edit().deleteFile(FILE_NAME); gApi.changes().id(changeId).edit().publish(); @@ -2875,6 +2900,18 @@ assertThat(e).hasMessageThat().isEqualTo("edit not allowed as base"); } + private Registration newEditWebLink() { + EditWebLink webLink = + new EditWebLink() { + @Override + public WebLinkInfo getEditWebLink(String projectName, String revision, String fileName) { + return new WebLinkInfo( + "name", "imageURL", "http://edit/" + projectName + "/" + fileName); + } + }; + return extensionRegistry.newRegistration().add(webLink); + } + private String updatedCommitMessage() { return "An unchanged patchset\n\nChange-Id: " + changeId; }
diff --git a/polygerrit-ui/app/types/diff.ts b/polygerrit-ui/app/types/diff.ts index c3b38c6..d30917a0 100644 --- a/polygerrit-ui/app/types/diff.ts +++ b/polygerrit-ui/app/types/diff.ts
@@ -74,6 +74,11 @@ export interface DiffFileMetaInfo extends DiffFileMetaInfoApi { /** Links to the file in external sites as a list of WebLinkInfo entries. */ web_links?: WebLinkInfo[]; + /** + * Links to edit the file in external sites as a list of WebLinkInfo + * entries. + */ + edit_web_links?: WebLinkInfo[]; } /**