Merge "Remove GWT UI"

This commit is contained in:
Dave Borowitz 2018-11-14 17:50:26 +00:00 committed by Gerrit Code Review
commit 13975fa2ae
687 changed files with 58 additions and 75369 deletions

9
BUILD
View File

@ -44,16 +44,10 @@ pkg_war(
ui = None, ui = None,
) )
pkg_war(
name = "polygerrit",
ui = "polygerrit",
)
pkg_war( pkg_war(
name = "release", name = "release",
context = ["//plugins:core"], context = ["//plugins:core"],
doc = True, doc = True,
ui = "ui_optdbg_r",
) )
pkg_war( pkg_war(
@ -71,9 +65,6 @@ API_DEPS = [
"//plugins:plugin-api_deploy.jar", "//plugins:plugin-api_deploy.jar",
"//plugins:plugin-api-sources_deploy.jar", "//plugins:plugin-api-sources_deploy.jar",
"//plugins:plugin-api-javadoc", "//plugins:plugin-api-javadoc",
"//gerrit-plugin-gwtui:gwtui-api_deploy.jar",
"//gerrit-plugin-gwtui:gwtui-api-source_deploy.jar",
"//gerrit-plugin-gwtui:gwtui-api-javadoc",
] ]
genrule2( genrule2(

View File

@ -47,7 +47,6 @@ license_map(
name = "licenses", name = "licenses",
opts = ["--asciidoctor"], opts = ["--asciidoctor"],
targets = [ targets = [
"//gerrit-gwtui:ui_module",
"//polygerrit-ui/app:polygerrit_ui", "//polygerrit-ui/app:polygerrit_ui",
"//java/com/google/gerrit/pgm", "//java/com/google/gerrit/pgm",
], ],
@ -57,7 +56,6 @@ license_map(
license_map( license_map(
name = "js_licenses", name = "js_licenses",
targets = [ targets = [
"//gerrit-gwtui:ui_module",
"//polygerrit-ui/app:polygerrit_ui", "//polygerrit-ui/app:polygerrit_ui",
], ],
visibility = ["//visibility:public"], visibility = ["//visibility:public"],

View File

@ -273,10 +273,7 @@ When this is the configured authentication method a hyperlink titled
`Become` appears in the top right corner of the page, taking the `Become` appears in the top right corner of the page, taking the
user to a form where they can enter the username of any existing user to a form where they can enter the username of any existing
user account, and immediately login as that account, without any user account, and immediately login as that account, without any
authentication taking place. This form of authentication is only authentication taking place.
useful for the GWT hosted mode shell, where OpenID authentication
redirects might be risky to the developer's host computer, and HTTP
authentication is not possible.
+ +
By default, OpenID. By default, OpenID.
@ -485,13 +482,12 @@ the "Switch Account" link is displayed next to "Sign Out".
+ +
When `auth.type` does not normally enable this URL administrators may When `auth.type` does not normally enable this URL administrators may
set this to `login/`, allowing users to begin a new web session. This value set this to `login/`, allowing users to begin a new web session. This value
is used as an href in PolyGerrit and the GWT UI, so absolute URLs like is used as an href in PolyGerrit, so absolute URLs like
`https://someotherhost/login` work as well. `https://someotherhost/login` work as well.
+ +
If a ${path} parameter is included, then PolyGerrit will substitute the If a ${path} parameter is included, then PolyGerrit will substitute the
currently viewed path in the link. Be aware that this path will include currently viewed path in the link. Be aware that this path will include
a leading slash, so a value like this might be appropriate: `/login${path}`. a leading slash, so a value like this might be appropriate: `/login${path}`.
Note: in the GWT UI this substitution for ${path} is *always* `/`.
[[auth.cookiePath]]auth.cookiePath:: [[auth.cookiePath]]auth.cookiePath::
+ +
@ -1175,8 +1171,7 @@ Default is 5 minutes.
[[change.allowBlame]]change.allowBlame:: [[change.allowBlame]]change.allowBlame::
+ +
Allow blame on side by side diff in the GWT UI. If set to false, blame cannot be Allow blame on side by side diff. If set to false, blame cannot be used.
used.
+ +
Default is true. Default is true.
@ -1433,13 +1428,10 @@ upper and lower case character for each position must be used. For
example, to match the string `bug` in a case insensitive way the match example, to match the string `bug` in a case insensitive way the match
pattern `[bB][uU][gG]` needs to be used. pattern `[bB][uU][gG]` needs to be used.
+ +
Between the GWT UI and PolyGerrit, the commentlink.name.match regular The commentlink.name.match regular expressions are applied to the raw,
expressions are applied differently. Whereas in the GWT UI the unformatted and unescaped text form. Regex matching against HTML is not
expressions are applied to the formatted and escaped HTML result, the supported. Comment link patterns that are written in this style should
PolyGerrit UI applies them only to the raw, unformatted and unescaped be updated to match text formats.
text form. PolyGerrit does not support regex matching against HTML.
Comment link patterns that are written in this style should be updated
to match text formats.
+ +
A common pattern to match is `bug\\s+(\\d+)`. A common pattern to match is `bug\\s+(\\d+)`.
@ -5100,10 +5092,6 @@ The contents of the `system_config` table are cached at startup
by Gerrit. If you modify any columns in this table, Gerrit needs by Gerrit. If you modify any columns in this table, Gerrit needs
to be restarted before it will use the new values. to be restarted before it will use the new values.
== Configuring the Polygerrit UI
Please see link:dev-polygerrit.html[UI] on configuring the Polygerrit UI.
=== Configurable Parameters === Configurable Parameters
site_path:: site_path::

View File

@ -199,8 +199,7 @@ Project]
This plugin allows the rendering of Git repository branch network in a This plugin allows the rendering of Git repository branch network in a
graphical HTML5 Canvas. It is mainly intended to be used as a graphical HTML5 Canvas. It is mainly intended to be used as a
"project link" in a gitweb configuration or by other Gerrit GWT UI "project link" in a gitweb configuration.
plugins to be plugged elsewhere in Gerrit.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/branch-network[ link:https://gerrit-review.googlesource.com/admin/repos/plugins/branch-network[
Project] | Project] |

View File

@ -129,9 +129,7 @@ instead of '#' because Analytics won't track anchors.
The `window.onload` callback is necessary to ensure that the The `window.onload` callback is necessary to ensure that the
`Gerrit.on()` function has actually been defined by the `Gerrit.on()` function has actually been defined by the
page. Because GWT loads the module asynchronously any `<script>` page.
block in the header or footer will execute before Gerrit has defined
the function and is ready to register the hook callback.
GERRIT GERRIT
------ ------

View File

@ -92,7 +92,7 @@ in `$gerrit_site/etc/gerrit.config` to run Gerrit with Java 9:
=== Gerrit Development WAR File === Gerrit Development WAR File
To build the Gerrit web application that includes the PolyGerrit UI: To build the Gerrit web application:
---- ----
bazel build gerrit bazel build gerrit
@ -111,8 +111,8 @@ The output executable WAR will be placed in:
[[release]] [[release]]
=== Gerrit Release WAR File === Gerrit Release WAR File
To build the Gerrit web application that includes the GWT UI, the To build the Gerrit web application that includes the PolyGerrit UI,
PolyGerrit UI, core plugins and documentation: core plugins and documentation:
---- ----
bazel build release bazel build release
@ -126,7 +126,7 @@ The output executable WAR will be placed in:
=== Headless Mode === Headless Mode
To build Gerrit in headless mode, i.e. without the PolyGerrit and GWT To build Gerrit in headless mode, i.e. without the PolyGerrit UI:
Web UI: Web UI:
---- ----
@ -141,7 +141,7 @@ The output executable WAR will be placed in:
=== Extension and Plugin API JAR Files === Extension and Plugin API JAR Files
To build the extension, plugin and GWT API JAR files: To build the extension, plugin and acceptance-framework JAR files:
---- ----
bazel build api bazel build api
@ -154,7 +154,8 @@ Java docs will be placed in:
bazel-genfiles/api.zip bazel-genfiles/api.zip
---- ----
Install {extension,plugin,gwt}-api to the local maven repository: Install {extension,plugin,acceptance-framework}-api to the local
maven repository:
---- ----
tools/maven/api.sh install tools/maven/api.sh install

View File

@ -273,7 +273,6 @@ when coding:
people from submitting actions more than once when operating people from submitting actions more than once when operating
on slow links. If the action buttons are disabled, they cannot on slow links. If the action buttons are disabled, they cannot
be resubmitted and the user can see that Gerrit is still busy. be resubmitted and the user can see that Gerrit is still busy.
* GWT EventBus is the new way forward.
* ...and so is Guava (previously known as Google Collections). * ...and so is Guava (previously known as Google Collections).
@ -333,21 +332,6 @@ Fixes that are known to be needed for a particular release should be pushed
for review on that release's stable branch. It will then be included in for review on that release's stable branch. It will then be included in
the master branch when the stable branch is merged back. the master branch when the stable branch is merged back.
=== Updating to new version of GWT
When updating to a new version of GWT, there are several things that also need
to be updated or at least checked.
* Update common and plugin dependencies in `tools/gwt-constants.defs`.
* Update to the same GWT version in the cookbook plugin and optionally in other
plugins that have a dependency on GWT.
* Update the GWT version in the archetype metadata in the
`gerrit-plugin-gwt-archetype`.
* Update the version of `gwt-maven-plugin` in the example pom.xml file in
link:dev-plugins.html[dev-plugins].
* Update to the same GWT version in the `gwtjsonrpc` project, and release a
new version.
=== Finding starter projects to work on === Finding starter projects to work on
We have created a We have created a

View File

@ -121,9 +121,9 @@ to be the author of the change.
End-user web browsers make HTTP requests directly to Gerrit's End-user web browsers make HTTP requests directly to Gerrit's
HTTP server. As nearly all of the user interface is implemented HTTP server. As nearly all of the user interface is implemented
through Google Web Toolkit (GWT), the majority of these requests through PolyGerrit, the majority of these requests are transmitting
are transmitting compressed JSON payloads, with all HTML being compressed JSON payloads, with all HTML being generated within the
generated within the browser. Most responses are under 1 KB. browser. Most responses are under 1 KB.
Gerrit's HTTP server side component is implemented as a standard Gerrit's HTTP server side component is implemented as a standard
Java servlet, and thus runs within any J2EE servlet container. Java servlet, and thus runs within any J2EE servlet container.
@ -166,7 +166,6 @@ User authentication is handled by OpenID, and therefore Gerrit
requires that the OpenID provider selected by a user must be requires that the OpenID provider selected by a user must be
online and operating in order to authenticate that user. online and operating in order to authenticate that user.
* link:http://www.gwtproject.org/[Google Web Toolkit (GWT)]
* link:http://www.kernel.org/pub/software/scm/git/docs/gitrepository-layout.html[Git Repository Format] * link:http://www.kernel.org/pub/software/scm/git/docs/gitrepository-layout.html[Git Repository Format]
* link:http://www.postgresql.org/about/[About PostgreSQL] * link:http://www.postgresql.org/about/[About PostgreSQL]
* link:http://openid.net/developers/specs/[OpenID Specifications] * link:http://openid.net/developers/specs/[OpenID Specifications]
@ -200,11 +199,6 @@ The majority of Gerrit's users will be writing change descriptions
and comments in English, and therefore an English user interface and comments in English, and therefore an English user interface
is usable by the target user base. is usable by the target user base.
Gerrit uses GWT's i18n support to externalize all constant strings
and messages shown to the user, so that in the future someone who
really needed a translated version of the UI could contribute new
string files for their locale(s).
Right-to-left (RTL) support is only barely considered within the Right-to-left (RTL) support is only barely considered within the
Gerrit code base. Some portions of the code have tried to take Gerrit code base. Some portions of the code have tried to take
RTL into consideration, while others probably need to be modified RTL into consideration, while others probably need to be modified
@ -235,20 +229,11 @@ provide hints to screen readers.
Supporting non-JavaScript enabled browsers is a non-goal for Gerrit. Supporting non-JavaScript enabled browsers is a non-goal for Gerrit.
As Gerrit is a pure-GWT application with no server side rendering As Gerrit is a pure JavaScript application on the client side, with
fallbacks, the browser must support modern JavaScript semantics in no server side rendering fallbacks, the browser must support modern
order to access the Gerrit web application. Dumb clients such as JavaScript semantics in order to access the Gerrit web application.
`lynx`, `wget`, `curl`, or even many search engine spiders are not Dumb clients such as `lynx`, `wget`, `curl`, or even many search engine
able to access Gerrit content. spiders are not able to access Gerrit content.
As Google Web Toolkit (GWT) is used to generate the browser
specific versions of the client-side JavaScript code, Gerrit works
on any JavaScript enabled browser which GWT can produce code for.
This covers the majority of the popular browsers.
The Gerrit project does not have the development resources necessary
to support two parallel UI implementations (GWT based JavaScript
and server-side rendering). Consequently only one is implemented.
There are number of web browsers available with full JavaScript There are number of web browsers available with full JavaScript
support, and nearly every operating system (including any PDA-like support, and nearly every operating system (including any PDA-like
@ -323,7 +308,7 @@ services other than those listed above.
Gerrit uses an XSRF protected variant of JSON-RPC 1.1 to communicate Gerrit uses an XSRF protected variant of JSON-RPC 1.1 to communicate
between the browser client and the server. between the browser client and the server.
As the protocol is not the GWT-RPC protocol, but is instead a As the protocol is not the proprietry protocol, but is instead a
self-describing standard JSON format it is easily implemented by self-describing standard JSON format it is easily implemented by
any 3rd party client application, provided the client has a JSON any 3rd party client application, provided the client has a JSON
parser and HTTP client library available. parser and HTTP client library available.

View File

@ -1,11 +1,9 @@
= Gerrit Code Review - Eclipse Setup = Gerrit Code Review - Eclipse Setup
This document is about configuring Gerrit Code Review into an This document is about configuring Gerrit Code Review into an
Eclipse workspace for development and debugging with GWT. Eclipse workspace for development.
Java 8 or later SDK is also required to run GWT's compiler and
runtime debugging environment.
Java 8 or later SDK is require
[[setup]] [[setup]]
== Project Setup == Project Setup
@ -104,61 +102,6 @@ Duplicate the existing launch configuration:
* Change Save as to be Local file. * Change Save as to be Local file.
* Close the Debug Configurations dialog and save the changes when prompted. * Close the Debug Configurations dialog and save the changes when prompted.
=== Running GWT Debug Mode
The `gerrit_gwt_debug` launch configuration uses GWT's
link:http://www.gwtproject.org/articles/superdevmode.html[Super Dev Mode].
* Make a local copy of the `gerrit_gwt_debug` configuration, using the
process described for `gerrit_daemon` above.
* Launch the local copy of `gerrit_gwt_debug` from the Eclipse debug menu.
* If debugging GWT for the first time:
** Open the link:http://localhost:9876/[codeserver URL] and add the `Dev Mode On`
and `Dev Mode Off` bookmarklet to your bookmark bar.
** Activate the source maps feature in your browser. Refer to the
link:https://developer.chrome.com/devtools/docs/javascript-debugging#source-maps[
Chrome] and
link:https://developer.mozilla.org/en-US/docs/Tools/Debugger#Use_a_source_map[
Firefox] developer documentation.
* Load the link:http://localhost:8080[Gerrit page].
* Open the source tab in developer tools.
* Click the `Dev Mode On` bookmark to incrementally recompile changed files.
* Select the `gerrit_ui` module to compile (the `Compile` button can also be used
as a bookmarklet).
* In the developer tools source tab, open a file and set a breakpoint.
* Navigate to the UI and confirm that the breakpoint is hit.
* To end the debugging session, click the `Dev Mode Off` bookmark.
.After changing the client side code:
* Hitting `F5` in the browser only reloads the last compile output, without
recompiling.
* To reflect your changes in the debug session, click `Dev Mode On` then `Compile`.
=== Running GWT Debug Mode for Gerrit plugins
A Gerrit plugin can expose GWT module and its implementation can be inspected
in the SDM debug session.
`codeserver` needs two additional inputs to expose the plugin module in the SDM
debug session: the module name and the source folder location. For example the
module name and source folder of `cookbook-plugin` should be added in the local
copy of the `gerrit_gwt_debug` configuration:
----
com.googlesource.gerrit.plugins.cookbook.HelloForm \
-src ${resource_loc:/gerrit}/plugins/cookbook-plugin/src/main/java \
-- --console-log [...]
----
After doing that, both the Gerrit core and plugin GWT modules can be activated
during SDM (debug session)[http://imgur.com/HFXZ5No].
GERRIT GERRIT
------ ------
Part of link:index.html[Gerrit Code Review] Part of link:index.html[Gerrit Code Review]

View File

@ -1302,7 +1302,7 @@ this can be specified by setting `scope = CapabilityScope.CORE`:
[[panels]] [[panels]]
=== Panels === Panels
GWT plugins can contribute panels to Gerrit screens. UI plugins can contribute panels to Gerrit screens.
Gerrit screens define extension points where plugins can add GWT Gerrit screens define extension points where plugins can add GWT
panels with custom controls: panels with custom controls:
@ -1878,317 +1878,6 @@ public class MyTopMenuExtension implements TopMenu {
---- ----
[[gwt_ui_extension]]
== GWT UI Extension
Plugins can extend the Gerrit UI with own GWT code.
A GWT plugin must contain a GWT module file, e.g. `HelloPlugin.gwt.xml`,
that bundles together all the configuration settings of the GWT plugin:
[source,xml]
----
<?xml version="1.0" encoding="UTF-8"?>
<module rename-to="hello_gwt_plugin">
<!-- Inherit the core Web Toolkit stuff. -->
<inherits name="com.google.gwt.user.User"/>
<!-- Other module inherits -->
<inherits name="com.google.gerrit.Plugin"/>
<inherits name="com.google.gwt.http.HTTP"/>
<!-- Using GWT built-in themes adds a number of static -->
<!-- resources to the plugin. No theme inherits lines were -->
<!-- added in order to make this plugin as simple as possible -->
<!-- Specify the app entry point class. -->
<entry-point class="${package}.client.HelloPlugin"/>
<stylesheet src="hello.css"/>
</module>
----
The GWT module must inherit `com.google.gerrit.Plugin` and
`com.google.gwt.http.HTTP`.
To register the GWT module a `GwtPlugin` needs to be bound.
If no Guice modules are declared in the manifest, the GWT plugin may
use auto-registration by using the `@Listen` annotation:
[source,java]
----
@Listen
public class MyExtension extends GwtPlugin {
public MyExtension() {
super("hello_gwt_plugin");
}
}
----
Otherwise the binding must be done in an `HttpModule`:
[source,java]
----
public class HttpModule extends HttpPluginModule {
@Override
protected void configureServlets() {
DynamicSet.bind(binder(), WebUiPlugin.class)
.toInstance(new GwtPlugin("hello_gwt_plugin"));
}
}
----
The HTTP module above must be declared in the `pom.xml` for Maven
driven plugins:
[source,xml]
----
<manifestEntries>
<Gerrit-HttpModule>com.googlesource.gerrit.plugins.myplugin.HttpModule</Gerrit-HttpModule>
</manifestEntries>
----
The name that is provided to the `GwtPlugin` must match the GWT
module name compiled into the plugin. The name of the GWT module
can be explicitly set in the GWT module XML file by specifying
the `rename-to` attribute on the module. It is important that the
module name be unique across all plugins installed on the server,
as the module name determines the JavaScript namespace used by the
compiled plugin code.
[source,xml]
----
<module rename-to="hello_gwt_plugin">
----
The actual GWT code must be implemented in a class that extends
`com.google.gerrit.plugin.client.PluginEntryPoint`:
[source,java]
----
public class HelloPlugin extends PluginEntryPoint {
@Override
public void onPluginLoad() {
// Create the dialog box
final DialogBox dialogBox = new DialogBox();
// The content of the dialog comes from a User specified Preference
dialogBox.setText("Hello from GWT Gerrit UI plugin");
dialogBox.setAnimationEnabled(true);
Button closeButton = new Button("Close");
VerticalPanel dialogVPanel = new VerticalPanel();
dialogVPanel.setWidth("100%");
dialogVPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);
dialogVPanel.add(closeButton);
closeButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
dialogBox.hide();
}
});
// Set the contents of the Widget
dialogBox.setWidget(dialogVPanel);
RootPanel rootPanel = RootPanel.get(HelloMenu.MENU_ID);
rootPanel.getElement().removeAttribute("href");
rootPanel.addDomHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
dialogBox.center();
dialogBox.show();
}
}, ClickEvent.getType());
}
}
----
This class must be set as entry point in the GWT module:
[source,xml]
----
<entry-point class="${package}.client.HelloPlugin"/>
----
In addition this class must be defined as module in the `pom.xml` for the
`gwt-maven-plugin` and the `webappDirectory` option of `gwt-maven-plugin`
must be set to `${project.build.directory}/classes/static`:
[source,xml]
----
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>gwt-maven-plugin</artifactId>
<version>2.7.0</version>
<configuration>
<module>com.googlesource.gerrit.plugins.myplugin.HelloPlugin</module>
<disableClassMetadata>true</disableClassMetadata>
<disableCastChecking>true</disableCastChecking>
<webappDirectory>${project.build.directory}/classes/static</webappDirectory>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
----
To attach a GWT widget defined by the plugin to the Gerrit core UI
`com.google.gwt.user.client.ui.RootPanel` can be used to manipulate the
Gerrit core widgets:
[source,java]
----
RootPanel rootPanel = RootPanel.get(HelloMenu.MENU_ID);
rootPanel.getElement().removeAttribute("href");
rootPanel.addDomHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
dialogBox.center();
dialogBox.show();
}
}, ClickEvent.getType());
----
GWT plugins can come with their own css file. This css file must have a
unique name and must be registered in the GWT module:
[source,xml]
----
<stylesheet src="hello.css"/>
----
If a GWT plugin wants to invoke the Gerrit REST API it can use
`com.google.gerrit.plugin.client.rpc.RestApi` to construct the URL
path and to trigger the REST calls.
Example for invoking a Gerrit core REST endpoint:
[source,java]
----
new RestApi("projects").id(projectName).view("description")
.put("new description", new AsyncCallback<JavaScriptObject>() {
@Override
public void onSuccess(JavaScriptObject result) {
// TODO
}
@Override
public void onFailure(Throwable caught) {
// never invoked
}
});
----
Example for invoking a REST endpoint defined by a plugin:
[source,java]
----
new RestApi("projects").id(projectName).view("myplugin", "myview")
.get(new AsyncCallback<JavaScriptObject>() {
@Override
public void onSuccess(JavaScriptObject result) {
// TODO
}
@Override
public void onFailure(Throwable caught) {
// never invoked
}
});
----
The `onFailure(Throwable)` of the provided callback is never invoked.
If an error occurs, it is shown in an error dialog.
In order to be able to do REST calls the GWT module must inherit
`com.google.gwt.json.JSON`:
[source,xml]
----
<inherits name="com.google.gwt.json.JSON"/>
----
[[screen]]
== Add Screen
A link:#gwt_ui_extension[GWT plugin] can link:#top-menu-extensions[add
a menu item] that opens a screen that is implemented by the plugin.
This way plugin screens can be fully integrated into the Gerrit UI.
Example menu item:
[source,java]
----
public class MyMenu implements TopMenu {
private final List<MenuEntry> menuEntries;
@Inject
public MyMenu(@PluginName String name) {
menuEntries = new ArrayList<>();
menuEntries.add(new MenuEntry("My Menu", Collections.singletonList(
new MenuItem("My Screen", "#/x/" + name + "/my-screen", ""))));
}
@Override
public List<MenuEntry> getEntries() {
return menuEntries;
}
}
----
Example screen:
[source,java]
----
public class MyPlugin extends PluginEntryPoint {
@Override
public void onPluginLoad() {
Plugin.get().screen("my-screen", new Screen.EntryPoint() {
@Override
public void onLoad(Screen screen) {
screen.add(new InlineLabel("My Screen");
screen.show();
}
});
}
}
----
[[user-settings-screen]]
== Add User Settings Screen
A link:#gwt_ui_extension[GWT plugin] can implement a user settings
screen that is integrated into the Gerrit user settings menu.
Example settings screen:
[source,java]
----
public class MyPlugin extends PluginEntryPoint {
@Override
public void onPluginLoad() {
Plugin.get().settingsScreen("my-preferences", "My Preferences",
new Screen.EntryPoint() {
@Override
public void onLoad(Screen screen) {
screen.setPageTitle("Settings");
screen.add(new InlineLabel("My Preferences"));
screen.show();
}
});
}
}
----
By defining an link:config-gerrit.html#urlAlias[urlAlias] Gerrit
administrators can map plugin screens into the Gerrit URL namespace or
even replace Gerrit screens by plugin screens.
Plugins may also programatically add URL aliases in the preferences of
of a user. This way certain screens can be replaced for certain users.
E.g. the plugin may offer a user preferences setting for choosing a
screen that then sets/unsets a URL alias for the user.
[[settings-screen]] [[settings-screen]]
== Plugin Settings Screen == Plugin Settings Screen

View File

@ -126,10 +126,7 @@ As result a link:#server-info[ServerInfo] entity is returned.
"gerrit": { "gerrit": {
"all_projects": "All-Projects", "all_projects": "All-Projects",
"all_users": "All-Users" "all_users": "All-Users"
"doc_search": true, "doc_search": true
"web_uis": [
"gwt"
]
}, },
"sshd": {}, "sshd": {},
"suggest": { "suggest": {
@ -1805,9 +1802,6 @@ link:config-gerrit.html#gerrit.reportBugUrl[URL to report bugs].
|`report_bug_text` |optional, not set if default| |`report_bug_text` |optional, not set if default|
link:config-gerrit.html#gerrit.reportBugText[Display text for report link:config-gerrit.html#gerrit.reportBugText[Display text for report
bugs link]. bugs link].
|`web_uis` ||
List of web UIs supported by the HTTP server. Possible values are `GWT`
and `POLYGERRIT`.
|================================= |=================================
[[hit-ration-info]] [[hit-ration-info]]

View File

@ -3,7 +3,6 @@ workspace(name = "gerrit")
load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive", "http_file") load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive", "http_file")
load("//tools/bzl:maven_jar.bzl", "GERRIT", "MAVEN_LOCAL", "maven_jar") load("//tools/bzl:maven_jar.bzl", "GERRIT", "MAVEN_LOCAL", "maven_jar")
load("//lib/codemirror:cm.bzl", "CM_VERSION", "DIFF_MATCH_PATCH_VERSION")
load("//plugins:external_plugin_deps.bzl", "external_plugin_deps") load("//plugins:external_plugin_deps.bzl", "external_plugin_deps")
http_archive( http_archive(
@ -146,61 +145,6 @@ maven_jar(
sha1 = "021a212688ec94fe77aff74ab34cc74f6f940e60", sha1 = "021a212688ec94fe77aff74ab34cc74f6f940e60",
) )
GWT_VERS = "2.8.2"
maven_jar(
name = "user",
artifact = "com.google.gwt:gwt-user:" + GWT_VERS,
sha1 = "a2b9be2c996a658c4e009ba652a9c6a81c88a797",
)
maven_jar(
name = "dev",
artifact = "com.google.gwt:gwt-dev:" + GWT_VERS,
sha1 = "7a87e060bbf129386b7ae772459fb9f87297c332",
)
maven_jar(
name = "javax-validation",
artifact = "javax.validation:validation-api:1.0.0.GA",
sha1 = "b6bd7f9d78f6fdaa3c37dae18a4bd298915f328e",
src_sha1 = "7a561191db2203550fbfa40d534d4997624cd369",
)
maven_jar(
name = "jsinterop-annotations",
artifact = "com.google.jsinterop:jsinterop-annotations:1.0.2",
sha1 = "abd7319f53d018e11108a88f599bd16492448dd2",
src_sha1 = "33716f8aef043f2f02b78ab4a1acda6cd90a7602",
)
maven_jar(
name = "ant",
artifact = "ant:ant:1.6.5",
attach_source = False,
sha1 = "7d18faf23df1a5c3a43613952e0e8a182664564b",
)
maven_jar(
name = "colt",
artifact = "colt:colt:1.2.0",
attach_source = False,
sha1 = "0abc984f3adc760684d49e0f11ddf167ba516d4f",
)
maven_jar(
name = "tapestry",
artifact = "tapestry:tapestry:4.0.2",
attach_source = False,
sha1 = "e855a807425d522e958cbce8697f21e9d679b1f7",
)
maven_jar(
name = "w3c-css-sac",
artifact = "org.w3c.css:sac:1.3",
sha1 = "cdb2dcb4e22b83d6b32b93095f644c3462739e82",
)
load("//lib/jgit:jgit.bzl", "jgit_repos") load("//lib/jgit:jgit.bzl", "jgit_repos")
jgit_repos() jgit_repos()
@ -1050,25 +994,6 @@ maven_jar(
sha1 = "951b7eda125f3137538a94e2cbdcf744088ad4c2", sha1 = "951b7eda125f3137538a94e2cbdcf744088ad4c2",
) )
maven_jar(
name = "codemirror-minified-gwt",
artifact = "org.webjars.npm:codemirror-minified:" + CM_VERSION,
sha1 = "36558ea3b8e30782e1e09c0e7bd781e09614f139",
)
maven_jar(
name = "codemirror-original-gwt",
artifact = "org.webjars.npm:codemirror:" + CM_VERSION,
sha1 = "f1f8fbbc3e2d224fdccc43d2f4180658a92320f9",
)
maven_jar(
name = "diff-match-patch",
artifact = "org.webjars:google-diff-match-patch:" + DIFF_MATCH_PATCH_VERSION,
attach_source = False,
sha1 = "0cf1782dbcb8359d95070da9176059a5a9d37709",
)
maven_jar( maven_jar(
name = "commons-io", name = "commons-io",
artifact = "commons-io:commons-io:2.2", artifact = "commons-io:commons-io:2.2",

View File

@ -1,16 +0,0 @@
java_library(
name = "gwtdebug",
srcs = glob(["src/main/java/**/*.java"]),
visibility = ["//visibility:public"],
deps = [
"//java/com/google/gerrit/pgm",
"//java/com/google/gerrit/pgm/util",
"//java/com/google/gerrit/util/cli",
"//lib/flogger:api",
"//lib/gwt:dev",
"//lib/jetty:server",
"//lib/jetty:servlet",
"//lib/jetty:servlets",
"//lib/log:log4j",
],
)

View File

@ -1,77 +0,0 @@
// Copyright (C) 2014 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.gwtdebug;
import com.google.common.flogger.FluentLogger;
import com.google.gerrit.pgm.Daemon;
import com.google.gwt.dev.codeserver.CodeServer;
import com.google.gwt.dev.codeserver.Options;
import java.util.ArrayList;
import java.util.List;
class GerritGwtDebugLauncher {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
public static void main(String[] argv) throws Exception {
GerritGwtDebugLauncher launcher = new GerritGwtDebugLauncher();
launcher.mainImpl(argv);
}
private int mainImpl(String[] argv) {
List<String> sdmLauncherOptions = new ArrayList<>();
List<String> daemonLauncherOptions = new ArrayList<>();
// Separator between Daemon and Codeserver parameters is "--"
boolean daemonArgumentSeparator = false;
int i = 0;
for (; i < argv.length; i++) {
if (!argv[i].equals("--")) {
sdmLauncherOptions.add(argv[i]);
} else {
daemonArgumentSeparator = true;
break;
}
}
if (daemonArgumentSeparator) {
++i;
for (; i < argv.length; i++) {
daemonLauncherOptions.add(argv[i]);
}
}
Options options = new Options();
if (!options.parseArgs(sdmLauncherOptions.toArray(new String[sdmLauncherOptions.size()]))) {
logger.atSevere().log("Failed to parse codeserver arguments");
return 1;
}
CodeServer.main(options);
try {
int r =
new Daemon()
.main(daemonLauncherOptions.toArray(new String[daemonLauncherOptions.size()]));
if (r != 0) {
logger.atSevere().log("Daemon exited with return code: %d", r);
return 1;
}
} catch (Exception e) {
logger.atSevere().withCause(e).log("Cannot start daemon");
return 1;
}
return 0;
}
}

View File

@ -1,62 +0,0 @@
load("//tools/bzl:java.bzl", "java_library2")
load("//tools/bzl:junit.bzl", "junit_tests")
load("//tools/bzl:gwt.bzl", "gwt_module")
EXPORTED_DEPS = [
"//java/com/google/gerrit/common:client",
"//java/com/google/gwtexpui/clippy",
"//java/com/google/gwtexpui/globalkey",
"//java/com/google/gwtexpui/progress",
"//java/com/google/gwtexpui/safehtml",
"//java/com/google/gwtexpui/user:agent",
]
DEPS = ["//lib/gwt:user-neverlink"]
SRC = "src/main/java/com/google/gerrit/"
gwt_module(
name = "client",
srcs = glob(["src/main/**/*.java"]),
exported_deps = EXPORTED_DEPS,
gwt_xml = SRC + "GerritGwtUICommon.gwt.xml",
resources = glob(
["src/main/**/*"],
exclude = [SRC + "client/**/*.java"] + [
SRC + "GerritGwtUICommon.gwt.xml",
],
),
visibility = ["//visibility:public"],
deps = DEPS,
)
java_library2(
name = "client-lib",
srcs = glob(["src/main/**/*.java"]),
exported_deps = EXPORTED_DEPS,
resources = glob(["src/main/**/*"]),
visibility = ["//visibility:public"],
deps = DEPS,
)
java_library(
name = "diffy_logo",
data = [
"//lib:LICENSE-CC-BY3.0-unported",
"//lib:LICENSE-diffy",
],
resources = glob(["src/main/resources/com/google/gerrit/client/diffy*.png"]),
visibility = ["//visibility:public"],
)
junit_tests(
name = "client_tests",
srcs = glob(["src/test/java/**/*.java"]),
visibility = ["//visibility:public"],
deps = [
":client",
"//lib:junit",
"//lib/gwt:dev",
"//lib/jgit/org.eclipse.jgit:jgit",
],
)

View File

@ -1,43 +0,0 @@
<!--
Copyright (C) 2014 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.
-->
<module>
<inherits name='org.eclipse.jgit.JGit'/>
<inherits name='com.google.gerrit.common.Common'/>
<inherits name='com.google.gerrit.extensions.Extensions'/>
<inherits name='com.google.gerrit.prettify.PrettyFormatter'/>
<inherits name='com.google.gwtexpui.clippy.Clippy'/>
<inherits name='com.google.gwtexpui.globalkey.GlobalKey'/>
<inherits name='com.google.gwtexpui.progress.Progress'/>
<inherits name='com.google.gwtexpui.safehtml.SafeHtml'/>
<source path='client'>
<include name='AccountFormatter.java'/>
<include name='CommonConstants.java'/>
<include name='CommonMessages.java'/>
<include name='DateFormatter.java'/>
<include name='GerritUiExtensionPoint.java'/>
<include name='RelativeDateFormatter.java'/>
<include name='Resources.java'/>
<include name='CommonConstants.properties'/>
<include name='CommonMessages.properties'/>
<include name='info/*.java'/>
<include name='rpc/NativeMap.java'/>
<include name='rpc/Natives.java'/>
<include name='rpc/NativeString.java'/>
<include name='rpc/TransformCallback.java'/>
<include name='ui/HighlightSuggestion.java'/>
<include name='ui/RemoteSuggestOracle.java'/>
</source>
</module>

View File

@ -1,70 +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;
import com.google.gerrit.client.info.AccountInfo;
public class AccountFormatter {
private final String anonymousCowardName;
public AccountFormatter(String anonymousCowardName) {
this.anonymousCowardName = anonymousCowardName;
}
/**
* Formats an account as a name and an email address.
*
* <p>Example output:
*
* <ul>
* <li>{@code A U. Thor &lt;author@example.com&gt;}: full populated
* <li>{@code A U. Thor (12)}: missing email address
* <li>{@code Anonymous Coward &lt;author@example.com&gt;}: missing name
* <li>{@code Anonymous Coward (12)}: missing name and email address
* </ul>
*/
public String nameEmail(AccountInfo info) {
String name = info.name();
if (name == null || name.trim().isEmpty()) {
name = anonymousCowardName;
}
StringBuilder b = new StringBuilder().append(name);
if (info.email() != null) {
b.append(" <").append(info.email()).append(">");
} else if (info._accountId() > 0) {
b.append(" (").append(info._accountId()).append(")");
}
return b.toString();
}
/**
* Formats an account name.
*
* <p>If the account has a full name, it returns only the full name. Otherwise it returns a longer
* form that includes the email address.
*/
public String name(AccountInfo ai) {
if (ai.name() != null && !ai.name().trim().isEmpty()) {
return ai.name();
}
String email = ai.email();
if (email != null) {
int at = email.indexOf('@');
return 0 < at ? email.substring(0, at) : email;
}
return nameEmail(ai);
}
}

View File

@ -1,46 +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;
import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.Constants;
public interface CommonConstants extends Constants {
CommonConstants C = GWT.create(CommonConstants.class);
String inTheFuture();
String month();
String months();
String year();
String years();
String oneSecondAgo();
String oneMinuteAgo();
String oneHourAgo();
String oneDayAgo();
String oneWeekAgo();
String oneMonthAgo();
String oneYearAgo();
}

View File

@ -1,13 +0,0 @@
inTheFuture = in the future
month = month
months = months
years = years
year = year
oneSecondAgo = 1 second ago
oneMinuteAgo = 1 minute ago
oneHourAgo = 1 hour ago
oneDayAgo = 1 day ago
oneWeekAgo = 1 week ago
oneMonthAgo = 1 month ago
oneYearAgo = 1 year ago

View File

@ -1,40 +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;
import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.Messages;
public interface CommonMessages extends Messages {
CommonMessages M = GWT.create(CommonMessages.class);
String secondsAgo(long seconds);
String minutesAgo(long minutes);
String hoursAgo(long hours);
String daysAgo(long days);
String weeksAgo(long weeks);
String monthsAgo(long months);
String yearsAgo(long years);
String years0MonthsAgo(long years, String yearLabel);
String yearsMonthsAgo(long years, String yearLabel, long months, String monthLabel);
}

View File

@ -1,9 +0,0 @@
secondsAgo = {0} seconds ago
minutesAgo = {0} minutes ago
hoursAgo = {0} hours ago
daysAgo = {0} days ago
weeksAgo = {0} weeks ago
monthsAgo = {0} months ago
years0MonthsAgo = {0} {1} ago
yearsMonthsAgo = {0} {1}, {2} {3} ago
yearsAgo = {0} years ago

View File

@ -1,99 +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;
import com.google.gerrit.client.info.GeneralPreferences;
import com.google.gwt.i18n.client.DateTimeFormat;
import java.util.Date;
public class DateFormatter {
private static final long ONE_YEAR = 182L * 24 * 60 * 60 * 1000;
private final DateTimeFormat sTime;
private final DateTimeFormat sDate;
private final DateTimeFormat sdtFmt;
private final DateTimeFormat mDate;
private final DateTimeFormat dtfmt;
public DateFormatter(GeneralPreferences prefs) {
String fmt_sTime = prefs.timeFormat().getFormat();
String fmt_sDate = prefs.dateFormat().getShortFormat();
String fmt_mDate = prefs.dateFormat().getLongFormat();
sTime = DateTimeFormat.getFormat(fmt_sTime);
sDate = DateTimeFormat.getFormat(fmt_sDate);
sdtFmt = DateTimeFormat.getFormat(fmt_sDate + " " + fmt_sTime);
mDate = DateTimeFormat.getFormat(fmt_mDate);
dtfmt = DateTimeFormat.getFormat(fmt_mDate + " " + fmt_sTime);
}
/** Format a date using a really short format. */
public String shortFormat(Date dt) {
if (dt == null) {
return "";
}
Date now = new Date();
dt = new Date(dt.getTime());
if (mDate.format(now).equals(mDate.format(dt))) {
// Same day as today, report only the time.
//
return sTime.format(dt);
} else if (Math.abs(now.getTime() - dt.getTime()) < ONE_YEAR) {
// Within the last year, show a shorter date.
//
return sDate.format(dt);
} else {
// Report only date and year, its far away from now.
//
return mDate.format(dt);
}
}
/** Format a date using a really short format. */
public String shortFormatDayTime(Date dt) {
if (dt == null) {
return "";
}
Date now = new Date();
dt = new Date(dt.getTime());
if (mDate.format(now).equals(mDate.format(dt))) {
// Same day as today, report only the time.
//
return sTime.format(dt);
} else if (Math.abs(now.getTime() - dt.getTime()) < ONE_YEAR) {
// Within the last year, show a shorter date.
//
return sdtFmt.format(dt);
} else {
// Report only date and year, its far away from now.
//
return mDate.format(dt);
}
}
/** Format a date using the locale's medium length format. */
public String mediumFormat(Date dt) {
if (dt == null) {
return "";
}
return dtfmt.format(new Date(dt.getTime()));
}
}

View File

@ -1,46 +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;
public enum GerritUiExtensionPoint {
/* ChangeScreen */
CHANGE_SCREEN_HEADER,
CHANGE_SCREEN_HEADER_RIGHT_OF_BUTTONS,
CHANGE_SCREEN_HEADER_RIGHT_OF_POP_DOWNS,
CHANGE_SCREEN_BELOW_CHANGE_INFO_BLOCK,
CHANGE_SCREEN_BELOW_RELATED_INFO_BLOCK,
CHANGE_SCREEN_BELOW_COMMIT_INFO_BLOCK,
CHANGE_SCREEN_HISTORY_RIGHT_OF_BUTTONS,
/* MyPasswordScreen */
PASSWORD_SCREEN_BOTTOM,
/* MyPreferencesScreen */
PREFERENCES_SCREEN_BOTTOM,
/* MyProfileScreen */
PROFILE_SCREEN_BOTTOM,
/* ProjectInfoScreen */
PROJECT_INFO_SCREEN_TOP,
PROJECT_INFO_SCREEN_BOTTOM;
public enum Key {
ACCOUNT_INFO,
CHANGE_INFO,
PROJECT_NAME,
REVISION_INFO
}
}

View File

@ -1,142 +0,0 @@
// Copyright (C) 2013 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;
import java.util.Date;
/**
* Formatter to format timestamps relative to the current time using time units in the format
* defined by {@code git log --relative-date}.
*/
public class RelativeDateFormatter {
private static CommonConstants constants;
private static CommonMessages messages;
static final long SECOND_IN_MILLIS = 1000;
static final long MINUTE_IN_MILLIS = 60 * SECOND_IN_MILLIS;
static final long HOUR_IN_MILLIS = 60 * MINUTE_IN_MILLIS;
static final long DAY_IN_MILLIS = 24 * HOUR_IN_MILLIS;
static final long WEEK_IN_MILLIS = 7 * DAY_IN_MILLIS;
static final long MONTH_IN_MILLIS = 30 * DAY_IN_MILLIS;
static final long YEAR_IN_MILLIS = 365 * DAY_IN_MILLIS;
static void setConstants(CommonConstants c, CommonMessages m) {
constants = c;
messages = m;
}
private static CommonConstants c() {
return constants != null ? constants : CommonConstants.C;
}
private static CommonMessages m() {
return messages != null ? messages : CommonMessages.M;
}
/**
* @param when {@link Date} to format
* @return age of given {@link Date} compared to now formatted in the same relative format as
* returned by {@code git log --relative-date}
*/
public static String format(Date when) {
long ageMillis = (new Date()).getTime() - when.getTime();
// shouldn't happen in a perfect world
if (ageMillis < 0) {
return c().inTheFuture();
}
// seconds
if (ageMillis < upperLimit(MINUTE_IN_MILLIS)) {
long seconds = round(ageMillis, SECOND_IN_MILLIS);
if (seconds == 1) {
return c().oneSecondAgo();
}
return m().secondsAgo(seconds);
}
// minutes
if (ageMillis < upperLimit(HOUR_IN_MILLIS)) {
long minutes = round(ageMillis, MINUTE_IN_MILLIS);
if (minutes == 1) {
return c().oneMinuteAgo();
}
return m().minutesAgo(minutes);
}
// hours
if (ageMillis < upperLimit(DAY_IN_MILLIS)) {
long hours = round(ageMillis, HOUR_IN_MILLIS);
if (hours == 1) {
return c().oneHourAgo();
}
return m().hoursAgo(hours);
}
// up to 14 days use days
if (ageMillis < 14 * DAY_IN_MILLIS) {
long days = round(ageMillis, DAY_IN_MILLIS);
if (days == 1) {
return c().oneDayAgo();
}
return m().daysAgo(days);
}
// up to 10 weeks use weeks
if (ageMillis < 10 * WEEK_IN_MILLIS) {
long weeks = round(ageMillis, WEEK_IN_MILLIS);
if (weeks == 1) {
return c().oneWeekAgo();
}
return m().weeksAgo(weeks);
}
// months
if (ageMillis < YEAR_IN_MILLIS) {
long months = round(ageMillis, MONTH_IN_MILLIS);
if (months == 1) {
return c().oneMonthAgo();
}
return m().monthsAgo(months);
}
// up to 5 years use "year, months" rounded to months
if (ageMillis < 5 * YEAR_IN_MILLIS) {
long years = round(ageMillis, MONTH_IN_MILLIS) / 12;
String yearLabel = (years > 1) ? c().years() : c().year();
long months = round(ageMillis - years * YEAR_IN_MILLIS, MONTH_IN_MILLIS);
String monthLabel = (months > 1) ? c().months() : (months == 1 ? c().month() : "");
if (months == 0) {
return m().years0MonthsAgo(years, yearLabel);
}
return m().yearsMonthsAgo(years, yearLabel, months, monthLabel);
}
// years
long years = round(ageMillis, YEAR_IN_MILLIS);
if (years == 1) {
return c().oneYearAgo();
}
return m().yearsAgo(years);
}
private static long upperLimit(long unit) {
return unit + unit / 2;
}
private static long round(long n, long unit) {
return (n + unit / 2) / unit;
}
}

View File

@ -1,126 +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;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.ImageResource;
public interface Resources extends ClientBundle {
/** silk icons (CC-BY3.0): http://famfamfam.com/lab/icons/silk/ */
@Source("note_add.png")
ImageResource addFileComment();
@Source("tag_blue_add.png")
ImageResource addHashtag();
@Source("user_add.png")
ImageResource addUser();
@Source("user_edit.png")
ImageResource editUser();
// derived from resultset_next.png
@Source("resultset_down_gray.png")
ImageResource arrowDown();
// derived from resultset_next.png
@Source("resultset_next_gray.png")
ImageResource arrowRight();
// derived from resultset_next.png
@Source("resultset_up_gray.png")
ImageResource arrowUp();
@Source("lightbulb.png")
ImageResource blame();
@Source("page_white_put.png")
ImageResource downloadIcon();
// derived from comment.png
@Source("comment_draft.png")
ImageResource draftComments();
@Source("page_edit.png")
ImageResource edit();
@Source("arrow_undo.png")
ImageResource editUndo();
@Source("cog.png")
ImageResource gear();
@Source("tick.png")
ImageResource greenCheck();
@Source("tag_blue.png")
ImageResource hashtag();
@Source("lightbulb.png")
ImageResource info();
@Source("find.png")
ImageResource queryIcon();
@Source("lock.png")
ImageResource readOnly();
@Source("cross.png")
ImageResource redNot();
@Source("disk.png")
ImageResource save();
@Source("star.png")
ImageResource starFilled();
// derived from star.png
@Source("star-open.png")
ImageResource starOpen();
@Source("exclamation.png")
ImageResource warning();
@Source("help.png")
ImageResource question();
/** tango icon library (public domain): http://tango.freedesktop.org/Tango_Icon_Library */
@Source("goNext.png")
ImageResource goNext();
@Source("goPrev.png")
ImageResource goPrev();
@Source("goUp.png")
ImageResource goUp();
@Source("listAdd.png")
ImageResource listAdd();
// derived from important.png
@Source("merge.png")
ImageResource merge();
/** contributed by the artist under Apache2.0 */
@Source("sideBySideDiff.png")
ImageResource sideBySideDiff();
@Source("unifiedDiff.png")
ImageResource unifiedDiff();
/** contributed by the artist under CC-BY3.0 */
@Source("diffy26.png")
ImageResource gerritAvatar26();
}

View File

@ -1,93 +0,0 @@
// Copyright (C) 2013 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;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.core.client.JsArrayString;
import com.google.gwtjsonrpc.client.impl.ser.JavaSqlTimestamp_JsonSerializer;
import java.sql.Timestamp;
public class AccountInfo extends JavaScriptObject {
public final native int _accountId() /*-{ return this._account_id || 0; }-*/;
public final native String name() /*-{ return this.name; }-*/;
public final native String email() /*-{ return this.email; }-*/;
public final native JsArrayString secondaryEmails() /*-{ return this.secondary_emails; }-*/;
public final native String username() /*-{ return this.username; }-*/;
public final Timestamp registeredOn() {
Timestamp ts = _getRegisteredOn();
if (ts == null) {
ts = JavaSqlTimestamp_JsonSerializer.parseTimestamp(registeredOnRaw());
_setRegisteredOn(ts);
}
return ts;
}
private native String registeredOnRaw() /*-{ return this.registered_on; }-*/;
private native Timestamp _getRegisteredOn() /*-{ return this._cts; }-*/;
private native void _setRegisteredOn(Timestamp ts) /*-{ this._cts = ts; }-*/;
/**
* @return true if the server supplied avatar information about this account. The information may
* be an empty list, indicating no avatars are available, such as when no plugin is installed.
* This method returns false if the server did not check on avatars for the account.
*/
public final native boolean hasAvatarInfo() /*-{ return this.hasOwnProperty('avatars') }-*/;
public final AvatarInfo avatar(int sz) {
JsArray<AvatarInfo> a = avatars();
for (int i = 0; a != null && i < a.length(); i++) {
AvatarInfo r = a.get(i);
if (r.height() == sz) {
return r;
}
}
return null;
}
private native JsArray<AvatarInfo> avatars() /*-{ return this.avatars }-*/;
public final native void name(String n) /*-{ this.name = n }-*/;
public final native void email(String e) /*-{ this.email = e }-*/;
public final native void username(String n) /*-{ this.username = n }-*/;
public static native AccountInfo create(int id, String name, String email, String username) /*-{
return {'_account_id': id, 'name': name, 'email': email,
'username': username};
}-*/;
protected AccountInfo() {}
public static class AvatarInfo extends JavaScriptObject {
public static final int DEFAULT_SIZE = 26;
public final native String url() /*-{ return this.url }-*/;
public final native int height() /*-{ return this.height || 0 }-*/;
public final native int width() /*-{ return this.width || 0 }-*/;
protected AvatarInfo() {}
}
}

View File

@ -1,32 +0,0 @@
// Copyright (C) 2013 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 ActionInfo extends JavaScriptObject {
public final native String id() /*-{ return this.id; }-*/;
public final native String method() /*-{ return this.method; }-*/;
public final native String label() /*-{ return this.label; }-*/;
public final native String title() /*-{ return this.title; }-*/;
public final native boolean enabled() /*-{ return this.enabled || false; }-*/;
protected ActionInfo() {}
}

View File

@ -1,29 +0,0 @@
// Copyright (C) 2016 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 AgreementInfo extends JavaScriptObject {
public final native String name() /*-{ return this.name; }-*/;
public final native String description() /*-{ return this.description; }-*/;
public final native String url() /*-{ return this.url; }-*/;
public final native GroupInfo autoVerifyGroup() /*-{ return this.auto_verify_group; }-*/;
protected AgreementInfo() {}
}

View File

@ -1,121 +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.gerrit.client.rpc.Natives;
import com.google.gerrit.extensions.client.AccountFieldName;
import com.google.gerrit.extensions.client.AuthType;
import com.google.gerrit.extensions.client.GitBasicAuthPolicy;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.core.client.JsArrayString;
import java.util.ArrayList;
import java.util.List;
public class AuthInfo extends JavaScriptObject {
public final AuthType authType() {
return AuthType.valueOf(authTypeRaw());
}
public final boolean isLdap() {
return authType() == AuthType.LDAP || authType() == AuthType.LDAP_BIND;
}
public final boolean isOpenId() {
return authType() == AuthType.OPENID;
}
public final boolean isOAuth() {
return authType() == AuthType.OAUTH;
}
public final boolean isDev() {
return authType() == AuthType.DEVELOPMENT_BECOME_ANY_ACCOUNT;
}
public final boolean isClientSslCertLdap() {
return authType() == AuthType.CLIENT_SSL_CERT_LDAP;
}
public final boolean isCustomExtension() {
return authType() == AuthType.CUSTOM_EXTENSION;
}
public final boolean canEdit(AccountFieldName f) {
return editableAccountFields().contains(f);
}
public final List<AccountFieldName> editableAccountFields() {
List<AccountFieldName> fields = new ArrayList<>();
for (String f : Natives.asList(_editableAccountFields())) {
fields.add(AccountFieldName.valueOf(f));
}
return fields;
}
public final List<AgreementInfo> contributorAgreements() {
List<AgreementInfo> agreements = new ArrayList<>();
JsArray<AgreementInfo> contributorAgreements = _contributorAgreements();
if (contributorAgreements != null) {
agreements.addAll(Natives.asList(contributorAgreements));
}
return agreements;
}
public final boolean siteHasUsernames() {
if (isCustomExtension() && httpPasswordUrl() != null && !canEdit(AccountFieldName.USER_NAME)) {
return false;
}
return true;
}
public final boolean isHttpPasswordSettingsEnabled() {
return gitBasicAuthPolicy() == GitBasicAuthPolicy.HTTP
|| gitBasicAuthPolicy() == GitBasicAuthPolicy.HTTP_LDAP;
}
public final GitBasicAuthPolicy gitBasicAuthPolicy() {
return GitBasicAuthPolicy.valueOf(gitBasicAuthPolicyRaw());
}
public final native boolean useContributorAgreements()
/*-{ return this.use_contributor_agreements || false; }-*/ ;
public final native String loginUrl() /*-{ return this.login_url; }-*/;
public final native String loginText() /*-{ return this.login_text; }-*/;
public final native String switchAccountUrl() /*-{ return this.switch_account_url; }-*/;
public final native String registerUrl() /*-{ return this.register_url; }-*/;
public final native String registerText() /*-{ return this.register_text; }-*/;
public final native String editFullNameUrl() /*-{ return this.edit_full_name_url; }-*/;
public final native String httpPasswordUrl() /*-{ return this.http_password_url; }-*/;
private native String gitBasicAuthPolicyRaw() /*-{ return this.git_basic_auth_policy; }-*/;
private native String authTypeRaw() /*-{ return this.auth_type; }-*/;
private native JsArrayString _editableAccountFields()
/*-{ return this.editable_account_fields; }-*/ ;
private native JsArray<AgreementInfo> _contributorAgreements()
/*-{ return this.contributor_agreements; }-*/ ;
protected AuthInfo() {}
}

View File

@ -1,575 +0,0 @@
// Copyright (C) 2012 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 static java.util.Comparator.comparing;
import com.google.gerrit.client.rpc.NativeMap;
import com.google.gerrit.client.rpc.NativeString;
import com.google.gerrit.client.rpc.Natives;
import com.google.gerrit.common.data.LabelValue;
import com.google.gerrit.common.data.SubmitRecord;
import com.google.gerrit.extensions.client.ReviewerState;
import com.google.gerrit.extensions.client.SubmitType;
import com.google.gerrit.reviewdb.client.Change;
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.core.client.JsArray;
import com.google.gwt.core.client.JsArrayString;
import com.google.gwtjsonrpc.client.impl.ser.JavaSqlTimestamp_JsonSerializer;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
public class ChangeInfo extends JavaScriptObject {
public final void init() {
if (allLabels() != null) {
allLabels().copyKeysIntoChildren("_name");
}
}
public final Project.NameKey projectNameKey() {
return new Project.NameKey(project());
}
public final Change.Id legacyId() {
return new Change.Id(_number());
}
public final Timestamp created() {
Timestamp ts = _getCts();
if (ts == null) {
ts = JavaSqlTimestamp_JsonSerializer.parseTimestamp(createdRaw());
_setCts(ts);
}
return ts;
}
public final boolean hasEditBasedOnCurrentPatchSet() {
JsArray<RevisionInfo> revList = revisions().values();
RevisionInfo.sortRevisionInfoByNumber(revList);
return revList.get(revList.length() - 1).isEdit();
}
private native Timestamp _getCts() /*-{ return this._cts; }-*/;
private native void _setCts(Timestamp ts) /*-{ this._cts = ts; }-*/;
public final Timestamp updated() {
return JavaSqlTimestamp_JsonSerializer.parseTimestamp(updatedRaw());
}
public final Timestamp submitted() {
return JavaSqlTimestamp_JsonSerializer.parseTimestamp(submittedRaw());
}
public final String idAbbreviated() {
return new Change.Key(changeId()).abbreviate();
}
public final Change.Status status() {
return Change.Status.valueOf(statusRaw());
}
public final Set<String> labels() {
return allLabels().keySet();
}
public final Set<Integer> removableReviewerIds() {
Set<Integer> removable = new HashSet<>();
if (removableReviewers() != null) {
for (AccountInfo a : Natives.asList(removableReviewers())) {
removable.add(a._accountId());
}
}
return removable;
}
public final native String id() /*-{ return this.id; }-*/;
public final native String project() /*-{ return this.project; }-*/;
public final native String branch() /*-{ return this.branch; }-*/;
public final native String topic() /*-{ return this.topic; }-*/;
public final native String changeId() /*-{ return this.change_id; }-*/;
public final native boolean mergeable() /*-{ return this.mergeable ? true : false; }-*/;
public final native int insertions() /*-{ return this.insertions; }-*/;
public final native int deletions() /*-{ return this.deletions; }-*/;
private native String statusRaw() /*-{ return this.status; }-*/;
public final native String subject() /*-{ return this.subject; }-*/;
public final native AccountInfo owner() /*-{ return this.owner; }-*/;
public final native AccountInfo assignee() /*-{ return this.assignee; }-*/;
private native String createdRaw() /*-{ return this.created; }-*/;
private native String updatedRaw() /*-{ return this.updated; }-*/;
private native String submittedRaw() /*-{ return this.submitted; }-*/;
public final native AccountInfo submitter() /*-{ return this.submitter; }-*/;
public final native boolean starred() /*-{ return this.starred ? true : false; }-*/;
public final native boolean reviewed() /*-{ return this.reviewed ? true : false; }-*/;
public final native boolean isPrivate() /*-{ return this.is_private ? true : false; }-*/;
public final native boolean
isWorkInProgress() /*-{ return this.work_in_progress ? true : false; }-*/;
public final native NativeMap<LabelInfo> allLabels() /*-{ return this.labels; }-*/;
public final native LabelInfo label(String n) /*-{ return this.labels[n]; }-*/;
public final native String currentRevision() /*-{ return this.current_revision; }-*/;
public final native void setCurrentRevision(String r) /*-{ this.current_revision = r; }-*/;
public final native NativeMap<RevisionInfo> revisions() /*-{ return this.revisions; }-*/;
public final native RevisionInfo revision(String n) /*-{ return this.revisions[n]; }-*/;
public final native JsArray<MessageInfo> messages() /*-{ return this.messages; }-*/;
public final native void setEdit(EditInfo edit) /*-{ this.edit = edit; }-*/;
public final native EditInfo edit() /*-{ return this.edit; }-*/;
public final native boolean hasEdit() /*-{ return this.hasOwnProperty('edit') }-*/;
public final native JsArrayString hashtags() /*-{ return this.hashtags; }-*/;
public final native boolean hasPermittedLabels()
/*-{ return this.hasOwnProperty('permitted_labels') }-*/ ;
public final native NativeMap<JsArrayString> permittedLabels()
/*-{ return this.permitted_labels; }-*/ ;
public final native JsArrayString permittedValues(String n)
/*-{ return this.permitted_labels[n]; }-*/ ;
public final native JsArray<AccountInfo> removableReviewers()
/*-{ return this.removable_reviewers; }-*/ ;
private native NativeMap<JsArray<AccountInfo>> _reviewers() /*-{ return this.reviewers; }-*/;
public final Map<ReviewerState, List<AccountInfo>> reviewers() {
NativeMap<JsArray<AccountInfo>> reviewers = _reviewers();
Map<ReviewerState, List<AccountInfo>> result = new HashMap<>();
for (String k : reviewers.keySet()) {
ReviewerState state = ReviewerState.valueOf(k.toUpperCase());
List<AccountInfo> accounts = result.get(state);
if (accounts == null) {
accounts = new ArrayList<>();
result.put(state, accounts);
}
accounts.addAll(Natives.asList(reviewers.get(k)));
}
return result;
}
public final native boolean hasActions() /*-{ return this.hasOwnProperty('actions') }-*/;
public final native NativeMap<ActionInfo> actions() /*-{ return this.actions; }-*/;
public final native int _number() /*-{ return this._number; }-*/;
public final native boolean _more_changes() /*-{ return this._more_changes ? true : false; }-*/;
public final SubmitType submitType() {
String submitType = _submitType();
if (submitType == null) {
return null;
}
return SubmitType.valueOf(submitType);
}
private native String _submitType() /*-{ return this.submit_type; }-*/;
public final boolean submittable() {
init();
return _submittable();
}
private native boolean _submittable() /*-{ return this.submittable ? true : false; }-*/;
/**
* @return the index of the missing label or -1 if no label is missing, or if more than one label
* is missing.
*/
public final int getMissingLabelIndex() {
int i = -1;
int ret = -1;
List<LabelInfo> labels = Natives.asList(allLabels().values());
for (LabelInfo label : labels) {
i++;
if (!permittedLabels().containsKey(label.name())) {
continue;
}
JsArrayString values = permittedValues(label.name());
if (values.length() == 0) {
continue;
}
switch (label.status()) {
case NEED: // Label is required for submit.
if (ret != -1) {
// more than one label is missing, so it's unclear which to quick
// approve, return -1
return -1;
}
ret = i;
continue;
case OK: // Label already applied.
case MAY: // Label is not required.
continue;
case REJECT: // Submit cannot happen, do not quick approve.
case IMPOSSIBLE:
return -1;
}
}
return ret;
}
protected ChangeInfo() {}
public static class LabelInfo extends JavaScriptObject {
public final SubmitRecord.Label.Status status() {
if (approved() != null) {
return SubmitRecord.Label.Status.OK;
} else if (rejected() != null) {
return SubmitRecord.Label.Status.REJECT;
} else if (optional()) {
return SubmitRecord.Label.Status.MAY;
} else {
return SubmitRecord.Label.Status.NEED;
}
}
public final native String name() /*-{ return this._name; }-*/;
public final native AccountInfo approved() /*-{ return this.approved; }-*/;
public final native AccountInfo rejected() /*-{ return this.rejected; }-*/;
public final native AccountInfo recommended() /*-{ return this.recommended; }-*/;
public final native AccountInfo disliked() /*-{ return this.disliked; }-*/;
public final native JsArray<ApprovalInfo> all() /*-{ return this.all; }-*/;
public final ApprovalInfo forUser(int user) {
JsArray<ApprovalInfo> all = all();
for (int i = 0; all != null && i < all.length(); i++) {
if (all.get(i)._accountId() == user) {
return all.get(i);
}
}
return null;
}
private native NativeMap<NativeString> _values() /*-{ return this.values; }-*/;
public final Set<String> values() {
return Natives.keys(_values());
}
public final native String valueText(String n) /*-{ return this.values[n]; }-*/;
public final native boolean optional() /*-{ return this.optional ? true : false; }-*/;
public final native boolean blocking() /*-{ return this.blocking ? true : false; }-*/;
public final native short defaultValue() /*-{ return this.default_value; }-*/;
public final native short _value() /*-{
if (this.value) return this.value;
if (this.disliked) return -1;
if (this.recommended) return 1;
return 0;
}-*/;
public final String maxValue() {
return LabelValue.formatValue(valueSet().last());
}
public final SortedSet<Short> valueSet() {
SortedSet<Short> values = new TreeSet<>();
for (String v : values()) {
values.add(parseValue(v));
}
return values;
}
public static final short parseValue(String formatted) {
if (formatted.startsWith("+")) {
formatted = formatted.substring(1);
} else if (formatted.startsWith(" ")) {
formatted = formatted.trim();
}
return Short.parseShort(formatted);
}
protected LabelInfo() {}
}
public static class ApprovalInfo extends AccountInfo {
public final native boolean hasValue() /*-{ return this.hasOwnProperty('value'); }-*/;
public final native short value() /*-{ return this.value || 0; }-*/;
public final native VotingRangeInfo
permittedVotingRange() /*-{ return this.permitted_voting_range; }-*/;
protected ApprovalInfo() {}
}
public static class VotingRangeInfo extends AccountInfo {
public final native short min() /*-{ return this.min || 0; }-*/;
public final native short max() /*-{ return this.max || 0; }-*/;
protected VotingRangeInfo() {}
}
public static class EditInfo extends JavaScriptObject {
public final native String name() /*-{ return this.name; }-*/;
public final native String setName(String n) /*-{ this.name = n; }-*/;
public final native String baseRevision() /*-{ return this.base_revision; }-*/;
public final native CommitInfo commit() /*-{ return this.commit; }-*/;
public final native boolean hasActions() /*-{ return this.hasOwnProperty('actions') }-*/;
public final native NativeMap<ActionInfo> actions() /*-{ return this.actions; }-*/;
public final native boolean hasFetch() /*-{ return this.hasOwnProperty('fetch') }-*/;
public final native NativeMap<FetchInfo> fetch() /*-{ return this.fetch; }-*/;
public final native boolean hasFiles() /*-{ return this.hasOwnProperty('files') }-*/;
public final native NativeMap<FileInfo> files() /*-{ return this.files; }-*/;
protected EditInfo() {}
}
public static class RevisionInfo extends JavaScriptObject {
public static RevisionInfo fromEdit(EditInfo edit) {
RevisionInfo revisionInfo = createObject().cast();
revisionInfo.takeFromEdit(edit);
return revisionInfo;
}
public static RevisionInfo forParent(int number, CommitInfo commit) {
RevisionInfo revisionInfo = createObject().cast();
revisionInfo.takeFromParent(number, commit);
return revisionInfo;
}
private native void takeFromEdit(EditInfo edit) /*-{
this._number = 0;
this.name = edit.name;
this.commit = edit.commit;
this.edit_base = edit.base_revision;
}-*/;
private native void takeFromParent(int number, CommitInfo commit) /*-{
this._number = number;
this.commit = commit;
this.name = this._number;
}-*/;
public final native int _number() /*-{ return this._number; }-*/;
public final native String name() /*-{ return this.name; }-*/;
public final native AccountInfo uploader() /*-{ return this.uploader; }-*/;
public final native boolean isEdit() /*-{ return this._number == 0; }-*/;
public final native CommitInfo commit() /*-{ return this.commit; }-*/;
public final native void setCommit(CommitInfo c) /*-{ this.commit = c; }-*/;
public final native String editBase() /*-{ return this.edit_base; }-*/;
public final native boolean hasFiles() /*-{ return this.hasOwnProperty('files') }-*/;
public final native NativeMap<FileInfo> files() /*-{ return this.files; }-*/;
public final native boolean hasActions() /*-{ return this.hasOwnProperty('actions') }-*/;
public final native NativeMap<ActionInfo> actions() /*-{ return this.actions; }-*/;
public final native boolean hasFetch() /*-{ return this.hasOwnProperty('fetch') }-*/;
public final native NativeMap<FetchInfo> fetch() /*-{ return this.fetch; }-*/;
public final native boolean
hasPushCertificate() /*-{ return this.hasOwnProperty('push_certificate'); }-*/;
public final native PushCertificateInfo
pushCertificate() /*-{ return this.push_certificate; }-*/;
public static void sortRevisionInfoByNumber(JsArray<RevisionInfo> list) {
final int editParent = findEditParent(list);
Natives.asList(list)
.sort(comparing(r -> !r.isEdit() ? 2 * (r._number() - 1) + 1 : 2 * editParent));
}
public static int findEditParent(JsArray<RevisionInfo> list) {
RevisionInfo r = findEditParentRevision(list);
return r == null ? -1 : r._number();
}
public static RevisionInfo findEditParentRevision(JsArray<RevisionInfo> list) {
for (int i = 0; i < list.length(); i++) {
// edit under revisions?
RevisionInfo editInfo = list.get(i);
if (editInfo.isEdit()) {
String parentRevision = editInfo.editBase();
// find parent
for (int j = 0; j < list.length(); j++) {
RevisionInfo parentInfo = list.get(j);
String name = parentInfo.name();
if (name.equals(parentRevision)) {
// found parent pacth set number
return parentInfo;
}
}
}
}
return null;
}
public final String id() {
return PatchSet.Id.toId(_number());
}
public final boolean isMerge() {
return commit().parents().length() > 1;
}
protected RevisionInfo() {}
}
public static class FetchInfo extends JavaScriptObject {
public final native String url() /*-{ return this.url }-*/;
public final native String ref() /*-{ return this.ref }-*/;
public final native NativeMap<NativeString> commands() /*-{ return this.commands }-*/;
public final native String command(String n) /*-{ return this.commands[n]; }-*/;
protected FetchInfo() {}
}
public static class CommitInfo extends JavaScriptObject {
public final native String commit() /*-{ return this.commit; }-*/;
public final native JsArray<CommitInfo> parents() /*-{ return this.parents; }-*/;
public final native GitPerson author() /*-{ return this.author; }-*/;
public final native GitPerson committer() /*-{ return this.committer; }-*/;
public final native String subject() /*-{ return this.subject; }-*/;
public final native String message() /*-{ return this.message; }-*/;
public final native JsArray<WebLinkInfo> webLinks() /*-{ return this.web_links; }-*/;
protected CommitInfo() {}
}
public static class GitPerson extends JavaScriptObject {
public final native String name() /*-{ return this.name; }-*/;
public final native String email() /*-{ return this.email; }-*/;
private native String dateRaw() /*-{ return this.date; }-*/;
public final Timestamp date() {
return JavaSqlTimestamp_JsonSerializer.parseTimestamp(dateRaw());
}
protected GitPerson() {}
}
public static class MessageInfo extends JavaScriptObject {
public final native AccountInfo author() /*-{ return this.author; }-*/;
public final native String message() /*-{ return this.message; }-*/;
public final native int _revisionNumber() /*-{ return this._revision_number || 0; }-*/;
public final native String tag() /*-{ return this.tag; }-*/;
private native String dateRaw() /*-{ return this.date; }-*/;
public final Timestamp date() {
return JavaSqlTimestamp_JsonSerializer.parseTimestamp(dateRaw());
}
protected MessageInfo() {}
}
public static class MergeableInfo extends JavaScriptObject {
public final native String submitType() /*-{ return this.submit_type }-*/;
public final native boolean mergeable() /*-{ return this.mergeable }-*/;
protected MergeableInfo() {}
}
public static class IncludedInInfo extends JavaScriptObject {
public final Set<String> externalNames() {
return Natives.keys(external());
}
public final native JsArrayString branches() /*-{ return this.branches; }-*/;
public final native JsArrayString tags() /*-{ return this.tags; }-*/;
public final native JsArrayString external(String n) /*-{ return this.external[n]; }-*/;
private native NativeMap<JsArrayString> external() /*-{ return this.external; }-*/;
protected IncludedInInfo() {}
}
}

View File

@ -1,126 +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.gerrit.client.rpc.NativeMap;
import com.google.gerrit.client.rpc.NativeString;
import com.google.gerrit.client.rpc.Natives;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArrayString;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class DownloadInfo extends JavaScriptObject {
public final List<String> schemes() {
return _schemes().sortedKeys();
}
public final List<String> archives() {
List<String> archives = new ArrayList<>();
archives.addAll(Natives.asList(_archives()));
return archives;
}
public final native DownloadSchemeInfo scheme(String n) /*-{ return this.schemes[n]; }-*/;
private native NativeMap<DownloadSchemeInfo> _schemes() /*-{ return this.schemes; }-*/;
private native JsArrayString _archives() /*-{ return this.archives; }-*/;
protected DownloadInfo() {}
public static class DownloadSchemeInfo extends JavaScriptObject {
public final List<String> commandNames() {
return _commands().sortedKeys();
}
public final Set<DownloadCommandInfo> commands(String project) {
Set<DownloadCommandInfo> commands = new HashSet<>();
for (String commandName : commandNames()) {
commands.add(new DownloadCommandInfo(commandName, command(commandName, project)));
}
return commands;
}
public final String command(String commandName, String project) {
return command(commandName).replaceAll("\\$\\{project\\}", project);
}
private static String projectBaseName(String project) {
return project.substring(project.lastIndexOf('/') + 1);
}
public final List<String> cloneCommandNames() {
return _cloneCommands().sortedKeys();
}
public final List<DownloadCommandInfo> cloneCommands(String project) {
List<String> commandNames = cloneCommandNames();
List<DownloadCommandInfo> commands = new ArrayList<>(commandNames.size());
for (String commandName : commandNames) {
commands.add(new DownloadCommandInfo(commandName, cloneCommand(commandName, project)));
}
return commands;
}
public final String cloneCommand(String commandName, String project) {
return cloneCommand(commandName)
.replaceAll("\\$\\{project\\}", project)
.replaceAll("\\$\\{project-base-name\\}", projectBaseName(project));
}
public final String getUrl(String project) {
return url().replaceAll("\\$\\{project\\}", project);
}
public final native String name() /*-{ return this.name; }-*/;
public final native String url() /*-{ return this.url; }-*/;
public final native boolean isAuthRequired() /*-{ return this.is_auth_required || false; }-*/;
public final native boolean isAuthSupported() /*-{ return this.is_auth_supported || false; }-*/;
public final native String command(String n) /*-{ return this.commands[n]; }-*/;
public final native String cloneCommand(String n) /*-{ return this.clone_commands[n]; }-*/;
private native NativeMap<NativeString> _commands() /*-{ return this.commands; }-*/;
private native NativeMap<NativeString> _cloneCommands() /*-{ return this.clone_commands; }-*/;
protected DownloadSchemeInfo() {}
}
public static class DownloadCommandInfo {
private final String name;
private final String command;
DownloadCommandInfo(String name, String command) {
this.name = name;
this.command = command;
}
public String name() {
return name;
}
public String command() {
return command;
}
}
}

View File

@ -1,75 +0,0 @@
// Copyright (C) 2013 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.rpc.Natives;
import com.google.gerrit.common.data.FilenameComparator;
import com.google.gerrit.reviewdb.client.Patch;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
import java.util.Comparator;
public class FileInfo extends JavaScriptObject {
public final native String path() /*-{ return this.path; }-*/;
public final native String oldPath() /*-{ return this.old_path; }-*/;
public final native int linesInserted() /*-{ return this.lines_inserted || 0; }-*/;
public final native int linesDeleted() /*-{ return this.lines_deleted || 0; }-*/;
public final native boolean binary() /*-{ return this.binary || false; }-*/;
public final native String status() /*-{ return this.status; }-*/;
// JSNI methods cannot have 'long' as a parameter type or a return type and
// it's suggested to use double in this case:
// http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html#important
public final long size() {
return (long) _size();
}
private native double _size() /*-{ return this.size || 0; }-*/;
public final long sizeDelta() {
return (long) _sizeDelta();
}
private native double _sizeDelta() /*-{ return this.size_delta || 0; }-*/;
public final native int _row() /*-{ return this._row }-*/;
public final native void _row(int r) /*-{ this._row = r }-*/;
public static void sortFileInfoByPath(JsArray<FileInfo> list) {
Natives.asList(list).sort(Comparator.comparing(FileInfo::path, FilenameComparator.INSTANCE));
}
public static String getFileName(String path) {
String fileName;
if (Patch.COMMIT_MSG.equals(path)) {
fileName = "Commit Message";
} else if (Patch.MERGE_LIST.equals(path)) {
fileName = "Merge List";
} else {
fileName = path;
}
int s = fileName.lastIndexOf('/');
return s >= 0 ? fileName.substring(s + 1) : fileName;
}
protected FileInfo() {}
}

View File

@ -1,274 +0,0 @@
// Copyright (C) 2014 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.rpc.NativeMap;
import com.google.gerrit.client.rpc.NativeString;
import com.google.gerrit.client.rpc.Natives;
import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DateFormat;
import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DefaultBase;
import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DiffView;
import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DownloadCommand;
import com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailFormat;
import com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailStrategy;
import com.google.gerrit.extensions.client.GeneralPreferencesInfo.ReviewCategoryStrategy;
import com.google.gerrit.extensions.client.GeneralPreferencesInfo.TimeFormat;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class GeneralPreferences extends JavaScriptObject {
public static GeneralPreferences create() {
return createObject().cast();
}
public static GeneralPreferences createDefault() {
GeneralPreferencesInfo d = GeneralPreferencesInfo.defaults();
GeneralPreferences p = createObject().cast();
p.changesPerPage(d.changesPerPage);
p.showSiteHeader(d.showSiteHeader);
p.useFlashClipboard(d.useFlashClipboard);
p.downloadScheme(d.downloadScheme);
p.downloadCommand(d.downloadCommand);
p.dateFormat(d.getDateFormat());
p.timeFormat(d.getTimeFormat());
p.highlightAssigneeInChangeTable(d.highlightAssigneeInChangeTable);
p.relativeDateInChangeTable(d.relativeDateInChangeTable);
p.sizeBarInChangeTable(d.sizeBarInChangeTable);
p.legacycidInChangeTable(d.legacycidInChangeTable);
p.muteCommonPathPrefixes(d.muteCommonPathPrefixes);
p.signedOffBy(d.signedOffBy);
p.emailFormat(d.emailFormat);
p.reviewCategoryStrategy(d.getReviewCategoryStrategy());
p.diffView(d.getDiffView());
p.emailStrategy(d.emailStrategy);
p.defaultBaseForMerges(d.defaultBaseForMerges);
return p;
}
public final int changesPerPage() {
int changesPerPage = get("changes_per_page", GeneralPreferencesInfo.DEFAULT_PAGESIZE);
return 0 < changesPerPage ? changesPerPage : GeneralPreferencesInfo.DEFAULT_PAGESIZE;
}
private native short get(String n, int d) /*-{ return this.hasOwnProperty(n) ? this[n] : d }-*/;
public final native boolean showSiteHeader() /*-{ return this.show_site_header || false }-*/;
public final native boolean useFlashClipboard()
/*-{ return this.use_flash_clipboard || false }-*/ ;
public final native String downloadScheme() /*-{ return this.download_scheme }-*/;
public final DownloadCommand downloadCommand() {
String s = downloadCommandRaw();
return s != null ? DownloadCommand.valueOf(s) : null;
}
private native String downloadCommandRaw() /*-{ return this.download_command }-*/;
public final DateFormat dateFormat() {
String s = dateFormatRaw();
return s != null ? DateFormat.valueOf(s) : null;
}
private native String dateFormatRaw() /*-{ return this.date_format }-*/;
public final TimeFormat timeFormat() {
String s = timeFormatRaw();
return s != null ? TimeFormat.valueOf(s) : null;
}
private native String timeFormatRaw() /*-{ return this.time_format }-*/;
public final native boolean highlightAssigneeInChangeTable()
/*-{ return this.highlight_assignee_in_change_table || false }-*/ ;
public final native boolean relativeDateInChangeTable()
/*-{ return this.relative_date_in_change_table || false }-*/ ;
public final native boolean sizeBarInChangeTable()
/*-{ return this.size_bar_in_change_table || false }-*/ ;
public final native boolean legacycidInChangeTable()
/*-{ return this.legacycid_in_change_table || false }-*/ ;
public final native boolean muteCommonPathPrefixes()
/*-{ return this.mute_common_path_prefixes || false }-*/ ;
public final native boolean signedOffBy() /*-{ return this.signed_off_by || false }-*/;
public final ReviewCategoryStrategy reviewCategoryStrategy() {
String s = reviewCategeoryStrategyRaw();
return s != null ? ReviewCategoryStrategy.valueOf(s) : ReviewCategoryStrategy.NONE;
}
private native String reviewCategeoryStrategyRaw() /*-{ return this.review_category_strategy }-*/;
public final DiffView diffView() {
String s = diffViewRaw();
return s != null ? DiffView.valueOf(s) : null;
}
private native String diffViewRaw() /*-{ return this.diff_view }-*/;
public final EmailStrategy emailStrategy() {
String s = emailStrategyRaw();
return s != null ? EmailStrategy.valueOf(s) : null;
}
private native String emailStrategyRaw() /*-{ return this.email_strategy }-*/;
public final EmailFormat emailFormat() {
String s = emailFormatRaw();
return s != null ? EmailFormat.valueOf(s) : null;
}
private native String emailFormatRaw() /*-{ return this.email_format }-*/;
public final DefaultBase defaultBaseForMerges() {
String s = defaultBaseForMergesRaw();
return s != null ? DefaultBase.valueOf(s) : null;
}
private native String defaultBaseForMergesRaw() /*-{ return this.default_base_for_merges }-*/;
public final native boolean
publishCommentsOnPush() /*-{ return this.publish_comments_on_push || false }-*/;
public final native boolean
workInProgressByDefault() /*-{ return this.work_in_progress_by_default || false }-*/;
public final native JsArray<TopMenuItem> my() /*-{ return this.my; }-*/;
public final native void changesPerPage(int n) /*-{ this.changes_per_page = n }-*/;
public final native void showSiteHeader(boolean s) /*-{ this.show_site_header = s }-*/;
public final native void useFlashClipboard(boolean u) /*-{ this.use_flash_clipboard = u }-*/;
public final native void downloadScheme(String d) /*-{ this.download_scheme = d }-*/;
public final void downloadCommand(DownloadCommand d) {
downloadCommandRaw(d != null ? d.toString() : null);
}
public final native void downloadCommandRaw(String d) /*-{ this.download_command = d }-*/;
public final void dateFormat(DateFormat f) {
dateFormatRaw(f != null ? f.toString() : null);
}
private native void dateFormatRaw(String f) /*-{ this.date_format = f }-*/;
public final void timeFormat(TimeFormat f) {
timeFormatRaw(f != null ? f.toString() : null);
}
private native void timeFormatRaw(String f) /*-{ this.time_format = f }-*/;
public final native void highlightAssigneeInChangeTable(boolean d)
/*-{ this.highlight_assignee_in_change_table = d }-*/ ;
public final native void relativeDateInChangeTable(boolean d)
/*-{ this.relative_date_in_change_table = d }-*/ ;
public final native void sizeBarInChangeTable(boolean s)
/*-{ this.size_bar_in_change_table = s }-*/ ;
public final native void legacycidInChangeTable(boolean s)
/*-{ this.legacycid_in_change_table = s }-*/ ;
public final native void muteCommonPathPrefixes(boolean s)
/*-{ this.mute_common_path_prefixes = s }-*/ ;
public final native void signedOffBy(boolean s) /*-{ this.signed_off_by = s }-*/;
public final void reviewCategoryStrategy(ReviewCategoryStrategy s) {
reviewCategoryStrategyRaw(s != null ? s.toString() : null);
}
private native void reviewCategoryStrategyRaw(String s)
/*-{ this.review_category_strategy = s }-*/ ;
public final void diffView(DiffView d) {
diffViewRaw(d != null ? d.toString() : null);
}
private native void diffViewRaw(String d) /*-{ this.diff_view = d }-*/;
public final void emailStrategy(EmailStrategy s) {
emailStrategyRaw(s != null ? s.toString() : null);
}
private native void emailStrategyRaw(String s) /*-{ this.email_strategy = s }-*/;
public final void emailFormat(EmailFormat f) {
emailFormatRaw(f != null ? f.toString() : null);
}
private native void emailFormatRaw(String s) /*-{ this.email_format = s }-*/;
public final void defaultBaseForMerges(DefaultBase b) {
defaultBaseForMergesRaw(b != null ? b.toString() : null);
}
private native void defaultBaseForMergesRaw(String b) /*-{ this.default_base_for_merges = b }-*/;
public final native void publishCommentsOnPush(
boolean p) /*-{ this.publish_comments_on_push = p }-*/;
public final native void workInProgressByDefault(
boolean p) /*-{ this.work_in_progress_by_default = p }-*/;
public final void setMyMenus(List<TopMenuItem> myMenus) {
initMy();
for (TopMenuItem n : myMenus) {
addMy(n);
}
}
final native void initMy() /*-{ this.my = []; }-*/;
final native void addMy(TopMenuItem m) /*-{ this.my.push(m); }-*/;
public final Map<String, String> urlAliases() {
Map<String, String> urlAliases = new HashMap<>();
for (String k : Natives.keys(_urlAliases())) {
urlAliases.put(k, urlAliasToken(k));
}
return urlAliases;
}
private native String urlAliasToken(String m) /*-{ return this.url_aliases[m]; }-*/;
private native NativeMap<NativeString> _urlAliases() /*-{ return this.url_aliases; }-*/;
public final void setUrlAliases(Map<String, String> urlAliases) {
initUrlAliases();
for (Map.Entry<String, String> e : urlAliases.entrySet()) {
putUrlAlias(e.getKey(), e.getValue());
}
}
private native void putUrlAlias(String m, String t) /*-{ this.url_aliases[m] = t; }-*/;
private native void initUrlAliases() /*-{ this.url_aliases = {}; }-*/;
protected GeneralPreferences() {}
}

View File

@ -1,70 +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.gerrit.extensions.client.UiType;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArrayString;
import java.util.ArrayList;
import java.util.List;
public class GerritInfo extends JavaScriptObject {
public final Project.NameKey allProjectsNameKey() {
return new Project.NameKey(allProjects());
}
public final boolean isAllProjects(Project.NameKey p) {
return allProjectsNameKey().equals(p);
}
public final Project.NameKey allUsersNameKey() {
return new Project.NameKey(allUsers());
}
public final boolean isAllUsers(Project.NameKey p) {
return allUsersNameKey().equals(p);
}
public final native String allProjects() /*-{ return this.all_projects; }-*/;
public final native String allUsers() /*-{ return this.all_users; }-*/;
public final native boolean docSearch() /*-{ return this.doc_search; }-*/;
public final native String docUrl() /*-{ return this.doc_url; }-*/;
public final native boolean editGpgKeys() /*-{ return this.edit_gpg_keys || false; }-*/;
public final native String reportBugUrl() /*-{ return this.report_bug_url; }-*/;
public final native String reportBugText() /*-{ return this.report_bug_text; }-*/;
private native JsArrayString _webUis() /*-{ return this.web_uis; }-*/;
public final List<UiType> webUis() {
JsArrayString webUis = _webUis();
List<UiType> result = new ArrayList<>(webUis.length());
for (int i = 0; i < webUis.length(); i++) {
UiType t = UiType.parse(webUis.get(i));
if (t != null) {
result.add(t);
}
}
return result;
}
protected GerritInfo() {}
}

View File

@ -1,50 +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;
import com.google.gwt.core.client.JsArrayString;
public class GpgKeyInfo extends JavaScriptObject {
public enum Status {
BAD,
OK,
TRUSTED;
}
public final native String id() /*-{ return this.id; }-*/;
public final native String fingerprint() /*-{ return this.fingerprint; }-*/;
public final native JsArrayString userIds() /*-{ return this.user_ids; }-*/;
public final native String key() /*-{ return this.key; }-*/;
private native String statusRaw() /*-{ return this.status; }-*/;
public final Status status() {
String s = statusRaw();
if (s == null) {
return null;
}
return Status.valueOf(s);
}
public final native boolean hasProblems() /*-{ return this.hasOwnProperty('problems'); }-*/;
public final native JsArrayString problems() /*-{ return this.problems; }-*/;
protected GpgKeyInfo() {}
}

View File

@ -1,31 +0,0 @@
// Copyright (C) 2013 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.reviewdb.client.AccountGroup;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.http.client.URL;
public class GroupBaseInfo extends JavaScriptObject {
public final AccountGroup.UUID getGroupUUID() {
return new AccountGroup.UUID(URL.decodeQueryString(id()));
}
public final native String id() /*-{ return this.id; }-*/;
public final native String name() /*-{ return this.name; }-*/;
protected GroupBaseInfo() {}
}

View File

@ -1,67 +0,0 @@
// Copyright (C) 2013 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.reviewdb.client.AccountGroup;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.http.client.URL;
public class GroupInfo extends GroupBaseInfo {
public final AccountGroup.Id getGroupId() {
return new AccountGroup.Id(group_id());
}
public final native GroupOptionsInfo options() /*-{ return this.options; }-*/;
public final native String description() /*-{ return this.description; }-*/;
public final native String url() /*-{ return this.url; }-*/;
public final native String owner() /*-{ return this.owner; }-*/;
public final native void owner(String o) /*-{ if(o)this.owner=o; }-*/;
public final native JsArray<AccountInfo> members() /*-{ return this.members; }-*/;
public final native JsArray<GroupInfo> includes() /*-{ return this.includes; }-*/;
private native int group_id() /*-{ return this.group_id; }-*/;
private native String owner_id() /*-{ return this.owner_id; }-*/;
private native void owner_id(String o) /*-{ if(o)this.owner_id=o; }-*/;
public final AccountGroup.UUID getOwnerUUID() {
String owner = owner_id();
if (owner != null) {
return new AccountGroup.UUID(URL.decodeQueryString(owner));
}
return null;
}
public final void setOwnerUUID(AccountGroup.UUID uuid) {
owner_id(URL.encodeQueryString(uuid.get()));
}
protected GroupInfo() {}
public static class GroupOptionsInfo extends JavaScriptObject {
public final native boolean
isVisibleToAll() /*-{ return this['visible_to_all'] ? true : false; }-*/;
protected GroupOptionsInfo() {}
}
}

View File

@ -1,34 +0,0 @@
// Copyright (C) 2016 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 OAuthTokenInfo extends JavaScriptObject {
protected OAuthTokenInfo() {}
public final native String username() /*-{ return this.username; }-*/;
public final native String resourceHost() /*-{ return this.resource_host; }-*/;
public final native String accessToken() /*-{ return this.access_token; }-*/;
public final native String providerId() /*-{ return this.provider_id; }-*/;
public final native String expiresAt() /*-{ return this.expires_at; }-*/;
public final native String type() /*-{ return this.type; }-*/;
}

View File

@ -1,25 +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 PushCertificateInfo extends JavaScriptObject {
public final native String certificate() /*-{ return this.certificate; }-*/;
public final native GpgKeyInfo key() /*-{ return this.key; }-*/;
protected PushCertificateInfo() {}
}

View File

@ -1,113 +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.gerrit.client.rpc.NativeMap;
import com.google.gerrit.client.rpc.NativeString;
import com.google.gerrit.client.rpc.Natives;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArrayString;
import java.util.HashMap;
import java.util.Map;
public class ServerInfo extends JavaScriptObject {
public final native AuthInfo auth() /*-{ return this.auth; }-*/;
public final native ChangeConfigInfo change() /*-{ return this.change; }-*/;
public final native DownloadInfo download() /*-{ return this.download; }-*/;
public final native GerritInfo gerrit() /*-{ return this.gerrit; }-*/;
public final native PluginConfigInfo plugin() /*-{ return this.plugin; }-*/;
public final native SshdInfo sshd() /*-{ return this.sshd; }-*/;
public final native SuggestInfo suggest() /*-{ return this.suggest; }-*/;
public final native UserConfigInfo user() /*-{ return this.user; }-*/;
public final native ReceiveInfo receive() /*-{ return this.receive; }-*/;
public final Map<String, String> urlAliases() {
Map<String, String> urlAliases = new HashMap<>();
for (String k : Natives.keys(_urlAliases())) {
urlAliases.put(k, urlAliasToken(k));
}
return urlAliases;
}
public final native String urlAliasToken(String n) /*-{ return this.url_aliases[n]; }-*/;
private native NativeMap<NativeString> _urlAliases() /*-{ return this.url_aliases; }-*/;
public final boolean hasSshd() {
return sshd() != null;
}
protected ServerInfo() {}
public static class ChangeConfigInfo extends JavaScriptObject {
public final native boolean allowBlame() /*-{ return this.allow_blame || false; }-*/;
public final native int largeChange() /*-{ return this.large_change || 0; }-*/;
public final native String replyLabel() /*-{ return this.reply_label; }-*/;
public final native String replyTooltip() /*-{ return this.reply_tooltip; }-*/;
public final native boolean
showAssigneeInChangesTable() /*-{ return this.show_assignee_in_changes_table || false; }-*/;
public final native int updateDelay() /*-{ return this.update_delay || 0; }-*/;
public final native boolean isSubmitWholeTopicEnabled() /*-{
return this.submit_whole_topic; }-*/;
protected ChangeConfigInfo() {}
}
public static class PluginConfigInfo extends JavaScriptObject {
public final native boolean hasAvatars() /*-{ return this.has_avatars || false; }-*/;
public final native JsArrayString jsResourcePaths() /*-{
return this.js_resource_paths || []; }-*/;
protected PluginConfigInfo() {}
}
public static class SshdInfo extends JavaScriptObject {
protected SshdInfo() {}
}
public static class SuggestInfo extends JavaScriptObject {
public final native int from() /*-{ return this.from || 0; }-*/;
protected SuggestInfo() {}
}
public static class UserConfigInfo extends JavaScriptObject {
public final native String anonymousCowardName() /*-{ return this.anonymous_coward_name; }-*/;
protected UserConfigInfo() {}
}
public static class ReceiveInfo extends JavaScriptObject {
public final native boolean enableSignedPush()
/*-{ return this.enable_signed_push || false; }-*/ ;
protected ReceiveInfo() {}
}
}

View File

@ -1,27 +0,0 @@
// Copyright (C) 2013 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;
import com.google.gwt.core.client.JsArray;
public class TopMenu extends JavaScriptObject {
protected TopMenu() {}
public final native String getName() /*-{ return this.name; }-*/;
public final native JsArray<TopMenuItem> getItems() /*-{ return this.items; }-*/;
}

View File

@ -1,40 +0,0 @@
// Copyright (C) 2013 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 TopMenuItem extends JavaScriptObject {
public static TopMenuItem create(String name, String url) {
TopMenuItem i = createObject().cast();
i.name(name);
i.url(url);
return i;
}
public final native String getName() /*-{ return this.name; }-*/;
public final native String getUrl() /*-{ return this.url; }-*/;
public final native String getTarget() /*-{ return this.target; }-*/;
public final native String getId() /*-{ return this.id; }-*/;
public final native void name(String n) /*-{ this.name = n }-*/;
public final native void url(String u) /*-{ this.url = u }-*/;
protected TopMenuItem() {}
}

View File

@ -1,22 +0,0 @@
// Copyright (C) 2013 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.JsArray;
public class TopMenuList extends JsArray<TopMenu> {
protected TopMenuList() {}
}

View File

@ -1,50 +0,0 @@
// Copyright (C) 2014 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;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Image;
public class WebLinkInfo extends JavaScriptObject {
public final native String name() /*-{ return this.name; }-*/;
public final native String imageUrl() /*-{ return this.image_url; }-*/;
public final native String url() /*-{ return this.url; }-*/;
public final native String target() /*-{ return this.target; }-*/;
protected WebLinkInfo() {}
public final Anchor toAnchor() {
Anchor a = new Anchor();
a.setHref(url());
if (target() != null && !target().isEmpty()) {
a.setTarget(target());
}
if (imageUrl() != null && !imageUrl().isEmpty()) {
Image img = new Image();
img.setAltText(name());
img.setUrl(imageUrl());
img.setTitle(name());
a.getElement().appendChild(img.getElement());
} else {
a.setText("(" + name() + ")");
}
return a;
}
}

View File

@ -1,101 +0,0 @@
// Copyright (C) 2012 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.rpc;
import static java.util.stream.Collectors.toCollection;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.user.client.rpc.AsyncCallback;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
/** A map of native JSON objects, keyed by a string. */
public class NativeMap<T extends JavaScriptObject> extends JavaScriptObject {
public static <T extends JavaScriptObject> NativeMap<T> create() {
return createObject().cast();
}
/**
* Loop through the result map's entries and copy the key strings into the "name" property of the
* corresponding child object. This only runs on the top level map of the result, and requires the
* children to be JSON objects and not a JSON primitive (e.g. boolean or string).
*/
public static <T extends JavaScriptObject, M extends NativeMap<T>>
AsyncCallback<M> copyKeysIntoChildren(AsyncCallback<M> callback) {
return copyKeysIntoChildren("name", callback);
}
/** Loop through the result map and set asProperty on the children. */
public static <T extends JavaScriptObject, M extends NativeMap<T>>
AsyncCallback<M> copyKeysIntoChildren(String asProperty, AsyncCallback<M> callback) {
return new TransformCallback<M, M>(callback) {
@Override
protected M transform(M result) {
result.copyKeysIntoChildren(asProperty);
return result;
}
};
}
protected NativeMap() {}
public final Set<String> keySet() {
return Natives.keys(this);
}
public final List<String> sortedKeys() {
return keySet().stream().sorted().collect(toCollection(ArrayList::new));
}
public final native JsArray<T> values() /*-{
var s = this;
var v = [];
var i = 0;
for (var k in s) {
if (s.hasOwnProperty(k)) {
v[i++] = s[k];
}
}
return v;
}-*/;
public final int size() {
return keySet().size();
}
public final boolean isEmpty() {
return size() == 0;
}
public final boolean containsKey(String n) {
return get(n) != null;
}
public final native T get(String n) /*-{ return this[n]; }-*/;
public final native void put(String n, T v) /*-{ this[n] = v; }-*/;
public final native void copyKeysIntoChildren(String p) /*-{
var s = this;
for (var k in s) {
if (s.hasOwnProperty(k)) {
var c = s[k];
c[p] = k;
}
}
}-*/;
}

View File

@ -1,63 +0,0 @@
// Copyright (C) 2012 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.rpc;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.user.client.rpc.AsyncCallback;
/** Wraps a String that was returned from a JSON API. */
public final class NativeString extends JavaScriptObject {
public static final JavaScriptObject TYPE = init();
// Used from core and plugins
private static native JavaScriptObject init() /*-{
if ($wnd.Gerrit === undefined || $wnd.Gerrit.JsonString === undefined) {
return function(s){this.s=s};
} else {
return $wnd.Gerrit.JsonString;
}
}-*/;
static NativeString wrap(String s) {
return wrap0(TYPE, s);
}
private static native NativeString wrap0(JavaScriptObject T, String s) /*-{ return new T(s) }-*/;
public native String asString() /*-{ return this.s; }-*/;
public static AsyncCallback<NativeString> unwrap(AsyncCallback<String> cb) {
return new AsyncCallback<NativeString>() {
@Override
public void onSuccess(NativeString result) {
cb.onSuccess(result != null ? result.asString() : null);
}
@Override
public void onFailure(Throwable caught) {
cb.onFailure(caught);
}
};
}
public static boolean is(JavaScriptObject o) {
return is(TYPE, o);
}
private static native boolean is(JavaScriptObject T, JavaScriptObject o)
/*-{ return o instanceof T }-*/ ;
protected NativeString() {}
}

View File

@ -1,107 +0,0 @@
// Copyright (C) 2012 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.rpc;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.core.client.JsArrayString;
import com.google.gwt.json.client.JSONObject;
import java.util.AbstractList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
public class Natives {
/**
* Get the names of defined properties on the object. The returned set iterates in the native
* iteration order, which may match the source order.
*/
public static Set<String> keys(JavaScriptObject obj) {
if (obj != null) {
return new JSONObject(obj).keySet();
}
return Collections.emptySet();
}
public static List<String> asList(JsArrayString arr) {
if (arr == null) {
return null;
}
return new AbstractList<String>() {
@Override
public String set(int index, String element) {
String old = arr.get(index);
arr.set(index, element);
return old;
}
@Override
public String get(int index) {
return arr.get(index);
}
@Override
public int size() {
return arr.length();
}
};
}
public static <T extends JavaScriptObject> List<T> asList(JsArray<T> arr) {
if (arr == null) {
return null;
}
return new AbstractList<T>() {
@Override
public T set(int index, T element) {
T old = arr.get(index);
arr.set(index, element);
return old;
}
@Override
public T get(int index) {
return arr.get(index);
}
@Override
public int size() {
return arr.length();
}
};
}
public static <T extends JavaScriptObject> JsArray<T> arrayOf(T element) {
JsArray<T> arr = JavaScriptObject.createArray().cast();
arr.push(element);
return arr;
}
public static JsArrayString arrayOf(Iterable<String> elements) {
JsArrayString arr = JavaScriptObject.createArray().cast();
for (String elem : elements) {
arr.push(elem);
}
return arr;
}
public static JsArrayString arrayOf(String element) {
JsArrayString arr = JavaScriptObject.createArray().cast();
arr.push(element);
return arr;
}
private Natives() {}
}

View File

@ -1,38 +0,0 @@
// Copyright (C) 2012 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.rpc;
import com.google.gwt.user.client.rpc.AsyncCallback;
/** Transforms a value and passes it on to another callback. */
public abstract class TransformCallback<I, O> implements AsyncCallback<I> {
private final AsyncCallback<O> callback;
protected TransformCallback(AsyncCallback<O> callback) {
this.callback = callback;
}
@Override
public void onSuccess(I result) {
callback.onSuccess(transform(result));
}
@Override
public void onFailure(Throwable caught) {
callback.onFailure(caught);
}
protected abstract O transform(I result);
}

View File

@ -1,55 +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.ui;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
/** A {@code Suggestion} with highlights. */
public class HighlightSuggestion implements Suggestion {
private final String keyword;
private final String value;
public HighlightSuggestion(String keyword, String value) {
this.keyword = keyword;
this.value = value;
}
@Override
public String getDisplayString() {
int start = 0;
int keyLen = keyword.length();
SafeHtmlBuilder builder = new SafeHtmlBuilder();
for (; ; ) {
int index = value.indexOf(keyword, start);
if (index == -1) {
builder.appendEscaped(value.substring(start));
break;
}
builder.appendEscaped(value.substring(start, index));
builder.appendHtmlConstant("<strong>");
start = index + keyLen;
builder.appendEscaped(value.substring(index, start));
builder.appendHtmlConstant("</strong>");
}
return builder.toSafeHtml().asString();
}
@Override
public String getReplacementString() {
return value;
}
}

View File

@ -1,129 +0,0 @@
// Copyright (C) 2010 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.ui;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.SuggestOracle;
/**
* Delegates to a slow SuggestOracle, such as a remote server API.
*
* <p>A response is only supplied to the UI if no requests were made after the oracle begin that
* request.
*
* <p>When a request is made while the delegate is still processing a prior request all intermediate
* requests are discarded and the most recent request is queued. The pending request's response is
* discarded and the most recent request is started.
*/
public class RemoteSuggestOracle extends SuggestOracle {
private final SuggestOracle oracle;
private Query query;
private String last;
private Timer requestRetentionTimer;
private boolean cancelOutstandingRequest;
private boolean serveSuggestions;
public RemoteSuggestOracle(SuggestOracle src) {
oracle = src;
}
public String getLast() {
return last;
}
@Override
public void requestSuggestions(Request req, Callback cb) {
if (!serveSuggestions) {
return;
}
// Use a timer for key stroke retention, such that we don't query the
// backend for each and every keystroke we receive.
if (requestRetentionTimer != null) {
requestRetentionTimer.cancel();
}
requestRetentionTimer =
new Timer() {
@Override
public void run() {
Query q = new Query(req, cb);
if (query == null) {
query = q;
q.start();
} else {
query = q;
}
}
};
requestRetentionTimer.schedule(200);
}
@Override
public void requestDefaultSuggestions(Request req, Callback cb) {
requestSuggestions(req, cb);
}
@Override
public boolean isDisplayStringHTML() {
return oracle.isDisplayStringHTML();
}
public void cancelOutstandingRequest() {
if (requestRetentionTimer != null) {
requestRetentionTimer.cancel();
}
if (query != null) {
cancelOutstandingRequest = true;
}
}
public void setServeSuggestions(boolean serveSuggestions) {
this.serveSuggestions = serveSuggestions;
}
private class Query implements Callback {
final Request request;
final Callback callback;
Query(Request req, Callback cb) {
request = req;
callback = cb;
}
void start() {
oracle.requestSuggestions(request, this);
}
@Override
public void onSuggestionsReady(Request req, Response res) {
if (cancelOutstandingRequest || !serveSuggestions) {
// If cancelOutstandingRequest() was called, we ignore this response
cancelOutstandingRequest = false;
query = null;
} else if (query == this) {
// No new request was started while this query was running.
// Propose this request's response as the suggestions.
query = null;
last = request.getQuery();
callback.onSuggestionsReady(req, res);
} else {
// Another query came in while this one was running. Skip
// this response and start the most recent query.
query.start();
}
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 631 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 512 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 382 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 655 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 620 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 701 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 659 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 653 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 623 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 609 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 637 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 786 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 782 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 323 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 749 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 710 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 641 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 807 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 523 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 282 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 398 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 277 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 488 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 670 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 586 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 671 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 537 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 746 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 833 B

View File

@ -1,216 +0,0 @@
// Copyright (C) 2013 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;
import static com.google.gerrit.client.RelativeDateFormatter.DAY_IN_MILLIS;
import static com.google.gerrit.client.RelativeDateFormatter.HOUR_IN_MILLIS;
import static com.google.gerrit.client.RelativeDateFormatter.MINUTE_IN_MILLIS;
import static com.google.gerrit.client.RelativeDateFormatter.SECOND_IN_MILLIS;
import static com.google.gerrit.client.RelativeDateFormatter.YEAR_IN_MILLIS;
import static org.junit.Assert.assertEquals;
import java.util.Date;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class RelativeDateFormatterTest {
@BeforeClass
public static void setConstants() {
Constants c = new Constants();
RelativeDateFormatter.setConstants(c, c);
}
@AfterClass
public static void unsetConstants() {
RelativeDateFormatter.setConstants(null, null);
}
private static void assertFormat(long ageFromNow, long timeUnit, String expectedFormat) {
Date d = new Date(System.currentTimeMillis() - ageFromNow * timeUnit);
String s = RelativeDateFormatter.format(d);
assertEquals(expectedFormat, s);
}
@Test
public void future() {
assertFormat(-100, YEAR_IN_MILLIS, "in the future");
assertFormat(-1, SECOND_IN_MILLIS, "in the future");
}
@Test
public void formatSeconds() {
assertFormat(1, SECOND_IN_MILLIS, "1 second ago");
assertFormat(89, SECOND_IN_MILLIS, "89 seconds ago");
}
@Test
public void formatMinutes() {
assertFormat(90, SECOND_IN_MILLIS, "2 minutes ago");
assertFormat(3, MINUTE_IN_MILLIS, "3 minutes ago");
assertFormat(60, MINUTE_IN_MILLIS, "60 minutes ago");
assertFormat(89, MINUTE_IN_MILLIS, "89 minutes ago");
}
@Test
public void formatHours() {
assertFormat(90, MINUTE_IN_MILLIS, "2 hours ago");
assertFormat(149, MINUTE_IN_MILLIS, "2 hours ago");
assertFormat(35, HOUR_IN_MILLIS, "35 hours ago");
}
@Test
public void formatDays() {
assertFormat(36, HOUR_IN_MILLIS, "2 days ago");
assertFormat(13, DAY_IN_MILLIS, "13 days ago");
}
@Test
public void formatWeeks() {
assertFormat(14, DAY_IN_MILLIS, "2 weeks ago");
assertFormat(69, DAY_IN_MILLIS, "10 weeks ago");
}
@Test
public void formatMonths() {
assertFormat(70, DAY_IN_MILLIS, "2 months ago");
assertFormat(75, DAY_IN_MILLIS, "3 months ago");
assertFormat(364, DAY_IN_MILLIS, "12 months ago");
}
@Test
public void formatYearsMonths() {
assertFormat(366, DAY_IN_MILLIS, "1 year ago");
assertFormat(380, DAY_IN_MILLIS, "1 year, 1 month ago");
assertFormat(410, DAY_IN_MILLIS, "1 year, 2 months ago");
assertFormat(2, YEAR_IN_MILLIS, "2 years ago");
assertFormat(1824, DAY_IN_MILLIS, "5 years ago");
assertFormat(2 * 365 - 10, DAY_IN_MILLIS, "2 years ago");
}
@Test
public void formatYears() {
assertFormat(5, YEAR_IN_MILLIS, "5 years ago");
assertFormat(60, YEAR_IN_MILLIS, "60 years ago");
}
private static class Constants implements CommonConstants, CommonMessages {
@Override
public String inTheFuture() {
return "in the future";
}
@Override
public String month() {
return "month";
}
@Override
public String months() {
return "months";
}
@Override
public String year() {
return "year";
}
@Override
public String years() {
return "years";
}
@Override
public String oneSecondAgo() {
return "1 second ago";
}
@Override
public String oneMinuteAgo() {
return "1 minute ago";
}
@Override
public String oneHourAgo() {
return "1 hour ago";
}
@Override
public String oneDayAgo() {
return "1 day ago";
}
@Override
public String oneWeekAgo() {
return "1 week ago";
}
@Override
public String oneMonthAgo() {
return "1 month ago";
}
@Override
public String oneYearAgo() {
return "1 year ago";
}
@Override
public String secondsAgo(long seconds) {
return seconds + " seconds ago";
}
@Override
public String minutesAgo(long minutes) {
return minutes + " minutes ago";
}
@Override
public String hoursAgo(long hours) {
return hours + " hours ago";
}
@Override
public String daysAgo(long days) {
return days + " days ago";
}
@Override
public String weeksAgo(long weeks) {
return weeks + " weeks ago";
}
@Override
public String monthsAgo(long months) {
return months + " months ago";
}
@Override
public String yearsAgo(long years) {
return years + " years ago";
}
@Override
public String years0MonthsAgo(long years, String yearLabel) {
return years + " " + yearLabel + " ago";
}
@Override
public String yearsMonthsAgo(long years, String yearLabel, long months, String monthLabel) {
return years + " " + yearLabel + ", " + months + " " + monthLabel + " ago";
}
}
}

View File

@ -1,51 +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.ui;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class HighlightSuggestionTest {
@Test
public void singleHighlight() throws Exception {
String keyword = "key";
String value = "somethingkeysomething";
HighlightSuggestion suggestion = new HighlightSuggestion(keyword, value);
assertEquals("something<strong>key</strong>something", suggestion.getDisplayString());
assertEquals(value, suggestion.getReplacementString());
}
@Test
public void noHighlight() throws Exception {
String keyword = "key";
String value = "something";
HighlightSuggestion suggestion = new HighlightSuggestion(keyword, value);
assertEquals(value, suggestion.getDisplayString());
assertEquals(value, suggestion.getReplacementString());
}
@Test
public void doubleHighlight() throws Exception {
String keyword = "key";
String value = "somethingkeysomethingkeysomething";
HighlightSuggestion suggestion = new HighlightSuggestion(keyword, value);
assertEquals(
"something<strong>key</strong>something<strong>key</strong>something",
suggestion.getDisplayString());
assertEquals(value, suggestion.getReplacementString());
}
}

View File

@ -1,41 +0,0 @@
load(
"//tools/bzl:gwt.bzl",
"gen_ui_module",
"gwt_genrule",
"gwt_user_agent_permutations",
)
load("//tools/bzl:license.bzl", "license_test")
load("//tools/bzl:junit.bzl", "junit_tests")
gwt_genrule()
gwt_genrule("_r")
gen_ui_module(name = "ui_module")
gen_ui_module(
name = "ui_module",
suffix = "_r",
)
gwt_user_agent_permutations()
license_test(
name = "ui_module_license_test",
target = ":ui_module",
)
junit_tests(
name = "ui_tests",
srcs = glob(["src/test/java/**/*.java"]),
visibility = ["//visibility:public"],
deps = [
":ui_module",
"//java/com/google/gerrit/common:client",
"//java/com/google/gerrit/extensions:client",
"//lib:junit",
"//lib/gwt:dev",
"//lib/gwt:user",
"//lib/truth",
],
)

View File

@ -1,39 +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.
-->
<module rename-to="gerrit_ui">
<inherits name='com.google.gwt.editor.Editor'/>
<inherits name='com.google.gwt.user.User'/>
<inherits name='com.google.gwt.resources.Resources'/>
<inherits name='com.google.gwt.user.theme.chrome.Chrome'/>
<inherits name='com.google.gwtexpui.css.CSS'/>
<inherits name='com.google.gerrit.GerritGwtUICommon'/>
<inherits name='com.google.gerrit.UserAgent'/>
<inherits name='net.codemirror.CodeMirror'/>
<extend-property name='locale' values='en'/>
<set-property-fallback name='locale' value='en'/>
<set-property name='locale' value='en'/>
<set-configuration-property name='UiBinder.useSafeHtmlTemplates' value='true'/>
<set-configuration-property name='CssResource.style' value='stable'/>
<add-linker name='xsiframe'/>
<set-property name='gwt.logging.logLevel' value='SEVERE'/>
<!-- Disable GSS -->
<set-configuration-property name='CssResource.enableGss' value='false'/>
<entry-point class='com.google.gerrit.client.Gerrit'/>
</module>

View File

@ -1,41 +0,0 @@
<!--
Copyright (C) 2009 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.
-->
<module>
<replace-with class="com.google.gerrit.client.api.PluginName.PluginNameMoz">
<when-type-is class="com.google.gerrit.client.api.PluginName" />
<when-property-is name="compiler.stackMode" value="native" />
<when-property-is name="user.agent" value="safari" />
<when-property-is name="user.agent" value="gecko1_8" />
</replace-with>
<replace-with class="com.google.gerrit.client.ui.FancyFlexTableImplIE8">
<when-type-is class="com.google.gerrit.client.ui.FancyFlexTableImpl" />
<any>
<when-property-is name="user.agent" value="ie8"/>
</any>
</replace-with>
<replace-with class="com.google.gerrit.client.Themer.ThemerIE">
<when-type-is class="com.google.gerrit.client.Themer" />
<any>
<when-property-is name="user.agent" value="ie8"/>
<when-property-is name="user.agent" value="ie9"/>
<when-property-is name="user.agent" value="ie10"/>
<when-property-is name="user.agent" value="ie11"/>
<when-property-is name="user.agent" value="edge"/>
</any>
</replace-with>
</module>

View File

@ -1,202 +0,0 @@
// Copyright (C) 2013 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;
import com.google.gerrit.client.changes.Util;
import com.google.gerrit.client.info.AccountInfo;
import com.google.gerrit.client.info.AccountInfo.AvatarInfo;
import com.google.gerrit.client.rpc.RestApi;
import com.google.gwt.event.dom.client.LoadEvent;
import com.google.gwt.event.dom.client.LoadHandler;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseOverHandler;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.UIObject;
public class AvatarImage extends Image implements LoadHandler {
public AvatarImage() {
setVisible(false);
addLoadHandler(this);
}
/** A default sized avatar image. */
public AvatarImage(AccountInfo account) {
this(account, AccountInfo.AvatarInfo.DEFAULT_SIZE, true);
}
/**
* An avatar image for the given account using the requested size.
*
* @param account The account in which we are interested
* @param size A requested size. Note that the size can be ignored depending on the avatar
* provider. A size <= 0 indicates to let the provider decide a default size.
* @param addPopup show avatar popup with user info on hovering over the avatar image
*/
public AvatarImage(AccountInfo account, int size, boolean addPopup) {
addLoadHandler(this);
setAccount(account, size, addPopup);
}
public void setAccount(AccountInfo account, int size, boolean addPopup) {
if (account == null) {
setVisible(false);
} else if (isGerritServer(account)) {
setVisible(true);
setResource(Gerrit.RESOURCES.gerritAvatar26());
} else if (account.hasAvatarInfo()) {
setVisible(false);
AvatarInfo info = account.avatar(size);
if (info != null) {
setWidth(info.width() > 0 ? info.width() + "px" : "");
setHeight(info.height() > 0 ? info.height() + "px" : "");
setUrl(info.url());
popup(account, addPopup);
} else if (account.email() != null) {
loadAvatar(account, size, addPopup);
}
} else if (account.email() != null) {
loadAvatar(account, size, addPopup);
} else {
setVisible(false);
}
}
private void loadAvatar(AccountInfo account, int size, boolean addPopup) {
if (!Gerrit.info().plugin().hasAvatars()) {
setVisible(false);
return;
}
// TODO Kill /accounts/*/avatar URL.
String u = account.email();
if (Gerrit.isSignedIn() && u.equals(Gerrit.getUserAccount().email())) {
u = "self";
}
RestApi api = new RestApi("/accounts/").id(u).view("avatar");
if (size > 0) {
api.addParameter("s", size);
setSize("", size + "px");
}
setVisible(false);
setUrl(api.url());
popup(account, addPopup);
}
private void popup(AccountInfo account, boolean addPopup) {
if (addPopup) {
PopupHandler popupHandler = new PopupHandler(account, this);
addMouseOverHandler(popupHandler);
addMouseOutHandler(popupHandler);
}
}
@Override
public void onLoad(LoadEvent event) {
setVisible(true);
}
private static boolean isGerritServer(AccountInfo account) {
return account._accountId() == 0 && Util.C.messageNoAuthor().equals(account.name());
}
private static class PopupHandler implements MouseOverHandler, MouseOutHandler {
private final AccountInfo account;
private final UIObject target;
private UserPopupPanel popup;
private Timer showTimer;
private Timer hideTimer;
PopupHandler(AccountInfo account, UIObject target) {
this.account = account;
this.target = target;
}
private UserPopupPanel createPopupPanel(AccountInfo account) {
UserPopupPanel popup = new UserPopupPanel(account, false, false);
popup.addDomHandler(
new MouseOverHandler() {
@Override
public void onMouseOver(MouseOverEvent event) {
scheduleShow();
}
},
MouseOverEvent.getType());
popup.addDomHandler(
new MouseOutHandler() {
@Override
public void onMouseOut(MouseOutEvent event) {
scheduleHide();
}
},
MouseOutEvent.getType());
return popup;
}
@Override
public void onMouseOver(MouseOverEvent event) {
scheduleShow();
}
@Override
public void onMouseOut(MouseOutEvent event) {
scheduleHide();
}
private void scheduleShow() {
if (hideTimer != null) {
hideTimer.cancel();
hideTimer = null;
}
if ((popup != null && popup.isShowing() && popup.isVisible()) || showTimer != null) {
return;
}
showTimer =
new Timer() {
@Override
public void run() {
if (popup == null) {
popup = createPopupPanel(account);
}
if (!popup.isShowing() || !popup.isVisible()) {
popup.showRelativeTo(target);
}
}
};
showTimer.schedule(600);
}
private void scheduleHide() {
if (showTimer != null) {
showTimer.cancel();
showTimer = null;
}
if (popup == null || !popup.isShowing() || !popup.isVisible() || hideTimer != null) {
return;
}
hideTimer =
new Timer() {
@Override
public void run() {
popup.hide();
}
};
hideTimer.schedule(50);
}
}
}

View File

@ -1,33 +0,0 @@
// Copyright (C) 2010 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;
/**
* Interface that a caller must implement to react on the result of a {@link ConfirmationDialog}.
*/
public abstract class ConfirmationCallback {
/**
* Called when the {@link ConfirmationDialog} is finished with OK. To be overwritten by
* subclasses.
*/
public abstract void onOk();
/**
* Called when the {@link ConfirmationDialog} is finished with Cancel. To be overwritten by
* subclasses.
*/
public void onCancel() {}
}

View File

@ -1,88 +0,0 @@
// Copyright (C) 2010 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;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwtexpui.globalkey.client.GlobalKey;
import com.google.gwtexpui.safehtml.client.SafeHtml;
import com.google.gwtexpui.user.client.AutoCenterDialogBox;
public class ConfirmationDialog extends AutoCenterDialogBox {
private Button cancelButton;
private Button okButton;
public ConfirmationDialog(
final String dialogTitle, SafeHtml message, ConfirmationCallback callback) {
super(/* auto hide */ false, /* modal */ true);
setGlassEnabled(true);
setText(dialogTitle);
final FlowPanel buttons = new FlowPanel();
okButton = new Button();
okButton.setText(Gerrit.C.confirmationDialogOk());
okButton.addClickHandler(
new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
hide();
callback.onOk();
}
});
buttons.add(okButton);
cancelButton = new Button();
cancelButton.getElement().getStyle().setProperty("marginLeft", "300px");
cancelButton.setText(Gerrit.C.confirmationDialogCancel());
cancelButton.addClickHandler(
new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
hide();
callback.onCancel();
}
});
buttons.add(cancelButton);
final FlowPanel center = new FlowPanel();
final Widget msgWidget = message.toBlockWidget();
center.add(msgWidget);
center.add(buttons);
add(center);
msgWidget.setWidth("400px");
setWidget(center);
}
@Override
public void center() {
super.center();
GlobalKey.dialog(this);
cancelButton.setFocus(true);
}
public void setCancelVisible(boolean visible) {
cancelButton.setVisible(visible);
if (!visible) {
okButton.setFocus(true);
}
}
}

View File

@ -1,183 +0,0 @@
// Copyright (C) 2016 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;
import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DefaultBase;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSet;
/**
* Represent an object that can be diffed. This can be either a regular patch set, the base of a
* patch set, the parent of a merge, the auto-merge of a merge or an edit patch set.
*/
public class DiffObject {
public static final String AUTO_MERGE = "AutoMerge";
/**
* Parses a string that represents a diff object.
*
* <p>The following string representations are supported:
*
* <ul>
* <li>a positive integer: represents a patch set
* <li>a negative integer: represents a parent of a merge patch set
* <li>'0': represents the edit patch set
* <li>empty string or null: represents the parent of a 1-parent patch set, also called base
* <li>'AutoMerge': represents the auto-merge of a merge patch set
* </ul>
*
* @param changeId the ID of the change to which the diff object belongs
* @param str the string representation of the diff object
* @return the parsed diff object, {@code null} if str cannot be parsed as diff object
*/
public static DiffObject parse(Change.Id changeId, String str) {
if (str == null || str.isEmpty()) {
return new DiffObject(false);
}
if (AUTO_MERGE.equals(str)) {
return new DiffObject(true);
}
return new DiffObject(Dispatcher.toPsId(changeId, str));
}
/** Create a DiffObject that represents the parent of a 1-parent patch set. */
public static DiffObject base() {
return new DiffObject(false);
}
/** Create a DiffObject that represents the auto-merge for a merge patch set. */
public static DiffObject autoMerge() {
return new DiffObject(true);
}
/** Create a DiffObject that represents a patch set. */
public static DiffObject patchSet(PatchSet.Id psId) {
return new DiffObject(psId);
}
private final PatchSet.Id psId;
private final boolean autoMerge;
private DiffObject(PatchSet.Id psId) {
this.psId = psId;
this.autoMerge = false;
}
private DiffObject(boolean autoMerge) {
this.psId = null;
this.autoMerge = autoMerge;
}
public boolean isBase() {
return psId == null && !autoMerge;
}
public boolean isAutoMerge() {
return psId == null && autoMerge;
}
public boolean isBaseOrAutoMerge() {
return psId == null;
}
public boolean isPatchSet() {
return psId != null && psId.get() > 0;
}
public boolean isParent() {
return psId != null && psId.get() < 0;
}
public boolean isEdit() {
return psId != null && psId.get() == 0;
}
/**
* Returns the DiffObject as PatchSet.Id.
*
* @return PatchSet.Id with an id > 0 for a regular patch set; PatchSet.Id with an id < 0 for a
* parent of a merge; PatchSet.Id with id == 0 for an edit patch set; {@code null} for the
* base of a 1-parent patch set and for the auto-merge of a merge patch set
*/
public PatchSet.Id asPatchSetId() {
return psId;
}
/**
* Returns the parent number for a parent of a merge.
*
* @return 1-based parent number, 0 if this DiffObject is not a parent of a merge
*/
public int getParentNum() {
if (!isParent()) {
return 0;
}
return -psId.get();
}
/**
* Returns a string representation of this DiffObject that can be used in URLs.
*
* <p>The following string representations are returned:
*
* <ul>
* <li>a positive integer for a patch set
* <li>a negative integer for a parent of a merge patch set
* <li>'0' for the edit patch set
* <li>{@code null} for the parent of a 1-parent patch set, also called base
* <li>'AutoMerge' for the auto-merge of a merge patch set
* </ul>
*
* @return string representation of this DiffObject
*/
public String asString() {
if (autoMerge) {
if (Gerrit.getUserPreferences().defaultBaseForMerges() != DefaultBase.AUTO_MERGE) {
return AUTO_MERGE;
}
return null;
}
if (psId != null) {
return psId.getId();
}
return null;
}
@Override
public String toString() {
if (isPatchSet()) {
return "Patch Set " + psId.getId();
}
if (isParent()) {
return "Parent " + psId.getId();
}
if (isEdit()) {
return "Edit Patch Set";
}
if (isAutoMerge()) {
return "Auto Merge";
}
return "Base";
}
}

View File

@ -1,27 +0,0 @@
// Copyright (C) 2014 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;
import com.google.gerrit.client.info.WebLinkInfo;
public class DiffWebLinkInfo extends WebLinkInfo {
public final native boolean showOnSideBySideDiffView()
/*-{ return this.show_on_side_by_side_diff_view || false; }-*/ ;
public final native boolean showOnUnifiedDiffView()
/*-{ return this.show_on_unified_diff_view || false; }-*/ ;
protected DiffWebLinkInfo() {}
}

View File

@ -1,879 +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;
import static com.google.gerrit.common.PageLinks.ADMIN_CREATE_GROUP;
import static com.google.gerrit.common.PageLinks.ADMIN_CREATE_PROJECT;
import static com.google.gerrit.common.PageLinks.ADMIN_GROUPS;
import static com.google.gerrit.common.PageLinks.ADMIN_PLUGINS;
import static com.google.gerrit.common.PageLinks.ADMIN_PROJECTS;
import static com.google.gerrit.common.PageLinks.DASHBOARDS;
import static com.google.gerrit.common.PageLinks.MINE;
import static com.google.gerrit.common.PageLinks.MY_GROUPS;
import static com.google.gerrit.common.PageLinks.PROJECTS;
import static com.google.gerrit.common.PageLinks.QUERY;
import static com.google.gerrit.common.PageLinks.REGISTER;
import static com.google.gerrit.common.PageLinks.SETTINGS;
import static com.google.gerrit.common.PageLinks.SETTINGS_AGREEMENTS;
import static com.google.gerrit.common.PageLinks.SETTINGS_CONTACT;
import static com.google.gerrit.common.PageLinks.SETTINGS_DIFF_PREFERENCES;
import static com.google.gerrit.common.PageLinks.SETTINGS_EDIT_PREFERENCES;
import static com.google.gerrit.common.PageLinks.SETTINGS_EXTENSION;
import static com.google.gerrit.common.PageLinks.SETTINGS_GPGKEYS;
import static com.google.gerrit.common.PageLinks.SETTINGS_HTTP_PASSWORD;
import static com.google.gerrit.common.PageLinks.SETTINGS_MYGROUPS;
import static com.google.gerrit.common.PageLinks.SETTINGS_NEW_AGREEMENT;
import static com.google.gerrit.common.PageLinks.SETTINGS_OAUTH_TOKEN;
import static com.google.gerrit.common.PageLinks.SETTINGS_PREFERENCES;
import static com.google.gerrit.common.PageLinks.SETTINGS_PROJECTS;
import static com.google.gerrit.common.PageLinks.SETTINGS_SSHKEYS;
import static com.google.gerrit.common.PageLinks.SETTINGS_WEBIDENT;
import com.google.gerrit.client.account.MyAgreementsScreen;
import com.google.gerrit.client.account.MyContactInformationScreen;
import com.google.gerrit.client.account.MyDiffPreferencesScreen;
import com.google.gerrit.client.account.MyEditPreferencesScreen;
import com.google.gerrit.client.account.MyGpgKeysScreen;
import com.google.gerrit.client.account.MyGroupsScreen;
import com.google.gerrit.client.account.MyIdentitiesScreen;
import com.google.gerrit.client.account.MyOAuthTokenScreen;
import com.google.gerrit.client.account.MyPasswordScreen;
import com.google.gerrit.client.account.MyPreferencesScreen;
import com.google.gerrit.client.account.MyProfileScreen;
import com.google.gerrit.client.account.MySshKeysScreen;
import com.google.gerrit.client.account.MyWatchedProjectsScreen;
import com.google.gerrit.client.account.NewAgreementScreen;
import com.google.gerrit.client.account.RegisterScreen;
import com.google.gerrit.client.account.ValidateEmailScreen;
import com.google.gerrit.client.admin.AccountGroupAuditLogScreen;
import com.google.gerrit.client.admin.AccountGroupInfoScreen;
import com.google.gerrit.client.admin.AccountGroupMembersScreen;
import com.google.gerrit.client.admin.AccountGroupScreen;
import com.google.gerrit.client.admin.CreateGroupScreen;
import com.google.gerrit.client.admin.CreateProjectScreen;
import com.google.gerrit.client.admin.GroupListScreen;
import com.google.gerrit.client.admin.PluginListScreen;
import com.google.gerrit.client.admin.ProjectAccessScreen;
import com.google.gerrit.client.admin.ProjectBranchesScreen;
import com.google.gerrit.client.admin.ProjectDashboardsScreen;
import com.google.gerrit.client.admin.ProjectInfoScreen;
import com.google.gerrit.client.admin.ProjectListScreen;
import com.google.gerrit.client.admin.ProjectScreen;
import com.google.gerrit.client.admin.ProjectTagsScreen;
import com.google.gerrit.client.api.ExtensionScreen;
import com.google.gerrit.client.api.ExtensionSettingsScreen;
import com.google.gerrit.client.change.ChangeScreen;
import com.google.gerrit.client.change.FileTable;
import com.google.gerrit.client.change.ProjectChangeId;
import com.google.gerrit.client.changes.AccountDashboardScreen;
import com.google.gerrit.client.changes.CustomDashboardScreen;
import com.google.gerrit.client.changes.ProjectDashboardScreen;
import com.google.gerrit.client.changes.QueryScreen;
import com.google.gerrit.client.dashboards.DashboardInfo;
import com.google.gerrit.client.dashboards.DashboardList;
import com.google.gerrit.client.diff.DisplaySide;
import com.google.gerrit.client.diff.SideBySide;
import com.google.gerrit.client.diff.Unified;
import com.google.gerrit.client.documentation.DocScreen;
import com.google.gerrit.client.editor.EditScreen;
import com.google.gerrit.client.groups.GroupApi;
import com.google.gerrit.client.info.GroupInfo;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.rpc.RestApi;
import com.google.gerrit.client.ui.Screen;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DiffView;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.RunAsyncCallback;
import com.google.gwt.http.client.URL;
import com.google.gwtexpui.user.client.UserAgent;
import com.google.gwtorm.client.KeyUtil;
public class Dispatcher {
public static String toPatch(
@Nullable Project.NameKey project,
DiffObject diffBase,
PatchSet.Id revision,
String fileName) {
return toPatch("", project, diffBase, revision, fileName, null, 0);
}
public static String toPatch(
@Nullable Project.NameKey project,
DiffObject diffBase,
PatchSet.Id revision,
String fileName,
DisplaySide side,
int line) {
return toPatch("", project, diffBase, revision, fileName, side, line);
}
public static String toSideBySide(
@Nullable Project.NameKey project,
DiffObject diffBase,
PatchSet.Id revision,
String fileName) {
return toPatch("sidebyside", project, diffBase, revision, fileName, null, 0);
}
public static String toUnified(
@Nullable Project.NameKey project,
DiffObject diffBase,
PatchSet.Id revision,
String fileName) {
return toPatch("unified", project, diffBase, revision, fileName, null, 0);
}
public static String toPatch(
@Nullable Project.NameKey project, String type, DiffObject diffBase, Patch.Key id) {
return toPatch(type, project, diffBase, id.getParentKey(), id.get(), null, 0);
}
public static String toEditScreen(
@Nullable Project.NameKey project, PatchSet.Id revision, String fileName) {
return toEditScreen(project, revision, fileName, 0);
}
public static String toEditScreen(
@Nullable Project.NameKey project, PatchSet.Id revision, String fileName, int line) {
return toPatch("edit", project, DiffObject.base(), revision, fileName, null, line);
}
private static String toPatch(
String type,
@Nullable Project.NameKey project,
DiffObject diffBase,
PatchSet.Id revision,
String fileName,
DisplaySide side,
int line) {
Change.Id c = revision.getParentKey();
StringBuilder p = new StringBuilder(PageLinks.toChange(project, c));
if (diffBase != null && diffBase.asString() != null) {
p.append(diffBase.asString()).append("..");
}
p.append(revision.getId()).append("/").append(KeyUtil.encode(fileName));
if (type != null && !type.isEmpty() && (!"sidebyside".equals(type) || preferUnified())) {
p.append(",").append(type);
}
if (side == DisplaySide.A && line > 0) {
p.append("@a").append(line);
} else if (line > 0) {
p.append("@").append(line);
}
return p.toString();
}
public static String toGroup(AccountGroup.Id id) {
return ADMIN_GROUPS + id.toString();
}
public static String toGroup(AccountGroup.Id id, String panel) {
return ADMIN_GROUPS + id.toString() + "," + panel;
}
public static String toGroup(AccountGroup.UUID uuid) {
return PageLinks.toGroup(uuid);
}
public static String toGroup(AccountGroup.UUID uuid, String panel) {
return toGroup(uuid) + "," + panel;
}
public static String toProject(Project.NameKey n) {
return toProjectAdmin(n, ProjectScreen.getSavedPanel());
}
public static String toProjectAdmin(Project.NameKey n, String panel) {
if (panel == null || ProjectScreen.INFO.equals(panel)) {
return ADMIN_PROJECTS + n.toString();
}
return ADMIN_PROJECTS + n.toString() + "," + panel;
}
static final String RELOAD_UI = "/reload-ui/";
private static boolean wasStartedByReloadUI;
void display(String token) {
assert token != null;
try {
try {
if (matchPrefix(RELOAD_UI, token)) {
wasStartedByReloadUI = true;
token = skip(token);
}
select(token);
} finally {
wasStartedByReloadUI = false;
}
} catch (RuntimeException err) {
GWT.log("Error parsing history token: " + token, err);
Gerrit.display(token, new NotFoundScreen());
}
}
private static void select(String token) {
token = Gerrit.getUrlAliasMatcher().replace(token);
if (matchPrefix(QUERY, token)) {
query(token);
} else if (matchPrefix("/Documentation/q/", token)) {
docSearch(token);
} else if (matchPrefix("/c/", token)) {
change(token);
} else if (matchPrefix("/x/", token)) {
extension(token);
} else if (matchExact(MINE, token)) {
String defaultScreenToken = Gerrit.getDefaultScreenToken();
if (defaultScreenToken != null && !MINE.equals(defaultScreenToken)) {
select(defaultScreenToken);
} else {
Gerrit.display(token, mine());
}
} else if (matchPrefix("/dashboard/", token)) {
dashboard(token);
} else if (matchPrefix(PROJECTS, token)) {
projects(token);
} else if (matchExact(SETTINGS, token)
|| matchPrefix("/settings/", token)
|| matchExact(MY_GROUPS, token)
|| matchExact("register", token)
|| matchExact(REGISTER, token)
|| matchPrefix("/register/", token)
|| matchPrefix("/VE/", token)
|| matchPrefix("VE,", token)
|| matchPrefix("/SignInFailure,", token)) {
settings(token);
} else if (matchPrefix("/admin/", token)) {
admin(token);
} else {
Gerrit.display(token, new NotFoundScreen());
}
}
private static void query(String token) {
String s = skip(token);
int c = s.indexOf(',');
Screen screen;
if (c >= 0) {
String prefix = s.substring(0, c);
if (s.substring(c).equals(",n,z")) {
// Respect legacy token with max sortkey.
screen = new QueryScreen(prefix, 0);
} else {
screen = new QueryScreen(prefix, Integer.parseInt(s.substring(c + 1)));
}
} else {
screen = new QueryScreen(s, 0);
}
Gerrit.display(token, screen);
}
private static Screen mine() {
if (Gerrit.isSignedIn()) {
return new AccountDashboardScreen(Gerrit.getUserAccount()._accountId());
}
Screen r = new AccountDashboardScreen(null);
r.setRequiresSignIn(true);
return r;
}
private static void dashboard(String token) {
String rest = skip(token);
if (rest.matches("[0-9]+")) {
int accountId = Integer.parseInt(rest);
Gerrit.display(token, new AccountDashboardScreen(accountId));
return;
}
if (rest.equals("self")) {
if (Gerrit.isSignedIn()) {
Gerrit.display(token, new AccountDashboardScreen(Gerrit.getUserAccount()._accountId()));
} else {
Screen s = new AccountDashboardScreen(null);
s.setRequiresSignIn(true);
Gerrit.display(token, s);
}
return;
}
if (rest.startsWith("?")) {
Gerrit.display(token, new CustomDashboardScreen(rest.substring(1)));
return;
}
Gerrit.display(token, new NotFoundScreen());
}
private static void projects(String token) {
String rest = skip(token);
int c = rest.indexOf(DASHBOARDS);
if (0 <= c) {
final String project = URL.decodePathSegment(rest.substring(0, c));
rest = rest.substring(c);
if (matchPrefix(DASHBOARDS, rest)) {
final String dashboardId = skip(rest);
GerritCallback<DashboardInfo> cb =
new GerritCallback<DashboardInfo>() {
@Override
public void onSuccess(DashboardInfo result) {
if (matchPrefix("/dashboard/", result.url())) {
String params = skip(result.url()).substring(1);
ProjectDashboardScreen dash =
new ProjectDashboardScreen(new Project.NameKey(project), params);
Gerrit.display(token, dash);
}
}
@Override
public void onFailure(Throwable caught) {
if ("default".equals(dashboardId) && RestApi.isNotFound(caught)) {
Gerrit.display(
PageLinks.toChangeQuery(
PageLinks.projectQuery(new Project.NameKey(project))));
} else {
super.onFailure(caught);
}
}
};
if ("default".equals(dashboardId)) {
DashboardList.getDefault(new Project.NameKey(project), cb);
return;
}
c = dashboardId.indexOf(":");
if (0 <= c) {
final String ref = URL.decodeQueryString(dashboardId.substring(0, c));
final String path = URL.decodeQueryString(dashboardId.substring(c + 1));
DashboardList.get(new Project.NameKey(project), ref + ":" + path, cb);
return;
}
}
}
Gerrit.display(token, new NotFoundScreen());
}
private static void change(String token) {
String rest = skip(token);
int c = rest.lastIndexOf(',');
String panel = null;
if (0 <= c) {
panel = rest.substring(c + 1);
rest = rest.substring(0, c);
int at = panel.lastIndexOf('@');
if (at > 0) {
rest += panel.substring(at);
panel = panel.substring(0, at);
}
}
ProjectChangeId id = ProjectChangeId.create(rest);
rest = rest.length() > id.identifierLength() ? rest.substring(id.identifierLength() + 1) : "";
if (rest.isEmpty()) {
FileTable.Mode mode = FileTable.Mode.REVIEW;
if (panel != null && (panel.equals("edit") || panel.startsWith("edit/"))) {
mode = FileTable.Mode.EDIT;
panel = null;
}
Gerrit.display(
token,
panel == null
? new ChangeScreen(
id.getProject(), id.getChangeId(), DiffObject.base(), null, false, mode)
: new NotFoundScreen());
return;
}
String psIdStr;
int s = rest.indexOf('/');
if (0 <= s) {
psIdStr = rest.substring(0, s);
rest = rest.substring(s + 1);
} else {
psIdStr = rest;
rest = "";
}
DiffObject base = DiffObject.base();
PatchSet.Id ps;
int dotdot = psIdStr.indexOf("..");
if (1 <= dotdot) {
base = DiffObject.parse(id.getChangeId(), psIdStr.substring(0, dotdot));
if (base == null) {
Gerrit.display(token, new NotFoundScreen());
}
psIdStr = psIdStr.substring(dotdot + 2);
}
ps = toPsId(id.getChangeId(), psIdStr);
if (!rest.isEmpty()) {
DisplaySide side = DisplaySide.B;
int line = 0;
int at = rest.lastIndexOf('@');
if (at > 0) {
String l = rest.substring(at + 1);
if (l.startsWith("a")) {
side = DisplaySide.A;
l = l.substring(1);
}
line = Integer.parseInt(l);
rest = rest.substring(0, at);
}
Patch.Key p = new Patch.Key(ps, KeyUtil.decode(rest));
patch(token, id.getProject(), base, p, side, line, panel);
} else {
if (panel == null) {
Gerrit.display(
token,
new ChangeScreen(
id.getProject(),
id.getChangeId(),
base,
String.valueOf(ps.get()),
false,
FileTable.Mode.REVIEW));
} else {
Gerrit.display(token, new NotFoundScreen());
}
}
}
public 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(String token) {
ExtensionScreen view = new ExtensionScreen(skip(token));
if (view.isFound()) {
Gerrit.display(token, view);
} else {
Gerrit.display(token, new NotFoundScreen());
}
}
private static void patch(
String token,
@Nullable Project.NameKey project,
DiffObject base,
Patch.Key id,
DisplaySide side,
int line,
String panelType) {
String panel = panelType;
if (panel == null) {
int c = token.lastIndexOf(',');
panel = 0 <= c ? token.substring(c + 1) : "";
}
if ("".equals(panel) || /* DEPRECATED URL */ "cm".equals(panel)) {
if (preferUnified()) {
unified(token, project, base, id, side, line);
} else {
codemirror(token, base, project, id, side, line);
}
} else if ("sidebyside".equals(panel)) {
codemirror(token, base, project, id, side, line);
} else if ("unified".equals(panel)) {
unified(token, project, base, id, side, line);
} else if ("edit".equals(panel)) {
if (!Patch.isMagic(id.get()) || Patch.COMMIT_MSG.equals(id.get())) {
codemirrorForEdit(token, project, id, line);
} else {
Gerrit.display(token, new NotFoundScreen());
}
} else {
Gerrit.display(token, new NotFoundScreen());
}
}
private static boolean preferUnified() {
return DiffView.UNIFIED_DIFF.equals(Gerrit.getUserPreferences().diffView())
|| (UserAgent.isPortrait() && UserAgent.isMobile());
}
private static void unified(
final String token,
final Project.NameKey project,
final DiffObject base,
final Patch.Key id,
final DisplaySide side,
final int line) {
GWT.runAsync(
new AsyncSplit(token) {
@Override
public void onSuccess() {
Gerrit.display(
token,
new Unified(
project, base, DiffObject.patchSet(id.getParentKey()), id.get(), side, line));
}
});
}
private static void codemirror(
final String token,
final DiffObject base,
@Nullable final Project.NameKey project,
final Patch.Key id,
final DisplaySide side,
final int line) {
GWT.runAsync(
new AsyncSplit(token) {
@Override
public void onSuccess() {
Gerrit.display(
token,
new SideBySide(
project, base, DiffObject.patchSet(id.getParentKey()), id.get(), side, line));
}
});
}
private static void codemirrorForEdit(
final String token,
@Nullable final Project.NameKey project,
final Patch.Key id,
final int line) {
GWT.runAsync(
new AsyncSplit(token) {
@Override
public void onSuccess() {
Gerrit.display(token, new EditScreen(project, id, line));
}
});
}
private static void settings(String token) {
GWT.runAsync(
new AsyncSplit(token) {
@Override
public void onSuccess() {
Gerrit.display(token, select());
}
private Screen select() {
if (matchExact(SETTINGS, token)) {
return new MyProfileScreen();
}
if (matchExact(SETTINGS_PREFERENCES, token)) {
return new MyPreferencesScreen();
}
if (matchExact(SETTINGS_DIFF_PREFERENCES, token)) {
return new MyDiffPreferencesScreen();
}
if (matchExact(SETTINGS_EDIT_PREFERENCES, token)) {
return new MyEditPreferencesScreen();
}
if (matchExact(SETTINGS_PROJECTS, token)) {
return new MyWatchedProjectsScreen();
}
if (matchExact(SETTINGS_CONTACT, token)) {
return new MyContactInformationScreen();
}
if (matchExact(SETTINGS_SSHKEYS, token)) {
return new MySshKeysScreen();
}
if (matchExact(SETTINGS_GPGKEYS, token) && Gerrit.info().gerrit().editGpgKeys()) {
return new MyGpgKeysScreen();
}
if (matchExact(SETTINGS_WEBIDENT, token)) {
return new MyIdentitiesScreen();
}
if (matchExact(SETTINGS_HTTP_PASSWORD, token)) {
return new MyPasswordScreen();
}
if (matchExact(SETTINGS_OAUTH_TOKEN, token) && Gerrit.info().auth().isOAuth()) {
return new MyOAuthTokenScreen();
}
if (matchExact(MY_GROUPS, token) || matchExact(SETTINGS_MYGROUPS, token)) {
return new MyGroupsScreen();
}
if (matchExact(SETTINGS_AGREEMENTS, token)
&& Gerrit.info().auth().useContributorAgreements()) {
return new MyAgreementsScreen();
}
if (matchExact(REGISTER, token)
|| matchExact("/register/", token)
|| matchExact("register", token)) {
return new RegisterScreen(MINE);
} else if (matchPrefix("/register/", token)) {
return new RegisterScreen("/" + skip(token));
}
if (matchPrefix("/VE/", token) || matchPrefix("VE,", token)) {
return new ValidateEmailScreen(skip(token));
}
if (matchExact(SETTINGS_NEW_AGREEMENT, token)) {
return new NewAgreementScreen();
}
if (matchPrefix(SETTINGS_NEW_AGREEMENT + "/", token)) {
return new NewAgreementScreen(skip(token));
}
if (matchPrefix(SETTINGS_EXTENSION, token)) {
ExtensionSettingsScreen view = new ExtensionSettingsScreen(skip(token));
if (view.isFound()) {
return view;
}
return new NotFoundScreen();
}
return new NotFoundScreen();
}
});
}
private static void admin(String token) {
GWT.runAsync(
new AsyncSplit(token) {
@Override
public void onSuccess() {
if (matchExact(ADMIN_GROUPS, token) || matchExact("/admin/groups", token)) {
Gerrit.display(token, new GroupListScreen());
} else if (matchPrefix(ADMIN_GROUPS, token)) {
String rest = skip(token);
if (rest.startsWith("?")) {
Gerrit.display(token, new GroupListScreen(rest.substring(1)));
} else {
group();
}
} else if (matchPrefix("/admin/groups", token)) {
String rest = skip(token);
if (rest.startsWith("?")) {
Gerrit.display(token, new GroupListScreen(rest.substring(1)));
}
} else if (matchExact(ADMIN_PROJECTS, token) || matchExact("/admin/projects", token)) {
Gerrit.display(token, new ProjectListScreen());
} else if (matchPrefix(ADMIN_PROJECTS, token)) {
String rest = skip(token);
if (rest.startsWith("?")) {
Gerrit.display(token, new ProjectListScreen(rest.substring(1)));
} else {
Gerrit.display(token, selectProject());
}
} else if (matchPrefix("/admin/projects", token)) {
String rest = skip(token);
if (rest.startsWith("?")) {
Gerrit.display(token, new ProjectListScreen(rest.substring(1)));
}
} else if (matchPrefix(ADMIN_PLUGINS, token) || matchExact("/admin/plugins", token)) {
Gerrit.display(token, new PluginListScreen());
} else if (matchExact(ADMIN_CREATE_PROJECT, token)
|| matchExact("/admin/create-project", token)) {
Gerrit.display(token, new CreateProjectScreen());
} else if (matchExact(ADMIN_CREATE_GROUP, token)
|| matchExact("/admin/create-group", token)) {
Gerrit.display(token, new CreateGroupScreen());
} else {
Gerrit.display(token, new NotFoundScreen());
}
}
private void group() {
final String panel;
final String group;
if (matchPrefix("/admin/groups/uuid-", token)) {
String p = skip(token);
int c = p.indexOf(',');
if (c < 0) {
group = p;
panel = null;
} else {
group = p.substring(0, c);
panel = p.substring(c + 1);
}
} else if (matchPrefix(ADMIN_GROUPS, token)) {
String p = skip(token);
int c = p.indexOf(',');
if (c < 0) {
group = p;
panel = null;
} else {
group = p.substring(0, c);
panel = p.substring(c + 1);
}
} else {
Gerrit.display(token, new NotFoundScreen());
return;
}
GroupApi.getGroupDetail(
group,
new GerritCallback<GroupInfo>() {
@Override
public void onSuccess(GroupInfo group) {
if (panel == null || panel.isEmpty()) {
// The token does not say which group screen should be shown,
// as default for internal groups show the members, as default
// for external and system groups show the info screen (since
// for external and system groups the members cannot be
// shown in the web UI).
//
if (AccountGroup.isInternalGroup(group.getGroupUUID())) {
String newToken = toGroup(group.getGroupId(), AccountGroupScreen.MEMBERS);
Gerrit.display(newToken, new AccountGroupMembersScreen(group, newToken));
} else {
String newToken = toGroup(group.getGroupId(), AccountGroupScreen.INFO);
Gerrit.display(newToken, new AccountGroupInfoScreen(group, newToken));
}
} else if (AccountGroupScreen.INFO.equals(panel)) {
Gerrit.display(token, new AccountGroupInfoScreen(group, token));
} else if (AccountGroupScreen.MEMBERS.equals(panel)) {
Gerrit.display(token, new AccountGroupMembersScreen(group, token));
} else if (AccountGroupScreen.AUDIT_LOG.equals(panel)) {
Gerrit.display(token, new AccountGroupAuditLogScreen(group, token));
} else {
Gerrit.display(token, new NotFoundScreen());
}
}
});
}
private Screen selectProject() {
if (matchPrefix(ADMIN_PROJECTS, token)) {
String rest = skip(token);
int c = rest.lastIndexOf(',');
if (c < 0) {
return new ProjectInfoScreen(Project.NameKey.parse(rest));
} else if (c == 0) {
return new NotFoundScreen();
}
int q = rest.lastIndexOf('?');
if (q > 0 && rest.lastIndexOf(',', q) > 0) {
c = rest.substring(0, q - 1).lastIndexOf(',');
}
Project.NameKey k = Project.NameKey.parse(rest.substring(0, c));
String panel = rest.substring(c + 1);
if (ProjectScreen.INFO.equals(panel)) {
return new ProjectInfoScreen(k);
}
if (ProjectScreen.BRANCHES.equals(panel)
|| matchPrefix(ProjectScreen.BRANCHES, panel)) {
return new ProjectBranchesScreen(k);
}
if (ProjectScreen.TAGS.equals(panel) || matchPrefix(ProjectScreen.TAGS, panel)) {
return new ProjectTagsScreen(k);
}
if (ProjectScreen.ACCESS.equals(panel)) {
return new ProjectAccessScreen(k);
}
if (ProjectScreen.DASHBOARDS.equals(panel)) {
return new ProjectDashboardsScreen(k);
}
}
return new NotFoundScreen();
}
});
}
private static boolean matchExact(String want, String token) {
return token.equals(want);
}
private static int prefixlen;
private static boolean matchPrefix(String want, String token) {
if (token.startsWith(want)) {
prefixlen = want.length();
return true;
}
return false;
}
private static String skip(String token) {
return token.substring(prefixlen);
}
private abstract static class AsyncSplit implements RunAsyncCallback {
private final boolean isReloadUi;
protected final String token;
protected AsyncSplit(String token) {
this.isReloadUi = wasStartedByReloadUI;
this.token = token;
}
@Override
public final void onFailure(Throwable reason) {
if (!isReloadUi && "HTTP download failed with status 404".equals(reason.getMessage())) {
// The server was upgraded since we last download the main script,
// so the pointers to the splits aren't valid anymore. Force the
// page to reload itself and pick up the new code.
//
Gerrit.upgradeUI(token);
} else {
new ErrorDialog(reason).center();
}
}
}
private static void docSearch(String token) {
GWT.runAsync(
new AsyncSplit(token) {
@Override
public void onSuccess() {
Gerrit.display(token, new DocScreen(skip(token)));
}
});
}
}

View File

@ -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;
import com.google.gerrit.client.rpc.RestApi;
import com.google.gerrit.client.rpc.RpcConstants;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.http.client.Response;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.StatusCodeException;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwtexpui.safehtml.client.SafeHtml;
import com.google.gwtjsonrpc.client.RemoteJsonException;
/** A dialog box showing an error message, when bad things happen. */
public class ErrorDialog extends PopupPanel {
private final Label text;
private final FlowPanel body;
private final Button closey;
protected ErrorDialog() {
super(/* auto hide */ false, /* modal */ true);
setGlassEnabled(true);
getGlassElement().addClassName(Gerrit.RESOURCES.css().errorDialogGlass());
text = new Label();
text.setStyleName(Gerrit.RESOURCES.css().errorDialogTitle());
body = new FlowPanel();
final FlowPanel buttons = new FlowPanel();
buttons.setStyleName(Gerrit.RESOURCES.css().errorDialogButtons());
closey = new Button();
closey.setText(Gerrit.C.errorDialogContinue());
closey.addClickHandler(
new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
hide();
}
});
closey.addKeyPressHandler(
new KeyPressHandler() {
@Override
public void onKeyPress(KeyPressEvent event) {
// if the close button is triggered by a key we need to consume the key
// event, otherwise the key event would be propagated to the parent
// screen and eventually trigger some unwanted action there after the
// error dialog was closed
event.stopPropagation();
}
});
buttons.add(closey);
final FlowPanel center = new FlowPanel();
center.add(text);
center.add(body);
center.add(buttons);
setText(Gerrit.C.errorTitle());
addStyleName(Gerrit.RESOURCES.css().errorDialog());
add(center);
int l = Window.getScrollLeft() + 20;
int t = Window.getScrollTop() + 20;
setPopupPosition(l, t);
}
/** Create a dialog box to show a single message string. */
public ErrorDialog(String message) {
this();
body.add(createErrorMsgLabel(message));
}
/** Create a dialog box to show a single message string. */
public ErrorDialog(SafeHtml message) {
this();
body.add(message.toBlockWidget());
}
/** Create a dialog box to nicely format an exception. */
public ErrorDialog(Throwable what) {
this();
String hdr;
String msg;
if (what instanceof StatusCodeException) {
StatusCodeException sc = (StatusCodeException) what;
if (RestApi.isExpected(sc.getStatusCode())) {
hdr = null;
msg = sc.getEncodedResponse();
} else if (sc.getStatusCode() == Response.SC_INTERNAL_SERVER_ERROR) {
hdr = null;
msg = what.getMessage();
} else {
hdr = RpcConstants.C.errorServerUnavailable();
msg = what.getMessage();
}
} else if (what instanceof RemoteJsonException) {
// TODO Remove RemoteJsonException from Gerrit sources.
hdr = RpcConstants.C.errorRemoteJsonException();
msg = what.getMessage();
} else {
// TODO Fix callers of ErrorDialog to stop passing random types.
hdr = what.getClass().getName();
if (hdr.startsWith("java.lang.")) {
hdr = hdr.substring("java.lang.".length());
} else if (hdr.startsWith("com.google.gerrit.")) {
hdr = hdr.substring(hdr.lastIndexOf('.') + 1);
}
if (hdr.endsWith("Exception")) {
hdr = hdr.substring(0, hdr.length() - "Exception".length());
} else if (hdr.endsWith("Error")) {
hdr = hdr.substring(0, hdr.length() - "Error".length());
}
msg = what.getMessage();
}
if (hdr != null) {
final Label r = new Label(hdr);
r.setStyleName(Gerrit.RESOURCES.css().errorDialogErrorType());
body.add(r);
}
if (msg != null) {
body.add(createErrorMsgLabel(msg));
}
}
private Label createErrorMsgLabel(String message) {
Label m = new Label(message);
m.getElement().getStyle().setProperty("white-space", "pre");
return m;
}
public ErrorDialog setText(String t) {
text.setText(t);
return this;
}
@Override
public void center() {
show();
closey.setFocus(true);
}
}

View File

@ -1,132 +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;
import com.google.gerrit.client.change.Resources;
import com.google.gerrit.client.info.AccountInfo;
import com.google.gerrit.client.info.GeneralPreferences;
import com.google.gwt.i18n.client.NumberFormat;
import java.util.Date;
/** Misc. formatting functions. */
public class FormatUtil {
private static DateFormatter dateFormatter;
public static void setPreferences(GeneralPreferences prefs) {
dateFormatter = new DateFormatter(prefs);
}
/** Format a date using a really short format. */
public static String shortFormat(Date dt) {
ensureInited();
return dateFormatter.shortFormat(dt);
}
/** Format a date using a really short format. */
public static String shortFormatDayTime(Date dt) {
ensureInited();
return dateFormatter.shortFormatDayTime(dt);
}
/** Format a date using the locale's medium length format. */
public static String mediumFormat(Date dt) {
ensureInited();
return dateFormatter.mediumFormat(dt);
}
private static void ensureInited() {
if (dateFormatter == null) {
setPreferences(Gerrit.getUserPreferences());
}
}
/** Format a date using git log's relative date format. */
public static String relativeFormat(Date dt) {
return RelativeDateFormatter.format(dt);
}
/**
* Formats an account as a name and an email address.
*
* <p>Example output:
*
* <ul>
* <li>{@code A U. Thor &lt;author@example.com&gt;}: full populated
* <li>{@code A U. Thor (12)}: missing email address
* <li>{@code Anonymous Coward &lt;author@example.com&gt;}: missing name
* <li>{@code Anonymous Coward (12)}: missing name and email address
* </ul>
*/
public static String nameEmail(AccountInfo info) {
return createAccountFormatter().nameEmail(info);
}
/**
* Formats an account name.
*
* <p>If the account has a full name, it returns only the full name. Otherwise it returns a longer
* form that includes the email address.
*/
public static String name(AccountInfo info) {
return createAccountFormatter().name(info);
}
private static AccountFormatter createAccountFormatter() {
return new AccountFormatter(Gerrit.info().user().anonymousCowardName());
}
/** The returned format string doesn't contain any +/- sign. */
public static String formatAbsBytes(long bytes) {
return formatBytes(bytes, true);
}
public static String formatBytes(long bytes) {
return formatBytes(bytes, false);
}
private static String formatBytes(long bytes, boolean abs) {
bytes = abs ? Math.abs(bytes) : bytes;
if (bytes == 0) {
return abs ? "0 B" : "+/- 0 B";
}
if (Math.abs(bytes) < 1024) {
return (bytes > 0 && !abs ? "+" : "") + bytes + " B";
}
int exp = (int) (Math.log(Math.abs(bytes)) / Math.log(1024));
return (bytes > 0 && !abs ? "+" : "")
+ NumberFormat.getFormat("#.0").format(bytes / Math.pow(1024, exp))
+ " "
+ "KMGTPE".charAt(exp - 1)
+ "iB";
}
public static String formatPercentage(long size, long delta) {
if (size == 0) {
return Resources.C.notAvailable();
}
return (delta > 0 ? "+" : "-") + formatAbsPercentage(size, delta);
}
public static String formatAbsPercentage(long size, long delta) {
if (size == 0) {
return Resources.C.notAvailable();
}
long percentage = Math.abs(Math.round(delta * 100.0 / size));
return percentage + "%";
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,199 +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;
import com.google.gwt.i18n.client.Constants;
public interface GerritConstants extends Constants {
String menuSignIn();
String menuRegister();
String reportBug();
String loadingPlugins();
String signInDialogTitle();
String signInDialogGoAnonymous();
String linkIdentityDialogTitle();
String registerDialogTitle();
String loginTypeUnsupported();
String errorTitle();
String errorDialogContinue();
String warnTitle();
String confirmationDialogOk();
String confirmationDialogCancel();
String branchCreationDialogTitle();
String branchCreationConfirmationMessage();
String tagCreationDialogTitle();
String tagCreationConfirmationMessage();
String branchDeletionDialogTitle();
String branchDeletionConfirmationMessage();
String tagDeletionDialogTitle();
String tagDeletionConfirmationMessage();
String newUi();
String notSignedInTitle();
String notSignedInBody();
String notFoundTitle();
String notFoundBody();
String noSuchAccountTitle();
String noSuchGroupTitle();
String inactiveAccountBody();
String labelNotApplicable();
String menuAll();
String menuAllOpen();
String menuAllMerged();
String menuAllAbandoned();
String menuMine();
String menuMyChanges();
String menuMyWatchedChanges();
String menuMyStarredChanges();
String menuMyDraftComments();
String menuDiff();
String menuDiffCommit();
String menuDiffPreferences();
String menuDiffPatchSets();
String menuDiffFiles();
String menuProjects();
String menuProjectsList();
String menuProjectsInfo();
String menuProjectsBranches();
String menuProjectsTags();
String menuProjectsAccess();
String menuProjectsDashboards();
String menuProjectsCreate();
String menuPeople();
String menuPeopleGroupsList();
String menuPeopleGroupsCreate();
String menuPlugins();
String menuPluginsInstalled();
String menuDocumentation();
String menuDocumentationTOC();
String menuDocumentationSearch();
String menuDocumentationUpload();
String menuDocumentationAccess();
String menuDocumentationAPI();
String menuDocumentationProjectOwnerGuide();
String searchHint();
String searchButton();
String rpcStatusWorking();
String sectionNavigation();
String sectionActions();
String keySearch();
String keyEditor();
String keyHelp();
String sectionJumping();
String jumpAllOpen();
String jumpAllMerged();
String jumpAllAbandoned();
String jumpMine();
String jumpMineWatched();
String jumpMineStarred();
String jumpMineDraftComments();
String projectAccessError();
String projectAccessProposeForReviewHint();
String userCannotVoteToolTip();
String stringListPanelAdd();
String stringListPanelDelete();
String stringListPanelUp();
String stringListPanelDown();
String searchDropdownChanges();
String searchDropdownDoc();
}

View File

@ -1,121 +0,0 @@
menuSignIn = Sign In
menuRegister = Register
reportBug = Report Bug
loadingPlugins = Loading plugins ...
signInDialogTitle = Code Review - Sign In
signInDialogGoAnonymous = Go Anonymous
linkIdentityDialogTitle = Code Review - Link Identity
registerDialogTitle = Code Review - Register New Account
loginTypeUnsupported = Sign in is not available.
errorTitle = Code Review - Error
errorDialogContinue = Continue
warnTitle = Code Review - Warning
confirmationDialogOk = OK
confirmationDialogCancel = Cancel
branchCreationDialogTitle = Branch Creation
branchCreationConfirmationMessage = The following branch was successfully created:
tagCreationDialogTitle = Tag Creation
tagCreationConfirmationMessage = The following tag was successfully created:
branchDeletionDialogTitle = Branch Deletion
branchDeletionConfirmationMessage = Do you really want to delete the following branches?
tagDeletionDialogTitle = Tag Deletion
tagDeletionConfirmationMessage = Do you really want to delete the following tags?
newUi = Switch to New UI
notSignedInTitle = Code Review - Session Expired
notSignedInBody = <b>Session Expired</b>\
<p>You are no longer signed in to Gerrit Code Review.</p>\
<p>To continue, please sign-in again.</p>
notFoundTitle = Not Found
notFoundBody = The page you requested was not found, or you do not have permission to view this page.
noSuchAccountTitle = Code Review - Unknown User
noSuchGroupTitle = Code Review - Unknown Group
inactiveAccountBody = This user is currently inactive.
labelNotApplicable = Label not applicable
menuAll = All
menuAllOpen = Open
menuAllMerged = Merged
menuAllAbandoned = Abandoned
menuMine = My
menuMyChanges = Changes
menuMyStarredChanges = Starred Changes
menuMyWatchedChanges = Watched Changes
menuMyDraftComments = Draft Comments
menuDiff = Differences
menuDiffCommit = Commit Message
menuDiffPreferences = Preferences
menuDiffPatchSets = Patch Sets
menuDiffFiles = Files
menuProjects = Projects
menuProjectsList = List
menuProjectsInfo = General
menuProjectsBranches = Branches
menuProjectsTags = Tags
menuProjectsAccess = Access
menuProjectsDashboards = Dashboards
menuProjectsCreate = Create New Project
menuPeople = People
menuPeopleGroupsList = List Groups
menuPeopleGroupsCreate = Create New Group
menuPlugins = Plugins
menuPluginsInstalled = Installed
menuDocumentation = Documentation
menuDocumentationTOC = Table of Contents
menuDocumentationSearch = Searching
menuDocumentationUpload = Uploading
menuDocumentationAccess = Access Controls
menuDocumentationAPI = REST API
menuDocumentationProjectOwnerGuide = Project Owner Guide
searchHint = Search term
searchButton = Search
rpcStatusWorking = Working ...
sectionNavigation = Navigation
sectionActions = Actions
keySearch = Search
keyEditor = Open Inline Editor
keyHelp = Press '?' to view keyboard shortcuts
sectionJumping = Jumping
jumpAllOpen = Go to all open changes
jumpAllMerged = Go to all merged changes
jumpAllAbandoned = Go to all abandoned changes
jumpMine = Go to my dashboard
jumpMineWatched = Go to watched changes
jumpMineStarred = Go to starred changes
jumpMineDraftComments = Go to draft comments
projectAccessError = You don't have permissions to modify the access rights for the following refs:
projectAccessProposeForReviewHint = You may propose these modifications to the project owners by clicking on 'Save for Review'.
userCannotVoteToolTip = User cannot vote in this category
stringListPanelAdd = Add
stringListPanelDelete = Delete
stringListPanelUp = Up
stringListPanelDown = Down
searchDropdownChanges = Changes
searchDropdownDoc = Docs

View File

@ -1,299 +0,0 @@
// Copyright (C) 2009 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;
import com.google.gwt.resources.client.CssResource;
public interface GerritCss extends CssResource {
String accountDashboard();
String accountInfoBlock();
String accountLinkPanel();
String accountPassword();
String accountUsername();
String activeRow();
String addBranch();
String addMemberTextBox();
String addSshKeyPanel();
String addWatchPanel();
String avatarInfoPanel();
String bottomheader();
String branchTableDeleteButton();
String branchTablePrevNextLinks();
String cAPPROVAL();
String cASSIGNEE();
String cASSIGNEDTOME();
String cLastUpdate();
String cOWNER();
String cSIZE();
String cSUBJECT();
String cSTATUS();
String changeSize();
String changeTable();
String changeTablePrevNextLinks();
String commentedActionDialog();
String commentedActionMessage();
String contributorAgreementAlreadySubmitted();
String contributorAgreementButton();
String contributorAgreementLegal();
String contributorAgreementShortDescription();
String createProjectPanel();
String dataCell();
String dataCellHidden();
String dataHeader();
String dataHeaderHidden();
String downloadBox();
String downloadBoxTable();
String downloadBoxTableCommandColumn();
String downloadBoxSpacer();
String downloadBoxScheme();
String downloadBoxCopyLabel();
String downloadLink();
String downloadLinkCopyLabel();
String downloadLinkHeader();
String downloadLinkHeaderGap();
String downloadLinkList();
String downloadLink_Active();
String editHeadButton();
String emptySection();
String errorDialog();
String errorDialogButtons();
String errorDialogErrorType();
String errorDialogGlass();
String errorDialogTitle();
String extensionPanel();
String loadingPluginsDialog();
String gerritBody();
String gerritTopMenu();
String greenCheckClass();
String groupDescriptionPanel();
String groupIncludesTable();
String groupMembersTable();
String groupName();
String groupNamePanel();
String groupNameTextBox();
String groupOptionsPanel();
String groupOwnerPanel();
String groupOwnerTextBox();
String groupUUIDPanel();
String header();
String iconCell();
String iconHeader();
String identityUntrustedExternalId();
String infoBlock();
String inputFieldTypeHint();
String labelNotApplicable();
String leftMostCell();
String link();
String linkMenuBar();
String linkMenuItemNotLast();
String maxObjectSizeLimitEffectiveLabel();
String menuBarUserName();
String menuBarUserNameAvatar();
String menuBarUserNameFocusPanel();
String menuBarUserNamePanel();
String menuItem();
String menuScreenMenuBar();
String needsReview();
String negscore();
String oauthExpires();
String oauthInfoBlock();
String oauthPanel();
String oauthPanelCookieEntry();
String oauthPanelCookieHeading();
String oauthPanelNetRCEntry();
String oauthPanelNetRCHeading();
String oauthToken();
String pagingLink();
String patchSetActions();
String pluginProjectConfigInheritedValue();
String pluginsTable();
String posscore();
String projectActions();
String projectFilterLabel();
String projectFilterPanel();
String projectNameColumn();
String queryIcon();
String rebaseContentPanel();
String rebaseSuggestBox();
String registerScreenExplain();
String registerScreenNextLinks();
String registerScreenSection();
String rpcStatus();
String screen();
String screenHeader();
String searchPanel();
String suggestBoxPopup();
String sectionHeader();
String singleLine();
String smallHeading();
String specialBranchDataCell();
String specialBranchIconCell();
String sshHostKeyPanel();
String sshHostKeyPanelFingerprintData();
String sshHostKeyPanelHeading();
String sshHostKeyPanelKnownHostEntry();
String sshKeyPanelEncodedKey();
String sshKeyPanelInvalid();
String sshKeyTable();
String stringListPanelButtons();
String topmenu();
String topmenuMenuLeft();
String topmenuMenuRight();
String topmenuTDglue();
String topmenuTDmenu();
String topmost();
String userInfoPopup();
String usernameField();
String watchedProjectFilter();
}

View File

@ -1,51 +0,0 @@
// Copyright (C) 2009 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;
import com.google.gwt.i18n.client.Messages;
public interface GerritMessages extends Messages {
String windowTitle1(String hostname);
String windowTitle2(String section, String hostname);
String poweredBy(String version);
String noSuchAccountMessage(String who);
String noSuchGroupMessage(String who);
String nameAlreadyUsedBody(String alreadyUsedName);
String branchCreationFailed(String branchName, String error);
String invalidBranchName(String branchName);
String invalidRevision(String revision);
String branchCreationNotAllowedUnderRefnamePrefix(String refnamePrefix);
String branchAlreadyExists(String branchName);
String branchCreationConflict(String branchName, String existingBranchName);
String pluginFailed(String scriptPath);
String cannotDownloadPlugin(String scriptPath);
String parentUpdateFailed(String message);
String fileCount(int fileNumber, int fileCount);
}

Some files were not shown because too many files have changed in this diff Show More