Skip to content

Commit c9f9f8c

Browse files
[JENKINS-76222] Add support for modified files in report filtering (#1259)
See [JENKINS-76222](https://issues.jenkins.io/browse/JENKINS-76222)
1 parent ac616e2 commit c9f9f8c

File tree

2 files changed

+108
-1
lines changed

2 files changed

+108
-1
lines changed

src/main/java/edu/hm/hafner/analysis/IssuesInModifiedCodeMarker.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,29 @@ public void markIssuesInModifiedCode(final Report report, final Map<String, Set<
3131
}
3232
}
3333

34+
/**
35+
* Finds and marks all issues that are in modified files, regardless of whether they affect specific lines.
36+
*
37+
* @param report
38+
* the report with the issues to scan
39+
* @param modifiedFiles
40+
* a set of modified file names
41+
*/
42+
public void markIssuesInModifiedFiles(final Report report, final Set<String> modifiedFiles) {
43+
for (String fileName : modifiedFiles) {
44+
report.filter(issue -> affectsModifiedFile(issue, fileName))
45+
.stream()
46+
.forEach(Issue::markAsPartOfModifiedCode);
47+
}
48+
}
49+
3450
private boolean affectsChangedLineInFile(final Issue issue, final String fileName, final Set<Integer> lines) {
51+
return affectsModifiedFile(issue, fileName) && lines.stream().anyMatch(issue::affectsLine);
52+
}
53+
54+
private boolean affectsModifiedFile(final Issue issue, final String fileName) {
3555
var normalizedPath = PATH_UTIL.getRelativePath(fileName);
3656

37-
return issue.getFileName().endsWith(normalizedPath) && lines.stream().anyMatch(issue::affectsLine);
57+
return issue.getFileName().endsWith(normalizedPath);
3858
}
3959
}

src/test/java/edu/hm/hafner/analysis/IssuesInModifiedCodeMarkerTest.java

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,93 @@ void shouldMarkIssuesIfFileNameUsesWindowsPath() {
9494
assertThatIssuesToString(report).containsExactly(TO_STRING_MODIFIED, TO_STRING_MODIFIED);
9595
}
9696

97+
@Test
98+
void shouldNotMarkAnythingForEmptySetOfFiles() {
99+
var report = createReportWithTwoIssues();
100+
101+
assertThatModifiedCodeMarkers(report).containsExactly(false, false);
102+
103+
var marker = new IssuesInModifiedCodeMarker();
104+
marker.markIssuesInModifiedFiles(report, Set.of());
105+
assertThatModifiedCodeMarkers(report).containsExactly(false, false);
106+
assertThatIssuesToString(report).containsExactly(TO_STRING_UNMODIFIED, TO_STRING_UNMODIFIED);
107+
}
108+
109+
@Test
110+
void shouldNotMarkIfFileDoesNotMatch() {
111+
var report = createReportWithTwoIssues();
112+
113+
var marker = new IssuesInModifiedCodeMarker();
114+
marker.markIssuesInModifiedFiles(report, Set.of("/wrong/path/code.txt"));
115+
116+
assertThatModifiedCodeMarkers(report).containsExactly(false, false);
117+
assertThatIssuesToString(report).containsExactly(TO_STRING_UNMODIFIED, TO_STRING_UNMODIFIED);
118+
}
119+
120+
@Test
121+
void shouldMarkIssuesIfOneFileMatches() {
122+
var report = createReportWithTwoIssues();
123+
124+
var marker = new IssuesInModifiedCodeMarker();
125+
marker.markIssuesInModifiedFiles(report, Set.of("/part/of/modified/code.txt"));
126+
127+
assertThatModifiedCodeMarkers(report).containsExactly(true, false);
128+
assertThatIssuesToString(report).containsExactly(TO_STRING_MODIFIED, TO_STRING_UNMODIFIED);
129+
}
130+
131+
@Test
132+
void shouldMarkIssuesIfAllFilesMatch() {
133+
var report = createReportWithTwoIssues();
134+
135+
var marker = new IssuesInModifiedCodeMarker();
136+
marker.markIssuesInModifiedFiles(report, Set.of(
137+
"/part/of/modified/code.txt",
138+
"/part/of/additional/modified/code.txt"));
139+
140+
assertThatModifiedCodeMarkers(report).containsExactly(true, true);
141+
assertThatIssuesToString(report).containsExactly(TO_STRING_MODIFIED, TO_STRING_MODIFIED);
142+
}
143+
144+
@Test
145+
void shouldMarkIssuesIfFilesPrefixMatchesForFiles() {
146+
var report = createReportWithTwoIssues();
147+
148+
var marker = new IssuesInModifiedCodeMarker();
149+
marker.markIssuesInModifiedFiles(report, Set.of("modified/code.txt", "additional/modified/code.txt"));
150+
151+
assertThatModifiedCodeMarkers(report).containsExactly(true, true);
152+
assertThatIssuesToString(report).containsExactly(TO_STRING_MODIFIED, TO_STRING_MODIFIED);
153+
}
154+
155+
@Test
156+
void shouldMarkIssuesIfFileNameUsesWindowsPathForFiles() {
157+
var report = createReportWithTwoIssues();
158+
159+
var marker = new IssuesInModifiedCodeMarker();
160+
marker.markIssuesInModifiedFiles(report, Set.of("modified\\code.txt", "additional\\modified\\code.txt"));
161+
162+
assertThatModifiedCodeMarkers(report).containsExactly(true, true);
163+
assertThatIssuesToString(report).containsExactly(TO_STRING_MODIFIED, TO_STRING_MODIFIED);
164+
}
165+
166+
@Test
167+
void shouldMarkAllIssuesInFileRegardlessOfLineNumbers() {
168+
var report = new Report();
169+
try (var builder = new IssueBuilder()) {
170+
builder.setFileName("/part/of/modified/code.txt");
171+
report.add(builder.setLineStart(1).setLineEnd(5).build());
172+
report.add(builder.setLineStart(10).setLineEnd(15).build());
173+
report.add(builder.setLineStart(100).setLineEnd(200).build());
174+
builder.setFileName("/other/file.txt");
175+
report.add(builder.setLineStart(1).setLineEnd(5).build());
176+
}
177+
178+
var marker = new IssuesInModifiedCodeMarker();
179+
marker.markIssuesInModifiedFiles(report, Set.of("modified/code.txt"));
180+
181+
assertThatModifiedCodeMarkers(report).containsExactly(true, true, true, false);
182+
}
183+
97184
private AbstractListAssert<?, List<? extends String>, String, ObjectAssert<String>> assertThatIssuesToString(
98185
final Report report) {
99186
return assertThat(report.get()).extracting(Issue::toString);

0 commit comments

Comments
 (0)