Merge branch 'stable-3.0'
* stable-3.0:
Replace bazel-genfiles with bazel-bin in documentation
Upgrade bazlets to latest stable-3.0 to build with 3.0.3 API
Bump bazel version to 1.0.0
Add PolyGerrit UI for configuring uploadvalidator
Upgrade bazlets to latest stable-2.16 to build with 2.16.12 API
Upgrade bazlets to latest stable-2.15 to build with 2.15.17 API
Change-Id: I3ecff8a2a67826addcbc2e2e8622541cd9cc39df
diff --git a/.bazelversion b/.bazelversion
index 25939d3..3eefcb9 100644
--- a/.bazelversion
+++ b/.bazelversion
@@ -1 +1 @@
-0.29.1
+1.0.0
diff --git a/BUILD b/BUILD
index 4ae3ed0..414863f 100644
--- a/BUILD
+++ b/BUILD
@@ -9,6 +9,7 @@
"Gerrit-PluginName: uploadvalidator",
"Gerrit-ApiVersion: 3.0-SNAPSHOT",
"Gerrit-Module: com.googlesource.gerrit.plugins.uploadvalidator.Module",
+ "Gerrit-HttpModule: com.googlesource.gerrit.plugins.uploadvalidator.HttpModule",
],
resources = glob(["src/main/resources/**/*"]),
)
diff --git a/src/main/java/com/googlesource/gerrit/plugins/uploadvalidator/HttpModule.java b/src/main/java/com/googlesource/gerrit/plugins/uploadvalidator/HttpModule.java
new file mode 100644
index 0000000..c5cc519
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/uploadvalidator/HttpModule.java
@@ -0,0 +1,29 @@
+// Copyright (C) 2019 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.googlesource.gerrit.plugins.uploadvalidator;
+
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.webui.JavaScriptPlugin;
+import com.google.gerrit.extensions.webui.WebUiPlugin;
+import com.google.gerrit.httpd.plugins.HttpPluginModule;
+
+public class HttpModule extends HttpPluginModule {
+
+ @Override
+ protected void configureServlets() {
+ DynamicSet.bind(binder(), WebUiPlugin.class)
+ .toInstance(new JavaScriptPlugin("gr-uploadvalidator.html"));
+ }
+}
diff --git a/src/main/resources/Documentation/build.md b/src/main/resources/Documentation/build.md
index 20b8cd1..3aafe70 100644
--- a/src/main/resources/Documentation/build.md
+++ b/src/main/resources/Documentation/build.md
@@ -21,7 +21,7 @@
The output is created in
```
- bazel-genfiles/@PLUGIN@.jar
+ bazel-bin/@PLUGIN@.jar
```
To package the plugin sources run:
@@ -69,7 +69,7 @@
The output is created in
```
- bazel-genfiles/plugins/@PLUGIN@/@PLUGIN@.jar
+ bazel-bin/plugins/@PLUGIN@/@PLUGIN@.jar
```
To execute the tests run:
diff --git a/src/main/resources/static/gr-uploadvalidator-config-table.html b/src/main/resources/static/gr-uploadvalidator-config-table.html
new file mode 100644
index 0000000..d688f01
--- /dev/null
+++ b/src/main/resources/static/gr-uploadvalidator-config-table.html
@@ -0,0 +1,63 @@
+<!--
+@license
+Copyright (C) 2019 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.
+-->
+
+<dom-module id="gr-uploadvalidator-config-table">
+ <template>
+ <style include="shared-styles"></style>
+ <style include="gr-table-styles">
+ .genericList {
+ margin-bottom: 1em;
+ }
+
+ input#newEntry {
+ width: 100%;
+ }
+ </style>
+ <fieldset>
+ <section>
+ <table class="genericList">
+ <tbody>
+ <template id="list" is="dom-repeat" items="{{entries}}">
+ <tr>
+ <td class="nameColumn">{{item}}</td>
+ <td class="deleteColumn">
+ <gr-button id="{{item}}"
+ class="deleteEntryButton"
+ on-click="_handleDeleteEntry">
+ Delete
+ </gr-button>
+ </td>
+ </tr>
+ </template>
+ <tr>
+ <td class="nameColumn">
+ <iron-input>
+ <input id="newEntry" type="text">
+ </iron-input>
+ </td>
+ <td class="deleteColumn">
+ <gr-button id="addEntry"
+ on-click="_handleAddEntry"
+ disabled="[[disabled]]">
+ Add
+ </gr-button>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </section>
+ </fieldset>
+ </template>
+ <script src="gr-uploadvalidator-config-table.js"></script>
+</dom-module>
diff --git a/src/main/resources/static/gr-uploadvalidator-config-table.js b/src/main/resources/static/gr-uploadvalidator-config-table.js
new file mode 100644
index 0000000..89d6bd9
--- /dev/null
+++ b/src/main/resources/static/gr-uploadvalidator-config-table.js
@@ -0,0 +1,57 @@
+// Copyright (C) 2019 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.
+
+(function () {
+ 'use strict';
+
+ Polymer({
+ is: 'gr-uploadvalidator-config-table',
+
+ properties: {
+ disabled: {
+ type: Boolean,
+ reflectToAttribute: true,
+ },
+ entries: {
+ type: Array,
+ value(){ return []; },
+ },
+ },
+
+ _handleAddEntry() {
+ if (this.$.newEntry.value === '') {
+ return;
+ }
+
+ if (!this.entries.includes(this.$.newEntry.value)) {
+ this.push('entries', this.$.newEntry.value);
+ this.fire('listChanged', {
+ entry: this.$.newEntry.value,
+ allEntries: this.entries,
+ });
+ } else {
+ this.fire('show-alert', {message: 'Value already exists.'});
+ }
+ this.$.newEntry.value = '';
+ },
+
+ _handleDeleteEntry(event) {
+ this.splice('entries', this.entries.indexOf(event.path[1].id), 1);
+ this.fire('listChanged', {
+ entry: event.target.id,
+ allEntries: this.entries.slice(),
+ });
+ },
+ })
+})();
diff --git a/src/main/resources/static/gr-uploadvalidator-config.html b/src/main/resources/static/gr-uploadvalidator-config.html
new file mode 100644
index 0000000..83f399b
--- /dev/null
+++ b/src/main/resources/static/gr-uploadvalidator-config.html
@@ -0,0 +1,189 @@
+<!--
+@license
+Copyright (C) 2019 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.
+-->
+
+<link rel="import" href="./gr-uploadvalidator-config-table.html">
+
+<dom-module id="gr-uploadvalidator-config">
+ <template>
+ <style include="shared-styles"></style>
+ <style include="gr-form-styles"></style>
+ <style>
+ .sectionTitle {
+ padding-top: 2em;
+ }
+ </style>
+ <fieldset class="gr-form-styles">
+ <h2 class="sectionTitle">Uploadvalidator Options</h2>
+ <section>
+ <section>
+ <h3>Author Email Pattern</h3>
+ <gr-uploadvalidator-config-table id="allowedAuthorEmailPattern"
+ entries=[[_changedConfig.allowedAuthorEmailPattern.values]]>
+ </gr-uploadvalidator-config-table>
+ </section>
+ <section>
+ <h3>Committer Email Pattern</h3>
+ <gr-uploadvalidator-config-table id="allowedCommitterEmailPattern"
+ entries=[[_changedConfig.allowedCommitterEmailPattern.values]]>
+ </gr-uploadvalidator-config-table>
+ </section>
+ <section>
+ <h3>Binary Types</h3>
+ <gr-uploadvalidator-config-table id="binaryTypes"
+ entries=[[_changedConfig.binaryTypes.values]]>
+ </gr-uploadvalidator-config-table>
+ </section>
+ <section>
+ <h3>Blocked Content</h3>
+ <span class="title">List Type</span>
+ <span class="value">
+ <gr-select id="blockedContentTypeWhitelist"
+ bind-value="{{_changedConfig.blockedContentTypeWhitelist.value}}"
+ on-change="_handlePrefsChanged">
+ <select>
+ <option value="true">Whitelist</option>
+ <option value="false">Blacklist</option>
+ </select>
+ </gr-select>
+ </span>
+ <gr-uploadvalidator-config-table id="blockedContentType"
+ entries=[[_changedConfig.blockedContentType.values]]>
+ </gr-uploadvalidator-config-table>
+ </section>
+ <section>
+ <h3>Blocked File Extensions</h3>
+ <gr-uploadvalidator-config-table id="blockedFileExtension"
+ entries=[[_changedConfig.blockedFileExtension.values]]>
+ </gr-uploadvalidator-config-table>
+ </section>
+ <section>
+ <h3>Blocked Keyword Pattern</h3>
+ <gr-uploadvalidator-config-table id="blockedKeywordPattern"
+ entries=[[_changedConfig.blockedKeywordPattern.values]]>
+ </gr-uploadvalidator-config-table>
+ </section>
+ <section>
+ <h3>Invalid Filename Pattern</h3>
+ <gr-uploadvalidator-config-table id="invalidFilenamePattern"
+ entries=[[_changedConfig.invalidFilenamePattern.values]]>
+ </gr-uploadvalidator-config-table>
+ </section>
+ <section>
+ <h3>Projects</h3>
+ <gr-uploadvalidator-config-table id="project"
+ entries=[[_changedConfig.project.values]]>
+ </gr-uploadvalidator-config-table>
+ </section>
+ <section>
+ <h3>Refs</h3>
+ <gr-uploadvalidator-config-table id="ref"
+ entries=[[_changedConfig.ref.values]]>
+ </gr-uploadvalidator-config-table>
+ </section>
+ <section>
+ <h3>Required Footers</h3>
+ <gr-uploadvalidator-config-table id="requiredFooter"
+ entries=[[_changedConfig.requiredFooter.values]]>
+ </gr-uploadvalidator-config-table>
+ </section>
+ <section>
+ <span class="title">Max Path Length</span>
+ <span class="value">
+ <iron-input bind-value="{{_changedConfig.maxPathLength.value}}">
+ <input id="maxPathLength"
+ value="{{_changedConfig.maxPathLength.value::input}}"
+ prevent-invalid-input
+ allowed-pattern="[0-9]"
+ type="number"
+ on-keypress="_handlePrefsChanged"
+ on-change="_handlePrefsChanged">
+ </iron-input>
+ </span>
+ </section>
+ <section>
+ <span class="title">Reject Duplicate Pathnames Locale</span>
+ <span class="value">
+ <gr-select id="rejectDuplicatePathnamesLocale"
+ bind-value="{{_changedConfig.rejectDuplicatePathnamesLocale.value}}"
+ on-change="_handlePrefsChanged">
+ <select>
+ <template is="dom-repeat"
+ items="[[_changedConfig.rejectDuplicatePathnamesLocale.permitted_values]]">
+ <option value="[[item]]">[[item]]</option>
+ </template>
+ </select>
+ </gr-select>
+ </span>
+ </section>
+ <section>
+ <span class="title">Reject Duplicate Pathnames</span>
+ <span class="value">
+ <gr-select id="rejectDuplicatePathnames"
+ bind-value="{{_changedConfig.rejectDuplicatePathnames.value}}"
+ on-change="_handlePrefsChanged">
+ <select>
+ <option value="true">True</option>
+ <option value="false">False</option>
+ </select>
+ </gr-select>
+ </span>
+ </section>
+ <section>
+ <span class="title">Reject Submodules</span>
+ <span class="value">
+ <gr-select id="rejectSubmodule"
+ bind-value="{{_changedConfig.rejectSubmodule.value}}"
+ on-change="_handlePrefsChanged">
+ <select>
+ <option value="true">True</option>
+ <option value="false">False</option>
+ </select>
+ </gr-select>
+ </span>
+ </section>
+ <section>
+ <span class="title">Reject Symbolic Links</span>
+ <span class="value">
+ <gr-select id="rejectSymlink"
+ bind-value="{{_changedConfig.rejectSymlink.value}}"
+ on-change="_handlePrefsChanged">
+ <select>
+ <option value="true">True</option>
+ <option value="false">False</option>
+ </select>
+ </gr-select>
+ </span>
+ </section>
+ <section>
+ <span class="title">Reject Windows Line Endings</span>
+ <span class="value">
+ <gr-select id="rejectWindowsLineEndings"
+ bind-value="{{_changedConfig.rejectWindowsLineEndings.value}}"
+ on-change="_handlePrefsChanged">
+ <select>
+ <option value="true">True</option>
+ <option value="false">False</option>
+ </select>
+ </gr-select>
+ </span>
+ </section>
+ <gr-button id="saveButton"
+ on-click="_handlePrefsSave"
+ disabled="[[!_prefsChanged]]">
+ Save Changes
+ </gr-button>
+ </fieldset>
+ </template>
+ <script src="gr-uploadvalidator-config.js"></script>
+</dom-module>
diff --git a/src/main/resources/static/gr-uploadvalidator-config.js b/src/main/resources/static/gr-uploadvalidator-config.js
new file mode 100644
index 0000000..508231c
--- /dev/null
+++ b/src/main/resources/static/gr-uploadvalidator-config.js
@@ -0,0 +1,79 @@
+// Copyright (C) 2019 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.
+
+(function () {
+ 'use strict';
+
+ Polymer({
+ is: 'gr-uploadvalidator-config',
+
+ properties: {
+ repoName: String,
+ _config: Object,
+ _changedConfig: Object,
+ _prefsChanged: {
+ type: Boolean,
+ value: false,
+ },
+ _projectRestApi: Object,
+ },
+
+ listeners: {
+ listChanged: '_handleListDataChanged',
+ },
+
+ attached() {
+ this._projectRestApi = this.plugin.restApi('/projects/');
+
+ this._getPreferences().then(() => {
+ this._changedConfig = Object.assign({}, this._config);
+ });
+ },
+
+ _getPreferences() {
+ return this._projectRestApi.get(`${this.repoName}/config`)
+ .then(config => {
+ if (!config) {
+ return;
+ }
+
+ if (config.plugin_config && config.plugin_config.uploadvalidator) {
+ this._config = config.plugin_config.uploadvalidator;
+ }
+ })
+ },
+
+ _handleListDataChanged(event) {
+ this._changedConfig[event.target.id] = { values: event.detail.allEntries };
+ this._handlePrefsChanged();
+ },
+
+ _handlePrefsChanged() {
+ this._prefsChanged = true;
+ },
+
+ _handlePrefsSave() {
+ let body = { plugin_config_values: {} };
+ body.plugin_config_values.uploadvalidator = this._changedConfig;
+
+ this._projectRestApi.put(`${this.repoName}/config`, body)
+ .then(() => {
+ this._prefsChanged = false;
+ }).catch(response => {
+ this.fire('show-error', { message: response });
+ });
+ },
+
+ });
+})();
diff --git a/src/main/resources/static/gr-uploadvalidator.html b/src/main/resources/static/gr-uploadvalidator.html
new file mode 100644
index 0000000..767915a
--- /dev/null
+++ b/src/main/resources/static/gr-uploadvalidator.html
@@ -0,0 +1,26 @@
+<!--
+@license
+Copyright (C) 2019 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.
+-->
+
+<link rel="import" href="./gr-uploadvalidator-config.html">
+
+<dom-module id="gr-uploadvalidator">
+ <script>
+ Gerrit.install(plugin => {
+ plugin.registerCustomComponent('repo-config', 'gr-uploadvalidator-config');
+ });
+ </script>
+</dom-module>