Skip to content

Commit 97bbd7e

Browse files
committed
refresh group lists in project message handling
fixes #1769
1 parent c57bc5a commit 97bbd7e

File tree

4 files changed

+85
-13
lines changed

4 files changed

+85
-13
lines changed

src/org/opensolaris/opengrok/configuration/RuntimeEnvironment.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1285,8 +1285,10 @@ private void generateProjectRepositoriesMap() throws IOException {
12851285

12861286
/**
12871287
* Classifies projects and puts them in their groups.
1288+
* @param groups groups to update
1289+
* @param projects projects to classify
12881290
*/
1289-
private void populateGroups(Set<Group> groups, Set<Project> projects) {
1291+
public void populateGroups(Set<Group> groups, Set<Project> projects) {
12901292
if (projects == null || groups == null) {
12911293
return;
12921294
}
@@ -1326,7 +1328,7 @@ public void setConfiguration(Configuration configuration, List<String> subFileLi
13261328
} catch (IOException ex) {
13271329
LOGGER.log(Level.SEVERE, "Cannot generate project - repository map", ex);
13281330
}
1329-
populateGroups(getGroups(), new TreeSet<Project>(getProjects().values()));
1331+
populateGroups(getGroups(), new TreeSet<>(getProjects().values()));
13301332
if (subFileList != null) {
13311333
HistoryGuru.getInstance().invalidateRepositories(
13321334
configuration.getRepositories(), subFileList);

src/org/opensolaris/opengrok/configuration/messages/ProjectMessage.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,13 @@
2828
import java.util.ArrayList;
2929
import java.util.List;
3030
import java.util.Map;
31+
import java.util.Set;
32+
import java.util.TreeSet;
3133
import java.util.logging.Level;
3234
import java.util.logging.Logger;
3335
import java.util.stream.Collector;
3436
import java.util.stream.Collectors;
37+
import org.opensolaris.opengrok.configuration.Group;
3538
import org.opensolaris.opengrok.configuration.Project;
3639
import org.opensolaris.opengrok.configuration.RuntimeEnvironment;
3740
import org.opensolaris.opengrok.history.HistoryGuru;
@@ -41,6 +44,7 @@
4144
import org.opensolaris.opengrok.index.IndexDatabase;
4245
import org.opensolaris.opengrok.logger.LoggerFactory;
4346
import org.opensolaris.opengrok.util.IOUtils;
47+
import org.opensolaris.opengrok.web.ProjectHelper;
4448

4549

4650
/**
@@ -123,11 +127,17 @@ protected byte[] applyMessage(RuntimeEnvironment env) throws Exception {
123127
// Note that the project is inactive in the UI until it is indexed.
124128
// See {@code isIndexed()}
125129
env.getProjects().put(projectName, project);
130+
131+
Set<Project> projectSet = new TreeSet<>();
132+
projectSet.add(project);
133+
env.populateGroups(env.getGroups(), projectSet);
126134
} else {
127135
Project project = env.getProjects().get(projectName);
128136
Map<Project, List<RepositoryInfo>> map = env.getProjectRepositoriesMap();
129137

130-
// Refresh the list of repositories.
138+
// Refresh the list of repositories of this project.
139+
// This is the goal of this action: if an existing project
140+
// is re-added, this means its list of repositories has changed.
131141
List<RepositoryInfo> repos = getRepositoriesInDir(env, projDir);
132142
List<RepositoryInfo> allrepos = env.getRepositories();
133143
synchronized (allrepos) {
@@ -156,7 +166,13 @@ protected byte[] applyMessage(RuntimeEnvironment env) throws Exception {
156166
throw new Exception("cannot get project \"" + projectName + "\"");
157167
}
158168

159-
LOGGER.log(Level.INFO, "deleting data for project " + projectName);
169+
LOGGER.log(Level.INFO, "deleting configuration for project " + projectName);
170+
171+
// Remove the project from its groups.
172+
for (Group group : proj.getGroups()) {
173+
group.getRepositories().remove(proj);
174+
group.getProjects().remove(proj);
175+
}
160176

161177
// Now remove the repositories associated with this project.
162178
List<RepositoryInfo> repos = env.getProjectRepositoriesMap().get(proj);
@@ -169,6 +185,7 @@ protected byte[] applyMessage(RuntimeEnvironment env) throws Exception {
169185
env.refreshSearcherManagerMap();
170186

171187
// Lastly, remove data associated with the project.
188+
LOGGER.log(Level.INFO, "deleting data for project " + projectName);
172189
for (String dirName: new String[]{
173190
IndexDatabase.INDEX_DIR, IndexDatabase.XREF_DIR}) {
174191

src/org/opensolaris/opengrok/web/ProjectHelper.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,10 +128,10 @@ public List<RepositoryInfo> getRepositoryInfo(Project p) {
128128
private void populateGroups() {
129129
groups.addAll(cfg.getEnv().getGroups());
130130
for (Project project : cfg.getEnv().getProjectList()) {
131-
// filterProjects only groups which match project's description
131+
// filterProjects() only adds groups which match project's name.
132132
Set<Group> copy = Group.matching(project, groups);
133133

134-
// if no group matches the project, add it to not-grouped projects
134+
// If no group matches the project, add it to not-grouped projects.
135135
if (copy.isEmpty()) {
136136
if (cfg.getEnv().getProjectRepositoriesMap().get(project) == null) {
137137
ungroupedProjects.add(project);

test/org/opensolaris/opengrok/configuration/messages/ProjectMessageTest.java

Lines changed: 60 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,17 @@
2626
import java.io.IOException;
2727
import java.util.ArrayList;
2828
import java.util.List;
29+
import java.util.Set;
2930
import java.util.TreeSet;
3031
import java.util.concurrent.ConcurrentHashMap;
32+
import java.util.stream.Collectors;
3133
import org.junit.After;
3234
import org.junit.Assert;
3335
import static org.junit.Assert.assertTrue;
3436
import org.junit.Assume;
3537
import org.junit.Before;
3638
import org.junit.Test;
39+
import org.opensolaris.opengrok.configuration.Group;
3740
import org.opensolaris.opengrok.configuration.Project;
3841
import org.opensolaris.opengrok.configuration.RuntimeEnvironment;
3942
import org.opensolaris.opengrok.history.GitRepository;
@@ -131,12 +134,24 @@ public void testValidate() {
131134

132135
@Test
133136
public void testAdd() throws Exception {
134-
// Add one project.
137+
Assert.assertTrue(env.getRepositories().isEmpty());
138+
Assert.assertTrue(env.getProjects().isEmpty());
139+
140+
// Add a group matching the project to be added.
141+
String groupName = "mercurialgroup";
142+
Group group = new Group(groupName, "mercurial.*");
143+
env.getGroups().add(group);
144+
Assert.assertTrue(env.hasGroups());
145+
Assert.assertEquals(1, env.getGroups().stream().
146+
filter(g -> g.getName().equals(groupName)).
147+
collect(Collectors.toSet()).size());
148+
Assert.assertEquals(0, group.getRepositories().size());
149+
Assert.assertEquals(0, group.getProjects().size());
150+
151+
// Prepare project addition.
135152
Message m = new ProjectMessage();
136153
m.setText("add");
137154
m.addTag("mercurial");
138-
Assert.assertTrue(env.getRepositories().isEmpty());
139-
Assert.assertTrue(env.getProjects().isEmpty());
140155

141156
// Add a sub-repository.
142157
File mercurialRoot = new File(repository.getSourceRoot() + File.separator + "mercurial");
@@ -146,16 +161,24 @@ public void testAdd() throws Exception {
146161
"clone", mercurialRoot.getAbsolutePath(),
147162
mercurialRoot.getAbsolutePath() + File.separator + "usr" + File.separator + "closed");
148163

164+
// Add the project.
149165
env.setScanningDepth(3);
150166
m.apply(env);
167+
168+
// Check that the project was added properly.
151169
Assert.assertTrue(env.getProjects().containsKey("mercurial"));
152170
Assert.assertEquals(1, env.getProjects().size());
153171
Assert.assertEquals(2, env.getRepositories().size());
172+
Assert.assertEquals(1, group.getRepositories().size());
173+
Assert.assertEquals(0, group.getProjects().size());
174+
Assert.assertEquals(1, group.getRepositories().stream().
175+
filter(p -> p.getName().equals("mercurial")).
176+
collect(Collectors.toSet()).size());
154177

155178
// Add more projects and check that they have been added incrementally.
156179
// At the same time, it checks that multiple projects can be added
157180
// with single message.
158-
m.setTags(new TreeSet<String>());
181+
m.setTags(new TreeSet<>());
159182
m.addTag("git");
160183
m.addTag("svn");
161184
m.apply(env);
@@ -195,13 +218,31 @@ public void testRepositoryRefresh() throws Exception {
195218
Assert.assertEquals(1, env.getProjectRepositoriesMap().get(Project.getProject(mercurialRoot)).size());
196219
}
197220

221+
/**
222+
* This test needs to perform indexing so that it can be verified that
223+
* the delete message handling performs removal of the index data.
224+
* @throws Exception
225+
*/
198226
@Test
199227
public void testDelete() throws Exception {
228+
String projectsToDelete[] = { "git", "svn" };
229+
200230
env.setCtags(System.getProperty(ctagsProperty, "ctags"));
201231

202232
assertTrue("No point in running indexer tests without valid ctags",
203233
RuntimeEnvironment.getInstance().validateExuberantCtags());
204234

235+
// Add a group matching the project to be added.
236+
String groupName = "gitgroup";
237+
Group group = new Group(groupName, "git.*");
238+
env.getGroups().add(group);
239+
Assert.assertTrue(env.hasGroups());
240+
Assert.assertEquals(1, env.getGroups().stream().
241+
filter(g -> g.getName().equals(groupName)).
242+
collect(Collectors.toSet()).size());
243+
Assert.assertEquals(0, group.getRepositories().size());
244+
Assert.assertEquals(0, group.getProjects().size());
245+
205246
// Firstly add some projects.
206247
Message m = new ProjectMessage();
207248
m.setText("add");
@@ -216,6 +257,13 @@ public void testDelete() throws Exception {
216257
Assert.assertEquals(3, env.getRepositories().size());
217258
Assert.assertEquals(3, env.getProjectRepositoriesMap().size());
218259

260+
// Check the group was populated properly.
261+
Assert.assertEquals(1, group.getRepositories().size());
262+
Assert.assertEquals(0, group.getProjects().size());
263+
Assert.assertEquals(1, group.getRepositories().stream().
264+
filter(p -> p.getName().equals("git")).
265+
collect(Collectors.toSet()).size());
266+
219267
// Run the indexer (ala 'indexpart') so that data directory is populated.
220268
ArrayList<String> subFiles = new ArrayList<>();
221269
subFiles.add("/git");
@@ -247,23 +295,28 @@ public void testDelete() throws Exception {
247295
// Then remove multiple projects.
248296
m.setText("delete");
249297
m.setTags(new TreeSet<String>());
250-
m.addTag("git");
251-
m.addTag("svn");
298+
for (String p : projectsToDelete) {
299+
m.addTag(p);
300+
}
252301
m.apply(env);
253302
Assert.assertEquals(1, env.getProjects().size());
254303
Assert.assertEquals(1, env.getRepositories().size());
255304
Assert.assertEquals(1, env.getProjectRepositoriesMap().size());
256305

257306
// Test data removal.
258307
File dataRoot = env.getDataRootFile();
259-
for (String projectName : new String[]{"git", "svn"}) {
308+
for (String projectName : projectsToDelete) {
260309
for (String dirName : new String[]{"historycache",
261310
IndexDatabase.XREF_DIR, IndexDatabase.INDEX_DIR}) {
262311
File dir = new File(env.getDataRootFile(),
263312
dirName + File.separator + projectName);
264313
Assert.assertFalse(dir.exists());
265314
}
266315
}
316+
317+
// Check the group no longer contains the removed project.
318+
Assert.assertEquals(0, group.getRepositories().size());
319+
Assert.assertEquals(0, group.getProjects().size());
267320
}
268321

269322
@Test

0 commit comments

Comments
 (0)