Merge branch 'mh/ref-races'
"git pack-refs" that races with new ref creation or deletion have been susceptible to lossage of refs under right conditions, which has been tightened up. * mh/ref-races: for_each_ref: load all loose refs before packed refs get_packed_ref_cache: reload packed-refs file when it changes add a stat_validity struct Extract a struct stat_data from cache_entry packed_ref_cache: increment refcount when locked do_for_each_entry(): increment the packed refs cache refcount refs: manage lifetime of packed refs cache via reference counting refs: implement simple transactions for the packed-refs file refs: wrap the packed refs cache in a level of indirection pack_refs(): split creation of packed refs and entry writing repack_without_ref(): split list curation and entry writing
This commit is contained in:
60
cache.h
60
cache.h
@ -119,15 +119,19 @@ struct cache_time {
|
||||
unsigned int nsec;
|
||||
};
|
||||
|
||||
struct stat_data {
|
||||
struct cache_time sd_ctime;
|
||||
struct cache_time sd_mtime;
|
||||
unsigned int sd_dev;
|
||||
unsigned int sd_ino;
|
||||
unsigned int sd_uid;
|
||||
unsigned int sd_gid;
|
||||
unsigned int sd_size;
|
||||
};
|
||||
|
||||
struct cache_entry {
|
||||
struct cache_time ce_ctime;
|
||||
struct cache_time ce_mtime;
|
||||
unsigned int ce_dev;
|
||||
unsigned int ce_ino;
|
||||
struct stat_data ce_stat_data;
|
||||
unsigned int ce_mode;
|
||||
unsigned int ce_uid;
|
||||
unsigned int ce_gid;
|
||||
unsigned int ce_size;
|
||||
unsigned int ce_flags;
|
||||
unsigned int ce_namelen;
|
||||
unsigned char sha1[20];
|
||||
@ -511,6 +515,21 @@ extern int limit_pathspec_to_literal(void);
|
||||
#define HASH_FORMAT_CHECK 2
|
||||
extern int index_fd(unsigned char *sha1, int fd, struct stat *st, enum object_type type, const char *path, unsigned flags);
|
||||
extern int index_path(unsigned char *sha1, const char *path, struct stat *st, unsigned flags);
|
||||
|
||||
/*
|
||||
* Record to sd the data from st that we use to check whether a file
|
||||
* might have changed.
|
||||
*/
|
||||
extern void fill_stat_data(struct stat_data *sd, struct stat *st);
|
||||
|
||||
/*
|
||||
* Return 0 if st is consistent with a file not having been changed
|
||||
* since sd was filled. If there are differences, return a
|
||||
* combination of MTIME_CHANGED, CTIME_CHANGED, OWNER_CHANGED,
|
||||
* INODE_CHANGED, and DATA_CHANGED.
|
||||
*/
|
||||
extern int match_stat_data(const struct stat_data *sd, struct stat *st);
|
||||
|
||||
extern void fill_stat_cache_info(struct cache_entry *ce, struct stat *st);
|
||||
|
||||
#define REFRESH_REALLY 0x0001 /* ignore_valid */
|
||||
@ -1338,4 +1357,31 @@ int checkout_fast_forward(const unsigned char *from,
|
||||
|
||||
int sane_execvp(const char *file, char *const argv[]);
|
||||
|
||||
/*
|
||||
* A struct to encapsulate the concept of whether a file has changed
|
||||
* since we last checked it. This uses criteria similar to those used
|
||||
* for the index.
|
||||
*/
|
||||
struct stat_validity {
|
||||
struct stat_data *sd;
|
||||
};
|
||||
|
||||
void stat_validity_clear(struct stat_validity *sv);
|
||||
|
||||
/*
|
||||
* Returns 1 if the path is a regular file (or a symlink to a regular
|
||||
* file) and matches the saved stat_validity, 0 otherwise. A missing
|
||||
* or inaccessible file is considered a match if the struct was just
|
||||
* initialized, or if the previous update found an inaccessible file.
|
||||
*/
|
||||
int stat_validity_check(struct stat_validity *sv, const char *path);
|
||||
|
||||
/*
|
||||
* Update the stat_validity from a file opened at descriptor fd. If
|
||||
* the file is missing, inaccessible, or not a regular file, then
|
||||
* future calls to stat_validity_check will match iff one of those
|
||||
* conditions continues to be true.
|
||||
*/
|
||||
void stat_validity_update(struct stat_validity *sv, int fd);
|
||||
|
||||
#endif /* CACHE_H */
|
||||
|
Reference in New Issue
Block a user