]> git.ipfire.org Git - thirdparty/git.git/blame - statinfo.h
Merge branch 'jt/commit-redundant-scissors-fix'
[thirdparty/git.git] / statinfo.h
CommitLineData
ac48adf4
EN
1#ifndef STATINFO_H
2#define STATINFO_H
3
90cbae9c
EN
4struct index_state;
5
ac48adf4
EN
6/*
7 * The "cache_time" is just the low 32 bits of the
8 * time. It doesn't matter if it overflows - we only
9 * check it for equality in the 32 bits we save.
10 */
11struct cache_time {
12 uint32_t sec;
13 uint32_t nsec;
14};
15
16struct stat_data {
17 struct cache_time sd_ctime;
18 struct cache_time sd_mtime;
19 unsigned int sd_dev;
20 unsigned int sd_ino;
21 unsigned int sd_uid;
22 unsigned int sd_gid;
23 unsigned int sd_size;
24};
25
90cbae9c
EN
26/*
27 * A struct to encapsulate the concept of whether a file has changed
28 * since we last checked it. This uses criteria similar to those used
29 * for the index.
30 */
31struct stat_validity {
32 struct stat_data *sd;
33};
34
35#define MTIME_CHANGED 0x0001
36#define CTIME_CHANGED 0x0002
37#define OWNER_CHANGED 0x0004
38#define MODE_CHANGED 0x0008
39#define INODE_CHANGED 0x0010
40#define DATA_CHANGED 0x0020
41#define TYPE_CHANGED 0x0040
42
43/*
44 * Record to sd the data from st that we use to check whether a file
45 * might have changed.
46 */
47void fill_stat_data(struct stat_data *sd, struct stat *st);
48
c33fa871
JH
49/*
50 * The inverse of the above. When we know the cache_entry that
51 * contains sd is up-to-date, but still need to pretend we called
52 * lstat() to learn that fact, this function fills "st" enough to
53 * fool ie_match_stat().
54 */
55void fake_lstat_data(const struct stat_data *sd, struct stat *st);
56
90cbae9c
EN
57/*
58 * Return 0 if st is consistent with a file not having been changed
59 * since sd was filled. If there are differences, return a
60 * combination of MTIME_CHANGED, CTIME_CHANGED, OWNER_CHANGED,
61 * INODE_CHANGED, and DATA_CHANGED.
62 */
63int match_stat_data(const struct stat_data *sd, struct stat *st);
64
65void stat_validity_clear(struct stat_validity *sv);
66
67/*
68 * Returns 1 if the path is a regular file (or a symlink to a regular
69 * file) and matches the saved stat_validity, 0 otherwise. A missing
70 * or inaccessible file is considered a match if the struct was just
71 * initialized, or if the previous update found an inaccessible file.
72 */
73int stat_validity_check(struct stat_validity *sv, const char *path);
74
75/*
76 * Update the stat_validity from a file opened at descriptor fd. If
77 * the file is missing, inaccessible, or not a regular file, then
78 * future calls to stat_validity_check will match iff one of those
79 * conditions continues to be true.
80 */
81void stat_validity_update(struct stat_validity *sv, int fd);
82
03bf92b9
AS
83#if defined(DT_UNKNOWN) && !defined(NO_D_TYPE_IN_DIRENT)
84#define DTYPE(de) ((de)->d_type)
85#else
86#undef DT_UNKNOWN
87#undef DT_DIR
88#undef DT_REG
89#undef DT_LNK
90#define DT_UNKNOWN 0
91#define DT_DIR 1
92#define DT_REG 2
93#define DT_LNK 3
94#define DTYPE(de) DT_UNKNOWN
95#endif
96
ac48adf4 97#endif