diff options
Diffstat (limited to 'cache.h')
| -rw-r--r-- | cache.h | 174 | 
1 files changed, 83 insertions, 91 deletions
@@ -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]; @@ -185,12 +189,15 @@ struct cache_entry {  #error "CE_EXTENDED_FLAGS out of range"  #endif +struct pathspec; +  /*   * Copy the sha1 and stat state of a cache entry from one to   * another. But we never change the name, or the hash state!   */  #define CE_STATE_MASK (CE_HASHED | CE_UNHASHED) -static inline void copy_cache_entry(struct cache_entry *dst, struct cache_entry *src) +static inline void copy_cache_entry(struct cache_entry *dst, +				    const struct cache_entry *src)  {  	unsigned int state = dst->ce_flags & CE_STATE_MASK; @@ -222,7 +229,8 @@ static inline unsigned int create_ce_mode(unsigned int mode)  		return S_IFGITLINK;  	return S_IFREG | ce_permissions(mode);  } -static inline unsigned int ce_mode_from_stat(struct cache_entry *ce, unsigned int mode) +static inline unsigned int ce_mode_from_stat(const struct cache_entry *ce, +					     unsigned int mode)  {  	extern int trust_executable_bit, has_symlinks;  	if (!has_symlinks && S_ISREG(mode) && @@ -359,6 +367,9 @@ static inline enum object_type object_type(unsigned int mode)  #define GIT_NOTES_REWRITE_REF_ENVIRONMENT "GIT_NOTES_REWRITE_REF"  #define GIT_NOTES_REWRITE_MODE_ENVIRONMENT "GIT_NOTES_REWRITE_MODE"  #define GIT_LITERAL_PATHSPECS_ENVIRONMENT "GIT_LITERAL_PATHSPECS" +#define GIT_GLOB_PATHSPECS_ENVIRONMENT "GIT_GLOB_PATHSPECS" +#define GIT_NOGLOB_PATHSPECS_ENVIRONMENT "GIT_NOGLOB_PATHSPECS" +#define GIT_ICASE_PATHSPECS_ENVIRONMENT "GIT_ICASE_PATHSPECS"  /*   * This environment variable is expected to contain a boolean indicating @@ -406,6 +417,7 @@ extern void setup_work_tree(void);  extern const char *setup_git_directory_gently(int *);  extern const char *setup_git_directory(void);  extern char *prefix_path(const char *prefix, int len, const char *path); +extern char *prefix_path_gently(const char *prefix, int len, int *remaining, const char *path);  extern const char *prefix_filename(const char *prefix, int len, const char *path);  extern int check_filename(const char *prefix, const char *name);  extern void verify_filename(const char *prefix, @@ -419,6 +431,8 @@ extern int path_inside_repo(const char *prefix, const char *path);  extern int set_git_dir_init(const char *git_dir, const char *real_git_dir, int);  extern int init_db(const char *template_dir, unsigned int flags); +extern void sanitize_stdfds(void); +  #define alloc_nr(x) (((x)+16)*3/2)  /* @@ -441,7 +455,7 @@ extern int init_db(const char *template_dir, unsigned int flags);  /* Initialize and use the cache information */  extern int read_index(struct index_state *); -extern int read_index_preload(struct index_state *, const char **pathspec); +extern int read_index_preload(struct index_state *, const struct pathspec *pathspec);  extern int read_index_from(struct index_state *, const char *path);  extern int is_index_unborn(struct index_state *);  extern int read_index_unmerged(struct index_state *); @@ -470,7 +484,7 @@ extern int remove_file_from_index(struct index_state *, const char *path);  extern int add_to_index(struct index_state *, const char *path, struct stat *, int flags);  extern int add_file_to_index(struct index_state *, const char *path, int flags);  extern struct cache_entry *make_cache_entry(unsigned int mode, const unsigned char *sha1, const char *path, int stage, int refresh); -extern int ce_same_name(struct cache_entry *a, struct cache_entry *b); +extern int ce_same_name(const struct cache_entry *a, const struct cache_entry *b);  extern int index_name_is_other(const struct index_state *, const char *, int);  extern void *read_blob_data_from_index(struct index_state *, const char *, unsigned long *); @@ -480,35 +494,30 @@ extern void *read_blob_data_from_index(struct index_state *, const char *, unsig  #define CE_MATCH_RACY_IS_DIRTY		02  /* do stat comparison even if CE_SKIP_WORKTREE is true */  #define CE_MATCH_IGNORE_SKIP_WORKTREE	04 -extern int ie_match_stat(const struct index_state *, struct cache_entry *, struct stat *, unsigned int); -extern int ie_modified(const struct index_state *, struct cache_entry *, struct stat *, unsigned int); - -#define PATHSPEC_ONESTAR 1	/* the pathspec pattern sastisfies GFNM_ONESTAR */ - -struct pathspec { -	const char **raw; /* get_pathspec() result, not freed by free_pathspec() */ -	int nr; -	unsigned int has_wildcard:1; -	unsigned int recursive:1; -	int max_depth; -	struct pathspec_item { -		const char *match; -		int len; -		int nowildcard_len; -		int flags; -	} *items; -}; +extern int ie_match_stat(const struct index_state *, const struct cache_entry *, struct stat *, unsigned int); +extern int ie_modified(const struct index_state *, const struct cache_entry *, struct stat *, unsigned int); -extern int init_pathspec(struct pathspec *, const char **); -extern void free_pathspec(struct pathspec *);  extern int ce_path_match(const struct cache_entry *ce, const struct pathspec *pathspec); -extern int limit_pathspec_to_literal(void); -  #define HASH_WRITE_OBJECT 1  #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 */ @@ -517,7 +526,7 @@ extern void fill_stat_cache_info(struct cache_entry *ce, struct stat *st);  #define REFRESH_IGNORE_MISSING	0x0008	/* ignore non-existent */  #define REFRESH_IGNORE_SUBMODULES	0x0010	/* ignore submodules */  #define REFRESH_IN_PORCELAIN	0x0020	/* user friendly output, not "needs update" */ -extern int refresh_index(struct index_state *, unsigned int flags, const char **pathspec, char *seen, const char *header_msg); +extern int refresh_index(struct index_state *, unsigned int flags, const struct pathspec *pathspec, char *seen, const char *header_msg);  struct lock_file {  	struct lock_file *next; @@ -554,6 +563,7 @@ extern int assume_unchanged;  extern int prefer_symlink_refs;  extern int log_all_ref_updates;  extern int warn_ambiguous_refs; +extern int warn_on_object_refname_ambiguity;  extern int shared_repository;  extern const char *apply_default_whitespace;  extern const char *apply_default_ignorewhitespace; @@ -737,7 +747,8 @@ int is_directory(const char *);  const char *real_path(const char *path);  const char *real_path_if_valid(const char *path);  const char *absolute_path(const char *path); -const char *relative_path(const char *abs, const char *base); +const char *relative_path(const char *in, const char *prefix, struct strbuf *sb); +int normalize_path_copy_len(char *dst, const char *src, int *prefix_len);  int normalize_path_copy(char *dst, const char *src);  int longest_ancestor_length(const char *path, struct string_list *prefixes);  char *strip_path_suffix(const char *path, const char *suffix); @@ -772,9 +783,6 @@ extern int parse_sha1_header(const char *hdr, unsigned long *sizep);  /* global flag to enable extra checks when accessing packed objects */  extern int do_check_packed_object_crc; -/* for development: log offset of pack access */ -extern const char *log_pack_access; -  extern int check_sha1_signature(const unsigned char *sha1, void *buf, unsigned long size, const char *type);  extern int move_temp_to_file(const char *tmpfile, const char *filename); @@ -910,6 +918,7 @@ void show_date_relative(unsigned long time, int tz, const struct timeval *now,  			struct strbuf *timebuf);  int parse_date(const char *date, char *buf, int bufsize);  int parse_date_basic(const char *date, unsigned long *timestamp, int *offset); +int parse_expiry_date(const char *date, unsigned long *timestamp);  void datestamp(char *buf, int bufsize);  #define approxidate(s) approxidate_careful((s), NULL)  unsigned long approxidate_careful(const char *, int *); @@ -1016,56 +1025,6 @@ struct pack_entry {  	struct packed_git *p;  }; -struct ref { -	struct ref *next; -	unsigned char old_sha1[20]; -	unsigned char new_sha1[20]; -	char *symref; -	unsigned int -		force:1, -		forced_update:1, -		merge:1, -		deletion:1, -		matched:1; -	enum { -		REF_STATUS_NONE = 0, -		REF_STATUS_OK, -		REF_STATUS_REJECT_NONFASTFORWARD, -		REF_STATUS_REJECT_ALREADY_EXISTS, -		REF_STATUS_REJECT_NODELETE, -		REF_STATUS_REJECT_FETCH_FIRST, -		REF_STATUS_REJECT_NEEDS_FORCE, -		REF_STATUS_UPTODATE, -		REF_STATUS_REMOTE_REJECT, -		REF_STATUS_EXPECTING_REPORT -	} status; -	char *remote_status; -	struct ref *peer_ref; /* when renaming */ -	char name[FLEX_ARRAY]; /* more */ -}; - -#define REF_NORMAL	(1u << 0) -#define REF_HEADS	(1u << 1) -#define REF_TAGS	(1u << 2) - -extern struct ref *find_ref_by_name(const struct ref *list, const char *name); - -#define CONNECT_VERBOSE       (1u << 0) -extern struct child_process *git_connect(int fd[2], const char *url, const char *prog, int flags); -extern int finish_connect(struct child_process *conn); -extern int git_connection_is_socket(struct child_process *conn); -struct extra_have_objects { -	int nr, alloc; -	unsigned char (*array)[20]; -}; -extern struct ref **get_remote_heads(int in, char *src_buf, size_t src_len, -				     struct ref **list, unsigned int flags, -				     struct extra_have_objects *); -extern int server_supports(const char *feature); -extern int parse_feature_request(const char *features, const char *feature); -extern const char *server_feature_value(const char *feature, int *len_ret); -extern const char *parse_feature_value(const char *feature_list, const char *feature, int *len_ret); -  extern struct packed_git *parse_pack_index(unsigned char *sha1, const char *idx_path);  /* A hook for count-objects to report invalid files in pack directory */ @@ -1098,7 +1057,9 @@ extern int unpack_object_header(struct packed_git *, struct pack_window **, off_  struct object_info {  	/* Request */ +	enum object_type *typep;  	unsigned long *sizep; +	unsigned long *disk_sizep;  	/* Response */  	enum { @@ -1142,11 +1103,15 @@ extern int update_server_info(int);  typedef int (*config_fn_t)(const char *, const char *, void *);  extern int git_default_config(const char *, const char *, void *);  extern int git_config_from_file(config_fn_t fn, const char *, void *); +extern int git_config_from_buf(config_fn_t fn, const char *name, +			       const char *buf, size_t len, void *data);  extern void git_config_push_parameter(const char *text);  extern int git_config_from_parameters(config_fn_t fn, void *data);  extern int git_config(config_fn_t fn, void *);  extern int git_config_with_options(config_fn_t fn, void *, -				   const char *filename, int respect_includes); +				   const char *filename, +				   const char *blob_ref, +				   int respect_includes);  extern int git_config_early(config_fn_t fn, void *, const char *repo_config);  extern int git_parse_ulong(const char *, unsigned long *);  extern int git_config_int(const char *, const char *); @@ -1265,7 +1230,7 @@ void packet_trace_identity(const char *prog);   * return 0 if success, 1 - if addition of a file failed and   * ADD_FILES_IGNORE_ERRORS was specified in flags   */ -int add_files_to_cache(const char *prefix, const char **pathspec, int flags); +int add_files_to_cache(const char *prefix, const struct pathspec *pathspec, int flags);  /* diff.c */  extern int diff_auto_refresh_index; @@ -1299,7 +1264,7 @@ extern int ws_blank_line(const char *line, int len, unsigned ws_rule);  #define ws_tab_width(rule)     ((rule) & WS_TAB_WIDTH_MASK)  /* ls-files */ -int report_path_error(const char *ps_matched, const char **pathspec, const char *prefix); +int report_path_error(const char *ps_matched, const struct pathspec *pathspec, const char *prefix);  void overlay_tree_on_cache(const char *tree_name, const char *prefix);  char *alias_lookup(const char *alias); @@ -1326,4 +1291,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 */  | 
