You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Ref.java 6.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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. package org.eclipse.jgit.lib;
  44. import org.eclipse.jgit.annotations.NonNull;
  45. import org.eclipse.jgit.annotations.Nullable;
  46. /**
  47. * Pairing of a name and the {@link ObjectId} it currently has.
  48. * <p>
  49. * A ref in Git is (more or less) a variable that holds a single object
  50. * identifier. The object identifier can be any valid Git object (blob, tree,
  51. * commit, annotated tag, ...).
  52. * <p>
  53. * The ref name has the attributes of the ref that was asked for as well as the
  54. * ref it was resolved to for symbolic refs plus the object id it points to and
  55. * (for tags) the peeled target object id, i.e. the tag resolved recursively
  56. * until a non-tag object is referenced.
  57. */
  58. public interface Ref {
  59. /** Location where a {@link Ref} is stored. */
  60. public static enum Storage {
  61. /**
  62. * The ref does not exist yet, updating it may create it.
  63. * <p>
  64. * Creation is likely to choose {@link #LOOSE} storage.
  65. */
  66. NEW(true, false),
  67. /**
  68. * The ref is stored in a file by itself.
  69. * <p>
  70. * Updating this ref affects only this ref.
  71. */
  72. LOOSE(true, false),
  73. /**
  74. * The ref is stored in the <code>packed-refs</code> file, with others.
  75. * <p>
  76. * Updating this ref requires rewriting the file, with perhaps many
  77. * other refs being included at the same time.
  78. */
  79. PACKED(false, true),
  80. /**
  81. * The ref is both {@link #LOOSE} and {@link #PACKED}.
  82. * <p>
  83. * Updating this ref requires only updating the loose file, but deletion
  84. * requires updating both the loose file and the packed refs file.
  85. */
  86. LOOSE_PACKED(true, true),
  87. /**
  88. * The ref came from a network advertisement and storage is unknown.
  89. * <p>
  90. * This ref cannot be updated without Git-aware support on the remote
  91. * side, as Git-aware code consolidate the remote refs and reported them
  92. * to this process.
  93. */
  94. NETWORK(false, false);
  95. private final boolean loose;
  96. private final boolean packed;
  97. private Storage(final boolean l, final boolean p) {
  98. loose = l;
  99. packed = p;
  100. }
  101. /**
  102. * @return true if this storage has a loose file.
  103. */
  104. public boolean isLoose() {
  105. return loose;
  106. }
  107. /**
  108. * @return true if this storage is inside the packed file.
  109. */
  110. public boolean isPacked() {
  111. return packed;
  112. }
  113. }
  114. /**
  115. * What this ref is called within the repository.
  116. *
  117. * @return name of this ref.
  118. */
  119. @NonNull
  120. public String getName();
  121. /**
  122. * Test if this reference is a symbolic reference.
  123. * <p>
  124. * A symbolic reference does not have its own {@link ObjectId} value, but
  125. * instead points to another {@code Ref} in the same database and always
  126. * uses that other reference's value as its own.
  127. *
  128. * @return true if this is a symbolic reference; false if this reference
  129. * contains its own ObjectId.
  130. */
  131. public abstract boolean isSymbolic();
  132. /**
  133. * Traverse target references until {@link #isSymbolic()} is false.
  134. * <p>
  135. * If {@link #isSymbolic()} is false, returns {@code this}.
  136. * <p>
  137. * If {@link #isSymbolic()} is true, this method recursively traverses
  138. * {@link #getTarget()} until {@link #isSymbolic()} returns false.
  139. * <p>
  140. * This method is effectively
  141. *
  142. * <pre>
  143. * return isSymbolic() ? getTarget().getLeaf() : this;
  144. * </pre>
  145. *
  146. * @return the reference that actually stores the ObjectId value.
  147. */
  148. @NonNull
  149. public abstract Ref getLeaf();
  150. /**
  151. * Get the reference this reference points to, or {@code this}.
  152. * <p>
  153. * If {@link #isSymbolic()} is true this method returns the reference it
  154. * directly names, which might not be the leaf reference, but could be
  155. * another symbolic reference.
  156. * <p>
  157. * If this is a leaf level reference that contains its own ObjectId,this
  158. * method returns {@code this}.
  159. *
  160. * @return the target reference, or {@code this}.
  161. */
  162. @NonNull
  163. public abstract Ref getTarget();
  164. /**
  165. * Cached value of this ref.
  166. *
  167. * @return the value of this ref at the last time we read it. May be
  168. * {@code null} to indicate a ref that does not exist yet or a
  169. * symbolic ref pointing to an unborn branch.
  170. */
  171. @Nullable
  172. public abstract ObjectId getObjectId();
  173. /**
  174. * Cached value of <code>ref^{}</code> (the ref peeled to commit).
  175. *
  176. * @return if this ref is an annotated tag the id of the commit (or tree or
  177. * blob) that the annotated tag refers to; {@code null} if this ref
  178. * does not refer to an annotated tag.
  179. */
  180. @Nullable
  181. public abstract ObjectId getPeeledObjectId();
  182. /**
  183. * @return whether the Ref represents a peeled tag
  184. */
  185. public abstract boolean isPeeled();
  186. /**
  187. * How was this ref obtained?
  188. * <p>
  189. * The current storage model of a Ref may influence how the ref must be
  190. * updated or deleted from the repository.
  191. *
  192. * @return type of ref.
  193. */
  194. @NonNull
  195. public abstract Storage getStorage();
  196. }