refs.h 10.4 KB
Newer Older
D
Daniel Barkalow 已提交
1 2 3
#ifndef REFS_H
#define REFS_H

4
struct ref_lock {
5
	char *ref_name;
6
	char *orig_ref_name;
7
	struct lock_file *lk;
8 9
	unsigned char old_sha1[20];
	int lock_fd;
10
	int force_write;
11 12
};

13 14
struct ref_transaction;

15 16 17 18 19
/*
 * Bit values set in the flags argument passed to each_ref_fn():
 */

/* Reference is a symbolic reference. */
20
#define REF_ISSYMREF 0x01
21 22

/* Reference is a packed reference. */
23
#define REF_ISPACKED 0x02
24 25 26 27 28 29

/*
 * Reference cannot be resolved to an object name: dangling symbolic
 * reference (directly or indirectly), corrupt reference file, or
 * symbolic reference refers to ill-formatted reference name.
 */
30
#define REF_ISBROKEN 0x04
31

32
/*
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
 * The signature for the callback function for the for_each_*()
 * functions below.  The memory pointed to by the refname and sha1
 * arguments is only guaranteed to be valid for the duration of a
 * single callback invocation.
 */
typedef int each_ref_fn(const char *refname,
			const unsigned char *sha1, int flags, void *cb_data);

/*
 * The following functions invoke the specified callback function for
 * each reference indicated.  If the function ever returns a nonzero
 * value, stop the iteration and return that value.  Please note that
 * it is not safe to modify references while an iteration is in
 * progress, unless the same callback function invocation that
 * modifies the reference also returns a nonzero value to immediately
 * stop the iteration.
49
 */
50 51
extern int head_ref(each_ref_fn, void *);
extern int for_each_ref(each_ref_fn, void *);
52
extern int for_each_ref_in(const char *, each_ref_fn, void *);
53 54 55
extern int for_each_tag_ref(each_ref_fn, void *);
extern int for_each_branch_ref(each_ref_fn, void *);
extern int for_each_remote_ref(each_ref_fn, void *);
56
extern int for_each_replace_ref(each_ref_fn, void *);
I
Ilari Liusvaara 已提交
57
extern int for_each_glob_ref(each_ref_fn, const char *pattern, void *);
58
extern int for_each_glob_ref_in(each_ref_fn, const char *pattern, const char* prefix, void *);
59

60 61 62 63 64 65 66 67
extern int head_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data);
extern int for_each_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data);
extern int for_each_ref_in_submodule(const char *submodule, const char *prefix,
		each_ref_fn fn, void *cb_data);
extern int for_each_tag_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data);
extern int for_each_branch_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data);
extern int for_each_remote_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data);

J
Josh Triplett 已提交
68 69 70
extern int head_ref_namespaced(each_ref_fn fn, void *cb_data);
extern int for_each_namespaced_ref(each_ref_fn fn, void *cb_data);

71 72 73 74 75
static inline const char *has_glob_specials(const char *pattern)
{
	return strpbrk(pattern, "?*[");
}

76 77 78
/* can be used to learn about broken ref and symref */
extern int for_each_rawref(each_ref_fn, void *);

79
extern void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname);
80
extern void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_list* refnames);
81

82
/*
83 84 85 86 87 88 89 90 91 92
 * Lock the packed-refs file for writing.  Flags is passed to
 * hold_lock_file_for_update().  Return 0 on success.
 */
extern int lock_packed_refs(int flags);

/*
 * Add a reference to the in-memory packed reference cache.  This may
 * only be called while the packed-refs file is locked (see
 * lock_packed_refs()).  To actually write the packed-refs file, call
 * commit_packed_refs().
93 94 95
 */
extern void add_packed_ref(const char *refname, const unsigned char *sha1);

96 97 98 99 100 101 102 103 104 105 106 107 108 109
/*
 * Write the current version of the packed refs cache from memory to
 * disk.  The packed-refs file must already be locked for writing (see
 * lock_packed_refs()).  Return zero on success.
 */
extern int commit_packed_refs(void);

/*
 * Rollback the lockfile for the packed-refs file, and discard the
 * in-memory packed reference cache.  (The packed-refs file will be
 * read anew if it is needed again after this function is called.)
 */
extern void rollback_packed_refs(void);

110 111 112 113 114 115 116 117 118 119 120 121 122 123
/*
 * Flags for controlling behaviour of pack_refs()
 * PACK_REFS_PRUNE: Prune loose refs after packing
 * PACK_REFS_ALL:   Pack _all_ refs, not just tags and already packed refs
 */
#define PACK_REFS_PRUNE 0x0001
#define PACK_REFS_ALL   0x0002

/*
 * Write a packed-refs file for the current repository.
 * flags: Combination of the above PACK_REFS_* flags.
 */
int pack_refs(unsigned int flags);

124 125
extern int repack_without_refs(const char **refnames, int n);

126
extern int ref_exists(const char *);
127

128 129 130 131 132 133 134 135
/*
 * If refname is a non-symbolic reference that refers to a tag object,
 * and the tag can be (recursively) dereferenced to a non-tag object,
 * store the SHA1 of the referred-to object to sha1 and return 0.  If
 * any of these conditions are not met, return a non-zero value.
 * Symbolic references are considered unpeelable, even if they
 * ultimately resolve to a peelable tag.
 */
136
extern int peel_ref(const char *refname, unsigned char *sha1);
137

138
/** Locks a "refs/" ref returning the lock on success and NULL on failure. **/
139
extern struct ref_lock *lock_ref_sha1(const char *refname, const unsigned char *old_sha1);
140 141

/** Locks any ref (for 'HEAD' type refs). */
142
#define REF_NODEREF	0x01
143 144
extern struct ref_lock *lock_any_ref_for_update(const char *refname,
						const unsigned char *old_sha1,
145
						int flags, int *type_p);
D
Daniel Barkalow 已提交
146

147 148 149 150 151 152
/** Close the file descriptor owned by a lock and return the status */
extern int close_ref(struct ref_lock *lock);

/** Close and commit the ref locked by the lock */
extern int commit_ref(struct ref_lock *lock);

153
/** Release any lock taken but not written. **/
J
Junio C Hamano 已提交
154
extern void unlock_ref(struct ref_lock *lock);
D
Daniel Barkalow 已提交
155

156 157
/** Writes sha1 into the ref specified by the lock. **/
extern int write_ref_sha1(struct ref_lock *lock, const unsigned char *sha1, const char *msg);
D
Daniel Barkalow 已提交
158

159
/** Setup reflog before using. **/
160
int log_ref_setup(const char *refname, char *logfile, int bufsize);
161

162
/** Reads log for the value of ref during at_time. **/
163 164 165
extern int read_ref_at(const char *refname, unsigned long at_time, int cnt,
		       unsigned char *sha1, char **msg,
		       unsigned long *cutoff_time, int *cutoff_tz, int *cutoff_cnt);
166

167 168 169 170 171 172
/** Check if a particular reflog exists */
extern int reflog_exists(const char *refname);

/** Delete a reflog */
extern int delete_reflog(const char *refname);

173
/* iterate over reflog entries */
174
typedef int each_reflog_ent_fn(unsigned char *osha1, unsigned char *nsha1, const char *, unsigned long, int, const char *, void *);
175
int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn, void *cb_data);
176
int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn, void *cb_data);
177

178 179 180 181 182 183
/*
 * Calls the specified function for each reflog file until it returns nonzero,
 * and returns the value
 */
extern int for_each_reflog(each_ref_fn, void *);

184 185
#define REFNAME_ALLOW_ONELEVEL 1
#define REFNAME_REFSPEC_PATTERN 2
186
#define REFNAME_DOT_COMPONENT 4
187 188

/*
189 190 191
 * Return 0 iff refname has the correct format for a refname according
 * to the rules described in Documentation/git-check-ref-format.txt.
 * If REFNAME_ALLOW_ONELEVEL is set in flags, then accept one-level
192 193
 * reference names.  If REFNAME_REFSPEC_PATTERN is set in flags, then
 * allow a "*" wildcard character in place of one of the name
194 195 196 197
 * components.  No leading or repeated slashes are accepted.  If
 * REFNAME_DOT_COMPONENT is set in flags, then allow refname
 * components to start with "." (but not a whole component equal to
 * "." or "..").
198
 */
199
extern int check_refname_format(const char *refname, int flags);
D
Daniel Barkalow 已提交
200

201
extern const char *prettify_refname(const char *refname);
202
extern char *shorten_unambiguous_ref(const char *refname, int strict);
203

204
/** rename ref, return 0 on success **/
205
extern int rename_ref(const char *oldref, const char *newref, const char *logmsg);
206

207 208 209 210 211 212
/**
 * Resolve refname in the nested "gitlink" repository that is located
 * at path.  If the resolution is successful, return 0 and set sha1 to
 * the name of the object; otherwise, return a non-zero value.
 */
extern int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sha1);
213

214 215 216 217 218 219
enum action_on_err {
	UPDATE_REFS_MSG_ON_ERR,
	UPDATE_REFS_DIE_ON_ERR,
	UPDATE_REFS_QUIET_ON_ERR
};

220 221
/*
 * Begin a reference transaction.  The reference transaction must
222
 * be freed by calling ref_transaction_free().
223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269
 */
struct ref_transaction *ref_transaction_begin(void);

/*
 * The following functions add a reference check or update to a
 * ref_transaction.  In all of them, refname is the name of the
 * reference to be affected.  The functions make internal copies of
 * refname, so the caller retains ownership of the parameter.  flags
 * can be REF_NODEREF; it is passed to update_ref_lock().
 */

/*
 * Add a reference update to transaction.  new_sha1 is the value that
 * the reference should have after the update, or zeros if it should
 * be deleted.  If have_old is true, then old_sha1 holds the value
 * that the reference should have had before the update, or zeros if
 * it must not have existed beforehand.
 */
void ref_transaction_update(struct ref_transaction *transaction,
			    const char *refname,
			    unsigned char *new_sha1, unsigned char *old_sha1,
			    int flags, int have_old);

/*
 * Add a reference creation to transaction.  new_sha1 is the value
 * that the reference should have after the update; it must not be the
 * null SHA-1.  It is verified that the reference does not exist
 * already.
 */
void ref_transaction_create(struct ref_transaction *transaction,
			    const char *refname,
			    unsigned char *new_sha1,
			    int flags);

/*
 * Add a reference deletion to transaction.  If have_old is true, then
 * old_sha1 holds the value that the reference should have had before
 * the update (which must not be the null SHA-1).
 */
void ref_transaction_delete(struct ref_transaction *transaction,
			    const char *refname,
			    unsigned char *old_sha1,
			    int flags, int have_old);

/*
 * Commit all of the changes that have been queued in transaction, as
 * atomically as possible.  Return a nonzero value if there is a
270
 * problem.
271 272 273 274
 */
int ref_transaction_commit(struct ref_transaction *transaction,
			   const char *msg, enum action_on_err onerr);

275 276 277 278 279
/*
 * Free an existing transaction and all associated data.
 */
void ref_transaction_free(struct ref_transaction *transaction);

280
/** Lock a ref and then write its file */
C
Carlos Rica 已提交
281 282 283 284
int update_ref(const char *action, const char *refname,
		const unsigned char *sha1, const unsigned char *oldval,
		int flags, enum action_on_err onerr);

285 286 287
extern int parse_hide_refs_config(const char *var, const char *value, const char *);
extern int ref_is_hidden(const char *);

D
Daniel Barkalow 已提交
288
#endif /* REFS_H */