Merge branch 'stable-2.16'

* stable-2.16:
  Remove mention that H2 is not recommended for large installations
  Temp fix for projects list ordering in PolyGerrit
  EditInfo: Include the change edit ref
  Add missing documentation of base_patch_set_number in edit API
  Add postgresql/postgres/pgsql to mime list
  Build all languages for highlight.js
  Update git submodules
  Fix "stream has already been operated upon or closed"
  Merge top menu items contributed by plugins

Change-Id: I21aa77a4a068e16089709ee44a1fd2cf3d5b2c58
This commit is contained in:
Marco Miller
2019-01-07 17:30:08 -05:00
11 changed files with 228 additions and 20 deletions

View File

@@ -2593,7 +2593,9 @@ provided fetch info map is also included.
"subject":"Use an EventBus to manage star icons", "subject":"Use an EventBus to manage star icons",
"message":"Use an EventBus to manage star icons\n\nImage widgets that need to ..." "message":"Use an EventBus to manage star icons\n\nImage widgets that need to ..."
}, },
"base_revision":"c35558e0925e6985c91f3a16921537d5e572b7a3" "base_patch_set_number":1,
"base_revision":"c35558e0925e6985c91f3a16921537d5e572b7a3",
"ref":"refs/users/01/1000001/edit-76482/1"
} }
---- ----
@@ -4825,7 +4827,9 @@ resulting change edit is returned.
"subject":"Implement feature X", "subject":"Implement feature X",
"message":"Implement feature X\n\nWith this feature ..." "message":"Implement feature X\n\nWith this feature ..."
}, },
"base_patch_set_number":1,
"base_revision":"674ac754f91e64a0efb8087e59a176484bd534d1" "base_revision":"674ac754f91e64a0efb8087e59a176484bd534d1"
"ref":"refs/users/01/1000001/edit-42622/1"
} }
---- ----
@@ -6340,15 +6344,17 @@ The `EditInfo` entity contains information about a change edit.
[options="header",cols="1,^1,5"] [options="header",cols="1,^1,5"]
|=========================== |===========================
|Field Name ||Description |Field Name ||Description
|`commit` ||The commit of change edit as |`commit` ||The commit of change edit as
link:#commit-info[CommitInfo] entity. link:#commit-info[CommitInfo] entity.
|`base_revision`||The revision of the patch set the change edit is based on. |`base_patch_set_number`||The patch set number of the patch set the change edit is based on.
|`fetch` |optional| |`base_revision` ||The revision of the patch set the change edit is based on.
|`ref` ||The ref of the change edit.
|`fetch` |optional|
Information about how to fetch this patch set. The fetch information is Information about how to fetch this patch set. The fetch information is
provided as a map that maps the protocol name ("`git`", "`http`", provided as a map that maps the protocol name ("`git`", "`http`",
"`ssh`") to link:#fetch-info[FetchInfo] entities. "`ssh`") to link:#fetch-info[FetchInfo] entities.
|`files` |optional| |`files` |optional|
The files of the change edit as a map that maps the file names to The files of the change edit as a map that maps the file names to
link:#file-info[FileInfo] entities. link:#file-info[FileInfo] entities.
|=========================== |===========================

View File

@@ -364,7 +364,6 @@ public class GerritServer implements AutoCloseable {
daemon.setAuditEventModuleForTesting(new FakeGroupAuditService.Module()); daemon.setAuditEventModuleForTesting(new FakeGroupAuditService.Module());
daemon.setAdditionalSysModuleForTesting(testSysModule); daemon.setAdditionalSysModuleForTesting(testSysModule);
daemon.setEnableSshd(desc.useSsh()); daemon.setEnableSshd(desc.useSsh());
daemon.setSlave(isSlave(baseConfig));
if (desc.memory()) { if (desc.memory()) {
checkArgument(additionalArgs.length == 0, "cannot pass args to in-memory server"); checkArgument(additionalArgs.length == 0, "cannot pass args to in-memory server");
@@ -381,6 +380,7 @@ public class GerritServer implements AutoCloseable {
@Nullable InMemoryRepositoryManager inMemoryRepoManager) @Nullable InMemoryRepositoryManager inMemoryRepoManager)
throws Exception { throws Exception {
Config cfg = desc.buildConfig(baseConfig); Config cfg = desc.buildConfig(baseConfig);
daemon.setSlave(isSlave(baseConfig) || cfg.getBoolean("container", "slave", false));
mergeTestConfig(cfg); mergeTestConfig(cfg);
// Set the log4j configuration to an invalid one to prevent system logs // Set the log4j configuration to an invalid one to prevent system logs
// from getting configured and creating log files. // from getting configured and creating log files.

View File

@@ -20,6 +20,7 @@ public class EditInfo {
public CommitInfo commit; public CommitInfo commit;
public int basePatchSetNumber; public int basePatchSetNumber;
public String baseRevision; public String baseRevision;
public String ref;
public Map<String, FetchInfo> fetch; public Map<String, FetchInfo> fetch;
public Map<String, FileInfo> files; public Map<String, FileInfo> files;
} }

View File

@@ -53,6 +53,7 @@ public class ChangeEditJson {
out.commit = fillCommit(edit.getEditCommit()); out.commit = fillCommit(edit.getEditCommit());
out.baseRevision = edit.getBasePatchSet().getRevision().get(); out.baseRevision = edit.getBasePatchSet().getRevision().get();
out.basePatchSetNumber = edit.getBasePatchSet().getPatchSetId(); out.basePatchSetNumber = edit.getBasePatchSet().getPatchSetId();
out.ref = edit.getRefName();
if (downloadCommands) { if (downloadCommands) {
out.fetch = fillFetchMap(edit); out.fetch = fillFetchMap(edit);
} }

View File

@@ -22,6 +22,7 @@ import static com.google.gerrit.reviewdb.client.RefNames.REFS_USERS_SELF;
import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.toMap; import static java.util.stream.Collectors.toMap;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.common.flogger.FluentLogger; import com.google.common.flogger.FluentLogger;
@@ -58,7 +59,6 @@ import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Stream;
import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Ref;
@@ -365,17 +365,17 @@ class DefaultRefFilter {
private Map<Change.Id, Branch.NameKey> visibleChangesByScan(Repository repo) private Map<Change.Id, Branch.NameKey> visibleChangesByScan(Repository repo)
throws PermissionBackendException { throws PermissionBackendException {
Project.NameKey p = projectState.getNameKey(); Project.NameKey p = projectState.getNameKey();
Stream<ChangeNotesResult> s; ImmutableList<ChangeNotesResult> changes;
try { try {
s = changeNotesFactory.scan(repo, p); changes = changeNotesFactory.scan(repo, p).collect(toImmutableList());
} catch (IOException e) { } catch (IOException e) {
logger.atSevere().withCause(e).log( logger.atSevere().withCause(e).log(
"Cannot load changes for project %s, assuming no changes are visible", p); "Cannot load changes for project %s, assuming no changes are visible", p);
return Collections.emptyMap(); return Collections.emptyMap();
} }
Map<Change.Id, Branch.NameKey> result = Maps.newHashMapWithExpectedSize((int) s.count()); Map<Change.Id, Branch.NameKey> result = Maps.newHashMapWithExpectedSize(changes.size());
for (ChangeNotesResult notesResult : s.collect(toImmutableList())) { for (ChangeNotesResult notesResult : changes) {
ChangeNotes notes = toNotes(notesResult); ChangeNotes notes = toNotes(notesResult);
if (notes != null) { if (notes != null) {
result.put(notes.getChangeId(), notes.getChange().getDest()); result.put(notes.getChangeId(), notes.getChange().getDest());

View File

@@ -17,6 +17,7 @@ package com.google.gerrit.server.restapi.project;
import com.google.common.collect.ListMultimap; import com.google.common.collect.ListMultimap;
import com.google.common.flogger.FluentLogger; import com.google.common.flogger.FluentLogger;
import com.google.gerrit.common.Nullable; import com.google.gerrit.common.Nullable;
import com.google.gerrit.extensions.api.GerritApi;
import com.google.gerrit.extensions.registration.DynamicMap; import com.google.gerrit.extensions.registration.DynamicMap;
import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.BadRequestException;
@@ -26,6 +27,7 @@ import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestApiException; import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.RestCollection; import com.google.gerrit.extensions.restapi.RestCollection;
import com.google.gerrit.extensions.restapi.RestReadView;
import com.google.gerrit.extensions.restapi.RestView; import com.google.gerrit.extensions.restapi.RestView;
import com.google.gerrit.extensions.restapi.TopLevelResource; import com.google.gerrit.extensions.restapi.TopLevelResource;
import com.google.gerrit.extensions.restapi.UnprocessableEntityException; import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
@@ -42,7 +44,9 @@ import com.google.inject.Inject;
import com.google.inject.Provider; import com.google.inject.Provider;
import com.google.inject.Singleton; import com.google.inject.Singleton;
import java.io.IOException; import java.io.IOException;
import java.util.List;
import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.Constants;
import org.kohsuke.args4j.Option;
@Singleton @Singleton
public class ProjectsCollection public class ProjectsCollection
@@ -51,23 +55,27 @@ public class ProjectsCollection
private final DynamicMap<RestView<ProjectResource>> views; private final DynamicMap<RestView<ProjectResource>> views;
private final Provider<ListProjects> list; private final Provider<ListProjects> list;
private final Provider<GerritApi> gApi;
private final Provider<QueryProjects> queryProjects; private final Provider<QueryProjects> queryProjects;
private final ProjectCache projectCache; private final ProjectCache projectCache;
private final PermissionBackend permissionBackend; private final PermissionBackend permissionBackend;
private final Provider<CurrentUser> user; private final Provider<CurrentUser> user;
private boolean hasQuery; private boolean hasQuery;
private boolean isDisplayActiveAndReadonlyQuery;
@Inject @Inject
public ProjectsCollection( public ProjectsCollection(
DynamicMap<RestView<ProjectResource>> views, DynamicMap<RestView<ProjectResource>> views,
Provider<ListProjects> list, Provider<ListProjects> list,
Provider<GerritApi> gApi,
Provider<QueryProjects> queryProjects, Provider<QueryProjects> queryProjects,
ProjectCache projectCache, ProjectCache projectCache,
PermissionBackend permissionBackend, PermissionBackend permissionBackend,
Provider<CurrentUser> user) { Provider<CurrentUser> user) {
this.views = views; this.views = views;
this.list = list; this.list = list;
this.gApi = gApi;
this.queryProjects = queryProjects; this.queryProjects = queryProjects;
this.projectCache = projectCache; this.projectCache = projectCache;
this.permissionBackend = permissionBackend; this.permissionBackend = permissionBackend;
@@ -78,11 +86,62 @@ public class ProjectsCollection
public void setParams(ListMultimap<String, String> params) throws BadRequestException { public void setParams(ListMultimap<String, String> params) throws BadRequestException {
// The --query option is defined in QueryProjects // The --query option is defined in QueryProjects
this.hasQuery = params.containsKey("query"); this.hasQuery = params.containsKey("query");
List<String> queryParams = params.get("query");
this.isDisplayActiveAndReadonlyQuery =
queryParams.size() == 1
&& queryParams.get(0).toLowerCase().trim().equals("state:active or state:read-only");
} }
@Override @Override
public RestView<TopLevelResource> list() { public RestView<TopLevelResource> list() {
if (hasQuery) { if (hasQuery) {
// Temporary workaround for v2.16. Should be removed as soon as the Projects Lucene Index
// sorting is fixed
if (isDisplayActiveAndReadonlyQuery) {
return new RestReadView<TopLevelResource>() {
private int limit;
private int start;
@Option(
name = "--limit",
aliases = {"-n"},
metaVar = "CNT",
usage = "maximum number of projects to list")
public void setLimit(int limit) {
this.limit = limit;
}
@Option(
name = "--start",
aliases = {"-S"},
metaVar = "CNT",
usage = "number of projects to skip")
public void setStart(int start) {
this.start = start;
}
@SuppressWarnings("unused")
@Option(
name = "--query",
aliases = {"-q"},
usage = "project query")
public void setQuery(String query) {
// Explicitly ignored because this fix is for full listing only
}
@Override
public Object apply(TopLevelResource resource)
throws AuthException, BadRequestException, ResourceConflictException, Exception {
return gApi.get()
.projects()
.list()
.withDescription(true)
.withStart(start)
.withLimit(limit)
.get();
}
};
}
return queryProjects.get(); return queryProjects.get();
} }
return list.get().setFormat(OutputFormat.JSON); return list.get().setFormat(OutputFormat.JSON);

View File

@@ -338,7 +338,17 @@ public class RefAdvertisementIT extends AbstractDaemonTest {
} }
@Test @Test
public void uploadPackNoSearchingChangeCacheImpl() throws Exception { public void uploadPackNoSearchingChangeCacheImplMaster() throws Exception {
uploadPackNoSearchingChangeCacheImpl();
}
@Test
@GerritConfig(name = "container.slave", value = "true")
public void uploadPackNoSearchingChangeCacheImplSlave() throws Exception {
uploadPackNoSearchingChangeCacheImpl();
}
private void uploadPackNoSearchingChangeCacheImpl() throws Exception {
allow("refs/heads/*", Permission.READ, REGISTERED_USERS); allow("refs/heads/*", Permission.READ, REGISTERED_USERS);
setApiUser(user); setApiUser(user);

View File

@@ -179,11 +179,16 @@
}, },
_computeLinks(defaultLinks, userLinks, adminLinks, topMenus, docBaseUrl) { _computeLinks(defaultLinks, userLinks, adminLinks, topMenus, docBaseUrl) {
const links = defaultLinks.slice(); const links = defaultLinks.map(menu => {
return {
title: menu.title,
links: menu.links.slice(),
};
});
if (userLinks && userLinks.length > 0) { if (userLinks && userLinks.length > 0) {
links.push({ links.push({
title: 'Your', title: 'Your',
links: userLinks, links: userLinks.slice(),
}); });
} }
const docLinks = this._getDocLinks(docBaseUrl, DOCUMENTATION_LINKS); const docLinks = this._getDocLinks(docBaseUrl, DOCUMENTATION_LINKS);
@@ -196,13 +201,20 @@
} }
links.push({ links.push({
title: 'Browse', title: 'Browse',
links: adminLinks, links: adminLinks.slice(),
}); });
const topMenuLinks = [];
links.forEach(link => { topMenuLinks[link.title] = link.links; });
for (const m of topMenus) { for (const m of topMenus) {
links.push({ const items = m.items.map(this._fixCustomMenuItem);
title: m.name, if (m.name in topMenuLinks) {
links: m.items.map(this._fixCustomMenuItem), items.forEach(link => { topMenuLinks[m.name].push(link); });
}); } else {
links.push({
title: m.name,
links: topMenuLinks[m.name] = items,
});
}
} }
return links; return links;
}, },

View File

@@ -191,6 +191,121 @@ limitations under the License.
}]); }]);
}); });
test('merge top menus', () => {
const adminLinks = [{
name: 'Repos',
url: '/repos',
}];
const topMenus = [{
name: 'Plugins',
items: [{
name: 'Manage',
target: '_blank',
url: 'https://gerrit/plugins/plugin-manager/static/index.html',
}],
}, {
name: 'Plugins',
items: [{
name: 'Create',
target: '_blank',
url: 'https://gerrit/plugins/plugin-manager/static/create.html',
}],
}];
assert.deepEqual(element._computeLinks([], [], adminLinks, topMenus), [{
title: 'Browse',
links: adminLinks,
}, {
title: 'Plugins',
links: [{
name: 'Manage',
external: true,
url: 'https://gerrit/plugins/plugin-manager/static/index.html',
}, {
name: 'Create',
external: true,
url: 'https://gerrit/plugins/plugin-manager/static/create.html',
}],
}]);
});
test('merge top menus in default links', () => {
const defaultLinks = [{
title: 'Faves',
links: [{
name: 'Pinterest',
url: 'https://pinterest.com',
}],
}];
const topMenus = [{
name: 'Faves',
items: [{
name: 'Manage',
target: '_blank',
url: 'https://gerrit/plugins/plugin-manager/static/index.html',
}],
}];
assert.deepEqual(element._computeLinks(defaultLinks, [], [], topMenus), [{
title: 'Faves',
links: defaultLinks[0].links.concat([{
name: 'Manage',
external: true,
url: 'https://gerrit/plugins/plugin-manager/static/index.html',
}]),
}, {
title: 'Browse',
links: [],
}]);
});
test('merge top menus in user links', () => {
const userLinks = [{
name: 'Facebook',
url: 'https://facebook.com',
}];
const topMenus = [{
name: 'Your',
items: [{
name: 'Manage',
target: '_blank',
url: 'https://gerrit/plugins/plugin-manager/static/index.html',
}],
}];
assert.deepEqual(element._computeLinks([], userLinks, [], topMenus), [{
title: 'Your',
links: userLinks.concat([{
name: 'Manage',
external: true,
url: 'https://gerrit/plugins/plugin-manager/static/index.html',
}]),
}, {
title: 'Browse',
links: [],
}]);
});
test('merge top menus in admin links', () => {
const adminLinks = [{
name: 'Repos',
url: '/repos',
}];
const topMenus = [{
name: 'Browse',
items: [{
name: 'Manage',
target: '_blank',
url: 'https://gerrit/plugins/plugin-manager/static/index.html',
}],
}];
assert.deepEqual(element._computeLinks([], [], adminLinks, topMenus), [{
title: 'Browse',
links: adminLinks.concat([{
name: 'Manage',
external: true,
url: 'https://gerrit/plugins/plugin-manager/static/index.html',
}]),
}]);
});
test('register URL', () => { test('register URL', () => {
const config = { const config = {
auth: { auth: {

View File

@@ -63,6 +63,7 @@
'text/x-objectivec': 'objectivec', 'text/x-objectivec': 'objectivec',
'text/x-ocaml': 'ocaml', 'text/x-ocaml': 'ocaml',
'text/x-perl': 'perl', 'text/x-perl': 'perl',
'text/x-pgsql': 'pgsql', // postgresql
'text/x-php': 'php', 'text/x-php': 'php',
'text/x-protobuf': 'protobuf', 'text/x-protobuf': 'protobuf',
'text/x-puppet': 'puppet', 'text/x-puppet': 'puppet',

View File

@@ -149,6 +149,7 @@ pas = text/x-pascal
patch = text/x-diff patch = text/x-diff
pcss = text/x-pcss pcss = text/x-pcss
pgp = application/pgp pgp = application/pgp
pgsql = text/x-pgsql
php = text/x-php php = text/x-php
php3 = text/x-php php3 = text/x-php
php4 = text/x-php php4 = text/x-php
@@ -159,6 +160,8 @@ pig = text/x-pig
pl = text/x-perl pl = text/x-perl
pls = text/x-plsql pls = text/x-plsql
pm = text/x-perl pm = text/x-perl
postgres = text/x-pgsql
postgresql = text/x-pgsql
pp = text/x-puppet pp = text/x-puppet
pro = text/x-idl pro = text/x-idl
properties = text/x-ini properties = text/x-ini