Add ability to block lightweight tags
This is added to discourage the use of lighweight tags and make
everyone use annotated tags instead.
Solves: Jira GER-1722
Change-Id: I55576a0d606a6c4c1cd36c47190979b4f0a3a428
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventListenersConfig.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventListenersConfig.java
index 32f51c5..21bc418 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventListenersConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventListenersConfig.java
@@ -34,6 +34,7 @@
static final String ENABLED = "enabled";
static final String BLOCKED_REFS = "blockedRef";
static final String BLOCKED_PROJECTS = "blockedProject";
+ static final String BLOCK_LIGHTWEIGHT_TAGS = "blockLightWeightTags";
@VisibleForTesting
static boolean filterMatches(String filter, String repoName) {
@@ -56,7 +57,8 @@
return new EventListenersConfig(
cfg.getBoolean(EVENT_LISTENERS, ENABLED, true),
toCombinedMatcher(cfg.getStringList(EVENT_LISTENERS, null, BLOCKED_PROJECTS)),
- toCombinedMatcher(cfg.getStringList(EVENT_LISTENERS, null, BLOCKED_REFS)));
+ toCombinedMatcher(cfg.getStringList(EVENT_LISTENERS, null, BLOCKED_REFS)),
+ cfg.getBoolean(EVENT_LISTENERS, BLOCK_LIGHTWEIGHT_TAGS, false));
}
private final PluginConfigFactory configFactory;
@@ -81,7 +83,7 @@
} catch (NoSuchProjectException e) {
logger.atSevere().withCause(e).log(
"Unable to read project.config, using default EventListenersConfig");
- return new EventListenersConfig(true, toCombinedMatcher(""), toCombinedMatcher(""));
+ return new EventListenersConfig(true, toCombinedMatcher(""), toCombinedMatcher(""), false);
}
}
}
@@ -89,15 +91,18 @@
private final boolean enabled;
private final Function<String, Boolean> blockedRefMatcher;
private final Function<String, Boolean> blockedProjectMatcher;
+ private final boolean blockLightWeightTags;
@VisibleForTesting
public EventListenersConfig(
boolean enabled,
Function<String, Boolean> blockedProjectMatcher,
- Function<String, Boolean> blockedRefMatcher) {
+ Function<String, Boolean> blockedRefMatcher,
+ boolean blockLightWeightTags) {
this.enabled = enabled;
this.blockedProjectMatcher = blockedProjectMatcher;
this.blockedRefMatcher = blockedRefMatcher;
+ this.blockLightWeightTags = blockLightWeightTags;
}
public boolean isEnabled() {
@@ -111,4 +116,8 @@
public boolean projectIsBlocked(String repoName) {
return blockedProjectMatcher.apply(repoName);
}
+
+ public boolean blockLightWeightTags() {
+ return blockLightWeightTags;
+ }
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/RefUpdateListener.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/RefUpdateListener.java
index bd60da4..8da4990 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/RefUpdateListener.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/RefUpdateListener.java
@@ -51,7 +51,7 @@
}
/* Updated reference is a tag. */
else if (event.getRefName().startsWith(RefNames.REFS_TAGS)) {
- queue.scheduleArtcCreation(event, branch -> config.refIsBlocked(branch));
+ queue.scheduleArtcCreation(event, branch -> config.refIsBlocked(branch), config.blockLightWeightTags());
}
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParser.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParser.java
index 7210ae7..6b38d55 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParser.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParser.java
@@ -221,13 +221,14 @@
String tagName,
Long creationTime,
boolean force,
- Function<String, Boolean> blockedRefMatcher) {
+ Function<String, Boolean> blockedRefMatcher,
+ boolean blockLightWeightTags) {
try {
CompositionDefinedEventKey cd =
CompositionDefinedEventKey.create(mapper.tagCompositionName(projectName), tagName);
Optional<UUID> oldCdId = eventHub.getExistingId(cd);
if (oldCdId.isEmpty() || force) {
- createAndScheduleCd(projectName, tagName, creationTime, force, blockedRefMatcher);
+ createAndScheduleCd(projectName, tagName, creationTime, force, blockedRefMatcher, blockLightWeightTags);
Optional<UUID> cdId = eventHub.getExistingId(cd);
if (cdId.isPresent() && !cdId.equals(oldCdId)) {
pushToHub(mapper.toArtc(projectName, tagName, creationTime, cdId.get()), force);
@@ -254,12 +255,13 @@
String tagName,
Long creationTime,
boolean force,
- Function<String, Boolean> blockedRefMatcher) {
+ Function<String, Boolean> blockedRefMatcher,
+ boolean blockLightWeightTags) {
Optional<UUID> scsId = Optional.empty();
List<Ref> refs = null;
try {
- ObjectId objectId = peelTag(projectName, tagName);
+ ObjectId objectId = peelTag(projectName, tagName, blockLightWeightTags);
if (objectId == null) {
return;
}
@@ -344,12 +346,17 @@
}
}
- private ObjectId peelTag(String projectName, String tagName) {
+ private ObjectId peelTag(String projectName, String tagName, boolean blockLightWeightTags) {
try (Repository repo = repoManager.openRepository(Project.nameKey(projectName))) {
Ref tagRef = repo.getRefDatabase().exactRef(Constants.R_TAGS + tagName);
if (tagRef != null) {
ObjectId peeled = repo.getRefDatabase().peel(tagRef).getPeeledObjectId();
- return peeled != null ? peeled : tagRef.getObjectId();
+ if (peeled != null)
+ return peeled;
+ if (!blockLightWeightTags)
+ return tagRef.getObjectId();
+ logger.atInfo().log("Creation of CD is blocked for lightweight tags");
+ return null;
}
logger.atSevere().log("Cannot find tag: %s:%s", projectName, tagName);
} catch (IOException e) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueue.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueue.java
index ba99d07..36e69ca 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueue.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueue.java
@@ -144,16 +144,17 @@
}
public void scheduleArtcCreation(
- GitReferenceUpdatedListener.Event event, Function<String, Boolean> blockedRefMatcher) {
+ GitReferenceUpdatedListener.Event event, Function<String, Boolean> blockedRefMatcher, boolean blockLightWeightTags) {
scheduleArtcCreation(
event.getProjectName(),
event.getRefName().substring(RefNames.REFS_TAGS.length()),
TimeUtil.nowMs(),
false,
- blockedRefMatcher);
+ blockedRefMatcher,
+ blockLightWeightTags);
}
- public void scheduleArtcCreation(TagResource resource, boolean force) {
+ public void scheduleArtcCreation(TagResource resource, boolean force, boolean blockLightWeightTags) {
String tagRef = resource.getRef();
scheduleArtcCreation(
resource.getName(),
@@ -162,7 +163,8 @@
: tagRef,
resource.getTagInfo().created.getTime(),
force,
- branch -> false);
+ branch -> false,
+ blockLightWeightTags);
}
public void scheduleArtcCreation(
@@ -170,7 +172,8 @@
String tagName,
Long creationTime,
boolean force,
- Function<String, Boolean> blockedRefMatcher) {
+ Function<String, Boolean> blockedRefMatcher,
+ boolean blockLightWeightTags) {
schedule(
new EventParsingWorker(ARTC, projectName, tagName) {
@@ -178,7 +181,7 @@
public void doRun() {
try {
eventParser.createAndScheduleArtc(
- projectName, tagName, creationTime, force, blockedRefMatcher);
+ projectName, tagName, creationTime, force, blockedRefMatcher, blockLightWeightTags);
} catch (Exception e) {
logger.atSevere().withCause(e).log(
"Failed to create ARTC for %s:%s", projectName, tagName);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/rest/CreateArtcs.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/rest/CreateArtcs.java
index 9a07c0f..7c53a2d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/rest/CreateArtcs.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/rest/CreateArtcs.java
@@ -25,6 +25,8 @@
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParsingQueue;
+import com.google.inject.Provider;
+import com.googlesource.gerrit.plugins.eventseiffel.config.EventListenersConfig;
@Singleton
@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
@@ -34,16 +36,18 @@
}
private final EiffelEventParsingQueue queue;
+ private final Provider<EventListenersConfig> configProvider;
@Inject
- CreateArtcs(EiffelEventParsingQueue queue) {
+ CreateArtcs(EiffelEventParsingQueue queue, Provider<EventListenersConfig> configProvider) {
this.queue = queue;
+ this.configProvider = configProvider;
}
@Override
public Response<?> apply(TagResource resource, CreateArtcs.Input input)
throws AuthException, BadRequestException, ResourceConflictException, Exception {
- queue.scheduleArtcCreation(resource, input.force);
+ queue.scheduleArtcCreation(resource, input.force, configProvider.get().blockLightWeightTags());
return EventCreationResponse.artc(resource);
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/rest/RestModule.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/rest/RestModule.java
index 29a643e..637f764 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/rest/RestModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/rest/RestModule.java
@@ -18,11 +18,16 @@
import static com.google.gerrit.server.project.TagResource.TAG_KIND;
import com.google.gerrit.extensions.restapi.RestApiModule;
+import com.google.inject.Scopes;
+import com.googlesource.gerrit.plugins.eventseiffel.config.EventListenersConfig;
public class RestModule extends RestApiModule {
@Override
public void configure() {
+ bind(EventListenersConfig.class)
+ .toProvider(EventListenersConfig.Provider.class)
+ .in(Scopes.SINGLETON);
post(BRANCH_KIND, "createSccs").to(CreateSccs.class);
post(BRANCH_KIND, "createScss").to(CreateScss.class);
post(TAG_KIND, "createArtcs").to(CreateArtcs.class);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventListenersConfigTest.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventListenersConfigTest.java
index ab2ca17..bee0989 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventListenersConfigTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventListenersConfigTest.java
@@ -148,10 +148,10 @@
}
private EventListenersConfig refsPatterns(String... patterns) {
- return new EventListenersConfig(true, toCombinedMatcher(), toCombinedMatcher(patterns));
+ return new EventListenersConfig(true, toCombinedMatcher(), toCombinedMatcher(patterns), false);
}
private EventListenersConfig projectsPatterns(String... patterns) {
- return new EventListenersConfig(true, toCombinedMatcher(patterns), toCombinedMatcher());
+ return new EventListenersConfig(true, toCombinedMatcher(patterns), toCombinedMatcher(), false);
}
}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/GerritEventListenersIT.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/GerritEventListenersIT.java
index b4cd29c..93ec6a6 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/GerritEventListenersIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/GerritEventListenersIT.java
@@ -340,7 +340,7 @@
@Override
public EventListenersConfig get() {
return new EventListenersConfig(
- enabled, toCombinedMatcher(projectPatterns), toCombinedMatcher(refPatterns));
+ enabled, toCombinedMatcher(projectPatterns), toCombinedMatcher(refPatterns), false);
}
}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIT.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIT.java
index cf4194c..9257cb0 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIT.java
@@ -210,7 +210,7 @@
String ref = setCdHandled();
ArtifactEventKey artc = ArtifactEventKey.create(tagPURL(project.get(), ref));
markAsHandled(artc);
- eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false, branch -> false);
+ eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false, branch -> false, false);
assertEquals(0, TestEventHub.EVENTS.size());
}
@@ -224,7 +224,7 @@
markAsHandled(cd);
ArtifactEventKey artc = ArtifactEventKey.create(tagPURL(project.get(), ref));
markAsHandled(artc);
- eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, true, branch -> false);
+ eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, true, branch -> false, false);
assertEquals(2, TestEventHub.EVENTS.size());
assertCorrectEvent(0, cd);
assertCorrectEvent(1, artc);
@@ -258,7 +258,7 @@
CompositionDefinedEventKey cd =
CompositionDefinedEventKey.create(tagCompositionName(project.get(), "localhost"), ref);
- eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false, branch -> false);
+ eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false, branch -> false, false);
assertEquals(4, TestEventHub.EVENTS.size());
assertCorrectEvent(0, scc);
assertCorrectEvent(1, scs);
@@ -272,7 +272,7 @@
createTagRef(getHead(repo(), "HEAD").getName(), true).substring(Constants.R_TAGS.length());
eventParser.createAndScheduleArtc(
- project.get(), ref, EPOCH_MILLIS, false, branch -> branch.equals("refs/heads/master"));
+ project.get(), ref, EPOCH_MILLIS, false, branch -> branch.equals("refs/heads/master"), false);
assertEquals(0, TestEventHub.EVENTS.size());
}
@@ -290,7 +290,7 @@
CompositionDefinedEventKey.create(tagCompositionName(project.get(), "localhost"), ref);
eventParser.createAndScheduleArtc(
- project.get(), ref, EPOCH_MILLIS, false, branch -> branch.equals("refs/heads/master"));
+ project.get(), ref, EPOCH_MILLIS, false, branch -> branch.equals("refs/heads/master"), false);
assertEquals(4, TestEventHub.EVENTS.size());
assertCorrectEvent(0, scc);
assertCorrectEvent(1, scs);
@@ -301,18 +301,34 @@
@Test
public void artcQueuedNoTagCreated() throws Exception {
eventParser.createAndScheduleArtc(
- project.get(), TAG_NAME, EPOCH_MILLIS, false, branch -> false);
+ project.get(), TAG_NAME, EPOCH_MILLIS, false, branch -> false, false);
assertEquals(0, TestEventHub.EVENTS.size());
}
@Test
public void annotatedTagArtcQueuedscsHandled() throws Exception {
- assertArtcQueuedScsHandled(true);
+ assertArtcQueuedScsHandled(true, false);
}
@Test
- public void LightweightTagArtcQueuedscsHandled() throws Exception {
- assertArtcQueuedScsHandled(false);
+ public void lightWeightTagArtcQueuedscsHandled() throws Exception {
+ assertArtcQueuedScsHandled(false, false);
+ }
+
+ @Test
+ public void annotatedTagArtcQueuedscsHandledLightWeightBlocked() throws Exception {
+ assertArtcQueuedScsHandled(true, true);
+ }
+
+ @Test
+ public void lightWeightTagArtcQueuedscsHandledLightWeightBlocked() throws Exception {
+ setScsHandled();
+ String ref =
+ createTagRef(getHead(repo(), "HEAD").getName(), false)
+ .substring(Constants.R_TAGS.length());
+
+ eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false, branch -> false, true);
+ assertEquals(0, TestEventHub.EVENTS.size());
}
@Test
@@ -320,7 +336,7 @@
String ref = setCdHandled();
ArtifactEventKey artc = ArtifactEventKey.create(tagPURL(project.get(), ref));
- eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false, branch -> false);
+ eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false, branch -> false, false);
assertEquals(0, TestEventHub.EVENTS.size());
}
@@ -328,14 +344,14 @@
@UseLocalDisk
@GlobalPluginConfig(pluginName = PLUGIN_NAME, name = "EiffelEvent.namespace", value = NAMESPACE)
public void artcQueuedscsHandledWithCustomNameSpace() throws Exception {
- assertArtcQueuedScsHandled(false, NAMESPACE);
+ assertArtcQueuedScsHandled(false, false, NAMESPACE);
}
- private void assertArtcQueuedScsHandled(boolean annotated) throws Exception {
- assertArtcQueuedScsHandled(annotated, "localhost");
+ private void assertArtcQueuedScsHandled(boolean annotated, boolean blockLightWeight) throws Exception {
+ assertArtcQueuedScsHandled(annotated, blockLightWeight, "localhost");
}
- private void assertArtcQueuedScsHandled(boolean annotated, String namespace) throws Exception {
+ private void assertArtcQueuedScsHandled(boolean annotated, boolean blockLightWeight, String namespace) throws Exception {
setScsHandled();
String ref =
createTagRef(getHead(repo(), "HEAD").getName(), annotated)
@@ -344,7 +360,7 @@
CompositionDefinedEventKey cd =
CompositionDefinedEventKey.create(tagCompositionName(project.get(), namespace), ref);
- eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false, branch -> false);
+ eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false, branch -> false, blockLightWeight);
assertEquals(2, TestEventHub.EVENTS.size());
assertCorrectEvent(0, cd);
assertCorrectEvent(1, artc);