2013-10-19 40 views
7

假設下面的一段代碼的行號致力於一個Git倉庫:使用JGIT,我怎樣才能檢索添加/刪除的行

int test(){ 
    int a = 3; 
    int b = 4; 
    int c = a + b; 
    return c; 
} 

和稍後更新爲

int test(){ 
    return 7; 
} 

我目前有一種方法,使用JGit API訪問上面提交的Git存儲庫,並輸出類似於以下內容的字符串:

int test(){ 
-int a = 3; 
-int b = 4; 
-int c = a + b; 
-return c; 
+return 7; 
} 

現在,我的要求已經改變,並且只想知道已更改行的行號。所以,我希望類似以下內容:

2 -int a = 3; 
3 -int b = 4; 
4 -int c = a + b; 
5 -return c; 
2 +return 7; 

基本上相同的信息,當某一更新GitHub的應用程序提供。

任何幫助將不勝感激:)該怎麼

片段 -/+行計算:

  String oldHash = "ee3e216ab5047748a22e9ec5ad3e92834704f0cc"; 
     Git git = null; 
     try { 
      //the path where the repo is. 
      git = Git.open(new File("C:\\Users\\Administrator\\Documents\\GitHub\\Trial")); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
     Repository repository = git.getRepository(); 
     ObjectId old = null; 
     ObjectId head = null; 
     //a new reader to read objects from getObjectDatabase() 
     ObjectReader reader = repository.newObjectReader(); 
     //Create a new parser. 
     CanonicalTreeParser oldTreeIter = new CanonicalTreeParser(); 
     CanonicalTreeParser newTreeIter = new CanonicalTreeParser(); 
     List<DiffEntry> diffs = null; 

     try { 
      //parse a git repository string and return an ObjectId 
      old = repository.resolve(oldHash + "^{tree}"); 
      head = repository.resolve("HEAD^{tree}"); 
      //Reset this parser to walk through the given tree 
      oldTreeIter.reset(reader, old); 
      newTreeIter.reset(reader, head); 
      diffs = git.diff()//Returns a command object to execute a diff command 
        .setNewTree(newTreeIter) 
        .setOldTree(oldTreeIter) 
        .call();//returns a DiffEntry for each path which is different 

     } catch (RevisionSyntaxException | IOException | GitAPIException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     //DiffLineCountFilter d = new DiffLineCountFilter(); 
     //out is the stream the formatter will write to 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     //Create a new formatter with a default level of context. 
     DiffFormatter df = new DiffFormatter(out); 
     //Set the repository the formatter can load object contents from. 
     df.setRepository(git.getRepository()); 
     ArrayList<String> diffText = new ArrayList<String>(); 
     //A DiffEntry is 'A value class representing a change to a file' therefore for each file you have a diff entry 
     for(DiffEntry diff : diffs) 
     { 
      try { 
       //Format a patch script for one file entry. 
       df.format(diff); 
       RawText r = new RawText(out.toByteArray()); 
       r.getLineDelimiter(); 


       diffText.add(out.toString()); 
       out.reset(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     } 
+0

我不明白你想要的輸出是什麼,爲什麼要'+ return 7;'ha 5號線? – robinst

+0

對不起,這是一個錯誤。它應該是: 2 -int a = 3; 3 -int b = 4; 4 -int c = a + b; 5 -return c; 2 + return 7; – gracey

+0

只是編輯它:) – gracey

回答

3

只是一個對任何人提示誰可能有這個問題。我沒有設法得到添加和刪除的行的行號,但我設法得到一個字符串,其中只包含添加和刪除的行,而沒有其他行沒有改變。

df.setContext(0); 

在我行

df.format(diff); 
+0

我提到的代碼,我認爲你可以從差異輸出計算行數。 '@@ -4,4 +4,4 @@'應該是'@@ - + ' – surenyonjan

1

你需要做的A線指標和B之間的差異前右上方提供的片段:

這是簡單地通過增加線完成從差異結果的行索引:

int linesAdded = 0; 
int linesDeleted = 0; 
int filesChanged = 0; 
try { 
    repo = new FileRepository(new File("repo/.git")); 
    RevWalk rw = new RevWalk(repo); 
    RevCommit commit = rw.parseCommit(repo.resolve("486817d67b")); // Any ref will work here (HEAD, a sha1, tag, branch) 
    RevCommit parent = rw.parseCommit(commit.getParent(0).getId()); 
    DiffFormatter df = new DiffFormatter(DisabledOutputStream.INSTANCE); 
    df.setRepository(repo); 
    df.setDiffComparator(RawTextComparator.DEFAULT); 
    df.setDetectRenames(true); 
    List<DiffEntry> diffs; 
    diffs = df.scan(parent.getTree(), commit.getTree()); 
    filesChanged = diffs.size(); 
    for (DiffEntry diff : diffs) { 
     for (Edit edit : df.toFileHeader(diff).toEditList()) { 
      linesDeleted += edit.getEndA() - edit.getBeginA(); 
      linesAdded += edit.getEndB() - edit.getBeginB(); 
     } 
    } 
} catch (IOException e1) { 
    throw new RuntimeException(e1); 
}