View Javadoc
1   /*
2    * Copyright (C) 2006-2008, Shawn O. Pearce <spearce@spearce.org>
3    * and other copyright owners as documented in the project's IP log.
4    *
5    * This program and the accompanying materials are made available
6    * under the terms of the Eclipse Distribution License v1.0 which
7    * accompanies this distribution, is reproduced below, and is
8    * available at http://www.eclipse.org/org/documents/edl-v10.php
9    *
10   * All rights reserved.
11   *
12   * Redistribution and use in source and binary forms, with or
13   * without modification, are permitted provided that the following
14   * conditions are met:
15   *
16   * - Redistributions of source code must retain the above copyright
17   *   notice, this list of conditions and the following disclaimer.
18   *
19   * - Redistributions in binary form must reproduce the above
20   *   copyright notice, this list of conditions and the following
21   *   disclaimer in the documentation and/or other materials provided
22   *   with the distribution.
23   *
24   * - Neither the name of the Eclipse Foundation, Inc. nor the
25   *   names of its contributors may be used to endorse or promote
26   *   products derived from this software without specific prior
27   *   written permission.
28   *
29   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
30   * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
31   * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
32   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
33   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
34   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
35   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
36   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
37   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
38   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
40   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
41   * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
42   */
43  
44  package org.eclipse.jgit.lib;
45  
46  import org.eclipse.jgit.annotations.NonNull;
47  import org.eclipse.jgit.annotations.Nullable;
48  
49  /**
50   * Pairing of a name and the {@link org.eclipse.jgit.lib.ObjectId} it currently
51   * has.
52   * <p>
53   * A ref in Git is (more or less) a variable that holds a single object
54   * identifier. The object identifier can be any valid Git object (blob, tree,
55   * commit, annotated tag, ...).
56   * <p>
57   * The ref name has the attributes of the ref that was asked for as well as the
58   * ref it was resolved to for symbolic refs plus the object id it points to and
59   * (for tags) the peeled target object id, i.e. the tag resolved recursively
60   * until a non-tag object is referenced.
61   */
62  public interface Ref {
63  	/** Location where a {@link Ref} is stored. */
64  	public static enum Storage {
65  		/**
66  		 * The ref does not exist yet, updating it may create it.
67  		 * <p>
68  		 * Creation is likely to choose {@link #LOOSE} storage.
69  		 */
70  		NEW(true, false),
71  
72  		/**
73  		 * The ref is stored in a file by itself.
74  		 * <p>
75  		 * Updating this ref affects only this ref.
76  		 */
77  		LOOSE(true, false),
78  
79  		/**
80  		 * The ref is stored in the <code>packed-refs</code> file, with others.
81  		 * <p>
82  		 * Updating this ref requires rewriting the file, with perhaps many
83  		 * other refs being included at the same time.
84  		 */
85  		PACKED(false, true),
86  
87  		/**
88  		 * The ref is both {@link #LOOSE} and {@link #PACKED}.
89  		 * <p>
90  		 * Updating this ref requires only updating the loose file, but deletion
91  		 * requires updating both the loose file and the packed refs file.
92  		 */
93  		LOOSE_PACKED(true, true),
94  
95  		/**
96  		 * The ref came from a network advertisement and storage is unknown.
97  		 * <p>
98  		 * This ref cannot be updated without Git-aware support on the remote
99  		 * side, as Git-aware code consolidate the remote refs and reported them
100 		 * to this process.
101 		 */
102 		NETWORK(false, false);
103 
104 		private final boolean loose;
105 
106 		private final boolean packed;
107 
108 		private Storage(boolean l, boolean p) {
109 			loose = l;
110 			packed = p;
111 		}
112 
113 		/**
114 		 * @return true if this storage has a loose file.
115 		 */
116 		public boolean isLoose() {
117 			return loose;
118 		}
119 
120 		/**
121 		 * @return true if this storage is inside the packed file.
122 		 */
123 		public boolean isPacked() {
124 			return packed;
125 		}
126 	}
127 
128 	/**
129 	 * What this ref is called within the repository.
130 	 *
131 	 * @return name of this ref.
132 	 */
133 	@NonNull
134 	public String getName();
135 
136 	/**
137 	 * Test if this reference is a symbolic reference.
138 	 * <p>
139 	 * A symbolic reference does not have its own
140 	 * {@link org.eclipse.jgit.lib.ObjectId} value, but instead points to
141 	 * another {@code Ref} in the same database and always uses that other
142 	 * reference's value as its own.
143 	 *
144 	 * @return true if this is a symbolic reference; false if this reference
145 	 *         contains its own ObjectId.
146 	 */
147 	public abstract boolean isSymbolic();
148 
149 	/**
150 	 * Traverse target references until {@link #isSymbolic()} is false.
151 	 * <p>
152 	 * If {@link #isSymbolic()} is false, returns {@code this}.
153 	 * <p>
154 	 * If {@link #isSymbolic()} is true, this method recursively traverses
155 	 * {@link #getTarget()} until {@link #isSymbolic()} returns false.
156 	 * <p>
157 	 * This method is effectively
158 	 *
159 	 * <pre>
160 	 * return isSymbolic() ? getTarget().getLeaf() : this;
161 	 * </pre>
162 	 *
163 	 * @return the reference that actually stores the ObjectId value.
164 	 */
165 	@NonNull
166 	public abstract Ref getLeaf();
167 
168 	/**
169 	 * Get the reference this reference points to, or {@code this}.
170 	 * <p>
171 	 * If {@link #isSymbolic()} is true this method returns the reference it
172 	 * directly names, which might not be the leaf reference, but could be
173 	 * another symbolic reference.
174 	 * <p>
175 	 * If this is a leaf level reference that contains its own ObjectId,this
176 	 * method returns {@code this}.
177 	 *
178 	 * @return the target reference, or {@code this}.
179 	 */
180 	@NonNull
181 	public abstract Ref getTarget();
182 
183 	/**
184 	 * Cached value of this ref.
185 	 *
186 	 * @return the value of this ref at the last time we read it. May be
187 	 *         {@code null} to indicate a ref that does not exist yet or a
188 	 *         symbolic ref pointing to an unborn branch.
189 	 */
190 	@Nullable
191 	public abstract ObjectId getObjectId();
192 
193 	/**
194 	 * Cached value of <code>ref^{}</code> (the ref peeled to commit).
195 	 *
196 	 * @return if this ref is an annotated tag the id of the commit (or tree or
197 	 *         blob) that the annotated tag refers to; {@code null} if this ref
198 	 *         does not refer to an annotated tag.
199 	 */
200 	@Nullable
201 	public abstract ObjectId getPeeledObjectId();
202 
203 	/**
204 	 * Whether the Ref represents a peeled tag.
205 	 *
206 	 * @return whether the Ref represents a peeled tag.
207 	 */
208 	public abstract boolean isPeeled();
209 
210 	/**
211 	 * How was this ref obtained?
212 	 * <p>
213 	 * The current storage model of a Ref may influence how the ref must be
214 	 * updated or deleted from the repository.
215 	 *
216 	 * @return type of ref.
217 	 */
218 	@NonNull
219 	public abstract Storage getStorage();
220 }