In the following commits we will need some functions that were internal to sha1_file.c, so let's first make them non static and declare them in "cache.h". While at it, let's rename 'create_tmpfile()' to 'create_object_tmpfile()' to make its name less generic. Let's also split out 'sha1_file_name_alt()' from 'sha1_file_name()' and 'open_sha1_file_alt()' from 'open_sha1_file()', as we will need both of these new functions too. Helped-by: Jeff King <peff@xxxxxxxx> Signed-off-by: Christian Couder <chriscool@xxxxxxxxxxxxx> --- cache.h | 8 ++++++++ sha1_file.c | 57 ++++++++++++++++++++++++++++++++++++--------------------- 2 files changed, 44 insertions(+), 21 deletions(-) diff --git a/cache.h b/cache.h index 71fe092644..06da3d8a3f 100644 --- a/cache.h +++ b/cache.h @@ -902,6 +902,12 @@ extern void check_repository_format(void); */ extern const char *sha1_file_name(const unsigned char *sha1); +/* + * Like sha1_file_name, but return the filename within a specific alternate + * object directory. Shares the same static buffer with sha1_file_name. + */ +extern const char *sha1_file_name_alt(const char *objdir, const unsigned char *sha1); + /* * Return the name of the (local) packfile with the specified sha1 in * its name. The return value is a pointer to memory that is @@ -1205,6 +1211,8 @@ extern int do_check_packed_object_crc; extern int check_sha1_signature(const unsigned char *sha1, void *buf, unsigned long size, const char *type); +extern int create_object_tmpfile(struct strbuf *tmp, const char *filename); +extern void close_sha1_file(int fd); extern int finalize_object_file(const char *tmpfile, const char *filename); extern int has_sha1_pack(const unsigned char *sha1); diff --git a/sha1_file.c b/sha1_file.c index b60ae15f70..d330996bc4 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -253,12 +253,12 @@ static void fill_sha1_path(struct strbuf *buf, const unsigned char *sha1) } } -const char *sha1_file_name(const unsigned char *sha1) +const char *sha1_file_name_alt(const char *objdir, const unsigned char *sha1) { static struct strbuf buf = STRBUF_INIT; strbuf_reset(&buf); - strbuf_addf(&buf, "%s/", get_object_directory()); + strbuf_addf(&buf, "%s/", objdir); fill_sha1_path(&buf, sha1); return buf.buf; @@ -278,9 +278,14 @@ static const char *alt_sha1_path(struct alternate_object_database *alt, return buf->buf; } - char *odb_pack_name(struct strbuf *buf, - const unsigned char *sha1, - const char *ext) +const char *sha1_file_name(const unsigned char *sha1) +{ + return sha1_file_name_alt(get_object_directory(), sha1); +} + +char *odb_pack_name(struct strbuf *buf, + const unsigned char *sha1, + const char *ext) { strbuf_reset(buf); strbuf_addf(buf, "%s/pack/pack-%s.%s", get_object_directory(), @@ -1727,24 +1732,14 @@ static int stat_sha1_file(const unsigned char *sha1, struct stat *st, return -1; } -/* - * Like stat_sha1_file(), but actually open the object and return the - * descriptor. See the caveats on the "path" parameter above. - */ -static int open_sha1_file(const unsigned char *sha1, const char **path) +static int open_sha1_file_alt(const unsigned char *sha1, const char **path) { - int fd; struct alternate_object_database *alt; - int most_interesting_errno; - - *path = sha1_file_name(sha1); - fd = git_open(*path); - if (fd >= 0) - return fd; - most_interesting_errno = errno; + int most_interesting_errno = errno; prepare_alt_odb(); for (alt = alt_odb_list; alt; alt = alt->next) { + int fd; *path = alt_sha1_path(alt, sha1); fd = git_open(*path); if (fd >= 0) @@ -1756,6 +1751,26 @@ static int open_sha1_file(const unsigned char *sha1, const char **path) return -1; } +/* + * Like stat_sha1_file(), but actually open the object and return the + * descriptor. See the caveats on the "path" parameter above. + */ +static int open_sha1_file(const unsigned char *sha1, const char **path) +{ + int fd; + + *path = sha1_file_name(sha1); + fd = git_open(*path); + if (fd >= 0) + return fd; + + fd = open_sha1_file_alt(sha1, path); + if (fd >= 0) + return fd; + + return fd; +} + /* * Map the loose object at "path" if it is not NULL, or the path found by * searching for a loose object named "sha1". @@ -3284,7 +3299,7 @@ int hash_sha1_file(const void *buf, unsigned long len, const char *type, } /* Finalize a file on disk, and close it. */ -static void close_sha1_file(int fd) +void close_sha1_file(int fd) { if (fsync_object_files) fsync_or_die(fd, "sha1 file"); @@ -3308,7 +3323,7 @@ static inline int directory_size(const char *filename) * We want to avoid cross-directory filename renames, because those * can have problems on various filesystems (FAT, NFS, Coda). */ -static int create_tmpfile(struct strbuf *tmp, const char *filename) +int create_object_tmpfile(struct strbuf *tmp, const char *filename) { int fd, dirlen = directory_size(filename); @@ -3348,7 +3363,7 @@ static int write_loose_object(const unsigned char *sha1, char *hdr, int hdrlen, static struct strbuf tmp_file = STRBUF_INIT; const char *filename = sha1_file_name(sha1); - fd = create_tmpfile(&tmp_file, filename); + fd = create_object_tmpfile(&tmp_file, filename); if (fd < 0) { if (errno == EACCES) return error("insufficient permission for adding an object to repository database %s", get_object_directory()); -- 2.14.0.rc1.52.gf02fb0ddac.dirty