You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by rf...@apache.org on 2007/12/13 01:42:29 UTC
svn commit: r603783 - in
/incubator/tuscany/java/sca/tools/maven/maven-incremental-build: ./
src/main/java/org/apache/tuscany/sca/tools/incremental/build/plugin/
Author: rfeng
Date: Wed Dec 12 16:42:25 2007
New Revision: 603783
URL: http://svn.apache.org/viewvc?rev=603783&view=rev
Log:
Use timestamp to detect the changes
Added:
incubator/tuscany/java/sca/tools/maven/maven-incremental-build/src/main/java/org/apache/tuscany/sca/tools/incremental/build/plugin/AbstractBuildMojo.java (with props)
Removed:
incubator/tuscany/java/sca/tools/maven/maven-incremental-build/src/main/java/org/apache/tuscany/sca/tools/incremental/build/plugin/AbstractScmMojo.java
Modified:
incubator/tuscany/java/sca/tools/maven/maven-incremental-build/pom.xml
incubator/tuscany/java/sca/tools/maven/maven-incremental-build/src/main/java/org/apache/tuscany/sca/tools/incremental/build/plugin/IncrementalBuildMojo.java
Modified: incubator/tuscany/java/sca/tools/maven/maven-incremental-build/pom.xml
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/tools/maven/maven-incremental-build/pom.xml?rev=603783&r1=603782&r2=603783&view=diff
==============================================================================
--- incubator/tuscany/java/sca/tools/maven/maven-incremental-build/pom.xml (original)
+++ incubator/tuscany/java/sca/tools/maven/maven-incremental-build/pom.xml Wed Dec 12 16:42:25 2007
@@ -73,22 +73,22 @@
</dependency>
<dependency>
- <groupId>org.apache.maven.scm</groupId>
- <artifactId>maven-scm-manager-plexus</artifactId>
- <version>1.0</version>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-compiler-api</artifactId>
+ <version>1.5.3</version>
</dependency>
+
<dependency>
- <groupId>org.apache.maven.scm</groupId>
- <artifactId>maven-scm-provider-svnexe</artifactId>
- <version>1.0</version>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-compiler-manager</artifactId>
+ <version>1.5.3</version>
</dependency>
<dependency>
- <groupId>org.apache.maven.scm</groupId>
- <artifactId>maven-scm-provider-local</artifactId>
- <version>1.0</version>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-compiler-javac</artifactId>
+ <version>1.5.3</version>
+ <scope>runtime</scope>
</dependency>
-
-
</dependencies>
</project>
Added: incubator/tuscany/java/sca/tools/maven/maven-incremental-build/src/main/java/org/apache/tuscany/sca/tools/incremental/build/plugin/AbstractBuildMojo.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/tools/maven/maven-incremental-build/src/main/java/org/apache/tuscany/sca/tools/incremental/build/plugin/AbstractBuildMojo.java?rev=603783&view=auto
==============================================================================
--- incubator/tuscany/java/sca/tools/maven/maven-incremental-build/src/main/java/org/apache/tuscany/sca/tools/incremental/build/plugin/AbstractBuildMojo.java (added)
+++ incubator/tuscany/java/sca/tools/maven/maven-incremental-build/src/main/java/org/apache/tuscany/sca/tools/incremental/build/plugin/AbstractBuildMojo.java Wed Dec 12 16:42:25 2007
@@ -0,0 +1,436 @@
+package org.apache.tuscany.sca.tools.incremental.build.plugin;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.maven.model.Resource;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.project.MavenProject;
+import org.codehaus.plexus.compiler.Compiler;
+import org.codehaus.plexus.compiler.CompilerConfiguration;
+import org.codehaus.plexus.compiler.CompilerException;
+import org.codehaus.plexus.compiler.CompilerOutputStyle;
+import org.codehaus.plexus.compiler.manager.CompilerManager;
+import org.codehaus.plexus.compiler.manager.NoSuchCompilerException;
+import org.codehaus.plexus.compiler.util.scan.InclusionScanException;
+import org.codehaus.plexus.compiler.util.scan.SimpleSourceInclusionScanner;
+import org.codehaus.plexus.compiler.util.scan.SourceInclusionScanner;
+import org.codehaus.plexus.compiler.util.scan.StaleSourceScanner;
+import org.codehaus.plexus.compiler.util.scan.mapping.SingleTargetSourceMapping;
+import org.codehaus.plexus.compiler.util.scan.mapping.SourceMapping;
+import org.codehaus.plexus.compiler.util.scan.mapping.SuffixMapping;
+import org.codehaus.plexus.util.DirectoryScanner;
+
+/**
+ * @version $Id: StaleSourceScannerTest.java 2393 2005-08-08 22:32:59Z kenney $
+ */
+public abstract class AbstractBuildMojo extends AbstractMojo {
+ // ----------------------------------------------------------------------
+ // Configurables
+ // ----------------------------------------------------------------------
+
+ /**
+ * The -source argument for the Java compiler.
+ *
+ * @parameter expression="${maven.compiler.source}"
+ * @readonly
+ */
+ private String source;
+
+ /**
+ * The -target argument for the Java compiler.
+ *
+ * @parameter expression="${maven.compiler.target}"
+ * @readonly
+ */
+ private String target;
+
+ /**
+ * The -encoding argument for the Java compiler.
+ *
+ * @parameter expression="${maven.compiler.encoding}"
+ * @readonly
+ */
+ private String encoding;
+
+ /**
+ * Sets the granularity in milliseconds of the last modification
+ * date for testing whether a source needs recompilation.
+ *
+ * @parameter expression="${lastModGranularityMs}" default-value="0"
+ *
+ */
+ private int staleMillis;
+
+ /**
+ * The compiler id of the compiler to use. See this
+ * <a href="non-javac-compilers.html">guide</a> for more information.
+ *
+ * @parameter expression="${maven.compiler.compilerId}" default-value="javac"
+ * @readonly
+ */
+ private String compilerId;
+
+ /**
+ * Version of the compiler to use, ex. "1.3", "1.5", if fork is set to true.
+ *
+ * @parameter expression="${maven.compiler.compilerVersion}"
+ * @readonly
+ */
+ private String compilerVersion;
+
+ /**
+ * Sets the executable of the compiler to use when fork is true.
+ *
+ * @parameter expression="${maven.compiler.executable}"
+ * @readonly
+ */
+ private String executable;
+
+ /**
+ * The directory to run the compiler from if fork is true.
+ *
+ * @parameter expression="${basedir}"
+ * @required
+ * @readonly
+ */
+ protected File basedir;
+
+ /**
+ * The target directory of the compiler if fork is true.
+ *
+ * @parameter expression="${project.build.directory}"
+ * @required
+ * @readonly
+ */
+ private File buildDirectory;
+
+ /**
+ * Plexus compiler manager.
+ *
+ * @component
+ * @readonly
+ */
+ private CompilerManager compilerManager;
+
+ /**
+ * The project to create a build for.
+ *
+ * @parameter expression="${project}"
+ * @required
+ * @readonly
+ */
+ protected MavenProject project;
+
+ protected SourceInclusionScanner getSourceInclusionScanner(int staleMillis) {
+ return new StaleSourceScanner(staleMillis);
+ }
+
+ protected SourceInclusionScanner getSourceInclusionScanner(String inputFileEnding) {
+ Set includes = Collections.singleton("**/*." + inputFileEnding);
+ return new SimpleSourceInclusionScanner(includes, Collections.EMPTY_SET);
+ }
+
+ /**
+ * Test if the resources have been changed
+ * @return
+ * @throws MojoExecutionException
+ */
+ protected boolean isResourceChanged() throws MojoExecutionException {
+ return isChanged(project.getResources(), project.getBuild().getOutputDirectory());
+ }
+
+ protected boolean isTestResourceChanged() throws MojoExecutionException {
+ return isChanged(project.getTestResources(), project.getBuild().getTestOutputDirectory());
+ }
+
+ private static final String[] EMPTY_STRING_ARRAY = {};
+
+ private static final String[] DEFAULT_INCLUDES = {"**/**"};
+
+ /**
+ * Test if any of the resources have been changed
+ * @param resources
+ * @param outputDirectory
+ * @return
+ * @throws MojoExecutionException
+ */
+ protected boolean isChanged(List resources, String outputDirectory) throws MojoExecutionException {
+
+ for (Iterator i = resources.iterator(); i.hasNext();) {
+ Resource resource = (Resource)i.next();
+
+ String targetPath = resource.getTargetPath();
+
+ File resourceDirectory = new File(resource.getDirectory());
+
+ if (!resourceDirectory.exists()) {
+ continue;
+ }
+
+ // this part is required in case the user specified "../something" as destination
+ // see MNG-1345
+ File outputDir = new File(outputDirectory);
+ if (!outputDir.exists()) {
+ return true;
+ }
+
+ DirectoryScanner scanner = new DirectoryScanner();
+
+ scanner.setBasedir(resource.getDirectory());
+ if (resource.getIncludes() != null && !resource.getIncludes().isEmpty()) {
+ scanner.setIncludes((String[])resource.getIncludes().toArray(EMPTY_STRING_ARRAY));
+ } else {
+ scanner.setIncludes(DEFAULT_INCLUDES);
+ }
+ if (resource.getExcludes() != null && !resource.getExcludes().isEmpty()) {
+ scanner.setExcludes((String[])resource.getExcludes().toArray(EMPTY_STRING_ARRAY));
+ }
+
+ scanner.addDefaultExcludes();
+ scanner.scan();
+
+ List includedFiles = Arrays.asList(scanner.getIncludedFiles());
+ for (Iterator j = includedFiles.iterator(); j.hasNext();) {
+ String name = (String)j.next();
+
+ String destination = name;
+
+ if (targetPath != null) {
+ destination = targetPath + "/" + name;
+ }
+
+ File source = new File(resource.getDirectory(), name);
+
+ File destinationFile = new File(outputDirectory, destination);
+
+ if (!destinationFile.exists()) {
+ return true;
+ } else {
+ if (source.lastModified() > destinationFile.lastModified()) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ protected boolean isSourceChanged(Compiler compiler) throws MojoExecutionException {
+ try {
+ List sourceRoots = project.getCompileSourceRoots();
+ File outputDir = new File(project.getBuild().getOutputDirectory());
+ List classPathEntries = project.getCompileClasspathElements();
+ return isChanged(compiler, sourceRoots, classPathEntries, outputDir);
+ } catch (Exception e) {
+ throw new MojoExecutionException(e.getMessage(), e);
+ }
+ }
+
+ protected boolean isTestSourceChanged(Compiler compiler) throws MojoExecutionException {
+ try {
+ List sourceRoots = project.getTestCompileSourceRoots();
+ File outputDir = new File(project.getBuild().getTestOutputDirectory());
+ List classPathEntries = project.getTestClasspathElements();
+ return isChanged(compiler, sourceRoots, classPathEntries, outputDir);
+ } catch (Exception e) {
+ throw new MojoExecutionException(e.getMessage(), e);
+ }
+ }
+
+ public boolean isChanged(Compiler compiler, List sourceRoots, List classPathEntries, File outputDir)
+ throws MojoExecutionException {
+ List compileSourceRoots = removeEmptyCompileSourceRoots(sourceRoots);
+
+ if (compileSourceRoots.isEmpty()) {
+ getLog().info("No sources to compile");
+ return false;
+ }
+
+ // ----------------------------------------------------------------------
+ // Create the compiler configuration
+ // ----------------------------------------------------------------------
+
+ CompilerConfiguration compilerConfiguration = new CompilerConfiguration();
+
+ compilerConfiguration.setOutputLocation(outputDir.getAbsolutePath());
+
+ compilerConfiguration.setClasspathEntries(classPathEntries);
+
+ compilerConfiguration.setSourceLocations(compileSourceRoots);
+
+ compilerConfiguration.setOptimize(false);
+
+ compilerConfiguration.setDebug(true);
+
+ compilerConfiguration.setVerbose(false);
+
+ compilerConfiguration.setShowWarnings(false);
+
+ compilerConfiguration.setShowDeprecation(true);
+
+ compilerConfiguration.setSourceVersion(source);
+
+ compilerConfiguration.setTargetVersion(target);
+
+ compilerConfiguration.setSourceEncoding(encoding);
+
+ compilerConfiguration.setExecutable(executable);
+
+ compilerConfiguration.setWorkingDirectory(basedir);
+
+ compilerConfiguration.setCompilerVersion(compilerVersion);
+
+ compilerConfiguration.setBuildDirectory(buildDirectory);
+
+ compilerConfiguration.setOutputFileName(project.getBuild().getFinalName());
+
+ // TODO: have an option to always compile (without need to clean)
+ Set staleSources;
+
+ boolean canUpdateTarget;
+
+ try {
+ staleSources =
+ computeStaleSources(compilerConfiguration,
+ compiler,
+ getSourceInclusionScanner(staleMillis),
+ sourceRoots,
+ outputDir);
+
+ canUpdateTarget = compiler.canUpdateTarget(compilerConfiguration);
+
+ if (compiler.getCompilerOutputStyle().equals(CompilerOutputStyle.ONE_OUTPUT_FILE_FOR_ALL_INPUT_FILES) && !canUpdateTarget) {
+ getLog().info("RESCANNING!");
+ // TODO: This second scan for source files is sub-optimal
+ String inputFileEnding = compiler.getInputFileEnding(compilerConfiguration);
+
+ Set sources =
+ computeStaleSources(compilerConfiguration,
+ compiler,
+ getSourceInclusionScanner(inputFileEnding),
+ sourceRoots,
+ outputDir);
+
+ compilerConfiguration.setSourceFiles(sources);
+ } else {
+ compilerConfiguration.setSourceFiles(staleSources);
+ }
+ } catch (CompilerException e) {
+ throw new MojoExecutionException("Error while computing stale sources.", e);
+ }
+
+ return !staleSources.isEmpty();
+
+ }
+
+ protected Compiler getCompiler() throws MojoExecutionException {
+ Compiler compiler;
+
+ getLog().debug("Using compiler '" + compilerId + "'.");
+
+ try {
+ compiler = compilerManager.getCompiler(compilerId);
+ } catch (NoSuchCompilerException e) {
+ throw new MojoExecutionException("No such compiler '" + e.getCompilerId() + "'.");
+ }
+ return compiler;
+ }
+
+ protected Set computeStaleSources(CompilerConfiguration compilerConfiguration,
+ Compiler compiler,
+ SourceInclusionScanner scanner,
+ List sourceRoots,
+ File outputDir) throws MojoExecutionException, CompilerException {
+ CompilerOutputStyle outputStyle = compiler.getCompilerOutputStyle();
+
+ SourceMapping mapping;
+
+ File outputDirectory;
+
+ if (outputStyle == CompilerOutputStyle.ONE_OUTPUT_FILE_PER_INPUT_FILE) {
+ mapping =
+ new SuffixMapping(compiler.getInputFileEnding(compilerConfiguration), compiler
+ .getOutputFileEnding(compilerConfiguration));
+
+ outputDirectory = outputDir;
+ } else if (outputStyle == CompilerOutputStyle.ONE_OUTPUT_FILE_FOR_ALL_INPUT_FILES) {
+ mapping =
+ new SingleTargetSourceMapping(compiler.getInputFileEnding(compilerConfiguration), compiler
+ .getOutputFile(compilerConfiguration));
+
+ outputDirectory = buildDirectory;
+ } else {
+ throw new MojoExecutionException("Unknown compiler output style: '" + outputStyle + "'.");
+ }
+
+ scanner.addSourceMapping(mapping);
+
+ Set staleSources = new HashSet();
+
+ for (Iterator it = sourceRoots.iterator(); it.hasNext();) {
+ String sourceRoot = (String)it.next();
+
+ File rootFile = new File(sourceRoot);
+
+ if (!rootFile.isDirectory()) {
+ continue;
+ }
+
+ try {
+ Set changed = scanner.getIncludedSources(rootFile, outputDirectory);
+ staleSources.addAll(changed);
+ } catch (InclusionScanException e) {
+ throw new MojoExecutionException("Error scanning source root: \'" + sourceRoot
+ + "\' "
+ + "for stale files to recompile.", e);
+ }
+ }
+
+ return staleSources;
+ }
+
+ /**
+ * @todo also in ant plugin. This should be resolved at some point so that it does not need to
+ * be calculated continuously - or should the plugins accept empty source roots as is?
+ */
+ private static List removeEmptyCompileSourceRoots(List compileSourceRootsList) {
+ List newCompileSourceRootsList = new ArrayList();
+ if (compileSourceRootsList != null) {
+ // copy as I may be modifying it
+ for (Iterator i = compileSourceRootsList.iterator(); i.hasNext();) {
+ String srcDir = (String)i.next();
+ if (!newCompileSourceRootsList.contains(srcDir) && new File(srcDir).exists()) {
+ newCompileSourceRootsList.add(srcDir);
+ }
+ }
+ }
+ return newCompileSourceRootsList;
+ }
+}
Propchange: incubator/tuscany/java/sca/tools/maven/maven-incremental-build/src/main/java/org/apache/tuscany/sca/tools/incremental/build/plugin/AbstractBuildMojo.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/tuscany/java/sca/tools/maven/maven-incremental-build/src/main/java/org/apache/tuscany/sca/tools/incremental/build/plugin/AbstractBuildMojo.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified: incubator/tuscany/java/sca/tools/maven/maven-incremental-build/src/main/java/org/apache/tuscany/sca/tools/incremental/build/plugin/IncrementalBuildMojo.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/tools/maven/maven-incremental-build/src/main/java/org/apache/tuscany/sca/tools/incremental/build/plugin/IncrementalBuildMojo.java?rev=603783&r1=603782&r2=603783&view=diff
==============================================================================
--- incubator/tuscany/java/sca/tools/maven/maven-incremental-build/src/main/java/org/apache/tuscany/sca/tools/incremental/build/plugin/IncrementalBuildMojo.java (original)
+++ incubator/tuscany/java/sca/tools/maven/maven-incremental-build/src/main/java/org/apache/tuscany/sca/tools/incremental/build/plugin/IncrementalBuildMojo.java Wed Dec 12 16:42:25 2007
@@ -19,10 +19,8 @@
package org.apache.tuscany.sca.tools.incremental.build.plugin;
import java.io.File;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
-import java.util.Iterator;
import java.util.List;
import java.util.Set;
@@ -30,16 +28,13 @@
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;
-import org.apache.maven.scm.ScmException;
-import org.apache.maven.scm.ScmFile;
-import org.apache.maven.scm.command.status.StatusScmResult;
-import org.apache.maven.scm.repository.ScmRepository;
+import org.apache.maven.settings.Settings;
import org.apache.maven.shared.invoker.DefaultInvocationRequest;
import org.apache.maven.shared.invoker.InvocationRequest;
import org.apache.maven.shared.invoker.InvocationResult;
import org.apache.maven.shared.invoker.Invoker;
import org.apache.maven.shared.invoker.MavenInvocationException;
-import org.codehaus.plexus.util.StringUtils;
+import org.codehaus.plexus.compiler.Compiler;
import org.codehaus.plexus.util.cli.CommandLineException;
/**
@@ -49,22 +44,29 @@
* @requiresDependencyResolution test
* @description Incrementally build project modules that depend on modified modules.
*/
-public class IncrementalBuildMojo extends AbstractScmMojo {
+public class IncrementalBuildMojo extends AbstractBuildMojo {
/**
- * The project to create a build for.
- *
- * @parameter expression="${project}"
- * @required
+ * Keep track of modified projects.
*/
- private MavenProject project;
+ private static Set<String> modifiedProjectIDs = new HashSet<String>();
/**
- * The local repository where the artifacts are located
- *
- * @parameter expression="${localRepository}"
- * @required
+ * Returns the qualified id of an artifact .
+ * @param p a Maven artifact
+ * @return a qualified id
*/
- private ArtifactRepository localRepository;
+ private static String id(Artifact a) {
+ return a.getGroupId() + ':' + a.getArtifactId();
+ }
+
+ /**
+ * Returns the qualified id of a project.
+ * @param p a Maven project
+ * @return a qualified id
+ */
+ private static String id(MavenProject p) {
+ return p.getGroupId() + ':' + p.getArtifactId();
+ }
/**
* The current user system settings for use in Maven.
@@ -82,56 +84,35 @@
private Invoker invoker;
/**
- * @parameter expression="${scm}" default-value=true
- */
- private boolean scm;
-
- /**
- * Keep track of modified projects.
- */
- private static Set<String> modifiedProjectIDs = new HashSet<String>();
-
- /**
- * Returns the qualified id of a project.
- * @param p a Maven project
- * @return a qualified id
+ * The local repository where the artifacts are located
+ *
+ * @parameter expression="${localRepository}"
+ * @required
*/
- private static String id(MavenProject p) {
- return p.getGroupId() + ':' + p.getArtifactId();
- }
+ private ArtifactRepository localRepository;
/**
- * Returns the qualified id of an artifact .
- * @param p a Maven artifact
- * @return a qualified id
+ * @parameter expression="${settings}"
+ * @required
+ * @readonly
*/
- private static String id(Artifact a) {
- return a.getGroupId() + ':' + a.getArtifactId();
- }
+ protected Settings settings;
public void execute() throws MojoExecutionException {
getLog().info("Building " + project.getName() + " [" + project.getId() + "]");
String type = project.getArtifact().getType();
if ("pom".equals(type)) {
- // project.getModules();
- // throw new MojoExecutionException("The incremental build cannot run with a pom module");
return;
}
String projectID = id(project);
- boolean changed = false;
- // Determine if the project has been modified
- String marker = project.getBasedir().getPath() + "/.modified";
- if (new File(marker).exists()) {
- getLog().info("Project: " + projectID + " has been modified.");
- changed = true;
+ Compiler compiler = getCompiler();
+ boolean changed = isSourceChanged(compiler) || isResourceChanged();
+ boolean testChanged = false;
+ if (changed) {
modifiedProjectIDs.add(projectID);
- } else if (scm) {
- if (!getStatus().getChangedFiles().isEmpty()) {
- getLog().info("Project: " + projectID + " has been modified.");
- changed = true;
- modifiedProjectIDs.add(projectID);
- }
+ } else {
+ testChanged = isTestSourceChanged(compiler) || isTestResourceChanged();
}
// Check if a project has compile dependencies on the modified projects
@@ -174,6 +155,10 @@
}
}
+ if (testChanged && goals.isEmpty()) {
+ goals.add("test");
+ }
+
// Invoke Maven with the necessary goals
if (!goals.isEmpty()) {
InvocationRequest request = new DefaultInvocationRequest();
@@ -203,57 +188,6 @@
e.printStackTrace();
throw new MojoExecutionException(e.getMessage(), e);
}
- }
- }
-
- protected StatusScmResult getStatus() throws MojoExecutionException {
- try {
- ScmRepository repository = getScmRepository();
-
- StatusScmResult result = getScmManager().status(repository, getFileSet());
-
- checkResult(result);
-
- File baseDir = getFileSet().getBasedir();
-
- // Determine the maximum length of the status column
- int maxLen = 0;
-
- for (Iterator iter = result.getChangedFiles().iterator(); iter.hasNext();) {
- ScmFile file = (ScmFile)iter.next();
- maxLen = Math.max(maxLen, file.getStatus().toString().length());
- }
-
- for (Iterator iter = result.getChangedFiles().iterator(); iter.hasNext();) {
- ScmFile file = (ScmFile)iter.next();
-
- // right align all of the statuses
- getLog().info(StringUtils.leftPad(file.getStatus().toString(), maxLen) + " status for "
- + getRelativePath(baseDir, file.getPath()));
- }
- return result;
- } catch (IOException e) {
- throw new MojoExecutionException("Cannot run status command : ", e);
- } catch (ScmException e) {
- throw new MojoExecutionException("Cannot run status command : ", e);
- }
- }
-
- /**
- * Formats the filename so that it is a relative directory from the base.
- *
- * @param baseDir
- * @param path
- * @return The relative path
- */
- protected String getRelativePath(File baseDir, String path) {
- if (path.equals(baseDir.getAbsolutePath())) {
- return ".";
- } else if (path.indexOf(baseDir.getAbsolutePath()) == 0) {
- // the + 1 gets rid of a leading file separator
- return path.substring(baseDir.getAbsolutePath().length() + 1);
- } else {
- return path;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org