From 6a81d325118cb41c7c0da3289e95cec19b072951 Mon Sep 17 00:00:00 2001 From: Pouryafard75 Date: Tue, 2 Jul 2024 01:39:37 -0400 Subject: [PATCH] Adopt with blame --- .../org/codetracker/api/AttributeTracker.java | 3 + .../org/codetracker/api/BlockTracker.java | 3 + .../org/codetracker/api/ClassTracker.java | 3 + .../org/codetracker/api/MethodTracker.java | 3 + .../codetracker/blame/CodeTrackerBlame.java | 88 ++++++++++--------- .../org/codetracker/blame/LineTracker.java | 2 +- .../codetracker/blame/LineTrackerImpl.java | 48 +++++----- .../blame/CodeTrackerBlameTest.java | 59 ++++++++++++- 8 files changed, 142 insertions(+), 67 deletions(-) diff --git a/src/main/java/org/codetracker/api/AttributeTracker.java b/src/main/java/org/codetracker/api/AttributeTracker.java index 5e1368d224d..d7feceb8967 100644 --- a/src/main/java/org/codetracker/api/AttributeTracker.java +++ b/src/main/java/org/codetracker/api/AttributeTracker.java @@ -8,6 +8,9 @@ public interface AttributeTracker extends CodeTracker { History track() throws Exception; + default History.HistoryInfo blame() throws Exception{ + throw new UnsupportedOperationException(); + } class Builder { private Repository repository; diff --git a/src/main/java/org/codetracker/api/BlockTracker.java b/src/main/java/org/codetracker/api/BlockTracker.java index 19026fe8edb..63885794f18 100644 --- a/src/main/java/org/codetracker/api/BlockTracker.java +++ b/src/main/java/org/codetracker/api/BlockTracker.java @@ -9,6 +9,9 @@ public interface BlockTracker extends CodeTracker { History track() throws Exception; + default History.HistoryInfo blame() throws Exception{ + throw new UnsupportedOperationException(); + } class Builder { private Repository repository; diff --git a/src/main/java/org/codetracker/api/ClassTracker.java b/src/main/java/org/codetracker/api/ClassTracker.java index 8b54094c555..45a7a3ba19f 100644 --- a/src/main/java/org/codetracker/api/ClassTracker.java +++ b/src/main/java/org/codetracker/api/ClassTracker.java @@ -7,6 +7,9 @@ public interface ClassTracker extends CodeTracker { History track() throws Exception; + default History.HistoryInfo blame() throws Exception{ + throw new UnsupportedOperationException(); + } class Builder { private Repository repository; diff --git a/src/main/java/org/codetracker/api/MethodTracker.java b/src/main/java/org/codetracker/api/MethodTracker.java index bae9ec09220..bda1874f2ab 100644 --- a/src/main/java/org/codetracker/api/MethodTracker.java +++ b/src/main/java/org/codetracker/api/MethodTracker.java @@ -8,6 +8,9 @@ public interface MethodTracker extends CodeTracker { History track() throws Exception; + default History.HistoryInfo blame() throws Exception{ + throw new UnsupportedOperationException(); + } class Builder { private Repository repository; diff --git a/src/main/java/org/codetracker/blame/CodeTrackerBlame.java b/src/main/java/org/codetracker/blame/CodeTrackerBlame.java index 33e30a872d9..e94cefa3d2c 100644 --- a/src/main/java/org/codetracker/blame/CodeTrackerBlame.java +++ b/src/main/java/org/codetracker/blame/CodeTrackerBlame.java @@ -1,7 +1,7 @@ package org.codetracker.blame; import org.codetracker.api.CodeElement; -import org.codetracker.rest.changeHistory.RESTChange; +import org.codetracker.api.History; import org.codetracker.util.CodeElementLocator; import org.eclipse.jgit.lib.Repository; @@ -11,7 +11,6 @@ import java.util.List; import static org.codetracker.blame.Utils.getFileContentByCommit; -import static org.codetracker.rest.RESTHandler.trackCodeHistory; /* Created by pourya on 2024-06-26*/ public class CodeTrackerBlame implements IBlame{ @@ -21,19 +20,57 @@ public List blameFile(Repository repository, String commitId, String f List lines = getFileContentByCommit(repository, commitId, filePath); int maxLine = lines.size(); List result = new ArrayList<>(); - for (int lineNumber = 0; lineNumber < maxLine; lineNumber++) { + for (int lineNumber = 1; lineNumber <= maxLine; lineNumber++) { try { result.add(lineBlameFormat(repository, commitId, filePath, null, lineNumber, lines)); + } catch (Exception e) { +// System.out.println(e.getMessage()); } - catch (Exception e) { -// System.out.println("Error in line " + lineNumber + ": " + e.getMessage()); - } - } return result; } - private static String[] lineBlameFormat(Repository repository, String commitId, String filePath, String name, int lineNumber, List lines) { + public static String[] lineBlameFormat(Repository repository, String commitId, String filePath, String name, int lineNumber, List lines) { + History.HistoryInfo latestChange = getLineBlame(repository, commitId, filePath, name, lineNumber); + String shortCommitId = NOT_FOUND_PLACEHOLDER; + String committer = NOT_FOUND_PLACEHOLDER; + String commitDate = NOT_FOUND_PLACEHOLDER; + String beforeFilePath = NOT_FOUND_PLACEHOLDER; + long commitTime = 0L; + if (latestChange != null) { + shortCommitId = latestChange.getCommitId().substring(0, 9); // take the first 7 characters + beforeFilePath = latestChange.getElementBefore().getFilePath(); + committer = latestChange.getCommitterName(); + commitTime = latestChange.getCommitTime(); + commitDate = (commitTime == 0) ? NOT_FOUND_PLACEHOLDER : new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z").format(new Date(commitTime * 1000L)); + } + return new String[] + { + shortCommitId, + beforeFilePath, + "(" + committer, + commitDate, + lineNumber + ")", + lines.get(lineNumber-1) + }; + } + public static History.HistoryInfo getLineBlame(Repository repository, String commitId, String filePath, String name, int lineNumber) { + CodeElement codeElement = locate(repository, commitId, filePath, name, lineNumber); + History.HistoryInfo history = null; + if (codeElement != null) { + try { + history = new LineTrackerImpl().blame(repository, filePath, commitId, name, lineNumber, codeElement); + } catch (Exception e) { + System.out.println("Error in tracking line blame for " + filePath + " at line " + lineNumber + " in commit " + commitId); + } + } + else { + System.out.println("Code element not found for " + filePath + " at line " + lineNumber + " in commit " + commitId); + } + return history; + } + + private static CodeElement locate(Repository repository, String commitId, String filePath, String name, int lineNumber) { CodeElementLocator locator = new CodeElementLocator( repository, commitId, @@ -44,42 +81,11 @@ private static String[] lineBlameFormat(Repository repository, String commitId, CodeElement codeElement = null; try { codeElement = locator.locate(); - } catch (Exception e) { - throw new RuntimeException(e); } - String shortCommitId = NOT_FOUND_PLACEHOLDER; - String committer = NOT_FOUND_PLACEHOLDER; - Long commitTime = 0L; - String beforeFilePath = NOT_FOUND_PLACEHOLDER; - if (codeElement != null) { - ArrayList restChanges = trackCodeHistory( - repository, - filePath, - commitId, - name, - lineNumber, - codeElement - ); + catch (Exception e) { - if (restChanges.isEmpty()) { - throw new RuntimeException("No history found for the given code element"); - } - RESTChange h0 = restChanges.get(0); - shortCommitId = h0.commitId.substring(0, 7); // take the first 7 characters - beforeFilePath = h0.elementFileBefore; - committer = h0.committer; - commitTime = h0.commitTime; } - String commitDate = (commitTime == 0) ? NOT_FOUND_PLACEHOLDER : new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z").format(new Date(commitTime * 1000L)); - return new String[] - { - shortCommitId, - beforeFilePath, - "(" + committer, - commitDate, - lineNumber + ")", - lines.get(lineNumber) - }; + return codeElement; } } diff --git a/src/main/java/org/codetracker/blame/LineTracker.java b/src/main/java/org/codetracker/blame/LineTracker.java index 3b1710d5df4..b887966a4cf 100644 --- a/src/main/java/org/codetracker/blame/LineTracker.java +++ b/src/main/java/org/codetracker/blame/LineTracker.java @@ -6,7 +6,7 @@ /* Created by pourya on 2024-06-26*/ public interface LineTracker { - History track( + History.HistoryInfo blame( Repository repository, String filePath, String commitId, diff --git a/src/main/java/org/codetracker/blame/LineTrackerImpl.java b/src/main/java/org/codetracker/blame/LineTrackerImpl.java index 5b1f2a58185..9b8979a660b 100644 --- a/src/main/java/org/codetracker/blame/LineTrackerImpl.java +++ b/src/main/java/org/codetracker/blame/LineTrackerImpl.java @@ -1,13 +1,15 @@ package org.codetracker.blame; import org.codetracker.api.*; +import org.codetracker.element.Attribute; import org.codetracker.element.Block; -import org.codetracker.element.Variable; +import org.codetracker.element.Class; +import org.codetracker.element.Method; import org.eclipse.jgit.lib.Repository; /* Created by pourya on 2024-06-26*/ public class LineTrackerImpl implements LineTracker { - public History track( + public History.HistoryInfo blame( Repository repository, String filePath, String commitId, @@ -16,45 +18,43 @@ public History track( CodeElement codeElement ) { try { - History history = null; + History.HistoryInfo blame = null; switch (codeElement.getClass().getSimpleName()) { - case "Method": - MethodTracker methodTracker = CodeTracker - .methodTracker() + case "Class" : + String className = ((Class) codeElement).getUmlClass().getNonQualifiedName(); + ClassTracker classTracker = CodeTracker + .classTracker() .repository(repository) .filePath(filePath) .startCommitId(commitId) - .methodName(name) - .methodDeclarationLineNumber(lineNumber) + .className(className) + .classDeclarationLineNumber(lineNumber) .build(); - history = methodTracker.track(); + blame = classTracker.blame(); break; - case "Variable": - Variable variable = (Variable) codeElement; - VariableTracker variableTracker = CodeTracker - .variableTracker() + case "Method": + String methodName = ((Method) codeElement).getUmlOperation().getName(); + MethodTracker methodTracker = CodeTracker + .methodTracker() .repository(repository) .filePath(filePath) .startCommitId(commitId) - .methodName(variable.getOperation().getName()) - .methodDeclarationLineNumber( - variable.getOperation().getLocationInfo().getStartLine() - ) - .variableName(name) - .variableDeclarationLineNumber(lineNumber) + .methodName(methodName) + .methodDeclarationLineNumber(lineNumber) .build(); - history = variableTracker.track(); + blame = methodTracker.blame(); break; case "Attribute": + String attrName = ((Attribute) codeElement).getUmlAttribute().getName(); AttributeTracker attributeTracker = CodeTracker .attributeTracker() .repository(repository) .filePath(filePath) .startCommitId(commitId) - .attributeName(name) + .attributeName(attrName) .attributeDeclarationLineNumber(lineNumber) .build(); - history = attributeTracker.track(); + blame = attributeTracker.blame(); break; case "Block": Block block = (Block) codeElement; @@ -71,12 +71,12 @@ public History track( .blockStartLineNumber(codeElement.getLocation().getStartLine()) .blockEndLineNumber(codeElement.getLocation().getEndLine()) .build(); - history = blockTracker.track(); + blame = blockTracker.blame(); break; default: break; } - return history; + return blame; } catch (Exception e) { throw new RuntimeException(e); diff --git a/src/test/java/org/codetracker/blame/CodeTrackerBlameTest.java b/src/test/java/org/codetracker/blame/CodeTrackerBlameTest.java index ea359219c73..f12498ac9cd 100644 --- a/src/test/java/org/codetracker/blame/CodeTrackerBlameTest.java +++ b/src/test/java/org/codetracker/blame/CodeTrackerBlameTest.java @@ -1,15 +1,21 @@ package org.codetracker.blame; import org.eclipse.jgit.lib.Repository; +import org.junit.jupiter.api.Test; import org.refactoringminer.api.GitService; import org.refactoringminer.util.GitServiceImpl; +import java.util.ArrayList; import java.util.List; +import static org.codetracker.blame.CodeTrackerBlame.lineBlameFormat; +import static org.codetracker.blame.Utils.getFileContentByCommit; + /* Created by pourya on 2024-06-26*/ public class CodeTrackerBlameTest { private static final GitService gitService = new GitServiceImpl(); - public void testDriver() throws Exception { +// @Test + public void blameTest() throws Exception { String commitId = "9aeefcd8120bb3b89cdb437d8c32d2ed84b8a825"; String filePath = "servers/src/main/java/tachyon/worker/block/allocator/MaxFreeAllocator.java"; String owner = "Alluxio"; @@ -22,8 +28,59 @@ public void testDriver() throws Exception { gitHubToken ); List blameResult = new CodeTrackerBlame().blameFile(repository, commitId, filePath); + System.out.println(); + System.out.println("----------------------------------------------------------------------------------------"); + System.out.println(); + TabularPrint.printTabularData(blameResult); + //TODO: Add assertions + //TODO: Add test for Tabular Print formatting + } + + @Test + public void blameTestWithLocalRepo() throws Exception { + String commitId = "5b33dc6f8cfcf8c0e31966c035b0406eca97ec76"; + String filePath = "src/main/java/dat/MakeIntels.java"; + String owner = "pouryafard75"; + String repoName = "DiffBenchmark"; + String gitHubToken = System.getProperty("OAuthToken"); + Repository repository = gitService.cloneIfNotExists( + "/Users/pourya/IdeaProjects/DiffBenchmark", + "https://github.com/" + owner + "/" + repoName + ".git", + owner, + gitHubToken + ); + List blameResult = new CodeTrackerBlame().blameFile(repository, commitId, filePath); + System.out.println(); + System.out.println("----------------------------------------------------------------------------------------"); + System.out.println(); + TabularPrint.printTabularData(blameResult); + //TODO: Add assertions + //TODO: Add test for Tabular Print formatting + } + @Test + public void blameTestSingleLine() throws Exception { + String commitId = "5b33dc6f8cfcf8c0e31966c035b0406eca97ec76"; + String filePath = "src/main/java/dat/MakeIntels.java"; + String owner = "pouryafard75"; + String repoName = "DiffBenchmark"; + int lineNumber = 18; + String name = null; + String gitHubToken = System.getProperty("OAuthToken"); + Repository repository = gitService.cloneIfNotExists( + "/Users/pourya/IdeaProjects/DiffBenchmark", + "https://github.com/" + owner + "/" + repoName + ".git", + owner, + gitHubToken + ); + List blameResult = new ArrayList<>(); + List lines = getFileContentByCommit(repository, commitId, filePath); + blameResult.add(lineBlameFormat(repository, commitId, filePath, name, lineNumber, lines)); + System.out.println(); + System.out.println("----------------------------------------------------------------------------------------"); + System.out.println(); TabularPrint.printTabularData(blameResult); //TODO: Add assertions //TODO: Add test for Tabular Print formatting } + } \ No newline at end of file