*/
static int allow_add = 0, allow_remove = 0;
-static int index_fd(const char *path, int namelen, struct cache_entry *ce, int fd, struct stat *st)
+static int index_fd(unsigned char *sha1, int fd, struct stat *st)
{
z_stream stream;
unsigned long size = st->st_size;
- int max_out_bytes = namelen + size + 200;
+ int max_out_bytes = size + 200;
void *out = malloc(max_out_bytes);
- void *metadata = malloc(namelen + 200);
+ void *metadata = malloc(200);
void *in;
SHA_CTX c;
SHA1_Init(&c);
SHA1_Update(&c, out, stream.total_out);
- SHA1_Final(ce->sha1, &c);
+ SHA1_Final(sha1, &c);
- return write_sha1_buffer(ce->sha1, out, stream.total_out);
+ return write_sha1_buffer(sha1, out, stream.total_out);
}
/*
memset(ce, 0, size);
memcpy(ce->name, path, namelen);
fill_stat_cache_info(ce, &st);
- ce->ce_mode = htonl(st.st_mode);
- ce->ce_namelen = htons(namelen);
+ ce->ce_mode = create_ce_mode(st.st_mode);
+ ce->ce_flags = htons(namelen);
- if (index_fd(path, namelen, ce, fd, &st) < 0)
+ if (index_fd(ce->sha1, fd, &st) < 0)
return -1;
return add_cache_entry(ce, allow_add);
}
}
+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;
+ if (get_sha1_hex(arg2, sha1))
+ return -1;
+ if (!verify_path(arg3))
+ return -1;
+
+ 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 = create_ce_mode(mode);
+ return add_cache_entry(ce, allow_add);
+}
+
static int remove_lock = 0;
static void remove_lock_file(void)
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 <mode> <sha1> <path>");
+ i += 3;
+ continue;
+ }
die("unknown option %s", path);
}
if (!verify_path(path)) {