View Javadoc

1   /*
2    * #%L
3    * JavaHg
4    * %%
5    * Copyright (C) 2011 aragost Trifork ag
6    * %%
7    * Permission is hereby granted, free of charge, to any person obtaining a copy
8    * of this software and associated documentation files (the "Software"), to deal
9    * in the Software without restriction, including without limitation the rights
10   * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11   * copies of the Software, and to permit persons to whom the Software is
12   * furnished to do so, subject to the following conditions:
13   * 
14   * The above copyright notice and this permission notice shall be included in
15   * all copies or substantial portions of the Software.
16   * 
17   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23   * THE SOFTWARE.
24   * #L%
25   */
26  package com.aragost.javahg.commands;
27  
28  import java.io.File;
29  
30  import com.aragost.javahg.Changeset;
31  import com.aragost.javahg.Repository;
32  import com.aragost.javahg.commands.flags.CommitCommandFlags;
33  import com.aragost.javahg.internals.Utils;
34  
35  /**
36   * Command class for executing <tt>hg commit</tt>. Set flags from
37   * {@link CommitCommandFlags} and call the {@link #execute} method.
38   */
39  public class CommitCommand extends CommitCommandFlags {
40  
41      private String message;
42  
43      /**
44       * @param repository
45       *            the repository associated with this command.
46       */
47      public CommitCommand(Repository repository) {
48          super(repository);
49          withDebugFlag();
50      }
51  
52      /**
53       * Check if the commit was successful. In contrast with Mercurial,
54       * this returns true if <tt>hg commit</tt> exited with a return
55       * code of 1. This happens if there were no changes and is
56       * signaled to the caller by returning null instead of a
57       * changeset.
58       */
59      @Override
60      public boolean isSuccessful() {
61          return super.isSuccessful() || getReturnCode() == 1;
62      }
63  
64      /**
65       * Commit changes in the passed in files only
66       * 
67       * @param files
68       *            the files to commit.
69       * @return the changeset created by the commit, or null if nothing
70       *         was committed.
71       */
72      public Changeset execute(String... files) {
73      	return doExecute(files);
74      }
75  
76  	private Changeset doExecute(String... files) {
77          if (this.message == null) {
78              throw new IllegalStateException("message not set for command");
79          }
80          
81          if (files == null) {
82          	files = new String[0];
83          } else if (files.length == 0) {
84          	files = new String[2];
85          	files[0]  = "--exclude";
86          	files[1]  = "*";
87          }
88  
89          String output = launchString(files);
90          int rc = getReturnCode();
91          if (rc == 1) {
92              return null;
93          } else {
94              int length = output.length();
95              String node = new String(output.substring(length - 41, length - 1));
96              return getRepository().changeset(node);
97          }
98      }
99  
100     /**
101      * 
102      * @param files
103      *            the files to commit.
104      * @return the changeset created by the commit, or null if nothing
105      *         was committed.
106      */
107     public Changeset execute(File... files) {
108         return execute(Utils.fileArray2StringArray(files));
109     }
110 
111     /**
112      * Commit all changes
113      * 
114      * @return the changeset created by the commit, or null if nothing was
115      *         committed.
116      */
117     public Changeset execute() {
118         return doExecute((String[])null);
119     }
120     
121     /**
122      * Set the commit message. A message is mandatory for commit.
123      */
124     @Override
125     public CommitCommand message(String text) {
126         this.message = text;
127         return super.message(text);
128     }
129 
130     /**
131      * Add a field to the extra dictionary for the changeset.
132      * <p>
133      * Note this is implemented via the javahg extension for
134      * Mercurial.
135      * 
136      * @param key
137      * @param value
138      */
139     public void extra(String key, String value) {
140         cmdAppend("--javahg-extra", key + "=" + value);
141     }
142 }