View Javadoc
1   /*
2    * Copyright (C) 2008, Mike Ralphson <mike@abacus.co.uk>
3    * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg.lists@dewire.com>
4    * Copyright (C) 2007, Robin Rosenberg <robin.rosenberg@dewire.com>
5    * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
6    * and other copyright owners as documented in the project's IP log.
7    *
8    * This program and the accompanying materials are made available
9    * under the terms of the Eclipse Distribution License v1.0 which
10   * accompanies this distribution, is reproduced below, and is
11   * available at http://www.eclipse.org/org/documents/edl-v10.php
12   *
13   * All rights reserved.
14   *
15   * Redistribution and use in source and binary forms, with or
16   * without modification, are permitted provided that the following
17   * conditions are met:
18   *
19   * - Redistributions of source code must retain the above copyright
20   *   notice, this list of conditions and the following disclaimer.
21   *
22   * - Redistributions in binary form must reproduce the above
23   *   copyright notice, this list of conditions and the following
24   *   disclaimer in the documentation and/or other materials provided
25   *   with the distribution.
26   *
27   * - Neither the name of the Eclipse Foundation, Inc. nor the
28   *   names of its contributors may be used to endorse or promote
29   *   products derived from this software without specific prior
30   *   written permission.
31   *
32   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
33   * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
34   * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
35   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
36   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
37   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
38   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
39   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
40   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
41   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
42   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
43   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
44   * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
45   */
46  
47  package org.eclipse.jgit.lib;
48  
49  import org.eclipse.jgit.internal.JGitText;
50  /**
51   * Important state of the repository that affects what can and cannot bed
52   * done. This is things like unhandled conflicted merges and unfinished rebase.
53   *
54   * The granularity and set of states are somewhat arbitrary. The methods
55   * on the state are the only supported means of deciding what to do.
56   */
57  public enum RepositoryState {
58  	/** Has no work tree and cannot be used for normal editing. */
59  	BARE {
60  		@Override
61  		public boolean canCheckout() { return false; }
62  
63  		@Override
64  		public boolean canResetHead() { return false; }
65  
66  		@Override
67  		public boolean canCommit() { return false; }
68  
69  		@Override
70  		public boolean canAmend() { return false; }
71  
72  		@Override
73  		public boolean isRebasing() { return false; }
74  
75  		@Override
76  		public String getDescription() {
77  			return JGitText.get().repositoryState_bare;
78  		}
79  	},
80  
81  	/**
82  	 * A safe state for working normally
83  	 * */
84  	SAFE {
85  		@Override
86  		public boolean canCheckout() { return true; }
87  
88  		@Override
89  		public boolean canResetHead() { return true; }
90  
91  		@Override
92  		public boolean canCommit() { return true; }
93  
94  		@Override
95  		public boolean canAmend() { return true; }
96  
97  		@Override
98  		public boolean isRebasing() { return false; }
99  
100 		@Override
101 		public String getDescription() { return JGitText.get().repositoryState_normal; }
102 	},
103 
104 	/** An unfinished merge. Must resolve or reset before continuing normally
105 	 */
106 	MERGING {
107 		@Override
108 		public boolean canCheckout() { return false; }
109 
110 		@Override
111 		public boolean canResetHead() { return true; }
112 
113 		@Override
114 		public boolean canCommit() { return false; }
115 
116 		@Override
117 		public boolean canAmend() { return false; }
118 
119 		@Override
120 		public boolean isRebasing() { return false; }
121 
122 		@Override
123 		public String getDescription() { return JGitText.get().repositoryState_conflicts; }
124 	},
125 
126 	/**
127 	 * An merge where all conflicts have been resolved. The index does not
128 	 * contain any unmerged paths.
129 	 */
130 	MERGING_RESOLVED {
131 		@Override
132 		public boolean canCheckout() { return true; }
133 
134 		@Override
135 		public boolean canResetHead() { return true; }
136 
137 		@Override
138 		public boolean canCommit() { return true; }
139 
140 		@Override
141 		public boolean canAmend() { return false; }
142 
143 		@Override
144 		public boolean isRebasing() { return false; }
145 
146 		@Override
147 		public String getDescription() { return JGitText.get().repositoryState_merged; }
148 	},
149 
150 	/** An unfinished cherry-pick. Must resolve or reset before continuing normally
151 	 */
152 	CHERRY_PICKING {
153 		@Override
154 		public boolean canCheckout() { return false; }
155 
156 		@Override
157 		public boolean canResetHead() { return true; }
158 
159 		@Override
160 		public boolean canCommit() { return false; }
161 
162 		@Override
163 		public boolean canAmend() { return false; }
164 
165 		@Override
166 		public boolean isRebasing() { return false; }
167 
168 		@Override
169 		public String getDescription() { return JGitText.get().repositoryState_conflicts; }
170 	},
171 
172 	/**
173 	 * A cherry-pick where all conflicts have been resolved. The index does not
174 	 * contain any unmerged paths.
175 	 */
176 	CHERRY_PICKING_RESOLVED {
177 		@Override
178 		public boolean canCheckout() { return true; }
179 
180 		@Override
181 		public boolean canResetHead() { return true; }
182 
183 		@Override
184 		public boolean canCommit() { return true; }
185 
186 		@Override
187 		public boolean canAmend() { return false; }
188 
189 		@Override
190 		public boolean isRebasing() { return false; }
191 
192 		@Override
193 		public String getDescription() { return JGitText.get().repositoryState_merged; }
194 	},
195 
196 	/** An unfinished revert. Must resolve or reset before continuing normally
197 	 */
198 	REVERTING {
199 		@Override
200 		public boolean canCheckout() { return false; }
201 
202 		@Override
203 		public boolean canResetHead() { return true; }
204 
205 		@Override
206 		public boolean canCommit() { return false; }
207 
208 		@Override
209 		public boolean canAmend() { return false; }
210 
211 		@Override
212 		public boolean isRebasing() { return false; }
213 
214 		@Override
215 		public String getDescription() { return JGitText.get().repositoryState_conflicts; }
216 	},
217 
218 	/**
219 	 * A revert where all conflicts have been resolved. The index does not
220 	 * contain any unmerged paths.
221 	 */
222 	REVERTING_RESOLVED {
223 		@Override
224 		public boolean canCheckout() { return true; }
225 
226 		@Override
227 		public boolean canResetHead() { return true; }
228 
229 		@Override
230 		public boolean canCommit() { return true; }
231 
232 		@Override
233 		public boolean canAmend() { return false; }
234 
235 		@Override
236 		public boolean isRebasing() { return false; }
237 
238 		@Override
239 		public String getDescription() { return JGitText.get().repositoryState_merged; }
240 	},
241 
242 	/**
243 	 * An unfinished rebase or am. Must resolve, skip or abort before normal work can take place
244 	 */
245 	REBASING {
246 		@Override
247 		public boolean canCheckout() { return false; }
248 
249 		@Override
250 		public boolean canResetHead() { return false; }
251 
252 		@Override
253 		public boolean canCommit() { return true; }
254 
255 		@Override
256 		public boolean canAmend() { return true; }
257 
258 		@Override
259 		public boolean isRebasing() { return true; }
260 
261 		@Override
262 		public String getDescription() { return JGitText.get().repositoryState_rebaseOrApplyMailbox; }
263 	},
264 
265 	/**
266 	 * An unfinished rebase. Must resolve, skip or abort before normal work can take place
267 	 */
268 	REBASING_REBASING {
269 		@Override
270 		public boolean canCheckout() { return false; }
271 
272 		@Override
273 		public boolean canResetHead() { return false; }
274 
275 		@Override
276 		public boolean canCommit() { return true; }
277 
278 		@Override
279 		public boolean canAmend() { return true; }
280 
281 		@Override
282 		public boolean isRebasing() { return true; }
283 
284 		@Override
285 		public String getDescription() { return JGitText.get().repositoryState_rebase; }
286 	},
287 
288 	/**
289 	 * An unfinished apply. Must resolve, skip or abort before normal work can take place
290 	 */
291 	APPLY {
292 		@Override
293 		public boolean canCheckout() { return false; }
294 
295 		@Override
296 		public boolean canResetHead() { return false; }
297 
298 		@Override
299 		public boolean canCommit() { return true; }
300 
301 		@Override
302 		public boolean canAmend() { return true; }
303 
304 		@Override
305 		public boolean isRebasing() { return false; }
306 
307 		@Override
308 		public String getDescription() { return JGitText.get().repositoryState_applyMailbox; }
309 	},
310 
311 	/**
312 	 * An unfinished rebase with merge. Must resolve, skip or abort before normal work can take place
313 	 */
314 	REBASING_MERGE {
315 		@Override
316 		public boolean canCheckout() { return false; }
317 
318 		@Override
319 		public boolean canResetHead() { return false; }
320 
321 		@Override
322 		public boolean canCommit() { return true; }
323 
324 		@Override
325 		public boolean canAmend() { return true; }
326 
327 		@Override
328 		public boolean isRebasing() { return true; }
329 
330 		@Override
331 		public String getDescription() { return JGitText.get().repositoryState_rebaseWithMerge; }
332 	},
333 
334 	/**
335 	 * An unfinished interactive rebase. Must resolve, skip or abort before normal work can take place
336 	 */
337 	REBASING_INTERACTIVE {
338 		@Override
339 		public boolean canCheckout() { return false; }
340 
341 		@Override
342 		public boolean canResetHead() { return false; }
343 
344 		@Override
345 		public boolean canCommit() { return true; }
346 
347 		@Override
348 		public boolean canAmend() { return true; }
349 
350 		@Override
351 		public boolean isRebasing() { return true; }
352 
353 		@Override
354 		public String getDescription() { return JGitText.get().repositoryState_rebaseInteractive; }
355 	},
356 
357 	/**
358 	 * Bisecting being done. Normal work may continue but is discouraged
359 	 */
360 	BISECTING {
361 		/* Changing head is a normal operation when bisecting */
362 		@Override
363 		public boolean canCheckout() { return true; }
364 
365 		/* Do not reset, checkout instead */
366 		@Override
367 		public boolean canResetHead() { return false; }
368 
369 		/* Commit during bisect is useful */
370 		@Override
371 		public boolean canCommit() { return true; }
372 
373 		@Override
374 		public boolean canAmend() { return false; }
375 
376 		@Override
377 		public boolean isRebasing() { return false; }
378 
379 		@Override
380 		public String getDescription() { return JGitText.get().repositoryState_bisecting; }
381 	};
382 
383 	/**
384 	 * Whether checkout can be done.
385 	 *
386 	 * @return whether checkout can be done.
387 	 */
388 	public abstract boolean canCheckout();
389 
390 	/**
391 	 * @return true if we can commit
392 	 */
393 	public abstract boolean canCommit();
394 
395 	/**
396 	 * @return true if reset to another HEAD is considered SAFE
397 	 */
398 	public abstract boolean canResetHead();
399 
400 	/**
401 	 * @return true if amending is considered SAFE
402 	 */
403 	public abstract boolean canAmend();
404 
405 	/**
406 	 * @return true if the repository is currently in a rebase
407 	 * @since 3.0
408 	 */
409 	public abstract boolean isRebasing();
410 
411 	/**
412 	 * @return a human readable description of the state.
413 	 */
414 	public abstract String getDescription();
415 }