From 9332bc3e21244bf545c1b1be21518bf6b08cfe33 Mon Sep 17 00:00:00 2001 From: Andrew Oberstar Date: Sun, 23 Aug 2015 19:25:06 -0500 Subject: [PATCH] Support renames in grgit.show() Fix #74, but using JGit's RenameDetector to process the commit's diff before returning it to the caller. --- .../ajoberstar/grgit/operation/ShowOp.groovy | 18 ++++++++++++------ .../grgit/operation/ShowOpSpec.groovy | 18 ++++++++++++++++++ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/main/groovy/org/ajoberstar/grgit/operation/ShowOp.groovy b/src/main/groovy/org/ajoberstar/grgit/operation/ShowOp.groovy index 03ce2fef..d20cc21b 100644 --- a/src/main/groovy/org/ajoberstar/grgit/operation/ShowOp.groovy +++ b/src/main/groovy/org/ajoberstar/grgit/operation/ShowOp.groovy @@ -25,6 +25,7 @@ import org.ajoberstar.grgit.util.JGitUtil import org.eclipse.jgit.diff.DiffEntry import org.eclipse.jgit.diff.DiffEntry.ChangeType +import org.eclipse.jgit.diff.RenameDetector import org.eclipse.jgit.treewalk.TreeWalk /** @@ -76,14 +77,19 @@ class ShowOp implements Callable { if (parentId) { walk.addTree(parentId.tree) walk.addTree(commitId.tree) - Map entries = DiffEntry.scan(walk).groupBy { it.changeType } + List initialEntries = DiffEntry.scan(walk) + RenameDetector detector = new RenameDetector(repo.jgit.repository) + detector.addAll(initialEntries) + List entries = detector.compute() + Map entriesByType = entries.groupBy { it.changeType } + return new CommitDiff( commit: commit, - added: entries[ChangeType.ADD].collect { it.newPath }, - copied: entries[ChangeType.COPY].collect { it.newPath }, - modified: entries[ChangeType.MODIFY].collect { it.newPath }, - removed: entries[ChangeType.DELETE].collect { it.oldPath }, - renamed: entries[ChangeType.RENAME].collect { it.newPath } + added: entriesByType[ChangeType.ADD].collect { it.newPath }, + copied: entriesByType[ChangeType.COPY].collect { it.newPath }, + modified: entriesByType[ChangeType.MODIFY].collect { it.newPath }, + removed: entriesByType[ChangeType.DELETE].collect { it.oldPath }, + renamed: entriesByType[ChangeType.RENAME].collect { it.newPath } ) } else { walk.addTree(commitId.tree) diff --git a/src/test/groovy/org/ajoberstar/grgit/operation/ShowOpSpec.groovy b/src/test/groovy/org/ajoberstar/grgit/operation/ShowOpSpec.groovy index 2a897bd9..2558ab3c 100644 --- a/src/test/groovy/org/ajoberstar/grgit/operation/ShowOpSpec.groovy +++ b/src/test/groovy/org/ajoberstar/grgit/operation/ShowOpSpec.groovy @@ -92,6 +92,24 @@ class ShowOpSpec extends SimpleGitOpSpec { ) } + def 'can show diffs in commit with rename'() { + given: + repoFile('elephant.txt') << 'I have tusks.' + grgit.add(patterns: ['.']) + grgit.commit(message: 'Adding elephant.') + + repoFile('elephant.txt').renameTo(repoFile('mammoth.txt')) + grgit.add(patterns: ['.']) + grgit.remove(patterns: ['elephant.txt']) + Commit renameCommit = grgit.commit(message: 'Renaming to mammoth.') + + expect: + grgit.show(commit: renameCommit) == new CommitDiff( + commit: renameCommit, + renamed: ['mammoth.txt'] + ) + } + def 'can show diffs based on rev string'() { File fooFile = repoFile("foo.txt") fooFile << "foo!"