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(); + } + } +}