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 }