private boolean ensureNoLocalModifications() throws ComponentLookupException, ScmException, MojoExecutionException { if (!Boolean.getBoolean("sesat.mojo.localModifications.ignore")) { final ScmManager scmManager = (ScmManager) container.lookup(ScmManager.ROLE); loadPomProject(); final StatusScmResult result = scmManager.status( scmManager.makeScmRepository(project.getScm().getDeveloperConnection()), new ScmFileSet(pomProject.getBasedir())); if (!result.isSuccess()) { getLog().error(result.getCommandOutput()); throw new MojoExecutionException("Failed to ensure checkout has no modifications"); } if (0 < result.getChangedFiles().size()) { throw new MojoExecutionException( "Your checkout has local modifications. " + "Server deploy can *only* be done with a clean workbench."); } return result.isSuccess() && 0 == result.getChangedFiles().size(); } return true; // sesat.mojo.localModifications.ignore }
public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment, List reactorProjects) throws ReleaseExecutionException, ReleaseFailureException { ReleaseResult relResult = new ReleaseResult(); List additionalExcludes = releaseDescriptor.getCheckModificationExcludes(); if (additionalExcludes != null) { for (int i1 = 0, additionalExcludesSize = additionalExcludes.size(); i1 < additionalExcludesSize; i1++) { // fail fast if it is not a string String exclude = (String) additionalExcludes.get(i1); excludedFiles.add(exclude); } } logInfo(relResult, "Verifying that there are no local modifications..."); logInfo(relResult, " ignoring changes on: " + StringUtils.join(excludedFiles, ", ")); ScmRepository repository; ScmProvider provider; try { repository = scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor, releaseEnvironment.getSettings()); provider = scmRepositoryConfigurator.getRepositoryProvider(repository); } catch (ScmRepositoryException e) { throw new ReleaseScmRepositoryException( e.getMessage() + " for URL: " + releaseDescriptor.getScmSourceUrl(), e.getValidationMessages()); } catch (NoSuchScmProviderException e) { throw new ReleaseExecutionException( "Unable to configure SCM repository: " + e.getMessage(), e); } StatusScmResult result; try { result = provider.status( repository, new ScmFileSet(new File(releaseDescriptor.getWorkingDirectory()))); } catch (ScmException e) { throw new ReleaseExecutionException( "An error occurred during the status check process: " + e.getMessage(), e); } if (!result.isSuccess()) { throw new ReleaseScmCommandException("Unable to check for local modifications", result); } List changedFiles = result.getChangedFiles(); // TODO: would be nice for SCM status command to do this for me. for (Iterator i = changedFiles.iterator(); i.hasNext(); ) { ScmFile f = (ScmFile) i.next(); String fileName = f.getPath().replace('\\', '/'); fileName = fileName.substring(fileName.lastIndexOf('/') + 1, fileName.length()); if (excludedFiles.contains(fileName)) { i.remove(); } } if (!changedFiles.isEmpty()) { StringBuffer message = new StringBuffer(); for (Iterator i = changedFiles.iterator(); i.hasNext(); ) { ScmFile file = (ScmFile) i.next(); message.append(file.toString()); message.append("\n"); } throw new ReleaseFailureException( "Cannot prepare the release because you have local modifications : \n" + message); } relResult.setResultCode(ReleaseResult.SUCCESS); return relResult; }