@@ -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