Skip to content

Commit 5c1fc40

Browse files
author
Vladimir Kotal
committed
add API endpoint to delete project index data
1 parent c23e686 commit 5c1fc40

File tree

2 files changed

+48
-14
lines changed

2 files changed

+48
-14
lines changed

apiary.apib

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,17 @@ and suggester data.
145145

146146
+ Response 204
147147

148+
## Project data management [/projects/{project}/data]
149+
150+
### delete project index data [DELETE]
151+
152+
This will delete project index data but keep the project in web application configuration so that
153+
can be indexed from scratch.
154+
The project data (whatever is the project's directory under source root) will be left intact.
155+
This will also mark the project as not indexed.
156+
157+
+ Response 204
158+
148159
## Project metadata management [/projects/{project}/indexed]
149160

150161
This entry point is used by the Indexer once it finishes indexing given project.

opengrok-web/src/main/java/org/opengrok/web/api/v1/controller/ProjectsController.java

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -132,38 +132,58 @@ private List<RepositoryInfo> getRepositoriesInDir(final File projDir) {
132132
return new ArrayList<>(histGuru.addRepositories(new File[]{projDir}, env.getIgnoredNames()));
133133
}
134134

135+
private Project disableProject(String projectName) {
136+
Project project = env.getProjects().get(projectName);
137+
if (project == null) {
138+
throw new IllegalStateException("cannot get project \"" + projectName + "\"");
139+
}
140+
141+
// Remove the project from searches so no one can trip over incomplete index data.
142+
project.setIndexed(false);
143+
144+
return project;
145+
}
146+
135147
@DELETE
136148
@Path("/{project}")
137149
public void deleteProject(@PathParam("project") final String projectName)
138-
throws IOException, HistoryException {
139-
140-
Project proj = env.getProjects().get(projectName);
141-
if (proj == null) {
142-
throw new IllegalStateException("cannot get project \"" + projectName + "\"");
143-
}
150+
throws HistoryException {
144151

152+
Project project = disableProject(projectName);
145153
logger.log(Level.INFO, "deleting configuration for project {0}", projectName);
146154

155+
// Delete index data associated with the project.
156+
deleteProjectData(projectName);
157+
147158
// Remove the project from its groups.
148-
for (Group group : proj.getGroups()) {
149-
group.getRepositories().remove(proj);
150-
group.getProjects().remove(proj);
159+
for (Group group : project.getGroups()) {
160+
group.getRepositories().remove(project);
161+
group.getProjects().remove(project);
151162
}
152163

153164
// Now remove the repositories associated with this project.
154-
List<RepositoryInfo> repos = env.getProjectRepositoriesMap().get(proj);
165+
List<RepositoryInfo> repos = env.getProjectRepositoriesMap().get(project);
155166
if (repos != null) {
156167
env.getRepositories().removeAll(repos);
157168
}
158-
env.getProjectRepositoriesMap().remove(proj);
169+
env.getProjectRepositoriesMap().remove(project);
159170

160-
env.getProjects().remove(projectName, proj);
171+
env.getProjects().remove(projectName, project);
161172

162173
// Prevent the project to be included in new searches.
163174
env.refreshSearcherManagerMap();
175+
}
164176

165-
// Lastly, remove data associated with the project.
177+
@DELETE
178+
@Path("/{project}/data")
179+
public void deleteProjectData(@PathParam("project") String projectName) throws HistoryException {
180+
181+
Project project = disableProject(projectName);
166182
logger.log(Level.INFO, "deleting data for project {0}", projectName);
183+
184+
List<RepositoryInfo> repos = env.getProjectRepositoriesMap().get(project);
185+
186+
// Delete index and xrefs.
167187
for (String dirName: new String[]{IndexDatabase.INDEX_DIR, IndexDatabase.XREF_DIR}) {
168188
java.nio.file.Path path = Paths.get(env.getDataRootPath(), dirName, projectName);
169189
try {
@@ -172,6 +192,8 @@ public void deleteProject(@PathParam("project") final String projectName)
172192
logger.log(Level.WARNING, "Could not delete {0}", path.toString());
173193
}
174194
}
195+
196+
// Delete history index.
175197
HistoryGuru guru = HistoryGuru.getInstance();
176198
guru.removeCache(repos.stream().
177199
map(x -> {
@@ -187,8 +209,9 @@ public void deleteProject(@PathParam("project") final String projectName)
187209
// {@code removeCache()} will return nothing.
188210
return "";
189211
}
190-
}).collect(Collectors.toSet()));
212+
}).filter(x -> !x.isEmpty()).collect(Collectors.toSet()));
191213

214+
// Delete suggester data.
192215
suggester.delete(projectName);
193216
}
194217

0 commit comments

Comments
 (0)