1 package org.apache.maven.scm.provider.perforce.command.diff;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.maven.scm.ScmException;
23 import org.apache.maven.scm.ScmFileSet;
24 import org.apache.maven.scm.ScmVersion;
25 import org.apache.maven.scm.command.diff.AbstractDiffCommand;
26 import org.apache.maven.scm.command.diff.DiffScmResult;
27 import org.apache.maven.scm.provider.ScmProviderRepository;
28 import org.apache.maven.scm.provider.perforce.PerforceScmProvider;
29 import org.apache.maven.scm.provider.perforce.command.PerforceCommand;
30 import org.apache.maven.scm.provider.perforce.repository.PerforceScmProviderRepository;
31 import org.codehaus.plexus.util.StringUtils;
32 import org.codehaus.plexus.util.cli.CommandLineException;
33 import org.codehaus.plexus.util.cli.CommandLineUtils;
34 import org.codehaus.plexus.util.cli.Commandline;
35
36 import java.io.File;
37
38
39
40
41
42 public class PerforceDiffCommand
43 extends AbstractDiffCommand
44 implements PerforceCommand
45 {
46
47 protected DiffScmResult executeDiffCommand( ScmProviderRepository repo, ScmFileSet files, ScmVersion startRev,
48 ScmVersion endRev )
49 throws ScmException
50 {
51 Commandline cl =
52 createCommandLine( (PerforceScmProviderRepository) repo, files.getBasedir(), startRev, endRev );
53 PerforceDiffConsumer consumer = new PerforceDiffConsumer();
54 if ( getLogger().isInfoEnabled() )
55 {
56 getLogger().info( "Executing: " + PerforceScmProvider.clean( cl.toString() ) );
57 }
58 boolean success = false;
59 try
60 {
61 CommandLineUtils.StringStreamConsumer err = new CommandLineUtils.StringStreamConsumer();
62 int exitCode = CommandLineUtils.executeCommandLine( cl, consumer, err );
63
64 if ( exitCode != 0 )
65 {
66 String cmdLine = CommandLineUtils.toString( cl.getCommandline() );
67
68 StringBuilder msg = new StringBuilder( "Exit code: " + exitCode + " - " + err.getOutput() );
69 msg.append( '\n' );
70 msg.append( "Command line was:" + cmdLine );
71
72 throw new CommandLineException( msg.toString() );
73 }
74 }
75 catch ( CommandLineException e )
76 {
77 if ( getLogger().isErrorEnabled() )
78 {
79 getLogger().error( "CommandLineException " + e.getMessage(), e );
80 }
81 }
82
83 return new DiffScmResult( cl.toString(), success ? "Diff successful" : "Unable to diff", consumer
84 .getOutput(), success );
85 }
86
87 public static Commandline createCommandLine( PerforceScmProviderRepository repo, File workingDirectory,
88 ScmVersion startRev, ScmVersion endRev )
89 {
90 String start = startRev != null && StringUtils.isNotEmpty( startRev.getName() ) ? "@" + startRev.getName() : "";
91 String end = endRev != null && StringUtils.isNotEmpty( endRev.getName() ) ? endRev.getName() : "now";
92
93 Commandline command = PerforceScmProvider.createP4Command( repo, workingDirectory );
94
95 command.createArg().setValue( "diff2" );
96 command.createArg().setValue( "-u" );
97
98 command.createArg().setValue( "..." + start );
99 command.createArg().setValue( "...@" + end );
100 return command;
101 }
102
103 }