Replace gitweb glue with WebLink extensions
Keep the gitweb configuration section, but bind the URLs through the WebLink extension points instead of specific support in the web UI. This simplifies the server and UI implementations a bit by using only code paths that other plugins like the gitiles plugin use. Change-Id: I8508dcaf3a4405b3ce3a47f2f717472a46e5a8ca
This commit is contained in:
parent
e7d7282284
commit
c4a90512d5
@ -1989,16 +1989,6 @@ based viewer)
|
|||||||
+
|
+
|
||||||
Valid values are "true" and "false," default is "true."
|
Valid values are "true" and "false," default is "true."
|
||||||
|
|
||||||
[[gitweb.linkDrafts]]gitweb.linkDrafts::
|
|
||||||
+
|
|
||||||
Whether or not Gerrit should provide links to gitweb on draft patch sets.
|
|
||||||
+
|
|
||||||
By default, Gerrit will show links to gitweb on all patch sets. If gitweb
|
|
||||||
only allows publicly viewable references, set this to false to remove
|
|
||||||
the links to draft patch sets from the change review screen.
|
|
||||||
+
|
|
||||||
Valid values are "true" and "false," default is "true".
|
|
||||||
|
|
||||||
[[groups]]
|
[[groups]]
|
||||||
=== Section groups
|
=== Section groups
|
||||||
|
|
||||||
|
@ -1305,54 +1305,6 @@ link:config-gerrit.html#gerrit.reportBugText[Display text for report
|
|||||||
bugs link].
|
bugs link].
|
||||||
|=================================
|
|=================================
|
||||||
|
|
||||||
[[git-web-info]]
|
|
||||||
=== GitwebInfo
|
|
||||||
The `GitwebInfo` entity contains information about the
|
|
||||||
link:config-gerrit.html#gitweb[gitweb] configuration.
|
|
||||||
|
|
||||||
[options="header",cols="1,6"]
|
|
||||||
|=======================
|
|
||||||
|Field Name |Description
|
|
||||||
|`url` |
|
|
||||||
The link:config-gerrit.html#gitweb.url[gitweb base URL].
|
|
||||||
|`type` |
|
|
||||||
The link:config-gerrit.html#gitweb.type[gitweb type] as
|
|
||||||
link:#git-web-type-info[GitwebTypeInfo] entity.
|
|
||||||
|=======================
|
|
||||||
|
|
||||||
[[git-web-type-info]]
|
|
||||||
=== GitwebTypeInfo
|
|
||||||
The `GitwebTypeInfo` entity contains information about the
|
|
||||||
link:config-gerrit.html#gitweb[gitweb] configuration.
|
|
||||||
|
|
||||||
[options="header",cols="1,^1,5"]
|
|
||||||
|=============================
|
|
||||||
|Field Name ||Description
|
|
||||||
|`name` ||
|
|
||||||
The link:config-gerrit.html#gitweb.linkname[gitweb link name].
|
|
||||||
|`revision` |optional|
|
|
||||||
The link:config-gerrit.html#gitweb.revision[gitweb revision pattern].
|
|
||||||
|`project` |optional|
|
|
||||||
The link:config-gerrit.html#gitweb.project[gitweb project pattern].
|
|
||||||
|`branch` |optional|
|
|
||||||
The link:config-gerrit.html#gitweb.branch[gitweb branch pattern].
|
|
||||||
|`root_tree` |optional|
|
|
||||||
The link:config-gerrit.html#gitweb.roottree[gitweb root tree pattern].
|
|
||||||
|`file` |optional|
|
|
||||||
The link:config-gerrit.html#gitweb.file[gitweb file pattern].
|
|
||||||
|`file_history` |optional|
|
|
||||||
The link:config-gerrit.html#gitweb.filehistory[gitweb file history
|
|
||||||
pattern].
|
|
||||||
|`path_separator`||
|
|
||||||
The link:config-gerrit.html#gitweb.pathSeparator[gitweb path separator].
|
|
||||||
|`link_drafts` |optional|
|
|
||||||
link:config-gerrit.html#gitweb.linkDrafts[Whether Gerrit should provide
|
|
||||||
links to gitweb on draft patch set.]
|
|
||||||
|`url_encode` |optional|
|
|
||||||
link:config-gerrit.html#gitweb.urlEncode[Whether Gerrit should encode
|
|
||||||
the generated viewer URL.]
|
|
||||||
|=============================
|
|
||||||
|
|
||||||
[[hit-ration-info]]
|
[[hit-ration-info]]
|
||||||
=== HitRatioInfo
|
=== HitRatioInfo
|
||||||
The `HitRatioInfo` entity contains information about the hit ratio of a
|
The `HitRatioInfo` entity contains information about the hit ratio of a
|
||||||
@ -1464,8 +1416,6 @@ information about Gerrit
|
|||||||
Information about the configuration from the
|
Information about the configuration from the
|
||||||
link:config-gerrit.html#gerrit[gerrit] section as link:#gerrit-info[
|
link:config-gerrit.html#gerrit[gerrit] section as link:#gerrit-info[
|
||||||
GerritInfo] entity.
|
GerritInfo] entity.
|
||||||
|`gitweb ` |optional|
|
|
||||||
Information about the link:config-gerrit.html#gitweb[gitweb]
|
|
||||||
|`plugin ` ||
|
|`plugin ` ||
|
||||||
Information about Gerrit extensions by plugins as
|
Information about Gerrit extensions by plugins as
|
||||||
link:#plugin-config-info[PluginConfigInfo] entity.
|
link:#plugin-config-info[PluginConfigInfo] entity.
|
||||||
|
@ -108,9 +108,6 @@ public class ServerInfoIT extends AbstractDaemonTest {
|
|||||||
assertThat(i.gerrit.reportBugUrl).isEqualTo("https://example.com/report");
|
assertThat(i.gerrit.reportBugUrl).isEqualTo("https://example.com/report");
|
||||||
assertThat(i.gerrit.reportBugText).isEqualTo("REPORT BUG");
|
assertThat(i.gerrit.reportBugText).isEqualTo("REPORT BUG");
|
||||||
|
|
||||||
// gitweb
|
|
||||||
assertThat(i.gitweb).isNull();
|
|
||||||
|
|
||||||
// plugin
|
// plugin
|
||||||
assertThat(i.plugin.jsResourcePaths).isEmpty();
|
assertThat(i.plugin.jsResourcePaths).isEmpty();
|
||||||
|
|
||||||
@ -176,9 +173,6 @@ public class ServerInfoIT extends AbstractDaemonTest {
|
|||||||
assertThat(i.gerrit.reportBugUrl).isNull();
|
assertThat(i.gerrit.reportBugUrl).isNull();
|
||||||
assertThat(i.gerrit.reportBugText).isNull();
|
assertThat(i.gerrit.reportBugText).isNull();
|
||||||
|
|
||||||
// gitweb
|
|
||||||
assertThat(i.gitweb).isNull();
|
|
||||||
|
|
||||||
// plugin
|
// plugin
|
||||||
assertThat(i.plugin.jsResourcePaths).isEmpty();
|
assertThat(i.plugin.jsResourcePaths).isEmpty();
|
||||||
|
|
||||||
|
@ -26,7 +26,6 @@ public class GitwebType {
|
|||||||
private String rootTree;
|
private String rootTree;
|
||||||
|
|
||||||
private char pathSeparator = '/';
|
private char pathSeparator = '/';
|
||||||
private boolean linkDrafts = true;
|
|
||||||
private boolean urlEncode = true;
|
private boolean urlEncode = true;
|
||||||
|
|
||||||
/** @return name displayed in links. */
|
/** @return name displayed in links. */
|
||||||
@ -141,20 +140,6 @@ public class GitwebType {
|
|||||||
this.pathSeparator = separator;
|
this.pathSeparator = separator;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return whether to generate links to draft patch sets. */
|
|
||||||
public boolean getLinkDrafts() {
|
|
||||||
return linkDrafts;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set whether to generate links to draft patch sets.
|
|
||||||
*
|
|
||||||
* @param linkDrafts new value.
|
|
||||||
*/
|
|
||||||
public void setLinkDrafts(boolean linkDrafts) {
|
|
||||||
this.linkDrafts = linkDrafts;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @return whether to URL encode path segments. */
|
/** @return whether to URL encode path segments. */
|
||||||
public boolean getUrlEncode() {
|
public boolean getUrlEncode() {
|
||||||
return urlEncode;
|
return urlEncode;
|
||||||
|
@ -1,168 +0,0 @@
|
|||||||
// Copyright (C) 2008 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.client.info;
|
|
||||||
|
|
||||||
import com.google.gerrit.client.info.ChangeInfo.RevisionInfo;
|
|
||||||
import com.google.gerrit.common.data.ParameterizedString;
|
|
||||||
import com.google.gerrit.reviewdb.client.Branch;
|
|
||||||
import com.google.gerrit.reviewdb.client.PatchSet;
|
|
||||||
import com.google.gerrit.reviewdb.client.Project;
|
|
||||||
import com.google.gwt.core.client.JavaScriptObject;
|
|
||||||
import com.google.gwt.http.client.URL;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public class GitwebInfo extends JavaScriptObject {
|
|
||||||
public final native String url() /*-{ return this.url; }-*/;
|
|
||||||
public final native GitwebTypeInfo type() /*-{ return this.type; }-*/;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks whether the given patch set can be linked.
|
|
||||||
*
|
|
||||||
* Draft patch sets can only be linked if linking of drafts was enabled by
|
|
||||||
* configuration.
|
|
||||||
*
|
|
||||||
* @param ps patch set to check whether it can be linked
|
|
||||||
* @return true if the patch set can be linked, otherwise false
|
|
||||||
*/
|
|
||||||
public final boolean canLink(PatchSet ps) {
|
|
||||||
return !ps.isDraft() || type().linkDrafts();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks whether the given revision can be linked.
|
|
||||||
*
|
|
||||||
* Draft revisions can only be linked if linking of drafts was enabled by
|
|
||||||
* configuration.
|
|
||||||
*
|
|
||||||
* @param revision revision to check whether it can be linked
|
|
||||||
* @return true if the revision can be linked, otherwise false
|
|
||||||
*/
|
|
||||||
public final boolean canLink(RevisionInfo revision) {
|
|
||||||
return revision.draft() || type().linkDrafts();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the name for gitweb links.
|
|
||||||
*
|
|
||||||
* @return the name for gitweb links
|
|
||||||
*/
|
|
||||||
public final String getLinkName() {
|
|
||||||
return "(" + type().name() + ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the gitweb link to a revision.
|
|
||||||
*
|
|
||||||
* @param project the name of the project
|
|
||||||
* @param commit the commit ID
|
|
||||||
* @return gitweb link to a revision
|
|
||||||
*/
|
|
||||||
public final String toRevision(String project, String commit) {
|
|
||||||
ParameterizedString pattern = new ParameterizedString(type().revision());
|
|
||||||
Map<String, String> p = new HashMap<>();
|
|
||||||
p.put("project", encode(project));
|
|
||||||
p.put("commit", encode(commit));
|
|
||||||
return url() + pattern.replace(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the gitweb link to a revision.
|
|
||||||
*
|
|
||||||
* @param project the name of the project
|
|
||||||
* @param ps the patch set
|
|
||||||
* @return gitweb link to a revision
|
|
||||||
*/
|
|
||||||
public final String toRevision(Project.NameKey project, PatchSet ps) {
|
|
||||||
return toRevision(project.get(), ps.getRevision().get());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the gitweb link to a project.
|
|
||||||
*
|
|
||||||
* @param project the project name key
|
|
||||||
* @return gitweb link to a project
|
|
||||||
*/
|
|
||||||
public final String toProject(Project.NameKey project) {
|
|
||||||
ParameterizedString pattern = new ParameterizedString(type().project());
|
|
||||||
|
|
||||||
Map<String, String> p = new HashMap<>();
|
|
||||||
p.put("project", encode(project.get()));
|
|
||||||
return url() + pattern.replace(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the gitweb link to a branch.
|
|
||||||
*
|
|
||||||
* @param branch the branch name key
|
|
||||||
* @return gitweb link to a branch
|
|
||||||
*/
|
|
||||||
public final String toBranch(Branch.NameKey branch) {
|
|
||||||
ParameterizedString pattern = new ParameterizedString(type().branch());
|
|
||||||
|
|
||||||
Map<String, String> p = new HashMap<>();
|
|
||||||
p.put("project", encode(branch.getParentKey().get()));
|
|
||||||
p.put("branch", encode(branch.get()));
|
|
||||||
return url() + pattern.replace(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the gitweb link to a file.
|
|
||||||
*
|
|
||||||
* @param project the branch name key
|
|
||||||
* @param commit the commit ID
|
|
||||||
* @param file the path of the file
|
|
||||||
* @return gitweb link to a file
|
|
||||||
*/
|
|
||||||
public final String toFile(String project, String commit, String file) {
|
|
||||||
Map<String, String> p = new HashMap<>();
|
|
||||||
p.put("project", encode(project));
|
|
||||||
p.put("commit", encode(commit));
|
|
||||||
p.put("file", encode(file));
|
|
||||||
|
|
||||||
ParameterizedString pattern = (file == null || file.isEmpty())
|
|
||||||
? new ParameterizedString(type().rootTree())
|
|
||||||
: new ParameterizedString(type().file());
|
|
||||||
return url() + pattern.replace(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the gitweb link to a file history.
|
|
||||||
*
|
|
||||||
* @param branch the branch name key
|
|
||||||
* @param file the path of the file
|
|
||||||
* @return gitweb link to a file history
|
|
||||||
*/
|
|
||||||
public final String toFileHistory(Branch.NameKey branch, String file) {
|
|
||||||
ParameterizedString pattern = new ParameterizedString(type().fileHistory());
|
|
||||||
|
|
||||||
Map<String, String> p = new HashMap<>();
|
|
||||||
p.put("project", encode(branch.getParentKey().get()));
|
|
||||||
p.put("branch", encode(branch.get()));
|
|
||||||
p.put("file", encode(file));
|
|
||||||
return url() + pattern.replace(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String encode(String segment) {
|
|
||||||
if (type().urlEncode()) {
|
|
||||||
return URL.encodeQueryString(type().replacePathSeparator(segment));
|
|
||||||
}
|
|
||||||
return segment;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected GitwebInfo() {
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,48 +0,0 @@
|
|||||||
// Copyright (C) 2015 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.client.info;
|
|
||||||
|
|
||||||
import com.google.gwt.core.client.JavaScriptObject;
|
|
||||||
|
|
||||||
public class GitwebTypeInfo extends JavaScriptObject {
|
|
||||||
/**
|
|
||||||
* Replace the standard path separator ('/') in a branch name or project
|
|
||||||
* name with a custom path separator configured by the property
|
|
||||||
* gitweb.pathSeparator.
|
|
||||||
* @param urlSegment The branch or project to replace the path separator in
|
|
||||||
* @return the urlSegment with the standard path separator replaced by the
|
|
||||||
* custom path separator
|
|
||||||
*/
|
|
||||||
public final String replacePathSeparator(String urlSegment) {
|
|
||||||
if (!"/".equals(pathSeparator())) {
|
|
||||||
return urlSegment.replace("/", pathSeparator());
|
|
||||||
}
|
|
||||||
return urlSegment;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final native String name() /*-{ return this.name; }-*/;
|
|
||||||
public final native String revision() /*-{ return this.revision; }-*/;
|
|
||||||
public final native String project() /*-{ return this.project; }-*/;
|
|
||||||
public final native String branch() /*-{ return this.branch; }-*/;
|
|
||||||
public final native String rootTree() /*-{ return this.root_tree; }-*/;
|
|
||||||
public final native String file() /*-{ return this.file; }-*/;
|
|
||||||
public final native String fileHistory() /*-{ return this.file_history; }-*/;
|
|
||||||
public final native String pathSeparator() /*-{ return this.path_separator; }-*/;
|
|
||||||
public final native boolean linkDrafts() /*-{ return this.link_drafts || false; }-*/;
|
|
||||||
public final native boolean urlEncode() /*-{ return this.url_encode || false; }-*/;
|
|
||||||
|
|
||||||
protected GitwebTypeInfo() {
|
|
||||||
}
|
|
||||||
}
|
|
@ -28,7 +28,6 @@ public class ServerInfo extends JavaScriptObject {
|
|||||||
public final native ChangeConfigInfo change() /*-{ return this.change; }-*/;
|
public final native ChangeConfigInfo change() /*-{ return this.change; }-*/;
|
||||||
public final native DownloadInfo download() /*-{ return this.download; }-*/;
|
public final native DownloadInfo download() /*-{ return this.download; }-*/;
|
||||||
public final native GerritInfo gerrit() /*-{ return this.gerrit; }-*/;
|
public final native GerritInfo gerrit() /*-{ return this.gerrit; }-*/;
|
||||||
public final native GitwebInfo gitweb() /*-{ return this.gitweb; }-*/;
|
|
||||||
public final native PluginConfigInfo plugin() /*-{ return this.plugin; }-*/;
|
public final native PluginConfigInfo plugin() /*-{ return this.plugin; }-*/;
|
||||||
public final native SshdInfo sshd() /*-{ return this.sshd; }-*/;
|
public final native SshdInfo sshd() /*-{ return this.sshd; }-*/;
|
||||||
public final native SuggestInfo suggest() /*-{ return this.suggest; }-*/;
|
public final native SuggestInfo suggest() /*-{ return this.suggest; }-*/;
|
||||||
|
@ -15,16 +15,12 @@
|
|||||||
package com.google.gerrit.client.admin;
|
package com.google.gerrit.client.admin;
|
||||||
|
|
||||||
import com.google.gerrit.client.Dispatcher;
|
import com.google.gerrit.client.Dispatcher;
|
||||||
import com.google.gerrit.client.Gerrit;
|
|
||||||
import com.google.gerrit.client.info.GitwebInfo;
|
|
||||||
import com.google.gerrit.client.ui.Hyperlink;
|
import com.google.gerrit.client.ui.Hyperlink;
|
||||||
import com.google.gerrit.client.ui.ParentProjectBox;
|
import com.google.gerrit.client.ui.ParentProjectBox;
|
||||||
import com.google.gerrit.common.data.AccessSection;
|
import com.google.gerrit.common.data.AccessSection;
|
||||||
import com.google.gerrit.common.data.ProjectAccess;
|
import com.google.gerrit.common.data.ProjectAccess;
|
||||||
import com.google.gerrit.common.data.WebLinkInfoCommon;
|
import com.google.gerrit.common.data.WebLinkInfoCommon;
|
||||||
import com.google.gerrit.reviewdb.client.Branch;
|
|
||||||
import com.google.gerrit.reviewdb.client.Project;
|
import com.google.gerrit.reviewdb.client.Project;
|
||||||
import com.google.gerrit.reviewdb.client.RefNames;
|
|
||||||
import com.google.gwt.core.client.GWT;
|
import com.google.gwt.core.client.GWT;
|
||||||
import com.google.gwt.dom.client.DivElement;
|
import com.google.gwt.dom.client.DivElement;
|
||||||
import com.google.gwt.dom.client.Style.Display;
|
import com.google.gwt.dom.client.Style.Display;
|
||||||
@ -156,32 +152,14 @@ public class ProjectAccessEditor extends Composite implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void setUpWebLinks() {
|
private void setUpWebLinks() {
|
||||||
if (!value.isConfigVisible()) {
|
List<WebLinkInfoCommon> links = value.getFileHistoryLinks();
|
||||||
|
if (!value.isConfigVisible() || links == null || links.isEmpty()) {
|
||||||
history.getStyle().setDisplay(Display.NONE);
|
history.getStyle().setDisplay(Display.NONE);
|
||||||
} else {
|
return;
|
||||||
GitwebInfo c = Gerrit.info().gitweb();
|
}
|
||||||
List<WebLinkInfoCommon> links = value.getFileHistoryLinks();
|
for (WebLinkInfoCommon link : links) {
|
||||||
if (c == null && links == null) {
|
webLinkPanel.add(toAnchor(link));
|
||||||
history.getStyle().setDisplay(Display.NONE);
|
|
||||||
}
|
|
||||||
if (c != null) {
|
|
||||||
webLinkPanel.add(toAnchor(c.toFileHistory(new Branch.NameKey(value.getProjectName(),
|
|
||||||
RefNames.REFS_CONFIG), "project.config"), c.getLinkName()));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (links != null) {
|
|
||||||
for (WebLinkInfoCommon link : links) {
|
|
||||||
webLinkPanel.add(toAnchor(link));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private Anchor toAnchor(String href, String name) {
|
|
||||||
Anchor a = new Anchor();
|
|
||||||
a.setHref(href);
|
|
||||||
a.setText(name);
|
|
||||||
return a;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Anchor toAnchor(WebLinkInfoCommon info) {
|
private static Anchor toAnchor(WebLinkInfoCommon info) {
|
||||||
|
@ -25,7 +25,6 @@ import com.google.gerrit.client.access.AccessMap;
|
|||||||
import com.google.gerrit.client.access.ProjectAccessInfo;
|
import com.google.gerrit.client.access.ProjectAccessInfo;
|
||||||
import com.google.gerrit.client.actions.ActionButton;
|
import com.google.gerrit.client.actions.ActionButton;
|
||||||
import com.google.gerrit.client.info.ActionInfo;
|
import com.google.gerrit.client.info.ActionInfo;
|
||||||
import com.google.gerrit.client.info.GitwebInfo;
|
|
||||||
import com.google.gerrit.client.info.WebLinkInfo;
|
import com.google.gerrit.client.info.WebLinkInfo;
|
||||||
import com.google.gerrit.client.projects.BranchInfo;
|
import com.google.gerrit.client.projects.BranchInfo;
|
||||||
import com.google.gerrit.client.projects.ProjectApi;
|
import com.google.gerrit.client.projects.ProjectApi;
|
||||||
@ -39,7 +38,6 @@ import com.google.gerrit.client.ui.NavigationTable;
|
|||||||
import com.google.gerrit.client.ui.OnEditEnabler;
|
import com.google.gerrit.client.ui.OnEditEnabler;
|
||||||
import com.google.gerrit.client.ui.PagingHyperlink;
|
import com.google.gerrit.client.ui.PagingHyperlink;
|
||||||
import com.google.gerrit.common.PageLinks;
|
import com.google.gerrit.common.PageLinks;
|
||||||
import com.google.gerrit.reviewdb.client.Branch;
|
|
||||||
import com.google.gerrit.reviewdb.client.Project;
|
import com.google.gerrit.reviewdb.client.Project;
|
||||||
import com.google.gerrit.reviewdb.client.RefNames;
|
import com.google.gerrit.reviewdb.client.RefNames;
|
||||||
import com.google.gwt.core.client.JsArray;
|
import com.google.gwt.core.client.JsArray;
|
||||||
@ -54,7 +52,6 @@ import com.google.gwt.event.dom.client.KeyUpEvent;
|
|||||||
import com.google.gwt.event.dom.client.KeyUpHandler;
|
import com.google.gwt.event.dom.client.KeyUpHandler;
|
||||||
import com.google.gwt.event.logical.shared.ValueChangeEvent;
|
import com.google.gwt.event.logical.shared.ValueChangeEvent;
|
||||||
import com.google.gwt.event.logical.shared.ValueChangeHandler;
|
import com.google.gwt.event.logical.shared.ValueChangeHandler;
|
||||||
import com.google.gwt.user.client.ui.Anchor;
|
|
||||||
import com.google.gwt.user.client.ui.Button;
|
import com.google.gwt.user.client.ui.Button;
|
||||||
import com.google.gwt.user.client.ui.CheckBox;
|
import com.google.gwt.user.client.ui.CheckBox;
|
||||||
import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
|
import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
|
||||||
@ -408,8 +405,6 @@ public class ProjectBranchesScreen extends PaginatedProjectScreen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void populate(int row, BranchInfo k) {
|
void populate(int row, BranchInfo k) {
|
||||||
GitwebInfo c = Gerrit.info().gitweb();
|
|
||||||
|
|
||||||
if (k.canDelete()) {
|
if (k.canDelete()) {
|
||||||
CheckBox sel = new CheckBox();
|
CheckBox sel = new CheckBox();
|
||||||
sel.addValueChangeHandler(updateDeleteHandler);
|
sel.addValueChangeHandler(updateDeleteHandler);
|
||||||
@ -432,10 +427,6 @@ public class ProjectBranchesScreen extends PaginatedProjectScreen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
FlowPanel actionsPanel = new FlowPanel();
|
FlowPanel actionsPanel = new FlowPanel();
|
||||||
if (c != null) {
|
|
||||||
actionsPanel.add(new Anchor(c.getLinkName(), false,
|
|
||||||
c.toBranch(new Branch.NameKey(getProjectKey(), k.ref()))));
|
|
||||||
}
|
|
||||||
if (k.webLinks() != null) {
|
if (k.webLinks() != null) {
|
||||||
for (WebLinkInfo webLink : Natives.asList(k.webLinks())) {
|
for (WebLinkInfo webLink : Natives.asList(k.webLinks())) {
|
||||||
actionsPanel.add(webLink.toAnchor());
|
actionsPanel.add(webLink.toAnchor());
|
||||||
|
@ -18,7 +18,6 @@ import static com.google.gerrit.common.PageLinks.ADMIN_PROJECTS;
|
|||||||
|
|
||||||
import com.google.gerrit.client.Dispatcher;
|
import com.google.gerrit.client.Dispatcher;
|
||||||
import com.google.gerrit.client.Gerrit;
|
import com.google.gerrit.client.Gerrit;
|
||||||
import com.google.gerrit.client.info.GitwebInfo;
|
|
||||||
import com.google.gerrit.client.info.WebLinkInfo;
|
import com.google.gerrit.client.info.WebLinkInfo;
|
||||||
import com.google.gerrit.client.projects.ProjectInfo;
|
import com.google.gerrit.client.projects.ProjectInfo;
|
||||||
import com.google.gerrit.client.projects.ProjectMap;
|
import com.google.gerrit.client.projects.ProjectMap;
|
||||||
@ -34,7 +33,6 @@ import com.google.gwt.event.dom.client.KeyCodes;
|
|||||||
import com.google.gwt.event.dom.client.KeyUpEvent;
|
import com.google.gwt.event.dom.client.KeyUpEvent;
|
||||||
import com.google.gwt.event.dom.client.KeyUpHandler;
|
import com.google.gwt.event.dom.client.KeyUpHandler;
|
||||||
import com.google.gwt.user.client.History;
|
import com.google.gwt.user.client.History;
|
||||||
import com.google.gwt.user.client.ui.Anchor;
|
|
||||||
import com.google.gwt.user.client.ui.FlowPanel;
|
import com.google.gwt.user.client.ui.FlowPanel;
|
||||||
import com.google.gwt.user.client.ui.HorizontalPanel;
|
import com.google.gwt.user.client.ui.HorizontalPanel;
|
||||||
import com.google.gwt.user.client.ui.Image;
|
import com.google.gwt.user.client.ui.Image;
|
||||||
@ -141,22 +139,12 @@ public class ProjectListScreen extends PaginatedProjectScreen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void addWebLinks(int row, ProjectInfo k) {
|
private void addWebLinks(int row, ProjectInfo k) {
|
||||||
GitwebInfo gitwebLink = Gerrit.info().gitweb();
|
|
||||||
List<WebLinkInfo> webLinks = Natives.asList(k.webLinks());
|
List<WebLinkInfo> webLinks = Natives.asList(k.webLinks());
|
||||||
if (gitwebLink != null || (webLinks != null && !webLinks.isEmpty())) {
|
if (webLinks != null && !webLinks.isEmpty()) {
|
||||||
FlowPanel p = new FlowPanel();
|
FlowPanel p = new FlowPanel();
|
||||||
table.setWidget(row, ProjectsTable.C_REPO_BROWSER, p);
|
table.setWidget(row, ProjectsTable.C_REPO_BROWSER, p);
|
||||||
|
for (WebLinkInfo weblink : webLinks) {
|
||||||
if (gitwebLink != null) {
|
p.add(weblink.toAnchor());
|
||||||
Anchor a = new Anchor();
|
|
||||||
a.setText(gitwebLink.getLinkName());
|
|
||||||
a.setHref(gitwebLink.toProject(k.name_key()));
|
|
||||||
p.add(a);
|
|
||||||
}
|
|
||||||
if (webLinks != null) {
|
|
||||||
for (WebLinkInfo weblink : webLinks) {
|
|
||||||
p.add(weblink.toAnchor());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,13 +16,11 @@ package com.google.gerrit.client.change;
|
|||||||
|
|
||||||
import com.google.gerrit.client.AvatarImage;
|
import com.google.gerrit.client.AvatarImage;
|
||||||
import com.google.gerrit.client.FormatUtil;
|
import com.google.gerrit.client.FormatUtil;
|
||||||
import com.google.gerrit.client.Gerrit;
|
|
||||||
import com.google.gerrit.client.info.AccountInfo;
|
import com.google.gerrit.client.info.AccountInfo;
|
||||||
import com.google.gerrit.client.info.ChangeInfo;
|
import com.google.gerrit.client.info.ChangeInfo;
|
||||||
import com.google.gerrit.client.info.ChangeInfo.CommitInfo;
|
import com.google.gerrit.client.info.ChangeInfo.CommitInfo;
|
||||||
import com.google.gerrit.client.info.ChangeInfo.GitPerson;
|
import com.google.gerrit.client.info.ChangeInfo.GitPerson;
|
||||||
import com.google.gerrit.client.info.ChangeInfo.RevisionInfo;
|
import com.google.gerrit.client.info.ChangeInfo.RevisionInfo;
|
||||||
import com.google.gerrit.client.info.GitwebInfo;
|
|
||||||
import com.google.gerrit.client.info.WebLinkInfo;
|
import com.google.gerrit.client.info.WebLinkInfo;
|
||||||
import com.google.gerrit.client.rpc.Natives;
|
import com.google.gerrit.client.rpc.Natives;
|
||||||
import com.google.gerrit.client.ui.CommentLinkProcessor;
|
import com.google.gerrit.client.ui.CommentLinkProcessor;
|
||||||
@ -38,7 +36,6 @@ import com.google.gwt.uibinder.client.UiBinder;
|
|||||||
import com.google.gwt.uibinder.client.UiField;
|
import com.google.gwt.uibinder.client.UiField;
|
||||||
import com.google.gwt.uibinder.client.UiHandler;
|
import com.google.gwt.uibinder.client.UiHandler;
|
||||||
import com.google.gwt.user.client.DOM;
|
import com.google.gwt.user.client.DOM;
|
||||||
import com.google.gwt.user.client.ui.Anchor;
|
|
||||||
import com.google.gwt.user.client.ui.Button;
|
import com.google.gwt.user.client.ui.Button;
|
||||||
import com.google.gwt.user.client.ui.Composite;
|
import com.google.gwt.user.client.ui.Composite;
|
||||||
import com.google.gwt.user.client.ui.FlowPanel;
|
import com.google.gwt.user.client.ui.FlowPanel;
|
||||||
@ -118,13 +115,13 @@ class CommitBox extends Composite {
|
|||||||
committerDate, change);
|
committerDate, change);
|
||||||
text.setHTML(commentLinkProcessor.apply(
|
text.setHTML(commentLinkProcessor.apply(
|
||||||
new SafeHtmlBuilder().append(commit.message()).linkify()));
|
new SafeHtmlBuilder().append(commit.message()).linkify()));
|
||||||
setWebLinks(change, revision, revInfo);
|
setWebLinks(revInfo);
|
||||||
|
|
||||||
if (revInfo.commit().parents().length() > 1) {
|
if (revInfo.commit().parents().length() > 1) {
|
||||||
mergeCommit.setVisible(true);
|
mergeCommit.setVisible(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
setParents(change.project(), revInfo.commit().parents());
|
setParents(revInfo.commit().parents());
|
||||||
}
|
}
|
||||||
|
|
||||||
void setParentNotCurrent(boolean parentNotCurrent) {
|
void setParentNotCurrent(boolean parentNotCurrent) {
|
||||||
@ -133,14 +130,7 @@ class CommitBox extends Composite {
|
|||||||
parentNotCurrentText.setInnerText(parentNotCurrent ? "\u25CF" : "");
|
parentNotCurrentText.setInnerText(parentNotCurrent ? "\u25CF" : "");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setWebLinks(ChangeInfo change, String revision,
|
private void setWebLinks(RevisionInfo revInfo) {
|
||||||
RevisionInfo revInfo) {
|
|
||||||
GitwebInfo gw = Gerrit.info().gitweb();
|
|
||||||
if (gw != null && gw.canLink(revInfo)) {
|
|
||||||
toAnchor(gw.toRevision(change.project(), revision),
|
|
||||||
gw.getLinkName());
|
|
||||||
}
|
|
||||||
|
|
||||||
JsArray<WebLinkInfo> links = revInfo.commit().webLinks();
|
JsArray<WebLinkInfo> links = revInfo.commit().webLinks();
|
||||||
if (links != null) {
|
if (links != null) {
|
||||||
for (WebLinkInfo link : Natives.asList(links)) {
|
for (WebLinkInfo link : Natives.asList(links)) {
|
||||||
@ -149,14 +139,7 @@ class CommitBox extends Composite {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void toAnchor(String href, String name) {
|
private void setParents(JsArray<CommitInfo> commits) {
|
||||||
Anchor a = new Anchor();
|
|
||||||
a.setHref(href);
|
|
||||||
a.setText(name);
|
|
||||||
webLinkPanel.add(a);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setParents(String project, JsArray<CommitInfo> commits) {
|
|
||||||
setVisible(firstParent, true);
|
setVisible(firstParent, true);
|
||||||
TableRowElement next = firstParent;
|
TableRowElement next = firstParent;
|
||||||
TableRowElement previous = null;
|
TableRowElement previous = null;
|
||||||
@ -164,18 +147,11 @@ class CommitBox extends Composite {
|
|||||||
if (next == firstParent) {
|
if (next == firstParent) {
|
||||||
CopyableLabel copyLabel = getCommitLabel(c);
|
CopyableLabel copyLabel = getCommitLabel(c);
|
||||||
parentCommits.add(copyLabel);
|
parentCommits.add(copyLabel);
|
||||||
addLinks(project, c, parentWebLinks);
|
|
||||||
} else {
|
} else {
|
||||||
next.appendChild(DOM.createTD());
|
next.appendChild(DOM.createTD());
|
||||||
Element td1 = DOM.createTD();
|
Element td1 = DOM.createTD();
|
||||||
td1.appendChild(getCommitLabel(c).getElement());
|
td1.appendChild(getCommitLabel(c).getElement());
|
||||||
next.appendChild(td1);
|
next.appendChild(td1);
|
||||||
FlowPanel linksPanel = new FlowPanel();
|
|
||||||
linksPanel.addStyleName(style.parentWebLink());
|
|
||||||
addLinks(project, c, linksPanel);
|
|
||||||
Element td2 = DOM.createTD();
|
|
||||||
td2.appendChild(linksPanel.getElement());
|
|
||||||
next.appendChild(td2);
|
|
||||||
previous.getParentElement().insertAfter(next, previous);
|
previous.getParentElement().insertAfter(next, previous);
|
||||||
}
|
}
|
||||||
previous = next;
|
previous = next;
|
||||||
@ -183,16 +159,6 @@ class CommitBox extends Composite {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addLinks(String project, CommitInfo c, FlowPanel panel) {
|
|
||||||
GitwebInfo gw = Gerrit.info().gitweb();
|
|
||||||
if (gw != null) {
|
|
||||||
Anchor a =
|
|
||||||
new Anchor(gw.getLinkName(), gw.toRevision(project, c.commit()));
|
|
||||||
a.setStyleName(style.parentWebLink());
|
|
||||||
panel.add(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private CopyableLabel getCommitLabel(CommitInfo c) {
|
private CopyableLabel getCommitLabel(CommitInfo c) {
|
||||||
CopyableLabel copyLabel;
|
CopyableLabel copyLabel;
|
||||||
copyLabel = new CopyableLabel(c.commit());
|
copyLabel = new CopyableLabel(c.commit());
|
||||||
|
@ -18,7 +18,6 @@ import com.google.gerrit.client.Gerrit;
|
|||||||
import com.google.gerrit.client.change.RelatedChanges.ChangeAndCommit;
|
import com.google.gerrit.client.change.RelatedChanges.ChangeAndCommit;
|
||||||
import com.google.gerrit.client.changes.Util;
|
import com.google.gerrit.client.changes.Util;
|
||||||
import com.google.gerrit.client.info.ChangeInfo.CommitInfo;
|
import com.google.gerrit.client.info.ChangeInfo.CommitInfo;
|
||||||
import com.google.gerrit.client.info.GitwebInfo;
|
|
||||||
import com.google.gerrit.common.PageLinks;
|
import com.google.gerrit.common.PageLinks;
|
||||||
import com.google.gerrit.reviewdb.client.Change;
|
import com.google.gerrit.reviewdb.client.Change;
|
||||||
import com.google.gwt.core.client.GWT;
|
import com.google.gwt.core.client.GWT;
|
||||||
@ -306,12 +305,7 @@ class RelatedChangesTab implements IsWidget {
|
|||||||
sb.closeSpan();
|
sb.closeSpan();
|
||||||
|
|
||||||
sb.openSpan();
|
sb.openSpan();
|
||||||
GitwebInfo gw = Gerrit.info().gitweb();
|
if (info.status() != null && !info.status().isOpen()) {
|
||||||
if (gw != null && (!info.hasChangeNumber() || !info.hasRevisionNumber())) {
|
|
||||||
sb.setStyleName(RelatedChanges.R.css().gitweb());
|
|
||||||
sb.setAttribute("title", gw.getLinkName());
|
|
||||||
sb.append('\u25CF'); // Unicode 'BLACK CIRCLE'
|
|
||||||
} else if (info.status() != null && !info.status().isOpen()) {
|
|
||||||
sb.setStyleName(RelatedChanges.R.css().gitweb());
|
sb.setStyleName(RelatedChanges.R.css().gitweb());
|
||||||
sb.setAttribute("title", Util.toLongString(info.status()));
|
sb.setAttribute("title", Util.toLongString(info.status()));
|
||||||
sb.append('\u25CF'); // Unicode 'BLACK CIRCLE'
|
sb.append('\u25CF'); // Unicode 'BLACK CIRCLE'
|
||||||
@ -340,11 +334,6 @@ class RelatedChangesTab implements IsWidget {
|
|||||||
if (info.hasChangeNumber() && info.hasRevisionNumber()) {
|
if (info.hasChangeNumber() && info.hasRevisionNumber()) {
|
||||||
return "#" + PageLinks.toChange(info.patchSetId());
|
return "#" + PageLinks.toChange(info.patchSetId());
|
||||||
}
|
}
|
||||||
|
|
||||||
GitwebInfo gw = Gerrit.info().gitweb();
|
|
||||||
if (gw != null && project != null) {
|
|
||||||
return gw.toRevision(project, info.commit().commit());
|
|
||||||
}
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,9 +22,7 @@ import com.google.gerrit.client.changes.ReviewInfo;
|
|||||||
import com.google.gerrit.client.changes.Util;
|
import com.google.gerrit.client.changes.Util;
|
||||||
import com.google.gerrit.client.diff.DiffInfo.Region;
|
import com.google.gerrit.client.diff.DiffInfo.Region;
|
||||||
import com.google.gerrit.client.info.ChangeInfo;
|
import com.google.gerrit.client.info.ChangeInfo;
|
||||||
import com.google.gerrit.client.info.ChangeInfo.RevisionInfo;
|
|
||||||
import com.google.gerrit.client.info.FileInfo;
|
import com.google.gerrit.client.info.FileInfo;
|
||||||
import com.google.gerrit.client.info.GitwebInfo;
|
|
||||||
import com.google.gerrit.client.info.WebLinkInfo;
|
import com.google.gerrit.client.info.WebLinkInfo;
|
||||||
import com.google.gerrit.client.patches.PatchUtil;
|
import com.google.gerrit.client.patches.PatchUtil;
|
||||||
import com.google.gerrit.client.rpc.CallbackGroup;
|
import com.google.gerrit.client.rpc.CallbackGroup;
|
||||||
@ -114,32 +112,20 @@ public class Header extends Composite {
|
|||||||
if (!Gerrit.isSignedIn()) {
|
if (!Gerrit.isSignedIn()) {
|
||||||
reviewed.getElement().getStyle().setVisibility(Visibility.HIDDEN);
|
reviewed.getElement().getStyle().setVisibility(Visibility.HIDDEN);
|
||||||
}
|
}
|
||||||
SafeHtml.setInnerHTML(filePath, formatPath(path, null, null));
|
SafeHtml.setInnerHTML(filePath, formatPath(path));
|
||||||
up.setTargetHistoryToken(PageLinks.toChange(
|
up.setTargetHistoryToken(PageLinks.toChange(
|
||||||
patchSetId.getParentKey(),
|
patchSetId.getParentKey(),
|
||||||
base != null ? base.getId() : null, patchSetId.getId()));
|
base != null ? base.getId() : null, patchSetId.getId()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SafeHtml formatPath(String path, String project, String commit) {
|
public static SafeHtml formatPath(String path) {
|
||||||
SafeHtmlBuilder b = new SafeHtmlBuilder();
|
SafeHtmlBuilder b = new SafeHtmlBuilder();
|
||||||
if (Patch.COMMIT_MSG.equals(path)) {
|
if (Patch.COMMIT_MSG.equals(path)) {
|
||||||
return b.append(Util.C.commitMessage());
|
return b.append(Util.C.commitMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
GitwebInfo gw = (project != null && commit != null)
|
|
||||||
? Gerrit.info().gitweb() : null;
|
|
||||||
int s = path.lastIndexOf('/') + 1;
|
int s = path.lastIndexOf('/') + 1;
|
||||||
if (gw != null && s > 0) {
|
b.append(path.substring(0, s));
|
||||||
String base = path.substring(0, s - 1);
|
|
||||||
b.openAnchor()
|
|
||||||
.setAttribute("href", gw.toFile(project, commit, base))
|
|
||||||
.setAttribute("title", gw.getLinkName())
|
|
||||||
.append(base)
|
|
||||||
.closeAnchor()
|
|
||||||
.append('/');
|
|
||||||
} else {
|
|
||||||
b.append(path.substring(0, s));
|
|
||||||
}
|
|
||||||
b.openElement("b");
|
b.openElement("b");
|
||||||
b.append(path.substring(s));
|
b.append(path.substring(s));
|
||||||
b.closeElement("b");
|
b.closeElement("b");
|
||||||
@ -200,23 +186,6 @@ public class Header extends Composite {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void setChangeInfo(ChangeInfo info) {
|
void setChangeInfo(ChangeInfo info) {
|
||||||
GitwebInfo gw = Gerrit.info().gitweb();
|
|
||||||
if (gw != null) {
|
|
||||||
for (RevisionInfo rev : Natives.asList(info.revisions().values())) {
|
|
||||||
if (patchSetId.getId().equals(rev.id())) {
|
|
||||||
String c = rev.name();
|
|
||||||
SafeHtml.setInnerHTML(filePath, formatPath(path, info.project(), c));
|
|
||||||
SafeHtml.setInnerHTML(project, new SafeHtmlBuilder()
|
|
||||||
.openAnchor()
|
|
||||||
.setAttribute("href", gw.toFile(info.project(), c, ""))
|
|
||||||
.setAttribute("title", gw.getLinkName())
|
|
||||||
.append(info.project())
|
|
||||||
.closeAnchor());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
project.setInnerText(info.project());
|
project.setInnerText(info.project());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,7 +191,7 @@ public class EditScreen extends Screen {
|
|||||||
@Override
|
@Override
|
||||||
public void onSuccess(ChangeInfo c) {
|
public void onSuccess(ChangeInfo c) {
|
||||||
project.setInnerText(c.project());
|
project.setInnerText(c.project());
|
||||||
SafeHtml.setInnerHTML(filePath, Header.formatPath(path, null, null));
|
SafeHtml.setInnerHTML(filePath, Header.formatPath(path));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -248,7 +248,6 @@ public class GerritGlobalModule extends FactoryModule {
|
|||||||
bind(ToolsCatalog.class);
|
bind(ToolsCatalog.class);
|
||||||
bind(EventFactory.class);
|
bind(EventFactory.class);
|
||||||
bind(TransferConfig.class);
|
bind(TransferConfig.class);
|
||||||
bind(GitwebConfig.class);
|
|
||||||
|
|
||||||
bind(GcConfig.class);
|
bind(GcConfig.class);
|
||||||
bind(ChangeCleanupConfig.class);
|
bind(ChangeCleanupConfig.class);
|
||||||
@ -329,6 +328,7 @@ public class GerritGlobalModule extends FactoryModule {
|
|||||||
DynamicSet.setOf(binder(), UploadValidationListener.class);
|
DynamicSet.setOf(binder(), UploadValidationListener.class);
|
||||||
|
|
||||||
DynamicMap.mapOf(binder(), ChangeQueryBuilder.ChangeOperatorFactory.class);
|
DynamicMap.mapOf(binder(), ChangeQueryBuilder.ChangeOperatorFactory.class);
|
||||||
|
install(new GitwebConfig.LegacyModule(cfg));
|
||||||
|
|
||||||
bind(AnonymousUser.class);
|
bind(AnonymousUser.class);
|
||||||
|
|
||||||
|
@ -65,7 +65,6 @@ public class GetServerInfo implements RestReadView<ConfigResource> {
|
|||||||
private final AllProjectsName allProjectsName;
|
private final AllProjectsName allProjectsName;
|
||||||
private final AllUsersName allUsersName;
|
private final AllUsersName allUsersName;
|
||||||
private final String anonymousCowardName;
|
private final String anonymousCowardName;
|
||||||
private final GitwebConfig gitwebConfig;
|
|
||||||
private final DynamicItem<AvatarProvider> avatar;
|
private final DynamicItem<AvatarProvider> avatar;
|
||||||
private final boolean enableSignedPush;
|
private final boolean enableSignedPush;
|
||||||
private final QueryDocumentationExecutor docSearcher;
|
private final QueryDocumentationExecutor docSearcher;
|
||||||
@ -83,7 +82,6 @@ public class GetServerInfo implements RestReadView<ConfigResource> {
|
|||||||
AllProjectsName allProjectsName,
|
AllProjectsName allProjectsName,
|
||||||
AllUsersName allUsersName,
|
AllUsersName allUsersName,
|
||||||
@AnonymousCowardName String anonymousCowardName,
|
@AnonymousCowardName String anonymousCowardName,
|
||||||
GitwebConfig gitwebConfig,
|
|
||||||
DynamicItem<AvatarProvider> avatar,
|
DynamicItem<AvatarProvider> avatar,
|
||||||
@EnableSignedPush boolean enableSignedPush,
|
@EnableSignedPush boolean enableSignedPush,
|
||||||
QueryDocumentationExecutor docSearcher) {
|
QueryDocumentationExecutor docSearcher) {
|
||||||
@ -98,7 +96,6 @@ public class GetServerInfo implements RestReadView<ConfigResource> {
|
|||||||
this.allProjectsName = allProjectsName;
|
this.allProjectsName = allProjectsName;
|
||||||
this.allUsersName = allUsersName;
|
this.allUsersName = allUsersName;
|
||||||
this.anonymousCowardName = anonymousCowardName;
|
this.anonymousCowardName = anonymousCowardName;
|
||||||
this.gitwebConfig = gitwebConfig;
|
|
||||||
this.avatar = avatar;
|
this.avatar = avatar;
|
||||||
this.enableSignedPush = enableSignedPush;
|
this.enableSignedPush = enableSignedPush;
|
||||||
this.docSearcher = docSearcher;
|
this.docSearcher = docSearcher;
|
||||||
@ -113,7 +110,6 @@ public class GetServerInfo implements RestReadView<ConfigResource> {
|
|||||||
getDownloadInfo(downloadSchemes, downloadCommands, cloneCommands,
|
getDownloadInfo(downloadSchemes, downloadCommands, cloneCommands,
|
||||||
archiveFormats);
|
archiveFormats);
|
||||||
info.gerrit = getGerritInfo(config, allProjectsName, allUsersName);
|
info.gerrit = getGerritInfo(config, allProjectsName, allUsersName);
|
||||||
info.gitweb = getGitwebInfo(gitwebConfig);
|
|
||||||
info.plugin = getPluginInfo();
|
info.plugin = getPluginInfo();
|
||||||
info.sshd = getSshdInfo(config);
|
info.sshd = getSshdInfo(config);
|
||||||
info.suggest = getSuggestInfo(config);
|
info.suggest = getSuggestInfo(config);
|
||||||
@ -262,17 +258,6 @@ public class GetServerInfo implements RestReadView<ConfigResource> {
|
|||||||
return CharMatcher.is('/').trimTrailingFrom(docUrl) + '/';
|
return CharMatcher.is('/').trimTrailingFrom(docUrl) + '/';
|
||||||
}
|
}
|
||||||
|
|
||||||
private GitwebInfo getGitwebInfo(GitwebConfig cfg) {
|
|
||||||
if (cfg.getUrl() == null || cfg.getGitwebType() == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
GitwebInfo info = new GitwebInfo();
|
|
||||||
info.url = cfg.getUrl();
|
|
||||||
info.type = cfg.getGitwebType();
|
|
||||||
return info;
|
|
||||||
}
|
|
||||||
|
|
||||||
private PluginConfigInfo getPluginInfo() {
|
private PluginConfigInfo getPluginInfo() {
|
||||||
PluginConfigInfo info = new PluginConfigInfo();
|
PluginConfigInfo info = new PluginConfigInfo();
|
||||||
info.hasAvatars = toBoolean(avatar.get() != null);
|
info.hasAvatars = toBoolean(avatar.get() != null);
|
||||||
@ -335,7 +320,6 @@ public class GetServerInfo implements RestReadView<ConfigResource> {
|
|||||||
public ChangeConfigInfo change;
|
public ChangeConfigInfo change;
|
||||||
public DownloadInfo download;
|
public DownloadInfo download;
|
||||||
public GerritInfo gerrit;
|
public GerritInfo gerrit;
|
||||||
public GitwebInfo gitweb;
|
|
||||||
public PluginConfigInfo plugin;
|
public PluginConfigInfo plugin;
|
||||||
public SshdInfo sshd;
|
public SshdInfo sshd;
|
||||||
public SuggestInfo suggest;
|
public SuggestInfo suggest;
|
||||||
|
@ -15,12 +15,23 @@
|
|||||||
package com.google.gerrit.server.config;
|
package com.google.gerrit.server.config;
|
||||||
|
|
||||||
import static com.google.common.base.MoreObjects.firstNonNull;
|
import static com.google.common.base.MoreObjects.firstNonNull;
|
||||||
|
import static com.google.common.base.Strings.emptyToNull;
|
||||||
import static com.google.common.base.Strings.isNullOrEmpty;
|
import static com.google.common.base.Strings.isNullOrEmpty;
|
||||||
import static com.google.common.base.Strings.nullToEmpty;
|
import static com.google.common.base.Strings.nullToEmpty;
|
||||||
|
|
||||||
import com.google.common.base.Strings;
|
|
||||||
import com.google.gerrit.common.data.GitwebType;
|
import com.google.gerrit.common.data.GitwebType;
|
||||||
|
import com.google.gerrit.common.data.ParameterizedString;
|
||||||
|
import com.google.gerrit.extensions.common.WebLinkInfo;
|
||||||
|
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.FileHistoryWebLink;
|
||||||
|
import com.google.gerrit.extensions.webui.FileWebLink;
|
||||||
|
import com.google.gerrit.extensions.webui.PatchSetWebLink;
|
||||||
|
import com.google.gerrit.extensions.webui.ProjectWebLink;
|
||||||
|
import com.google.inject.AbstractModule;
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
|
import com.google.inject.Singleton;
|
||||||
|
|
||||||
import org.eclipse.jgit.lib.Config;
|
import org.eclipse.jgit.lib.Config;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@ -34,21 +45,52 @@ public class GitwebConfig {
|
|||||||
|| isEmptyString(cfg, "gitweb", null, "cgi");
|
|| isEmptyString(cfg, "gitweb", null, "cgi");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class LegacyModule extends AbstractModule {
|
||||||
|
private final Config cfg;
|
||||||
|
|
||||||
|
public LegacyModule(Config cfg) {
|
||||||
|
this.cfg = cfg;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void configure() {
|
||||||
|
GitwebType type = typeFromConfig(cfg);
|
||||||
|
if (type != null) {
|
||||||
|
bind(GitwebType.class).toInstance(type);
|
||||||
|
|
||||||
|
if (!isNullOrEmpty(type.getBranch())) {
|
||||||
|
DynamicSet.bind(binder(), BranchWebLink.class).to(GitwebLinks.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isNullOrEmpty(type.getFile())
|
||||||
|
|| !isNullOrEmpty(type.getRootTree())) {
|
||||||
|
DynamicSet.bind(binder(), FileWebLink.class).to(GitwebLinks.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isNullOrEmpty(type.getFileHistory())) {
|
||||||
|
DynamicSet.bind(binder(), FileHistoryWebLink.class).to(GitwebLinks.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isNullOrEmpty(type.getRevision())) {
|
||||||
|
DynamicSet.bind(binder(), PatchSetWebLink.class).to(GitwebLinks.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isNullOrEmpty(type.getProject())) {
|
||||||
|
DynamicSet.bind(binder(), ProjectWebLink.class).to(GitwebLinks.class);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static boolean isEmptyString(Config cfg, String section,
|
private static boolean isEmptyString(Config cfg, String section,
|
||||||
String subsection, String name) {
|
String subsection, String name) {
|
||||||
// This is currently the only way to check for the empty string in a JGit
|
// This is currently the only way to check for the empty string in a JGit
|
||||||
// config. Fun!
|
// config. Fun!
|
||||||
String[] values = cfg.getStringList(section, subsection, name);
|
String[] values = cfg.getStringList(section, subsection, name);
|
||||||
return values.length > 0 && Strings.isNullOrEmpty(values[0]);
|
return values.length > 0 && isNullOrEmpty(values[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
private static GitwebType typeFromConfig(Config cfg) {
|
||||||
* Get a GitwebType based on the given config.
|
|
||||||
*
|
|
||||||
* @param cfg Gerrit config.
|
|
||||||
* @return GitwebType from the given name, else null if not found.
|
|
||||||
*/
|
|
||||||
public static GitwebType typeFromConfig(Config cfg) {
|
|
||||||
GitwebType defaultType = defaultType(cfg.getString("gitweb", null, "type"));
|
GitwebType defaultType = defaultType(cfg.getString("gitweb", null, "type"));
|
||||||
if (defaultType == null) {
|
if (defaultType == null) {
|
||||||
return null;
|
return null;
|
||||||
@ -76,9 +118,6 @@ public class GitwebConfig {
|
|||||||
type.setFileHistory(firstNonNull(
|
type.setFileHistory(firstNonNull(
|
||||||
cfg.getString("gitweb", null, "filehistory"),
|
cfg.getString("gitweb", null, "filehistory"),
|
||||||
defaultType.getFileHistory()));
|
defaultType.getFileHistory()));
|
||||||
type.setLinkDrafts(
|
|
||||||
cfg.getBoolean("gitweb", null, "linkdrafts",
|
|
||||||
defaultType.getLinkDrafts()));
|
|
||||||
type.setUrlEncode(
|
type.setUrlEncode(
|
||||||
cfg.getBoolean("gitweb", null, "urlencode",
|
cfg.getBoolean("gitweb", null, "urlencode",
|
||||||
defaultType.getUrlEncode()));
|
defaultType.getUrlEncode()));
|
||||||
@ -133,6 +172,7 @@ public class GitwebConfig {
|
|||||||
type.setFile("");
|
type.setFile("");
|
||||||
type.setFileHistory("");
|
type.setFileHistory("");
|
||||||
break;
|
break;
|
||||||
|
case "disabled":
|
||||||
default:
|
default:
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -147,48 +187,18 @@ public class GitwebConfig {
|
|||||||
if (isDisabled(cfg)) {
|
if (isDisabled(cfg)) {
|
||||||
type = null;
|
type = null;
|
||||||
url = null;
|
url = null;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
String cfgUrl = cfg.getString("gitweb", null, "url");
|
|
||||||
GitwebType type = typeFromConfig(cfg);
|
|
||||||
if (type == null) {
|
|
||||||
this.type = null;
|
|
||||||
url = null;
|
|
||||||
return;
|
|
||||||
} else if (cgiConfig.getGitwebCgi() == null) {
|
|
||||||
// Use an externally managed gitweb instance, and not an internal one.
|
|
||||||
url = cfgUrl;
|
|
||||||
} else {
|
} else {
|
||||||
url = firstNonNull(cfgUrl, "gitweb");
|
String cfgUrl = cfg.getString("gitweb", null, "url");
|
||||||
|
type = typeFromConfig(cfg);
|
||||||
|
if (type == null) {
|
||||||
|
url = null;
|
||||||
|
} else if (cgiConfig.getGitwebCgi() == null) {
|
||||||
|
// Use an externally managed gitweb instance, and not an internal one.
|
||||||
|
url = cfgUrl;
|
||||||
|
} else {
|
||||||
|
url = firstNonNull(cfgUrl, "gitweb");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isNullOrEmpty(type.getBranch())) {
|
|
||||||
log.warn("No Pattern specified for gitweb.branch, disabling.");
|
|
||||||
this.type = null;
|
|
||||||
} else if (isNullOrEmpty(type.getProject())) {
|
|
||||||
log.warn("No Pattern specified for gitweb.project, disabling.");
|
|
||||||
this.type = null;
|
|
||||||
} else if (isNullOrEmpty(type.getRevision())) {
|
|
||||||
log.warn("No Pattern specified for gitweb.revision, disabling.");
|
|
||||||
this.type = null;
|
|
||||||
} else if (isNullOrEmpty(type.getRootTree())) {
|
|
||||||
log.warn("No Pattern specified for gitweb.roottree, disabling.");
|
|
||||||
this.type = null;
|
|
||||||
} else if (isNullOrEmpty(type.getFile())) {
|
|
||||||
log.warn("No Pattern specified for gitweb.file, disabling.");
|
|
||||||
this.type = null;
|
|
||||||
} else if (isNullOrEmpty(type.getFileHistory())) {
|
|
||||||
log.warn("No Pattern specified for gitweb.filehistory, disabling.");
|
|
||||||
this.type = null;
|
|
||||||
} else {
|
|
||||||
this.type = type;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @return GitwebType for gitweb viewer. */
|
|
||||||
public GitwebType getGitwebType() {
|
|
||||||
return type;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -226,4 +236,103 @@ public class GitwebConfig {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Singleton
|
||||||
|
static class GitwebLinks implements BranchWebLink, FileHistoryWebLink,
|
||||||
|
FileWebLink, PatchSetWebLink, ProjectWebLink {
|
||||||
|
private final String url;
|
||||||
|
private final GitwebType type;
|
||||||
|
private final ParameterizedString branch;
|
||||||
|
private final ParameterizedString file;
|
||||||
|
private final ParameterizedString fileHistory;
|
||||||
|
private final ParameterizedString project;
|
||||||
|
private final ParameterizedString revision;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
GitwebLinks(GitwebConfig config, GitwebType type) {
|
||||||
|
this.url = config.getUrl();
|
||||||
|
this.type = type;
|
||||||
|
this.branch = parse(type.getBranch());
|
||||||
|
this.file = parse(firstNonNull(
|
||||||
|
emptyToNull(type.getFile()),
|
||||||
|
nullToEmpty(type.getRootTree())));
|
||||||
|
this.fileHistory = parse(type.getFileHistory());
|
||||||
|
this.project = parse(type.getProject());
|
||||||
|
this.revision = parse(type.getRevision());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public WebLinkInfo getBranchWebLink(String projectName, String branchName) {
|
||||||
|
if (branch != null) {
|
||||||
|
return link(branch
|
||||||
|
.replace("project", encode(projectName))
|
||||||
|
.replace("branch", encode(branchName))
|
||||||
|
.toString());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public WebLinkInfo getFileHistoryWebLink(String projectName,
|
||||||
|
String revision, String fileName) {
|
||||||
|
if (fileHistory != null) {
|
||||||
|
return link(revision
|
||||||
|
.replace("project", encode(projectName))
|
||||||
|
.replace("branch", encode(revision))
|
||||||
|
.replace("file", encode(fileName))
|
||||||
|
.toString());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public WebLinkInfo getFileWebLink(String projectName, String revision,
|
||||||
|
String fileName) {
|
||||||
|
if (file != null) {
|
||||||
|
return link(file
|
||||||
|
.replace("project", encode(projectName))
|
||||||
|
.replace("commit", encode(revision))
|
||||||
|
.replace("file", encode(fileName))
|
||||||
|
.toString());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public WebLinkInfo getPatchSetWebLink(String projectName, String commit) {
|
||||||
|
if (revision != null) {
|
||||||
|
return link(revision
|
||||||
|
.replace("project", encode(projectName))
|
||||||
|
.replace("commit", encode(commit))
|
||||||
|
.toString());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public WebLinkInfo getProjectWeblink(String projectName) {
|
||||||
|
if (project != null) {
|
||||||
|
return link(project.replace("project", encode(projectName)).toString());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String encode(String val) {
|
||||||
|
if (type.getUrlEncode()) {
|
||||||
|
return Url.encode(type.replacePathSeparator(val));
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
private WebLinkInfo link(String rest) {
|
||||||
|
return new WebLinkInfo(type.getLinkName(), null, url + rest, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ParameterizedString parse(String pattern) {
|
||||||
|
if (!isNullOrEmpty(pattern)) {
|
||||||
|
return new ParameterizedString(pattern);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user