Add the configuration for the merge changes grace time
Allow per project configuration of the merge changes grace time (by
default 24h).
Change-Id: Icf28a3cf274b771e1992e694d284df4ee1166a03
diff --git a/README.md b/README.md
index 5b6b123..e0d246a 100644
--- a/README.md
+++ b/README.md
@@ -70,9 +70,9 @@
has no side effects.
Filtering a closed change refs has the following meaning:
-- Merged changes and all their patch-sets
-- Abandoned changes and all their patch-sets
-- Corrupted changes and all their patch-sets
+- Merged changes and all their patch-sets older than the [grace time](#grace-time-for-closed-changes)
+- Abandoned changes and all their patch-sets older than the [grace time](#grace-time-for-closed-changes)
+- Corrupted changes and all their patch-sets older than the [grace time](#grace-time-for-closed-changes)
- All '/meta' refs of all changes
- All non-published edits of any changes
@@ -100,3 +100,18 @@
a READ rule to refs/*). To enable the closed changes filtering you need to disable any global read rule
for the group that needs refs filtering.
+### Grace time for closed changes
+
+The refsfilter allows to define `git-refs-filter: grace time [sec] for closed changes`
+project configuration parameter. This parameter controls the size of the grace
+time window in seconds. All closed changes newer than the grace time will not
+be filtered out. Value can be defined per project or can be inherited from its parents.
+
+Default value: 86400
+
+Example of setting the grace time parameter in `project.config`:
+
+```
+[plugin "gerrit"]
+ gitRefFilterClosedChangesGraceTimeSec = 3600
+```
\ No newline at end of file
diff --git a/src/main/java/com/googlesource/gerrit/modules/gitrefsfilter/FilterRefsConfig.java b/src/main/java/com/googlesource/gerrit/modules/gitrefsfilter/FilterRefsConfig.java
index 6bfafc2..1b29094 100644
--- a/src/main/java/com/googlesource/gerrit/modules/gitrefsfilter/FilterRefsConfig.java
+++ b/src/main/java/com/googlesource/gerrit/modules/gitrefsfilter/FilterRefsConfig.java
@@ -15,7 +15,10 @@
package com.googlesource.gerrit.modules.gitrefsfilter;
import com.google.common.collect.ImmutableList;
+import com.google.gerrit.entities.Project;
import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.PluginConfigFactory;
+import com.google.gerrit.server.project.NoSuchProjectException;
import com.google.inject.Inject;
import java.util.Arrays;
import java.util.List;
@@ -27,18 +30,20 @@
public class FilterRefsConfig {
public static final String SECTION_GIT_REFS_FILTER = "git-refs-filter";
public static final String KEY_HIDE_REFS = "hideRefs";
+ public static final String PROJECT_CONFIG_CLOSED_CHANGES_GRACE_TIME_SEC =
+ "gitRefFilterClosedChangesGraceTimeSec";
- private static final long CLOSED_CHANGE_GRACE_TIME_SEC_DEFAULT =
+ static final long CLOSED_CHANGES_GRACE_TIME_SEC_DEFAULT =
TimeUnit.SECONDS.convert(24, TimeUnit.HOURS);
- private long closedChangeGraceTimeSec = CLOSED_CHANGE_GRACE_TIME_SEC_DEFAULT;
-
private final List<String> hideRefs;
private final List<String> showRefs;
+ private PluginConfigFactory cfgFactory;
@Inject
- public FilterRefsConfig(@GerritServerConfig Config gerritConfig) {
+ public FilterRefsConfig(@GerritServerConfig Config gerritConfig, PluginConfigFactory cfgFactory) {
+ this.cfgFactory = cfgFactory;
List<String> hideRefsConfig =
Arrays.asList(gerritConfig.getStringList(SECTION_GIT_REFS_FILTER, null, KEY_HIDE_REFS));
@@ -75,11 +80,12 @@
return true;
}
- public long getClosedChangeGraceTimeSec() {
- return closedChangeGraceTimeSec;
- }
-
- public void setClosedChangeGraceTimeSec(long graceTimeSec) {
- this.closedChangeGraceTimeSec = graceTimeSec;
+ /** performance warning: this call can be expensive, please reuse the value */
+ public long getClosedChangeGraceTimeSec(Project.NameKey projectKey)
+ throws NoSuchProjectException {
+ return cfgFactory
+ .getFromProjectConfigWithInheritance(projectKey, "gerrit")
+ .getLong(
+ PROJECT_CONFIG_CLOSED_CHANGES_GRACE_TIME_SEC, CLOSED_CHANGES_GRACE_TIME_SEC_DEFAULT);
}
}
diff --git a/src/main/java/com/googlesource/gerrit/modules/gitrefsfilter/ForProjectWrapper.java b/src/main/java/com/googlesource/gerrit/modules/gitrefsfilter/ForProjectWrapper.java
index 7e30b5f..5347f2d 100644
--- a/src/main/java/com/googlesource/gerrit/modules/gitrefsfilter/ForProjectWrapper.java
+++ b/src/main/java/com/googlesource/gerrit/modules/gitrefsfilter/ForProjectWrapper.java
@@ -30,6 +30,7 @@
import com.google.gerrit.server.permissions.PermissionBackend.ForRef;
import com.google.gerrit.server.permissions.PermissionBackend.RefFilterOptions;
import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.NoSuchProjectException;
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
import com.google.inject.name.Named;
@@ -53,6 +54,7 @@
private final ForProject defaultForProject;
private final Project.NameKey project;
private final FilterRefsConfig config;
+ private long closedChangesGraceTime;
public interface Factory {
ForProjectWrapper get(ForProject defaultForProject, Project.NameKey project);
@@ -64,12 +66,14 @@
@Named(OPEN_CHANGES_CACHE) LoadingCache<ChangeCacheKey, Boolean> openChangesCache,
@Named(CHANGES_CACHE_TS) LoadingCache<ChangeCacheKey, Long> changesTsCache,
@Assisted ForProject defaultForProject,
- @Assisted Project.NameKey project) {
+ @Assisted Project.NameKey project)
+ throws NoSuchProjectException {
this.openChangesCache = openChangesCache;
this.changesTsCache = changesTsCache;
this.defaultForProject = defaultForProject;
this.project = project;
this.config = config;
+ this.closedChangesGraceTime = config.getClosedChangeGraceTimeSec(project);
}
@Override
@@ -142,9 +146,7 @@
try {
Timestamp cutOffTs =
Timestamp.from(
- Instant.now()
- .truncatedTo(ChronoUnit.SECONDS)
- .minusSeconds(config.getClosedChangeGraceTimeSec()));
+ Instant.now().truncatedTo(ChronoUnit.SECONDS).minusSeconds(closedChangesGraceTime));
return changesTsCache
.get(ChangeCacheKey.create(repo, changeId, changeRevision, project))
.longValue()
diff --git a/src/main/java/com/googlesource/gerrit/modules/gitrefsfilter/RefsFilterModule.java b/src/main/java/com/googlesource/gerrit/modules/gitrefsfilter/RefsFilterModule.java
index 5d53d22..8b882c9 100644
--- a/src/main/java/com/googlesource/gerrit/modules/gitrefsfilter/RefsFilterModule.java
+++ b/src/main/java/com/googlesource/gerrit/modules/gitrefsfilter/RefsFilterModule.java
@@ -16,6 +16,7 @@
import com.google.gerrit.extensions.annotations.Exports;
import com.google.gerrit.extensions.config.CapabilityDefinition;
+import com.google.gerrit.server.config.ProjectConfigEntry;
import com.google.gerrit.server.permissions.PermissionBackend;
import com.google.inject.AbstractModule;
import com.google.inject.Scopes;
@@ -44,6 +45,15 @@
.to(FilterRefsCapability.class)
.in(Scopes.SINGLETON);
+ bind(ProjectConfigEntry.class)
+ .annotatedWith(Exports.named(FilterRefsConfig.PROJECT_CONFIG_CLOSED_CHANGES_GRACE_TIME_SEC))
+ .toInstance(
+ new ProjectConfigEntry(
+ "git-refs-filter: grace time [sec] for closed changes",
+ FilterRefsConfig.CLOSED_CHANGES_GRACE_TIME_SEC_DEFAULT,
+ true,
+ "Grace time for keeping closed changes from filtering by the git-refs-filter"));
+
install(OpenChangesCache.module());
install(ChangesTsCache.module());
}
diff --git a/src/test/java/com/googlesource/gerrit/libmodule/plugins/test/GitRefsFilterTest.java b/src/test/java/com/googlesource/gerrit/libmodule/plugins/test/GitRefsFilterTest.java
index 44d6cbe..1fd85c1 100644
--- a/src/test/java/com/googlesource/gerrit/libmodule/plugins/test/GitRefsFilterTest.java
+++ b/src/test/java/com/googlesource/gerrit/libmodule/plugins/test/GitRefsFilterTest.java
@@ -29,6 +29,8 @@
import com.google.gerrit.entities.BranchNameKey;
import com.google.gerrit.entities.Change;
import com.google.gerrit.entities.RefNames;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.project.ProjectConfig;
import com.google.inject.Inject;
import com.google.inject.Module;
import com.google.inject.name.Named;
@@ -60,7 +62,6 @@
@Sandboxed
public class GitRefsFilterTest extends AbstractGitDaemonTest {
@Inject private RequestScopeOperations requestScopeOperations;
- @Inject private FilterRefsConfig filterConfig;
@Inject
private @Named(OPEN_CHANGES_CACHE) LoadingCache<ChangeCacheKey, Boolean> changeOpenCache;
@@ -83,7 +84,18 @@
@Before
public void setup() throws Exception {
createFilteredRefsGroup();
- filterConfig.setClosedChangeGraceTimeSec(CLOSED_CHANGES_GRACE_TIME_SEC);
+ try (MetaDataUpdate md = metaDataUpdateFactory.create(project)) {
+ ProjectConfig projectConfig = projectConfigFactory.create(project);
+ projectConfig.load(md);
+ projectConfig.updatePluginConfig(
+ "gerrit",
+ cfg ->
+ cfg.setLong(
+ FilterRefsConfig.PROJECT_CONFIG_CLOSED_CHANGES_GRACE_TIME_SEC,
+ CLOSED_CHANGES_GRACE_TIME_SEC));
+ projectConfig.commit(md);
+ projectCache.evict(project);
+ }
}
@Test