Skip to content

Commit 44f328b

Browse files
authored
Merge pull request #24 from jglick/sanitize
Prevent `[ab][0-9]` in commit hashes from being treated as `alpha` or `beta`
2 parents 724ec51 + 5b284ba commit 44f328b

File tree

3 files changed

+66
-1
lines changed
  • git-changelist-maven-extension
    • src
      • main/java/io/jenkins/tools/incrementals/git_changelist_maven_extension
      • test/java/io/jenkins/tools/incrementals/git_changelist_maven_extension

3 files changed

+66
-1
lines changed

git-changelist-maven-extension/pom.xml

+6
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,11 @@
3535
<artifactId>org.eclipse.jgit</artifactId>
3636
<version>4.9.0.201710071750-r</version>
3737
</dependency>
38+
<dependency>
39+
<groupId>junit</groupId>
40+
<artifactId>junit</artifactId>
41+
<version>4.13.2</version>
42+
<scope>test</scope>
43+
</dependency>
3844
</dependencies>
3945
</project>

git-changelist-maven-extension/src/main/java/io/jenkins/tools/incrementals/git_changelist_maven_extension/Main.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ public void afterSessionStart(MavenSession session) throws MavenExecutionExcepti
130130
throw new MavenExecutionException("Git operations failed", x);
131131
}
132132
log.debug("Spent " + (System.nanoTime() - start) / 1000 / 1000 + "ms on calculations");
133-
String value = String.format(props.getProperty("changelist.format", "-rc%d.%s"), count, hash);
133+
String value = String.format(props.getProperty("changelist.format", "-rc%d.%s"), count, sanitize(hash));
134134
log.info("Setting: -Dchangelist=" + value + " -DscmTag=" + fullHash);
135135
props.setProperty("changelist", value);
136136
props.setProperty("scmTag", fullHash);
@@ -172,6 +172,10 @@ public void afterSessionStart(MavenSession session) throws MavenExecutionExcepti
172172
}
173173
}
174174

175+
static String sanitize(String hash) {
176+
return hash.replaceAll("[ab]", "$0_");
177+
}
178+
175179
private static String summarize(RevCommit c) {
176180
return c.getId().name() + " “" + c.getShortMessage() + "” " + DateTimeFormatter.ISO_LOCAL_DATE.format(Instant.ofEpochSecond(c.getCommitTime()).atZone(ZoneId.systemDefault()));
177181
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* The MIT License
3+
*
4+
* Copyright 2021 CloudBees, Inc.
5+
*
6+
* Permission is hereby granted, free of charge, to any person obtaining a copy
7+
* of this software and associated documentation files (the "Software"), to deal
8+
* in the Software without restriction, including without limitation the rights
9+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10+
* copies of the Software, and to permit persons to whom the Software is
11+
* furnished to do so, subject to the following conditions:
12+
*
13+
* The above copyright notice and this permission notice shall be included in
14+
* all copies or substantial portions of the Software.
15+
*
16+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22+
* THE SOFTWARE.
23+
*/
24+
25+
package io.jenkins.tools.incrementals.git_changelist_maven_extension;
26+
27+
import org.apache.maven.artifact.versioning.ComparableVersion;
28+
import static org.hamcrest.CoreMatchers.containsString;
29+
import static org.hamcrest.CoreMatchers.is;
30+
import static org.hamcrest.CoreMatchers.not;
31+
import static org.hamcrest.MatcherAssert.assertThat;
32+
import org.junit.Test;
33+
34+
public class MainTest {
35+
36+
// https://maven.apache.org/pom.html#Version_Order_Specification
37+
private static final String[] PRERELEASE = {
38+
// From ComparableVersion.StringItem.QUALIFIERS:
39+
"alpha", "beta", "milestone", "rc", "snapshot",
40+
// ALIASES:
41+
"cr",
42+
// Nonstandard ones in Dependabot? https://github.com/dependabot/dependabot-core/blob/f146743aa400c7913b5e953e1b93c8b40345aaf4/maven/lib/dependabot/maven/version.rb#L24-L25
43+
"pr", "dev",
44+
};
45+
@Test public void alphaBeta() {
46+
String hash = "852b473a2b8c";
47+
String sanitized = Main.sanitize(hash);
48+
assertThat(hash + " has been sanitized to the expected format", sanitized, is("852b_473a_2b_8c"));
49+
String canonical = new ComparableVersion(sanitized).getCanonical();
50+
for (String prerelease : PRERELEASE) {
51+
assertThat(sanitized + " treated as a prerelease", canonical, not(containsString(prerelease)));
52+
}
53+
}
54+
55+
}

0 commit comments

Comments
 (0)