View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.scm.provider.svn.svnexe.command.untag;
20  
21  import java.io.File;
22  import java.io.IOException;
23  
24  import org.apache.maven.scm.ScmException;
25  import org.apache.maven.scm.ScmFileSet;
26  import org.apache.maven.scm.ScmResult;
27  import org.apache.maven.scm.ScmTag;
28  import org.apache.maven.scm.ScmUntagParameters;
29  import org.apache.maven.scm.command.untag.AbstractUntagCommand;
30  import org.apache.maven.scm.command.untag.UntagScmResult;
31  import org.apache.maven.scm.provider.ScmProviderRepository;
32  import org.apache.maven.scm.provider.svn.SvnCommandUtils;
33  import org.apache.maven.scm.provider.svn.SvnTagBranchUtils;
34  import org.apache.maven.scm.provider.svn.command.SvnCommand;
35  import org.apache.maven.scm.provider.svn.repository.SvnScmProviderRepository;
36  import org.apache.maven.scm.provider.svn.svnexe.command.SvnCommandLineUtils;
37  import org.codehaus.plexus.util.FileUtils;
38  import org.codehaus.plexus.util.Os;
39  import org.codehaus.plexus.util.cli.CommandLineException;
40  import org.codehaus.plexus.util.cli.CommandLineUtils;
41  import org.codehaus.plexus.util.cli.Commandline;
42  
43  /**
44   * scm:untag for provider svn is done by removing the tag dir
45   *
46   * @since 1.11.2
47   */
48  public class SvnUntagCommand extends AbstractUntagCommand implements SvnCommand {
49  
50      /** {@inheritDoc} */
51      @Override
52      public ScmResult executeUntagCommand(
53              ScmProviderRepository repo, ScmFileSet fileSet, ScmUntagParameters scmUntagParameters) throws ScmException {
54          String tag = scmUntagParameters.getTag();
55          if (tag == null || tag.trim().isEmpty()) {
56              throw new ScmException("tag must be specified");
57          }
58  
59          SvnScmProviderRepository repository = (SvnScmProviderRepository) repo;
60  
61          File messageFile = FileUtils.createTempFile("maven-scm-", ".commit", null);
62  
63          String message = scmUntagParameters.getMessage();
64          try {
65              FileUtils.fileWrite(messageFile.getAbsolutePath(), "UTF-8", message);
66          } catch (IOException ex) {
67              return new UntagScmResult(
68                      null,
69                      "Error while making a temporary file for the commit message: " + ex.getMessage(),
70                      null,
71                      false);
72          }
73  
74          Commandline cl = createCommandline(repository, fileSet, tag, messageFile);
75  
76          CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
77  
78          CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
79  
80          if (logger.isInfoEnabled()) {
81              logger.info("Executing: " + SvnCommandLineUtils.cryptPassword(cl));
82  
83              if (Os.isFamily(Os.FAMILY_WINDOWS)) {
84                  logger.info("Working directory: " + cl.getWorkingDirectory().getAbsolutePath());
85              }
86          }
87  
88          int exitCode;
89  
90          try {
91              exitCode = SvnCommandLineUtils.execute(cl, stdout, stderr);
92          } catch (CommandLineException ex) {
93              throw new ScmException("Error while executing svn remove command.", ex);
94          } finally {
95              try {
96                  FileUtils.forceDelete(messageFile);
97              } catch (IOException ex) {
98                  // ignore
99              }
100         }
101 
102         if (exitCode == 0) {
103             return new UntagScmResult(
104                     cl.toString(), "The svn remove command was successful.", stderr.getOutput(), true);
105         } else {
106             return new UntagScmResult(cl.toString(), "The svn remove command failed.", stderr.getOutput(), false);
107         }
108     }
109 
110     /**
111      * create command line from parameters
112      *
113      * @param repo        svn repo tu delete tag from
114      * @param fileSet     file set containing base dir
115      * @param tag         tag to delete
116      * @param messageFile file containing commit message
117      * @return            command line instance
118      */
119     Commandline createCommandline(SvnScmProviderRepository repo, ScmFileSet fileSet, String tag, File messageFile) {
120         Commandline cl = SvnCommandLineUtils.getBaseSvnCommandLine(fileSet.getBasedir(), repo);
121 
122         cl.createArg().setValue("--file");
123 
124         cl.createArg().setValue(messageFile.getAbsolutePath());
125 
126         cl.createArg().setValue("remove");
127 
128         String tagUrl = SvnTagBranchUtils.resolveTagUrl(repo, new ScmTag(tag));
129         tagUrl = SvnCommandUtils.fixUrl(tagUrl, repo.getUser());
130         cl.createArg().setValue(tagUrl + "@");
131 
132         return cl;
133     }
134 }