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 <p...@peff.net>
Signed-off-by: Christian Couder <chrisc...@tuxfamily.org>
---
 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

Reply via email to