Skip to content

Commit 1552abf

Browse files
committed
fix: close ObjectReader, DiffFormatter and RevWalk in getDiffStats
1 parent 1c84e11 commit 1552abf

File tree

2 files changed

+80
-147
lines changed

2 files changed

+80
-147
lines changed

plugin-modernizer-core/src/main/java/io/jenkins/tools/pluginmodernizer/core/github/DiffStatsCalculator.java

Lines changed: 0 additions & 145 deletions
This file was deleted.

plugin-modernizer-core/src/main/java/io/jenkins/tools/pluginmodernizer/core/github/GHService.java

Lines changed: 80 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1237,8 +1237,86 @@ private void deleteLegacyPrs(Plugin plugin) {
12371237
* @return DiffStats (no. of additions, deletions and changed files)
12381238
*/
12391239
public DiffStats getDiffStats(Plugin plugin, boolean dryRun) {
1240-
try {
1241-
return new DiffStatsCalculator().calculate(plugin, dryRun);
1240+
Path gitDirPath = Settings.DEFAULT_CACHE_PATH
1241+
.resolve(plugin.getName())
1242+
.resolve("sources")
1243+
.resolve(".git")
1244+
.normalize();
1245+
File gitDir = gitDirPath.toFile();
1246+
1247+
try (Repository repository = new FileRepositoryBuilder()
1248+
.setGitDir(gitDir)
1249+
.readEnvironment()
1250+
.findGitDir()
1251+
.build();
1252+
Git git = new Git(repository);
1253+
ObjectReader reader = repository.newObjectReader();
1254+
DiffFormatter formatter = new DiffFormatter(new ByteArrayOutputStream())) {
1255+
1256+
formatter.setRepository(repository);
1257+
formatter.setDiffComparator(RawTextComparator.DEFAULT);
1258+
formatter.setDetectRenames(true);
1259+
1260+
int additions = 0;
1261+
int deletions = 0;
1262+
int changedFiles = 0;
1263+
if (dryRun) {
1264+
// UNSTAGED: Working Directory vs Index
1265+
DirCacheIterator indexTree = new DirCacheIterator(repository.readDirCache());
1266+
FileTreeIterator workingTree = new FileTreeIterator(repository);
1267+
1268+
List<DiffEntry> unstagedDiffs = git.diff()
1269+
.setOldTree(indexTree)
1270+
.setNewTree(workingTree)
1271+
.setShowNameAndStatusOnly(false)
1272+
.call();
1273+
1274+
for (DiffEntry diff : unstagedDiffs) {
1275+
try {
1276+
EditList edits = formatter.toFileHeader(diff).toEditList();
1277+
for (Edit edit : edits) {
1278+
additions += edit.getEndB() - edit.getBeginB();
1279+
deletions += edit.getEndA() - edit.getBeginA();
1280+
}
1281+
changedFiles++;
1282+
} catch (MissingObjectException e) {
1283+
LOG.warn("Skipping diff for {}: {}", diff.getNewPath(), e.getMessage());
1284+
}
1285+
}
1286+
return new DiffStats(additions, deletions, changedFiles);
1287+
}
1288+
// COMMITTED: HEAD vs default branch or previous commit
1289+
ObjectId head = repository.resolve("HEAD");
1290+
String defaultBranchName = plugin.getRemoteRepository(this).getDefaultBranch();
1291+
ObjectId defaultBranch = repository.resolve("refs/heads/" + defaultBranchName);
1292+
1293+
if (defaultBranch == null) {
1294+
throw new IOException("Could not resolve default branch.");
1295+
}
1296+
1297+
CanonicalTreeParser oldTree = new CanonicalTreeParser();
1298+
CanonicalTreeParser newTree = new CanonicalTreeParser();
1299+
try (RevWalk revWalk = new RevWalk(repository)) {
1300+
oldTree.reset(reader, revWalk.parseTree(defaultBranch));
1301+
newTree.reset(reader, revWalk.parseTree(head));
1302+
}
1303+
1304+
List<DiffEntry> committedDiffs = git.diff()
1305+
.setOldTree(oldTree)
1306+
.setNewTree(newTree)
1307+
.setShowNameAndStatusOnly(false)
1308+
.call();
1309+
1310+
for (DiffEntry diff : committedDiffs) {
1311+
EditList edits = formatter.toFileHeader(diff).toEditList();
1312+
for (Edit edit : edits) {
1313+
additions += edit.getEndB() - edit.getBeginB();
1314+
deletions += edit.getEndA() - edit.getBeginA();
1315+
}
1316+
changedFiles++;
1317+
}
1318+
return new DiffStats(additions, deletions, changedFiles);
1319+
12421320
} catch (IOException | GitAPIException e) {
12431321
plugin.addError("Failed to get diff stats", e);
12441322
plugin.raiseLastError();

0 commit comments

Comments
 (0)