From 906198ad6db5206f2bf696ee684a5566c43aaf2f Mon Sep 17 00:00:00 2001
From: Gaetan Boismal <gaetan.boismal@forgerock.com>
Date: Tue, 29 Sep 2015 09:58:39 +0000
Subject: [PATCH] OPENDJ-2253 PR-58 Adapts opendj copyright plugin

---
 opendj-copyright-maven-plugin/src/test/java/org/forgerock/maven/UpdateCopyrightTestCase.java |    4 
 opendj-copyright-maven-plugin/src/main/java/org/forgerock/maven/CopyrightAbstractMojo.java   |  134 +++++++++++++++++++++++++++++++++-----------
 2 files changed, 102 insertions(+), 36 deletions(-)

diff --git a/opendj-copyright-maven-plugin/src/main/java/org/forgerock/maven/CopyrightAbstractMojo.java b/opendj-copyright-maven-plugin/src/main/java/org/forgerock/maven/CopyrightAbstractMojo.java
index f5831e1..9168b91 100644
--- a/opendj-copyright-maven-plugin/src/main/java/org/forgerock/maven/CopyrightAbstractMojo.java
+++ b/opendj-copyright-maven-plugin/src/main/java/org/forgerock/maven/CopyrightAbstractMojo.java
@@ -25,12 +25,13 @@
  */
 package org.forgerock.maven;
 
-import static org.forgerock.util.Utils.*;
+import static org.forgerock.util.Utils.closeSilently;
 
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Calendar;
 import java.util.LinkedList;
@@ -45,15 +46,26 @@
 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.DiffScmResult;
 import org.apache.maven.scm.command.status.StatusScmResult;
+import org.apache.maven.scm.log.ScmLogDispatcher;
+import org.apache.maven.scm.log.ScmLogger;
 import org.apache.maven.scm.manager.BasicScmManager;
 import org.apache.maven.scm.manager.NoSuchScmProviderException;
 import org.apache.maven.scm.manager.ScmManager;
-import org.apache.maven.scm.provider.ScmProvider;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.git.command.GitCommand;
+import org.apache.maven.scm.provider.git.command.diff.GitDiffConsumer;
 import org.apache.maven.scm.provider.git.gitexe.GitExeScmProvider;
-import org.apache.maven.scm.provider.svn.svnexe.SvnExeScmProvider;
+import org.apache.maven.scm.provider.git.gitexe.command.GitCommandLineUtils;
+import org.apache.maven.scm.provider.git.gitexe.command.diff.GitDiffCommand;
 import org.apache.maven.scm.repository.ScmRepository;
 import org.apache.maven.scm.repository.ScmRepositoryException;
+import org.codehaus.plexus.util.cli.CommandLineUtils;
+import org.codehaus.plexus.util.cli.CommandLineUtils.StringStreamConsumer;
+import org.codehaus.plexus.util.cli.Commandline;
 
 /**
  * Abstract class which is used for both copyright checks and updates.
@@ -71,9 +83,9 @@
     @Parameter(required = true, defaultValue = "ForgeRock AS")
     private String copyrightOwnerToken;
 
-    /** The path to the root of the Subversion workspace to check. */
+    /** The path to the root of the scm local workspace to check. */
     @Parameter(required = true, defaultValue = "${basedir}")
-    private String scmWorkspaceRoot;
+    private String baseDir;
 
     @Parameter(required = true, defaultValue = "${project.scm.connection}")
     private String scmRepositoryUrl;
@@ -91,6 +103,47 @@
     private static final List<String> SUPPORTED_START_BLOCK_COMMENT_TOKEN = new LinkedList<>(Arrays.asList(
                     "/*", "<!--"));
 
+    private static final class CustomGitExeScmProvider extends GitExeScmProvider {
+
+        @Override
+        protected GitCommand getDiffCommand() {
+            return new CustomGitDiffCommand();
+        }
+    }
+
+    private static class CustomGitDiffCommand extends GitDiffCommand implements GitCommand {
+
+        @Override
+        protected DiffScmResult executeDiffCommand(ScmProviderRepository repo, ScmFileSet fileSet,
+                ScmVersion unused, ScmVersion unused2) throws ScmException {
+            final GitDiffConsumer consumer = new GitDiffConsumer(getLogger(), fileSet.getBasedir());
+            final StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
+            final Commandline cl = GitCommandLineUtils.getBaseGitCommandLine(fileSet.getBasedir(), "diff");
+            cl.addArguments(new String[] { "--no-ext-diff", "--relative", "master...HEAD", "." });
+
+            if (GitCommandLineUtils.execute(cl, consumer, stderr, getLogger()) != 0) {
+                return new DiffScmResult(cl.toString(), "The git-diff command failed.", stderr.getOutput(), false);
+            }
+            return new DiffScmResult(
+                    cl.toString(), consumer.getChangedFiles(), consumer.getDifferences(), consumer.getPatch());
+        }
+
+    }
+
+    private String getLocalScmRootPath(final File basedir) throws ScmException {
+        final Commandline cl = GitCommandLineUtils.getBaseGitCommandLine(basedir, "rev-parse");
+        cl.addArguments(new String[] { "--show-toplevel" });
+
+        final StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
+        final StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
+        final ScmLogger dummyLogger = new ScmLogDispatcher();
+
+        final int exitCode = GitCommandLineUtils.execute(cl, stdout, stderr, dummyLogger);
+        return exitCode == 0 ? stdout.getOutput().trim().replace(" ", "%20")
+                             : basedir.getPath();
+    }
+
+
     /** The string representation of the current year. */
     Integer currentYear = Calendar.getInstance().get(Calendar.YEAR);
 
@@ -109,16 +162,11 @@
         if (scmManager == null) {
             scmManager = new BasicScmManager();
             String scmProviderID = getScmProviderID();
-            ScmProvider scmProvider;
-            if ("svn".equals(scmProviderID)) {
-                scmProvider = new SvnExeScmProvider();
-            } else if ("git".equals(scmProviderID)) {
-                scmProvider = new GitExeScmProvider();
-            } else {
-                throw new MojoExecutionException("Unsupported scm provider: " + scmProviderID + " or "
-                        + getIncorrectScmRepositoryUrlMsg());
+            if (!"git".equals(scmProviderID)) {
+                throw new MojoExecutionException(
+                        "Unsupported scm provider: " + scmProviderID + " or " + getIncorrectScmRepositoryUrlMsg());
             }
-            scmManager.setScmProvider(scmProviderID, scmProvider);
+            scmManager.setScmProvider(scmProviderID, new CustomGitExeScmProvider());
         }
 
         return scmManager;
@@ -151,27 +199,28 @@
         return scmRepository;
     }
 
-    String getScmWorkspaceRoot() {
-        return scmWorkspaceRoot;
+    String getBaseDir() {
+        return baseDir;
     }
 
-    /** Performs a diff with current working directory state against remote HEAD revision. */
-    List<String> getChangedFiles() throws MojoExecutionException, MojoFailureException  {
+    /**
+     * Performs a diff with current working directory state against remote HEAD revision.
+     * Then do a status to check uncommited changes as well.
+     */
+    List<File> getChangedFiles() throws MojoExecutionException, MojoFailureException  {
         try {
-            ScmFileSet workspaceFileSet = new ScmFileSet(new File(getScmWorkspaceRoot()));
-            StatusScmResult statusResult = getScmManager().status(getScmRepository(), workspaceFileSet);
-            if (!statusResult.isSuccess()) {
-                getLog().error("Impossible to perform scm status command because " + statusResult.getCommandOutput());
-                throw new MojoFailureException("SCM error");
-            }
+            final ScmFileSet workspaceFileSet = new ScmFileSet(new File(getBaseDir()));
+            final DiffScmResult diffMasterHeadResult = getScmManager().diff(
+                    getScmRepository(), workspaceFileSet, null, null);
+            ensureCommandSuccess(diffMasterHeadResult, "diff master...HEAD .");
 
-            List<ScmFile> scmFiles = statusResult.getChangedFiles();
-            List<String> changedFilePaths = new LinkedList<>();
-            for (ScmFile scmFile : scmFiles) {
-                if (scmFile.getStatus() != ScmFileStatus.UNKNOWN) {
-                    changedFilePaths.add(scmFile.getPath());
-                }
-            }
+            final StatusScmResult statusResult = getScmManager().status(getScmRepository(), workspaceFileSet);
+            ensureCommandSuccess(statusResult, "status");
+
+            final List<File> changedFilePaths = new ArrayList<>();
+            addToChangedFiles(diffMasterHeadResult.getChangedFiles(), getBaseDir(), changedFilePaths);
+            final String localScmRootPath = getLocalScmRootPath(new File(getBaseDir()));
+            addToChangedFiles(statusResult.getChangedFiles(), localScmRootPath, changedFilePaths);
 
             return changedFilePaths;
         } catch (ScmException e) {
@@ -180,14 +229,32 @@
         }
     }
 
+    private void ensureCommandSuccess(final ScmResult result, final String cmd) throws MojoFailureException {
+        if (!result.isSuccess()) {
+            final String message = "Impossible to perform scm " + cmd + " command because " + result.getCommandOutput();
+            getLog().error(message);
+            throw new MojoFailureException(message);
+        }
+    }
+
+    private void addToChangedFiles(
+            final List<ScmFile> scmChangedFiles, final String rootPath, final List<File> changedFiles) {
+        for (final ScmFile scmFile : scmChangedFiles) {
+            final String scmFilePath = scmFile.getPath();
+            if (scmFile.getStatus() != ScmFileStatus.UNKNOWN && !changedFiles.contains(scmFilePath)) {
+                changedFiles.add(new File(rootPath, scmFilePath));
+            }
+        }
+    }
+
     /** Examines the provided files list to determine whether each changed file copyright is acceptable. */
     void checkCopyrights() throws MojoExecutionException, MojoFailureException {
-        for (String changedFileName : getChangedFiles()) {
-            File changedFile = new File(getScmWorkspaceRoot(), changedFileName);
+        for (final File changedFile : getChangedFiles()) {
             if (!changedFile.exists() || !changedFile.isFile()) {
                 continue;
             }
 
+            final String changedFileName = changedFile.getPath();
             int lastPeriodPos = changedFileName.lastIndexOf('.');
             if (lastPeriodPos > 0) {
                 String extension = changedFileName.substring(lastPeriodPos + 1);
@@ -274,5 +341,4 @@
     boolean isCommentLine(String line) {
         return getCommentToken(line, true) != null;
     }
-
 }
diff --git a/opendj-copyright-maven-plugin/src/test/java/org/forgerock/maven/UpdateCopyrightTestCase.java b/opendj-copyright-maven-plugin/src/test/java/org/forgerock/maven/UpdateCopyrightTestCase.java
index 4519e91..8d6b691 100644
--- a/opendj-copyright-maven-plugin/src/test/java/org/forgerock/maven/UpdateCopyrightTestCase.java
+++ b/opendj-copyright-maven-plugin/src/test/java/org/forgerock/maven/UpdateCopyrightTestCase.java
@@ -98,13 +98,13 @@
             int nbLinesToSkip, int numberSpacesIndentation, String newPortionCopyrightString,
             String newCopyrightStartString, String copyrightEndToken, String newCopyrightOwnerStr) throws Exception {
         List<String> testFilePaths = new LinkedList<>();
-        List<String> updatedTestFilePaths = new LinkedList<>();
+        List<File> updatedTestFilePaths = new LinkedList<>();
 
         File[] changedFiles = new File(RESOURCE_DIR, testCaseFolderPath)
             .listFiles(new FilenameExtensionFilter(".txt"));
         for (File file : changedFiles) {
             testFilePaths.add(file.getAbsolutePath());
-            updatedTestFilePaths.add(file.getPath() + ".tmp");
+            updatedTestFilePaths.add(new File(file.getPath() + ".tmp"));
         }
 
         UpdateCopyrightMojo spyMojo = spy(new UpdateCopyrightMojo());

--
Gitblit v1.10.0