X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=update-cache.c;h=134ba7439891d698c4b82223a9e872d3a77e5edb;hb=9bd94cafdf104e613d7609401e60711cd08e209c;hp=8fcf07a6118104876770042dfd1b429c36f8c57e;hpb=2de381f919829aec1e35d6c7cc33519295dcd053;p=git.git diff --git a/update-cache.c b/update-cache.c index 8fcf07a6..134ba743 100644 --- a/update-cache.c +++ b/update-cache.c @@ -68,14 +68,17 @@ static int index_fd(const char *path, int namelen, struct cache_entry *ce, int f */ static void fill_stat_cache_info(struct cache_entry *ce, struct stat *st) { - ce->ctime.sec = st->st_ctime; - ce->ctime.nsec = st->st_ctim.tv_nsec; - ce->mtime.sec = st->st_mtime; - ce->mtime.nsec = st->st_mtim.tv_nsec; - ce->st_dev = st->st_dev; - ce->st_ino = st->st_ino; - ce->st_uid = st->st_uid; - ce->st_gid = st->st_gid; + ce->ce_ctime.sec = htonl(st->st_ctime); + ce->ce_mtime.sec = htonl(st->st_mtime); +#ifdef NSEC + ce->ce_ctime.nsec = htonl(st->st_ctim.tv_nsec); + ce->ce_mtime.nsec = htonl(st->st_mtim.tv_nsec); +#endif + ce->ce_dev = htonl(st->st_dev); + ce->ce_ino = htonl(st->st_ino); + ce->ce_uid = htonl(st->st_uid); + ce->ce_gid = htonl(st->st_gid); + ce->ce_size = htonl(st->st_size); } static int add_file_to_cache(char *path) @@ -103,9 +106,8 @@ static int add_file_to_cache(char *path) memset(ce, 0, size); memcpy(ce->name, path, namelen); fill_stat_cache_info(ce, &st); - ce->st_mode = st.st_mode; - ce->st_size = st.st_size; - ce->namelen = namelen; + ce->ce_mode = htonl(st.st_mode); + ce->ce_flags = htons(namelen); if (index_fd(path, namelen, ce, fd, &st) < 0) return -1; @@ -186,7 +188,6 @@ static struct cache_entry *refresh_entry(struct cache_entry *ce) updated = malloc(size); memcpy(updated, ce, size); fill_stat_cache_info(updated, &st); - updated->st_size = st.st_size; return updated; } @@ -213,7 +214,7 @@ static void refresh_cache(void) * are hidden, for chist sake. * * Also, we don't want double slashes or slashes at the - * end that can make pathnames ambiguous. + * end that can make pathnames ambiguous. */ static int verify_path(char *path) { @@ -234,6 +235,35 @@ inside: } } +static int add_cacheinfo(char *arg1, char *arg2, char *arg3) +{ + int size, len; + unsigned int mode; + unsigned char sha1[20]; + struct cache_entry *ce; + + if (sscanf(arg1, "%o", &mode) != 1) + return -1; + printf("got mode %o\n", mode); + if (get_sha1_hex(arg2, sha1)) + return -1; + printf("got sha1 %s\n", sha1_to_hex(sha1)); + if (!verify_path(arg3)) + return -1; + printf("got path %s\n", arg3); + + len = strlen(arg3); + size = cache_entry_size(len); + ce = malloc(size); + memset(ce, 0, size); + + memcpy(ce->sha1, sha1, 20); + memcpy(ce->name, arg3, len); + ce->ce_flags = htons(len); + ce->ce_mode = htonl(mode); + return add_cache_entry(ce, allow_add); +} + static int remove_lock = 0; static void remove_lock_file(void) @@ -278,6 +308,12 @@ int main(int argc, char **argv) refresh_cache(); continue; } + if (!strcmp(path, "--cacheinfo")) { + if (i+3 >= argc || add_cacheinfo(argv[i+1], argv[i+2], argv[i+3])) + die("update-cache: --cacheinfo "); + i += 3; + continue; + } die("unknown option %s", path); } if (!verify_path(path)) {