]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'jc/fake-lstat'
authorJunio C Hamano <gitster@pobox.com>
Wed, 27 Dec 2023 22:52:24 +0000 (14:52 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 27 Dec 2023 22:52:24 +0000 (14:52 -0800)
A new helper to let us pretend that we called lstat() when we know
our cache_entry is up-to-date via fsmonitor.

* jc/fake-lstat:
  cache: add fake_lstat()

1  2 
statinfo.c

diff --combined statinfo.c
index 9367ca099cd114d56d7b2103b0e56fa4933f5781,45156109de72e93109264198c8d370fa1e543447..3c6bc049c15d44c33c064fecbbd2236571b2dadb
@@@ -2,22 -2,6 +2,22 @@@
  #include "environment.h"
  #include "statinfo.h"
  
 +/*
 + * Munge st_size into an unsigned int.
 + */
 +static unsigned int munge_st_size(off_t st_size) {
 +      unsigned int sd_size = st_size;
 +
 +      /*
 +       * If the file is an exact multiple of 4 GiB, modify the value so it
 +       * doesn't get marked as racily clean (zero).
 +       */
 +      if (!sd_size && st_size)
 +              return 0x80000000;
 +      else
 +              return sd_size;
 +}
 +
  void fill_stat_data(struct stat_data *sd, struct stat *st)
  {
        sd->sd_ctime.sec = (unsigned int)st->st_ctime;
        sd->sd_ino = st->st_ino;
        sd->sd_uid = st->st_uid;
        sd->sd_gid = st->st_gid;
 -      sd->sd_size = st->st_size;
 +      sd->sd_size = munge_st_size(st->st_size);
  }
  
+ static void set_times(struct stat *st, const struct stat_data *sd)
+ {
+       st->st_ctime = sd->sd_ctime.sec;
+       st->st_mtime = sd->sd_mtime.sec;
+ #ifdef NO_NSEC
+       ; /* nothing */
+ #else
+ #ifdef USE_ST_TIMESPEC
+       st->st_ctimespec.tv_nsec = sd->sd_ctime.nsec;
+       st->st_mtimespec.tv_nsec = sd->sd_mtime.nsec;
+ #else
+       st->st_ctim.tv_nsec = sd->sd_ctime.nsec;
+       st->st_mtim.tv_nsec = sd->sd_mtime.nsec;
+ #endif
+ #endif
+ }
+ void fake_lstat_data(const struct stat_data *sd, struct stat *st)
+ {
+       set_times(st, sd);
+       st->st_dev = sd->sd_dev;
+       st->st_ino = sd->sd_ino;
+       st->st_uid = sd->sd_uid;
+       st->st_gid = sd->sd_gid;
+       st->st_size = sd->sd_size;
+ }
  int match_stat_data(const struct stat_data *sd, struct stat *st)
  {
        int changed = 0;
@@@ -67,7 -78,7 +94,7 @@@
                        changed |= INODE_CHANGED;
  #endif
  
 -      if (sd->sd_size != (unsigned int) st->st_size)
 +      if (sd->sd_size != munge_st_size(st->st_size))
                changed |= DATA_CHANGED;
  
        return changed;