Updated Branches:
  refs/heads/master a1fa0a15a -> ecd32d822

add first version of JGitDiffCommand


Project: http://git-wip-us.apache.org/repos/asf/maven-scm/repo
Commit: http://git-wip-us.apache.org/repos/asf/maven-scm/commit/c3804c61
Tree: http://git-wip-us.apache.org/repos/asf/maven-scm/tree/c3804c61
Diff: http://git-wip-us.apache.org/repos/asf/maven-scm/diff/c3804c61

Branch: refs/heads/master
Commit: c3804c61253234cc880e73275b4aec3f902699bb
Parents: 5601d2c
Author: imod <d...@fortysix.ch>
Authored: Mon Jun 17 22:00:16 2013 +0200
Committer: imod <d...@fortysix.ch>
Committed: Mon Jun 17 22:00:16 2013 +0200

----------------------------------------------------------------------
 .../scm/provider/git/jgit/JGitScmProvider.java  |  3 +-
 .../git/jgit/command/diff/JGitDiffCommand.java  | 88 ++++++++++++++++++++
 2 files changed, 90 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/maven-scm/blob/c3804c61/src/main/java/org/apache/maven/scm/provider/git/jgit/JGitScmProvider.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/maven/scm/provider/git/jgit/JGitScmProvider.java 
b/src/main/java/org/apache/maven/scm/provider/git/jgit/JGitScmProvider.java
index cabf7f0..2c39278 100644
--- a/src/main/java/org/apache/maven/scm/provider/git/jgit/JGitScmProvider.java
+++ b/src/main/java/org/apache/maven/scm/provider/git/jgit/JGitScmProvider.java
@@ -30,6 +30,7 @@ import 
org.apache.maven.scm.provider.git.jgit.command.branch.JGitBranchCommand;
 import 
org.apache.maven.scm.provider.git.jgit.command.changelog.JGitChangeLogCommand;
 import 
org.apache.maven.scm.provider.git.jgit.command.checkin.JGitCheckInCommand;
 import 
org.apache.maven.scm.provider.git.jgit.command.checkout.JGitCheckOutCommand;
+import org.apache.maven.scm.provider.git.jgit.command.diff.JGitDiffCommand;
 import org.apache.maven.scm.provider.git.jgit.command.status.JGitStatusCommand;
 import org.apache.maven.scm.provider.git.jgit.command.tag.JGitTagCommand;
 import org.apache.maven.scm.repository.ScmRepositoryException;
@@ -77,7 +78,7 @@ public class JGitScmProvider
     /** {@inheritDoc} */
     protected GitCommand getDiffCommand()
     {
-       throw new UnsupportedOperationException("getDiffCommand");
+       return new JGitDiffCommand();
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/maven-scm/blob/c3804c61/src/main/java/org/apache/maven/scm/provider/git/jgit/command/diff/JGitDiffCommand.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/maven/scm/provider/git/jgit/command/diff/JGitDiffCommand.java
 
b/src/main/java/org/apache/maven/scm/provider/git/jgit/command/diff/JGitDiffCommand.java
new file mode 100644
index 0000000..3feb1b9
--- /dev/null
+++ 
b/src/main/java/org/apache/maven/scm/provider/git/jgit/command/diff/JGitDiffCommand.java
@@ -0,0 +1,88 @@
+package org.apache.maven.scm.provider.git.jgit.command.diff;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFile;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmFileStatus;
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.ScmVersion;
+import org.apache.maven.scm.command.diff.AbstractDiffCommand;
+import org.apache.maven.scm.command.diff.DiffScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.git.command.GitCommand;
+import org.eclipse.jgit.api.DiffCommand;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.diff.DiffEntry;
+import org.eclipse.jgit.diff.DiffEntry.ChangeType;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.treewalk.AbstractTreeIterator;
+import org.eclipse.jgit.treewalk.CanonicalTreeParser;
+
+public class JGitDiffCommand extends AbstractDiffCommand implements GitCommand 
{
+
+       @Override
+       protected DiffScmResult executeDiffCommand(ScmProviderRepository 
repository, ScmFileSet fileSet, ScmVersion startRevision, ScmVersion 
endRevision) throws ScmException {
+
+               try {
+                       Git git = Git.open(fileSet.getBasedir());
+
+                       OutputStream out = new ByteArrayOutputStream();
+                       DiffCommand diff = 
git.diff().setOutputStream(out).setOldTree(getTreeIterator(git.getRepository(), 
startRevision.getName())).setNewTree(getTreeIterator(git.getRepository(), 
endRevision.getName()));
+                       List<DiffEntry> entries = diff.call();
+                       List<ScmFile> changedFiles = new ArrayList<ScmFile>();
+                       
+                       // TODO get differences 
+                       Map<String, CharSequence> differences = new 
HashMap<String, CharSequence>();
+
+                       for (DiffEntry diffEntry : entries) {
+                               changedFiles.add(new 
ScmFile(diffEntry.getNewPath(), 
getFileStatusForModificationType(diffEntry.getChangeType())));
+                       }
+
+                       return new DiffScmResult(changedFiles, differences, 
out.toString(), new ScmResult("JGit diff", "diff", null, true));
+               } catch (Exception e) {
+                       throw new ScmException("JGit diff failure!", e);
+               }
+       }
+
+       private ScmFileStatus getFileStatusForModificationType(ChangeType 
changeType) {
+               switch (changeType) {
+               case ADD:
+                       return ScmFileStatus.ADDED;
+               case MODIFY:
+                       return ScmFileStatus.MODIFIED;
+               case DELETE:
+                       return ScmFileStatus.DELETED;
+               case RENAME:
+                       return ScmFileStatus.RENAMED;
+               case COPY:
+                       return ScmFileStatus.COPIED;
+               default:
+                       return ScmFileStatus.UNKNOWN;
+               }
+       }
+
+       private AbstractTreeIterator getTreeIterator(Repository repo, String 
name) throws IOException {
+               final ObjectId id = repo.resolve(name);
+               if (id == null)
+                       throw new IllegalArgumentException(name);
+               final CanonicalTreeParser p = new CanonicalTreeParser();
+               final ObjectReader or = repo.newObjectReader();
+               try {
+                       p.reset(or, new RevWalk(repo).parseTree(id));
+                       return p;
+               } finally {
+                       or.release();
+               }
+       }
+}

Reply via email to