Raw
1 #ifndef OBJECT_NAME_H
2 #define OBJECT_NAME_H
3
4 #include "object.h"
5 #include "strbuf.h"
6
7 struct object_id;
8 struct repository;
9
10 struct object_context {
11 unsigned short mode;
12 /*
13 * symlink_path is only used by get_tree_entry_follow_symlinks,
14 * and only for symlinks that point outside the repository.
15 */
16 struct strbuf symlink_path;
17 /*
18 * If GET_OID_RECORD_PATH is set, this will record path (if any)
19 * found when resolving the name. The caller is responsible for
20 * releasing the memory.
21 */
22 char *path;
23 };
24
25 void object_context_release(struct object_context *ctx);
26
27 /*
28 * Return an abbreviated sha1 unique within this repository's object database.
29 * The result will be at least `len` characters long, and will be NUL
30 * terminated.
31 *
32 * The non-`_r` version returns a static buffer which remains valid until 4
33 * more calls to repo_find_unique_abbrev are made.
34 *
35 * The `_r` variant writes to a buffer supplied by the caller, which must be at
36 * least `GIT_MAX_HEXSZ + 1` bytes. The return value is the number of bytes
37 * written (excluding the NUL terminator).
38 *
39 * Note that while this version avoids the static buffer, it is not fully
40 * reentrant, as it calls into other non-reentrant git code.
41 */
42 const char *repo_find_unique_abbrev(struct repository *r, const struct object_id *oid, int len);
43 int repo_find_unique_abbrev_r(struct repository *r, char *hex, const struct object_id *oid, int len);
44
45 /**
46 * Add the abbreviation, as generated by repo_find_unique_abbrev(), of `sha1` to
47 * the strbuf `sb`.
48 */
49 void strbuf_repo_add_unique_abbrev(struct strbuf *sb, struct repository *repo,
50 const struct object_id *oid, int abbrev_len);
51 void strbuf_add_unique_abbrev(struct strbuf *sb, const struct object_id *oid,
52 int abbrev_len);
53
54 /*
55 * This is like "get_oid_basic()", except it allows "object ID expressions",
56 * notably "xyz^" for "parent of xyz". Accepts GET_OID_* flags.
57 */
58 int repo_get_oid_with_flags(struct repository *r, const char *str,
59 struct object_id *oid, unsigned flags);
60 int repo_get_oid(struct repository *r, const char *str, struct object_id *oid);
61 __attribute__((format (printf, 2, 3)))
62 int get_oidf(struct object_id *oid, const char *fmt, ...);
63 int repo_get_oid_commit(struct repository *r, const char *str, struct object_id *oid);
64 int repo_get_oid_committish(struct repository *r, const char *str, struct object_id *oid);
65 int repo_get_oid_tree(struct repository *r, const char *str, struct object_id *oid);
66 int repo_get_oid_treeish(struct repository *r, const char *str, struct object_id *oid);
67 int repo_get_oid_blob(struct repository *r, const char *str, struct object_id *oid);
68 int repo_get_oid_mb(struct repository *r, const char *str, struct object_id *oid);
69 void maybe_die_on_misspelt_object_name(struct repository *repo,
70 const char *name,
71 const char *prefix);
72 enum get_oid_result get_oid_with_context(struct repository *repo, const char *str,
73 unsigned flags, struct object_id *oid,
74 struct object_context *oc);
75
76
77 typedef int each_abbrev_fn(const struct object_id *oid, void *);
78 int repo_for_each_abbrev(struct repository *r, const char *prefix,
79 const struct git_hash_algo *algo, each_abbrev_fn, void *);
80
81 int set_disambiguate_hint_config(const char *var, const char *value);
82
83 /*
84 * This reads short-hand syntax that not only evaluates to a commit
85 * object name, but also can act as if the end user spelled the name
86 * of the branch from the command line.
87 *
88 * - "@{-N}" finds the name of the Nth previous branch we were on, and
89 * places the name of the branch in the given buf and returns the
90 * number of characters parsed if successful.
91 *
92 * - "<branch>@{upstream}" finds the name of the other ref that
93 * <branch> is configured to merge with (missing <branch> defaults
94 * to the current branch), and places the name of the branch in the
95 * given buf and returns the number of characters parsed if
96 * successful.
97 *
98 * If the input is not of the accepted format, it returns a negative
99 * number to signal an error.
100 *
101 * If the input was ok but there are not N branch switches in the
102 * reflog, it returns 0.
103 */
104 enum interpret_branch_kind {
105 INTERPRET_BRANCH_LOCAL = (1 << 0),
106 INTERPRET_BRANCH_REMOTE = (1 << 1),
107 INTERPRET_BRANCH_HEAD = (1 << 2),
108 };
109
110 struct interpret_branch_name_options {
111 /*
112 * If "allowed" is non-zero, it is a treated as a bitfield of allowable
113 * expansions: local branches ("refs/heads/"), remote branches
114 * ("refs/remotes/"), or "HEAD". If no "allowed" bits are set, any expansion is
115 * allowed, even ones to refs outside of those namespaces.
116 */
117 enum interpret_branch_kind allowed;
118
119 /*
120 * If ^{upstream} or ^{push} (or equivalent) is requested, and the
121 * branch in question does not have such a reference, return -1 instead
122 * of die()-ing.
123 */
124 unsigned nonfatal_dangling_mark : 1;
125 };
126 int repo_interpret_branch_name(struct repository *r,
127 const char *str, int len,
128 struct strbuf *buf,
129 const struct interpret_branch_name_options *options);
130
131 struct object *repo_peel_to_type(struct repository *r,
132 const char *name, int namelen,
133 struct object *o, enum object_type);
134
135 /* Convert to/from hex/sha1 representation */
136 #define MINIMUM_ABBREV minimum_abbrev
137 #define DEFAULT_ABBREV default_abbrev
138
139 /* used when the code does not know or care what the default abbrev is */
140 #define FALLBACK_DEFAULT_ABBREV 7
141
142 #endif /* OBJECT_NAME_H */