diff --git a/src/main/java/jenkins/plugins/git/AbstractGitSCMSource.java b/src/main/java/jenkins/plugins/git/AbstractGitSCMSource.java index 95979370b9..48d3ee6555 100644 --- a/src/main/java/jenkins/plugins/git/AbstractGitSCMSource.java +++ b/src/main/java/jenkins/plugins/git/AbstractGitSCMSource.java @@ -632,7 +632,9 @@ public Void run(GitClient client, String remoteName, FetchCommand fetch) throws discoverBranches(repository, walk, request, remoteReferences); } if (context.wantTags()) { - discoverTags(repository, walk, request, remoteReferences); + discoverTags(repository, walk, request, remoteReferences, + context.getAtLeastTagCommitTimeMillis(), + context.getAtMostTagCommitTimeMillis()); } if (context.wantOtherRefs()) { discoverOtherRefs(repository, walk, request, remoteReferences, @@ -772,7 +774,9 @@ public void record(@NonNull SCMHead head, SCMRevision revision, boolean isMatch) private void discoverTags(final Repository repository, final RevWalk walk, GitSCMSourceRequest request, - Map remoteReferences) + Map remoteReferences, + long atLeastMillis, + long atMostMillis) throws IOException, InterruptedException { listener.getLogger().println("Checking tags..."); walk.setRetainBody(false); @@ -785,6 +789,21 @@ private void discoverTags(final Repository repository, final String tagName = StringUtils.removeStart(ref.getKey(), Constants.R_TAGS); RevCommit commit = walk.parseCommit(ref.getValue()); final long lastModified = TimeUnit.SECONDS.toMillis(commit.getCommitTime()); + + if (atLeastMillis >= 0L || atMostMillis >= 0L) { + if (atMostMillis >= 0L && atLeastMillis > atMostMillis) { + /* Invalid. It's impossible for any tag to satisfy this. */ + continue; + } + long tagAge = System.currentTimeMillis() - lastModified; + if (atMostMillis >= 0L && tagAge > atMostMillis) { + continue; + } + if (atLeastMillis >= 0L && tagAge < atLeastMillis) { + continue; + } + } + if (request.process(new GitTagSCMHead(tagName, lastModified), new SCMSourceRequest.IntermediateLambda() { @Nullable diff --git a/src/main/java/jenkins/plugins/git/GitSCMSourceContext.java b/src/main/java/jenkins/plugins/git/GitSCMSourceContext.java index 494d027d2f..805876fd29 100644 --- a/src/main/java/jenkins/plugins/git/GitSCMSourceContext.java +++ b/src/main/java/jenkins/plugins/git/GitSCMSourceContext.java @@ -37,6 +37,7 @@ import java.util.Objects; import java.util.Set; import java.util.TreeSet; +import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -95,6 +96,12 @@ public class GitSCMSourceContext, R extends @NonNull private String remoteName = AbstractGitSCMSource.DEFAULT_REMOTE_NAME; + @CheckForNull + private long atLeastTagCommitTimeMillis; + + @CheckForNull + private long atMostTagCommitTimeMillis; + /** * Constructor. * @@ -192,6 +199,14 @@ public final String remoteName() { return remoteName; } + public final long getAtLeastTagCommitTimeMillis() { + return atLeastTagCommitTimeMillis; + } + + public final long getAtMostTagCommitTimeMillis() { + return atMostTagCommitTimeMillis; + } + /** * Adds a requirement for branch details to any {@link GitSCMSourceRequest} for this context. * @@ -358,6 +373,25 @@ public final List asRefSpecs() { return result; } + private long getTagCommitTimeLimitMillisFromDays(String limitDays) { + long tagCommitTimeLimit = Long.parseLong(StringUtils.defaultIfBlank(limitDays, "-1")); + return tagCommitTimeLimit < 0 ? -1L : TimeUnit.DAYS.toMillis(tagCommitTimeLimit); + } + + @SuppressWarnings("unchecked") + @NonNull + public final C withAtLeastTagCommitTimeDays(String atLeastDays) { + this.atLeastTagCommitTimeMillis = getTagCommitTimeLimitMillisFromDays(atLeastDays); + return (C) this; + } + + @SuppressWarnings("unchecked") + @NonNull + public final C withAtMostTagCommitTimeDays(String atMostDays) { + this.atMostTagCommitTimeMillis = getTagCommitTimeLimitMillisFromDays(atMostDays); + return (C) this; + } + /** * {@inheritDoc} */ diff --git a/src/main/java/jenkins/plugins/git/traits/TagDiscoveryTrait.java b/src/main/java/jenkins/plugins/git/traits/TagDiscoveryTrait.java index 9c9be145a9..8eafcac735 100644 --- a/src/main/java/jenkins/plugins/git/traits/TagDiscoveryTrait.java +++ b/src/main/java/jenkins/plugins/git/traits/TagDiscoveryTrait.java @@ -23,6 +23,7 @@ */ package jenkins.plugins.git.traits; +import edu.umd.cs.findbugs.annotations.CheckForNull; import edu.umd.cs.findbugs.annotations.NonNull; import hudson.Extension; import jenkins.plugins.git.GitSCMBuilder; @@ -51,11 +52,20 @@ * @since 3.6.0 */ public class TagDiscoveryTrait extends SCMSourceTrait { + private final String atLeastDays; + private final String atMostDays; + /** * Constructor for stapler. */ @DataBoundConstructor + public TagDiscoveryTrait(@CheckForNull String atLeastDays, @CheckForNull String atMostDays) { + this.atLeastDays = atLeastDays; + this.atMostDays = atMostDays; + } + public TagDiscoveryTrait() { + this(null, null); } /** @@ -66,6 +76,8 @@ protected void decorateContext(SCMSourceContext context) { GitSCMSourceContext ctx = (GitSCMSourceContext) context; ctx.wantTags(true); ctx.withAuthority(new TagSCMHeadAuthority()); + ctx.withAtLeastTagCommitTimeDays(atLeastDays) + .withAtMostTagCommitTimeDays(atMostDays); } /** @@ -76,6 +88,14 @@ public boolean includeCategory(@NonNull SCMHeadCategory category) { return category instanceof TagSCMHeadCategory; } + public String getAtLeastDays() { + return atLeastDays; + } + + public String getAtMostDays() { + return atMostDays; + } + /** * Our descriptor. */ diff --git a/src/main/resources/jenkins/plugins/git/traits/TagDiscoveryTrait/config.jelly b/src/main/resources/jenkins/plugins/git/traits/TagDiscoveryTrait/config.jelly index 92acdaa269..70e46bd717 100644 --- a/src/main/resources/jenkins/plugins/git/traits/TagDiscoveryTrait/config.jelly +++ b/src/main/resources/jenkins/plugins/git/traits/TagDiscoveryTrait/config.jelly @@ -1,4 +1,10 @@ + + + + + +