mirror of
https://github.com/git/git.git
synced 2024-05-04 08:56:13 +02:00
statinfo: move stat_{data,validity} functions from cache/read-cache
These functions do not depend upon struct cache_entry or struct index_state in any way, and it seems more logical to break them out into this file, especially since statinfo.h already has the struct stat_data declaration. Diff best viewed with `--color-moved`. Signed-off-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
6cee5ebc7a
commit
90cbae9ce5
1
Makefile
1
Makefile
|
@ -1142,6 +1142,7 @@ LIB_OBJS += sigchain.o
|
|||
LIB_OBJS += sparse-index.o
|
||||
LIB_OBJS += split-index.o
|
||||
LIB_OBJS += stable-qsort.o
|
||||
LIB_OBJS += statinfo.o
|
||||
LIB_OBJS += strbuf.o
|
||||
LIB_OBJS += streaming.o
|
||||
LIB_OBJS += string-list.o
|
||||
|
|
48
cache.h
48
cache.h
|
@ -488,19 +488,6 @@ int has_racy_timestamp(struct index_state *istate);
|
|||
int ie_match_stat(struct index_state *, const struct cache_entry *, struct stat *, unsigned int);
|
||||
int ie_modified(struct index_state *, const struct cache_entry *, struct stat *, unsigned int);
|
||||
|
||||
/*
|
||||
* Record to sd the data from st that we use to check whether a file
|
||||
* might have changed.
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
int match_stat_data(const struct stat_data *sd, struct stat *st);
|
||||
int match_stat_data_racy(const struct index_state *istate,
|
||||
const struct stat_data *sd, struct stat *st);
|
||||
|
||||
|
@ -539,14 +526,6 @@ void set_alternate_index_output(const char *);
|
|||
extern int verify_index_checksum;
|
||||
extern int verify_ce_order;
|
||||
|
||||
#define MTIME_CHANGED 0x0001
|
||||
#define CTIME_CHANGED 0x0002
|
||||
#define OWNER_CHANGED 0x0004
|
||||
#define MODE_CHANGED 0x0008
|
||||
#define INODE_CHANGED 0x0010
|
||||
#define DATA_CHANGED 0x0020
|
||||
#define TYPE_CHANGED 0x0040
|
||||
|
||||
int cmp_cache_name_compare(const void *a_, const void *b_);
|
||||
|
||||
/* add */
|
||||
|
@ -579,31 +558,4 @@ int checkout_fast_forward(struct repository *r,
|
|||
|
||||
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 */
|
||||
|
|
1
object.c
1
object.c
|
@ -6,6 +6,7 @@
|
|||
#include "object-file.h"
|
||||
#include "object-store.h"
|
||||
#include "blob.h"
|
||||
#include "statinfo.h"
|
||||
#include "tree.h"
|
||||
#include "commit.h"
|
||||
#include "tag.h"
|
||||
|
|
84
read-cache.c
84
read-cache.c
|
@ -177,61 +177,6 @@ void rename_index_entry_at(struct index_state *istate, int nr, const char *new_n
|
|||
add_index_entry(istate, new_entry, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE);
|
||||
}
|
||||
|
||||
void fill_stat_data(struct stat_data *sd, struct stat *st)
|
||||
{
|
||||
sd->sd_ctime.sec = (unsigned int)st->st_ctime;
|
||||
sd->sd_mtime.sec = (unsigned int)st->st_mtime;
|
||||
sd->sd_ctime.nsec = ST_CTIME_NSEC(*st);
|
||||
sd->sd_mtime.nsec = ST_MTIME_NSEC(*st);
|
||||
sd->sd_dev = st->st_dev;
|
||||
sd->sd_ino = st->st_ino;
|
||||
sd->sd_uid = st->st_uid;
|
||||
sd->sd_gid = st->st_gid;
|
||||
sd->sd_size = st->st_size;
|
||||
}
|
||||
|
||||
int match_stat_data(const struct stat_data *sd, struct stat *st)
|
||||
{
|
||||
int changed = 0;
|
||||
|
||||
if (sd->sd_mtime.sec != (unsigned int)st->st_mtime)
|
||||
changed |= MTIME_CHANGED;
|
||||
if (trust_ctime && check_stat &&
|
||||
sd->sd_ctime.sec != (unsigned int)st->st_ctime)
|
||||
changed |= CTIME_CHANGED;
|
||||
|
||||
#ifdef USE_NSEC
|
||||
if (check_stat && sd->sd_mtime.nsec != ST_MTIME_NSEC(*st))
|
||||
changed |= MTIME_CHANGED;
|
||||
if (trust_ctime && check_stat &&
|
||||
sd->sd_ctime.nsec != ST_CTIME_NSEC(*st))
|
||||
changed |= CTIME_CHANGED;
|
||||
#endif
|
||||
|
||||
if (check_stat) {
|
||||
if (sd->sd_uid != (unsigned int) st->st_uid ||
|
||||
sd->sd_gid != (unsigned int) st->st_gid)
|
||||
changed |= OWNER_CHANGED;
|
||||
if (sd->sd_ino != (unsigned int) st->st_ino)
|
||||
changed |= INODE_CHANGED;
|
||||
}
|
||||
|
||||
#ifdef USE_STDEV
|
||||
/*
|
||||
* st_dev breaks on network filesystems where different
|
||||
* clients will have different views of what "device"
|
||||
* the filesystem is on
|
||||
*/
|
||||
if (check_stat && sd->sd_dev != (unsigned int) st->st_dev)
|
||||
changed |= INODE_CHANGED;
|
||||
#endif
|
||||
|
||||
if (sd->sd_size != (unsigned int) st->st_size)
|
||||
changed |= DATA_CHANGED;
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
/*
|
||||
* This only updates the "non-critical" parts of the directory
|
||||
* cache, ie the parts that aren't tracked by GIT, and only used
|
||||
|
@ -3536,35 +3481,6 @@ void *read_blob_data_from_index(struct index_state *istate,
|
|||
return data;
|
||||
}
|
||||
|
||||
void stat_validity_clear(struct stat_validity *sv)
|
||||
{
|
||||
FREE_AND_NULL(sv->sd);
|
||||
}
|
||||
|
||||
int stat_validity_check(struct stat_validity *sv, const char *path)
|
||||
{
|
||||
struct stat st;
|
||||
|
||||
if (stat(path, &st) < 0)
|
||||
return sv->sd == NULL;
|
||||
if (!sv->sd)
|
||||
return 0;
|
||||
return S_ISREG(st.st_mode) && !match_stat_data(sv->sd, &st);
|
||||
}
|
||||
|
||||
void stat_validity_update(struct stat_validity *sv, int fd)
|
||||
{
|
||||
struct stat st;
|
||||
|
||||
if (fstat(fd, &st) < 0 || !S_ISREG(st.st_mode))
|
||||
stat_validity_clear(sv);
|
||||
else {
|
||||
if (!sv->sd)
|
||||
CALLOC_ARRAY(sv->sd, 1);
|
||||
fill_stat_data(sv->sd, &st);
|
||||
}
|
||||
}
|
||||
|
||||
void move_index_extensions(struct index_state *dst, struct index_state *src)
|
||||
{
|
||||
dst->untracked = src->untracked;
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include "../iterator.h"
|
||||
#include "../lockfile.h"
|
||||
#include "../chdir-notify.h"
|
||||
#include "../statinfo.h"
|
||||
#include "../wrapper.h"
|
||||
#include "../write-or-die.h"
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include "list-objects.h"
|
||||
#include "commit-reach.h"
|
||||
#include "shallow.h"
|
||||
#include "statinfo.h"
|
||||
#include "trace.h"
|
||||
#include "wrapper.h"
|
||||
|
||||
|
|
|
@ -0,0 +1,87 @@
|
|||
#include "git-compat-util.h"
|
||||
#include "environment.h"
|
||||
#include "statinfo.h"
|
||||
|
||||
void fill_stat_data(struct stat_data *sd, struct stat *st)
|
||||
{
|
||||
sd->sd_ctime.sec = (unsigned int)st->st_ctime;
|
||||
sd->sd_mtime.sec = (unsigned int)st->st_mtime;
|
||||
sd->sd_ctime.nsec = ST_CTIME_NSEC(*st);
|
||||
sd->sd_mtime.nsec = ST_MTIME_NSEC(*st);
|
||||
sd->sd_dev = st->st_dev;
|
||||
sd->sd_ino = st->st_ino;
|
||||
sd->sd_uid = st->st_uid;
|
||||
sd->sd_gid = st->st_gid;
|
||||
sd->sd_size = st->st_size;
|
||||
}
|
||||
|
||||
int match_stat_data(const struct stat_data *sd, struct stat *st)
|
||||
{
|
||||
int changed = 0;
|
||||
|
||||
if (sd->sd_mtime.sec != (unsigned int)st->st_mtime)
|
||||
changed |= MTIME_CHANGED;
|
||||
if (trust_ctime && check_stat &&
|
||||
sd->sd_ctime.sec != (unsigned int)st->st_ctime)
|
||||
changed |= CTIME_CHANGED;
|
||||
|
||||
#ifdef USE_NSEC
|
||||
if (check_stat && sd->sd_mtime.nsec != ST_MTIME_NSEC(*st))
|
||||
changed |= MTIME_CHANGED;
|
||||
if (trust_ctime && check_stat &&
|
||||
sd->sd_ctime.nsec != ST_CTIME_NSEC(*st))
|
||||
changed |= CTIME_CHANGED;
|
||||
#endif
|
||||
|
||||
if (check_stat) {
|
||||
if (sd->sd_uid != (unsigned int) st->st_uid ||
|
||||
sd->sd_gid != (unsigned int) st->st_gid)
|
||||
changed |= OWNER_CHANGED;
|
||||
if (sd->sd_ino != (unsigned int) st->st_ino)
|
||||
changed |= INODE_CHANGED;
|
||||
}
|
||||
|
||||
#ifdef USE_STDEV
|
||||
/*
|
||||
* st_dev breaks on network filesystems where different
|
||||
* clients will have different views of what "device"
|
||||
* the filesystem is on
|
||||
*/
|
||||
if (check_stat && sd->sd_dev != (unsigned int) st->st_dev)
|
||||
changed |= INODE_CHANGED;
|
||||
#endif
|
||||
|
||||
if (sd->sd_size != (unsigned int) st->st_size)
|
||||
changed |= DATA_CHANGED;
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
void stat_validity_clear(struct stat_validity *sv)
|
||||
{
|
||||
FREE_AND_NULL(sv->sd);
|
||||
}
|
||||
|
||||
int stat_validity_check(struct stat_validity *sv, const char *path)
|
||||
{
|
||||
struct stat st;
|
||||
|
||||
if (stat(path, &st) < 0)
|
||||
return sv->sd == NULL;
|
||||
if (!sv->sd)
|
||||
return 0;
|
||||
return S_ISREG(st.st_mode) && !match_stat_data(sv->sd, &st);
|
||||
}
|
||||
|
||||
void stat_validity_update(struct stat_validity *sv, int fd)
|
||||
{
|
||||
struct stat st;
|
||||
|
||||
if (fstat(fd, &st) < 0 || !S_ISREG(st.st_mode))
|
||||
stat_validity_clear(sv);
|
||||
else {
|
||||
if (!sv->sd)
|
||||
CALLOC_ARRAY(sv->sd, 1);
|
||||
fill_stat_data(sv->sd, &st);
|
||||
}
|
||||
}
|
51
statinfo.h
51
statinfo.h
|
@ -1,6 +1,8 @@
|
|||
#ifndef STATINFO_H
|
||||
#define STATINFO_H
|
||||
|
||||
struct index_state;
|
||||
|
||||
/*
|
||||
* The "cache_time" is just the low 32 bits of the
|
||||
* time. It doesn't matter if it overflows - we only
|
||||
|
@ -21,4 +23,53 @@ struct stat_data {
|
|||
unsigned int sd_size;
|
||||
};
|
||||
|
||||
/*
|
||||
* 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;
|
||||
};
|
||||
|
||||
#define MTIME_CHANGED 0x0001
|
||||
#define CTIME_CHANGED 0x0002
|
||||
#define OWNER_CHANGED 0x0004
|
||||
#define MODE_CHANGED 0x0008
|
||||
#define INODE_CHANGED 0x0010
|
||||
#define DATA_CHANGED 0x0020
|
||||
#define TYPE_CHANGED 0x0040
|
||||
|
||||
/*
|
||||
* Record to sd the data from st that we use to check whether a file
|
||||
* might have changed.
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
int match_stat_data(const struct stat_data *sd, struct stat *st);
|
||||
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue