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.

Constants.java 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530
  1. /*
  2. * Copyright (C) 2008, Google Inc.
  3. * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com>
  4. * Copyright (C) 2006-2008, Shawn O. Pearce <spearce@spearce.org>
  5. * and other copyright owners as documented in the project's IP log.
  6. *
  7. * This program and the accompanying materials are made available
  8. * under the terms of the Eclipse Distribution License v1.0 which
  9. * accompanies this distribution, is reproduced below, and is
  10. * available at http://www.eclipse.org/org/documents/edl-v10.php
  11. *
  12. * All rights reserved.
  13. *
  14. * Redistribution and use in source and binary forms, with or
  15. * without modification, are permitted provided that the following
  16. * conditions are met:
  17. *
  18. * - Redistributions of source code must retain the above copyright
  19. * notice, this list of conditions and the following disclaimer.
  20. *
  21. * - Redistributions in binary form must reproduce the above
  22. * copyright notice, this list of conditions and the following
  23. * disclaimer in the documentation and/or other materials provided
  24. * with the distribution.
  25. *
  26. * - Neither the name of the Eclipse Foundation, Inc. nor the
  27. * names of its contributors may be used to endorse or promote
  28. * products derived from this software without specific prior
  29. * written permission.
  30. *
  31. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
  32. * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
  33. * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  34. * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  35. * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  36. * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  37. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  38. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  39. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  40. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  41. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  42. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
  43. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  44. */
  45. package org.eclipse.jgit.lib;
  46. import java.nio.ByteBuffer;
  47. import java.nio.charset.Charset;
  48. import java.security.MessageDigest;
  49. import java.security.NoSuchAlgorithmException;
  50. import java.text.MessageFormat;
  51. import org.eclipse.jgit.JGitText;
  52. import org.eclipse.jgit.errors.CorruptObjectException;
  53. import org.eclipse.jgit.util.MutableInteger;
  54. /** Misc. constants used throughout JGit. */
  55. public final class Constants {
  56. /** Hash function used natively by Git for all objects. */
  57. private static final String HASH_FUNCTION = "SHA-1";
  58. /**
  59. * A Git object hash is 160 bits, i.e. 20 bytes.
  60. * <p>
  61. * Changing this assumption is not going to be as easy as changing this
  62. * declaration.
  63. */
  64. public static final int OBJECT_ID_LENGTH = 20;
  65. /**
  66. * A Git object can be expressed as a 40 character string of hexadecimal
  67. * digits.
  68. *
  69. * @see #OBJECT_ID_LENGTH
  70. */
  71. public static final int OBJECT_ID_STRING_LENGTH = OBJECT_ID_LENGTH * 2;
  72. /** Special name for the "HEAD" symbolic-ref. */
  73. public static final String HEAD = "HEAD";
  74. /**
  75. * Text string that identifies an object as a commit.
  76. * <p>
  77. * Commits connect trees into a string of project histories, where each
  78. * commit is an assertion that the best way to continue is to use this other
  79. * tree (set of files).
  80. */
  81. public static final String TYPE_COMMIT = "commit";
  82. /**
  83. * Text string that identifies an object as a blob.
  84. * <p>
  85. * Blobs store whole file revisions. They are used for any user file, as
  86. * well as for symlinks. Blobs form the bulk of any project's storage space.
  87. */
  88. public static final String TYPE_BLOB = "blob";
  89. /**
  90. * Text string that identifies an object as a tree.
  91. * <p>
  92. * Trees attach object ids (hashes) to names and file modes. The normal use
  93. * for a tree is to store a version of a directory and its contents.
  94. */
  95. public static final String TYPE_TREE = "tree";
  96. /**
  97. * Text string that identifies an object as an annotated tag.
  98. * <p>
  99. * Annotated tags store a pointer to any other object, and an additional
  100. * message. It is most commonly used to record a stable release of the
  101. * project.
  102. */
  103. public static final String TYPE_TAG = "tag";
  104. private static final byte[] ENCODED_TYPE_COMMIT = encodeASCII(TYPE_COMMIT);
  105. private static final byte[] ENCODED_TYPE_BLOB = encodeASCII(TYPE_BLOB);
  106. private static final byte[] ENCODED_TYPE_TREE = encodeASCII(TYPE_TREE);
  107. private static final byte[] ENCODED_TYPE_TAG = encodeASCII(TYPE_TAG);
  108. /** An unknown or invalid object type code. */
  109. public static final int OBJ_BAD = -1;
  110. /**
  111. * In-pack object type: extended types.
  112. * <p>
  113. * This header code is reserved for future expansion. It is currently
  114. * undefined/unsupported.
  115. */
  116. public static final int OBJ_EXT = 0;
  117. /**
  118. * In-pack object type: commit.
  119. * <p>
  120. * Indicates the associated object is a commit.
  121. * <p>
  122. * <b>This constant is fixed and is defined by the Git packfile format.</b>
  123. *
  124. * @see #TYPE_COMMIT
  125. */
  126. public static final int OBJ_COMMIT = 1;
  127. /**
  128. * In-pack object type: tree.
  129. * <p>
  130. * Indicates the associated object is a tree.
  131. * <p>
  132. * <b>This constant is fixed and is defined by the Git packfile format.</b>
  133. *
  134. * @see #TYPE_BLOB
  135. */
  136. public static final int OBJ_TREE = 2;
  137. /**
  138. * In-pack object type: blob.
  139. * <p>
  140. * Indicates the associated object is a blob.
  141. * <p>
  142. * <b>This constant is fixed and is defined by the Git packfile format.</b>
  143. *
  144. * @see #TYPE_BLOB
  145. */
  146. public static final int OBJ_BLOB = 3;
  147. /**
  148. * In-pack object type: annotated tag.
  149. * <p>
  150. * Indicates the associated object is an annotated tag.
  151. * <p>
  152. * <b>This constant is fixed and is defined by the Git packfile format.</b>
  153. *
  154. * @see #TYPE_TAG
  155. */
  156. public static final int OBJ_TAG = 4;
  157. /** In-pack object type: reserved for future use. */
  158. public static final int OBJ_TYPE_5 = 5;
  159. /**
  160. * In-pack object type: offset delta
  161. * <p>
  162. * Objects stored with this type actually have a different type which must
  163. * be obtained from their delta base object. Delta objects store only the
  164. * changes needed to apply to the base object in order to recover the
  165. * original object.
  166. * <p>
  167. * An offset delta uses a negative offset from the start of this object to
  168. * refer to its delta base. The base object must exist in this packfile
  169. * (even in the case of a thin pack).
  170. * <p>
  171. * <b>This constant is fixed and is defined by the Git packfile format.</b>
  172. */
  173. public static final int OBJ_OFS_DELTA = 6;
  174. /**
  175. * In-pack object type: reference delta
  176. * <p>
  177. * Objects stored with this type actually have a different type which must
  178. * be obtained from their delta base object. Delta objects store only the
  179. * changes needed to apply to the base object in order to recover the
  180. * original object.
  181. * <p>
  182. * A reference delta uses a full object id (hash) to reference the delta
  183. * base. The base object is allowed to be omitted from the packfile, but
  184. * only in the case of a thin pack being transferred over the network.
  185. * <p>
  186. * <b>This constant is fixed and is defined by the Git packfile format.</b>
  187. */
  188. public static final int OBJ_REF_DELTA = 7;
  189. /**
  190. * Pack file signature that occurs at file header - identifies file as Git
  191. * packfile formatted.
  192. * <p>
  193. * <b>This constant is fixed and is defined by the Git packfile format.</b>
  194. */
  195. public static final byte[] PACK_SIGNATURE = { 'P', 'A', 'C', 'K' };
  196. /** Native character encoding for commit messages, file names... */
  197. public static final String CHARACTER_ENCODING = "UTF-8";
  198. /** Native character encoding for commit messages, file names... */
  199. public static final Charset CHARSET;
  200. /** Default main branch name */
  201. public static final String MASTER = "master";
  202. /** Prefix for branch refs */
  203. public static final String R_HEADS = "refs/heads/";
  204. /** Prefix for remotes refs */
  205. public static final String R_REMOTES = "refs/remotes/";
  206. /** Prefix for tag refs */
  207. public static final String R_TAGS = "refs/tags/";
  208. /** Prefix for any ref */
  209. public static final String R_REFS = "refs/";
  210. /** Logs folder name */
  211. public static final String LOGS = "logs";
  212. /** Info refs folder */
  213. public static final String INFO_REFS = "info/refs";
  214. /** Packed refs file */
  215. public static final String PACKED_REFS = "packed-refs";
  216. /** The environment variable that contains the system user name */
  217. public static final String OS_USER_NAME_KEY = "user.name";
  218. /** The environment variable that contains the author's name */
  219. public static final String GIT_AUTHOR_NAME_KEY = "GIT_AUTHOR_NAME";
  220. /** The environment variable that contains the author's email */
  221. public static final String GIT_AUTHOR_EMAIL_KEY = "GIT_AUTHOR_EMAIL";
  222. /** The environment variable that contains the commiter's name */
  223. public static final String GIT_COMMITTER_NAME_KEY = "GIT_COMMITTER_NAME";
  224. /** The environment variable that contains the commiter's email */
  225. public static final String GIT_COMMITTER_EMAIL_KEY = "GIT_COMMITTER_EMAIL";
  226. /**
  227. * The environment variable that limits how close to the root of the file
  228. * systems JGit will traverse when looking for a repository root.
  229. */
  230. public static final String GIT_CEILING_DIRECTORIES_KEY = "GIT_CEILING_DIRECTORIES";
  231. /**
  232. * The environment variable that tells us which directory is the ".git"
  233. * directory
  234. */
  235. public static final String GIT_DIR_KEY = "GIT_DIR";
  236. /**
  237. * The environment variable that tells us which directory is the working
  238. * directory.
  239. */
  240. public static final String GIT_WORK_TREE_KEY = "GIT_WORK_TREE";
  241. /**
  242. * The environment variable that tells us which file holds the Git index.
  243. */
  244. public static final String GIT_INDEX_KEY = "GIT_INDEX";
  245. /**
  246. * The environment variable that tells us where objects are stored
  247. */
  248. public static final String GIT_OBJECT_DIRECTORY_KEY = "GIT_OBJECT_DIRECTORY";
  249. /**
  250. * The environment variable that tells us where to look for objects, besides
  251. * the default objects directory.
  252. */
  253. public static final String GIT_ALTERNATE_OBJECT_DIRECTORIES_KEY = "GIT_ALTERNATE_OBJECT_DIRECTORIES";
  254. /** Default value for the user name if no other information is available */
  255. public static final String UNKNOWN_USER_DEFAULT = "unknown-user";
  256. /** Beginning of the common "Signed-off-by: " commit message line */
  257. public static final String SIGNED_OFF_BY_TAG = "Signed-off-by: ";
  258. /** A gitignore file name */
  259. public static final String GITIGNORE_FILENAME = ".gitignore";
  260. /** Default remote name used by clone, push and fetch operations */
  261. public static final String DEFAULT_REMOTE_NAME = "origin";
  262. /** Default name for the Git repository directory */
  263. public static final String DOT_GIT = ".git";
  264. /** A bare repository typically ends with this string */
  265. public static final String DOT_GIT_EXT = ".git";
  266. /**
  267. * Create a new digest function for objects.
  268. *
  269. * @return a new digest object.
  270. * @throws RuntimeException
  271. * this Java virtual machine does not support the required hash
  272. * function. Very unlikely given that JGit uses a hash function
  273. * that is in the Java reference specification.
  274. */
  275. public static MessageDigest newMessageDigest() {
  276. try {
  277. return MessageDigest.getInstance(HASH_FUNCTION);
  278. } catch (NoSuchAlgorithmException nsae) {
  279. throw new RuntimeException(MessageFormat.format(
  280. JGitText.get().requiredHashFunctionNotAvailable, HASH_FUNCTION), nsae);
  281. }
  282. }
  283. /**
  284. * Convert an OBJ_* type constant to a TYPE_* type constant.
  285. *
  286. * @param typeCode the type code, from a pack representation.
  287. * @return the canonical string name of this type.
  288. */
  289. public static String typeString(final int typeCode) {
  290. switch (typeCode) {
  291. case OBJ_COMMIT:
  292. return TYPE_COMMIT;
  293. case OBJ_TREE:
  294. return TYPE_TREE;
  295. case OBJ_BLOB:
  296. return TYPE_BLOB;
  297. case OBJ_TAG:
  298. return TYPE_TAG;
  299. default:
  300. throw new IllegalArgumentException(MessageFormat.format(JGitText.get().badObjectType, typeCode));
  301. }
  302. }
  303. /**
  304. * Convert an OBJ_* type constant to an ASCII encoded string constant.
  305. * <p>
  306. * The ASCII encoded string is often the canonical representation of
  307. * the type within a loose object header, or within a tag header.
  308. *
  309. * @param typeCode the type code, from a pack representation.
  310. * @return the canonical ASCII encoded name of this type.
  311. */
  312. public static byte[] encodedTypeString(final int typeCode) {
  313. switch (typeCode) {
  314. case OBJ_COMMIT:
  315. return ENCODED_TYPE_COMMIT;
  316. case OBJ_TREE:
  317. return ENCODED_TYPE_TREE;
  318. case OBJ_BLOB:
  319. return ENCODED_TYPE_BLOB;
  320. case OBJ_TAG:
  321. return ENCODED_TYPE_TAG;
  322. default:
  323. throw new IllegalArgumentException(MessageFormat.format(JGitText.get().badObjectType, typeCode));
  324. }
  325. }
  326. /**
  327. * Parse an encoded type string into a type constant.
  328. *
  329. * @param id
  330. * object id this type string came from; may be null if that is
  331. * not known at the time the parse is occurring.
  332. * @param typeString
  333. * string version of the type code.
  334. * @param endMark
  335. * character immediately following the type string. Usually ' '
  336. * (space) or '\n' (line feed).
  337. * @param offset
  338. * position within <code>typeString</code> where the parse
  339. * should start. Updated with the new position (just past
  340. * <code>endMark</code> when the parse is successful.
  341. * @return a type code constant (one of {@link #OBJ_BLOB},
  342. * {@link #OBJ_COMMIT}, {@link #OBJ_TAG}, {@link #OBJ_TREE}.
  343. * @throws CorruptObjectException
  344. * there is no valid type identified by <code>typeString</code>.
  345. */
  346. public static int decodeTypeString(final AnyObjectId id,
  347. final byte[] typeString, final byte endMark,
  348. final MutableInteger offset) throws CorruptObjectException {
  349. try {
  350. int position = offset.value;
  351. switch (typeString[position]) {
  352. case 'b':
  353. if (typeString[position + 1] != 'l'
  354. || typeString[position + 2] != 'o'
  355. || typeString[position + 3] != 'b'
  356. || typeString[position + 4] != endMark)
  357. throw new CorruptObjectException(id, JGitText.get().corruptObjectInvalidType);
  358. offset.value = position + 5;
  359. return Constants.OBJ_BLOB;
  360. case 'c':
  361. if (typeString[position + 1] != 'o'
  362. || typeString[position + 2] != 'm'
  363. || typeString[position + 3] != 'm'
  364. || typeString[position + 4] != 'i'
  365. || typeString[position + 5] != 't'
  366. || typeString[position + 6] != endMark)
  367. throw new CorruptObjectException(id, JGitText.get().corruptObjectInvalidType);
  368. offset.value = position + 7;
  369. return Constants.OBJ_COMMIT;
  370. case 't':
  371. switch (typeString[position + 1]) {
  372. case 'a':
  373. if (typeString[position + 2] != 'g'
  374. || typeString[position + 3] != endMark)
  375. throw new CorruptObjectException(id, JGitText.get().corruptObjectInvalidType);
  376. offset.value = position + 4;
  377. return Constants.OBJ_TAG;
  378. case 'r':
  379. if (typeString[position + 2] != 'e'
  380. || typeString[position + 3] != 'e'
  381. || typeString[position + 4] != endMark)
  382. throw new CorruptObjectException(id, JGitText.get().corruptObjectInvalidType);
  383. offset.value = position + 5;
  384. return Constants.OBJ_TREE;
  385. default:
  386. throw new CorruptObjectException(id, JGitText.get().corruptObjectInvalidType);
  387. }
  388. default:
  389. throw new CorruptObjectException(id, JGitText.get().corruptObjectInvalidType);
  390. }
  391. } catch (ArrayIndexOutOfBoundsException bad) {
  392. throw new CorruptObjectException(id, JGitText.get().corruptObjectInvalidType);
  393. }
  394. }
  395. /**
  396. * Convert an integer into its decimal representation.
  397. *
  398. * @param s
  399. * the integer to convert.
  400. * @return a decimal representation of the input integer. The returned array
  401. * is the smallest array that will hold the value.
  402. */
  403. public static byte[] encodeASCII(final long s) {
  404. return encodeASCII(Long.toString(s));
  405. }
  406. /**
  407. * Convert a string to US-ASCII encoding.
  408. *
  409. * @param s
  410. * the string to convert. Must not contain any characters over
  411. * 127 (outside of 7-bit ASCII).
  412. * @return a byte array of the same length as the input string, holding the
  413. * same characters, in the same order.
  414. * @throws IllegalArgumentException
  415. * the input string contains one or more characters outside of
  416. * the 7-bit ASCII character space.
  417. */
  418. public static byte[] encodeASCII(final String s) {
  419. final byte[] r = new byte[s.length()];
  420. for (int k = r.length - 1; k >= 0; k--) {
  421. final char c = s.charAt(k);
  422. if (c > 127)
  423. throw new IllegalArgumentException(MessageFormat.format(JGitText.get().notASCIIString, s));
  424. r[k] = (byte) c;
  425. }
  426. return r;
  427. }
  428. /**
  429. * Convert a string to a byte array in the standard character encoding.
  430. *
  431. * @param str
  432. * the string to convert. May contain any Unicode characters.
  433. * @return a byte array representing the requested string, encoded using the
  434. * default character encoding (UTF-8).
  435. * @see #CHARACTER_ENCODING
  436. */
  437. public static byte[] encode(final String str) {
  438. final ByteBuffer bb = Constants.CHARSET.encode(str);
  439. final int len = bb.limit();
  440. if (bb.hasArray() && bb.arrayOffset() == 0) {
  441. final byte[] arr = bb.array();
  442. if (arr.length == len)
  443. return arr;
  444. }
  445. final byte[] arr = new byte[len];
  446. bb.get(arr);
  447. return arr;
  448. }
  449. static {
  450. if (OBJECT_ID_LENGTH != newMessageDigest().getDigestLength())
  451. throw new LinkageError(JGitText.get().incorrectOBJECT_ID_LENGTH);
  452. CHARSET = Charset.forName(CHARACTER_ENCODING);
  453. }
  454. /** name of the file containing the commit msg for a merge commit */
  455. public static final String MERGE_MSG = "MERGE_MSG";
  456. /** name of the file containing the IDs of the parents of a merge commit */
  457. public static final String MERGE_HEAD = "MERGE_HEAD";
  458. private Constants() {
  459. // Hide the default constructor
  460. }
  461. }