1 package org.apache.maven.scm.provider.git.gitexe.command.tag;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.File;
23 import java.io.IOException;
24
25 import org.apache.maven.scm.ScmException;
26 import org.apache.maven.scm.ScmFileSet;
27 import org.apache.maven.scm.ScmFileStatus;
28 import org.apache.maven.scm.ScmResult;
29 import org.apache.maven.scm.ScmTagParameters;
30 import org.apache.maven.scm.command.checkout.CheckOutScmResult;
31 import org.apache.maven.scm.command.tag.AbstractTagCommand;
32 import org.apache.maven.scm.command.tag.TagScmResult;
33 import org.apache.maven.scm.provider.ScmProviderRepository;
34 import org.apache.maven.scm.provider.git.command.GitCommand;
35 import org.apache.maven.scm.provider.git.gitexe.command.GitCommandLineUtils;
36 import org.apache.maven.scm.provider.git.gitexe.command.list.GitListCommand;
37 import org.apache.maven.scm.provider.git.gitexe.command.list.GitListConsumer;
38 import org.apache.maven.scm.provider.git.repository.GitScmProviderRepository;
39 import org.codehaus.plexus.util.FileUtils;
40 import org.codehaus.plexus.util.StringUtils;
41 import org.codehaus.plexus.util.cli.CommandLineUtils;
42 import org.codehaus.plexus.util.cli.Commandline;
43
44
45
46
47
48 public class GitTagCommand
49 extends AbstractTagCommand
50 implements GitCommand
51 {
52
53 public ScmResult executeTagCommand( ScmProviderRepository repo, ScmFileSet fileSet, String tag, String message )
54 throws ScmException
55 {
56 return executeTagCommand( repo, fileSet, tag, new ScmTagParameters( message ) );
57 }
58
59
60 public ScmResult executeTagCommand( ScmProviderRepository repo, ScmFileSet fileSet, String tag,
61 ScmTagParameters scmTagParameters )
62 throws ScmException
63 {
64 if ( tag == null || StringUtils.isEmpty( tag.trim() ) )
65 {
66 throw new ScmException( "tag name must be specified" );
67 }
68
69 if ( !fileSet.getFileList().isEmpty() )
70 {
71 throw new ScmException( "This provider doesn't support tagging subsets of a directory" );
72 }
73
74 GitScmProviderRepository repository = (GitScmProviderRepository) repo;
75
76 File messageFile = FileUtils.createTempFile( "maven-scm-", ".commit", null );
77
78 try
79 {
80 FileUtils.fileWrite( messageFile.getAbsolutePath(), scmTagParameters.getMessage() );
81 }
82 catch ( IOException ex )
83 {
84 return new TagScmResult( null, "Error while making a temporary file for the commit message: "
85 + ex.getMessage(), null, false );
86 }
87
88 try
89 {
90 CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
91 CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
92
93 int exitCode;
94
95 Commandline clTag = createCommandLine( repository, fileSet.getBasedir(), tag, messageFile );
96
97 exitCode = GitCommandLineUtils.execute( clTag, stdout, stderr, getLogger() );
98 if ( exitCode != 0 )
99 {
100 return new TagScmResult( clTag.toString(), "The git-tag command failed.", stderr.getOutput(), false );
101 }
102
103 if ( repo.isPushChanges() )
104 {
105
106 Commandline clPush = createPushCommandLine( repository, fileSet, tag );
107
108 exitCode = GitCommandLineUtils.execute( clPush, stdout, stderr, getLogger() );
109 if ( exitCode != 0 )
110 {
111 return new TagScmResult( clPush.toString(), "The git-push command failed.", stderr.getOutput(),
112 false );
113 }
114 }
115
116
117 GitListConsumer listConsumer =
118 new GitListConsumer( getLogger(), fileSet.getBasedir(), ScmFileStatus.TAGGED );
119
120 Commandline clList = GitListCommand.createCommandLine( repository, fileSet.getBasedir() );
121
122 exitCode = GitCommandLineUtils.execute( clList, listConsumer, stderr, getLogger() );
123 if ( exitCode != 0 )
124 {
125 return new CheckOutScmResult( clList.toString(), "The git-ls-files command failed.",
126 stderr.getOutput(), false );
127 }
128
129 return new TagScmResult( clTag.toString(), listConsumer.getListedFiles() );
130 }
131 finally
132 {
133 try
134 {
135 FileUtils.forceDelete( messageFile );
136 }
137 catch ( IOException ex )
138 {
139
140 }
141 }
142
143 }
144
145
146
147
148
149 public static Commandline createCommandLine( GitScmProviderRepository repository, File workingDirectory,
150 String tag, File messageFile )
151 {
152 Commandline cl = GitCommandLineUtils.getBaseGitCommandLine( workingDirectory, "tag" );
153
154 cl.createArg().setValue( "-F" );
155 cl.createArg().setValue( messageFile.getAbsolutePath() );
156
157
158 cl.createArg().setValue( tag );
159
160 return cl;
161 }
162
163 public static Commandline createPushCommandLine( GitScmProviderRepository repository, ScmFileSet fileSet,
164 String tag )
165 throws ScmException
166 {
167 Commandline cl = GitCommandLineUtils.getBaseGitCommandLine( fileSet.getBasedir(), "push" );
168
169 cl.createArg().setValue( repository.getPushUrl() );
170 cl.createArg().setValue( "refs/tags/" + tag );
171
172 return cl;
173 }
174
175 }