diff options
author | Jeff King <peff@peff.net> | 2018-11-12 09:49:35 -0500 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2018-11-13 14:22:02 +0900 |
commit | f3f043a103b7a7da57272ecf3252bda6089e41ae (patch) | |
tree | 1e20f944f65f62442976d3d1cf566bec0a89ccb7 /sha1-file.c | |
parent | b69fb867b4bb9e30e705d2176fe8a0a90b208325 (diff) | |
download | git-f3f043a103b7a7da57272ecf3252bda6089e41ae.tar.gz |
handle alternates paths the same as the main object dir
When we generate loose file paths for the main object directory, the
caller provides a buffer to loose_object_path (formerly sha1_file_name).
The callers generally keep their own static buffer to avoid excessive
reallocations.
But for alternate directories, each struct carries its own scratch
buffer. This is needlessly different; let's unify them.
We could go either direction here, but this patch moves the alternates
struct over to the main directory style (rather than vice-versa).
Technically the alternates style is more efficient, as it avoids
rewriting the object directory name on each call. But this is unlikely
to matter in practice, as we avoid reallocations either way (and nobody
has ever noticed or complained that the main object directory is copying
a few extra bytes before making a much more expensive system call).
And this has the advantage that the reusable buffers are tied to
particular calls, which makes the invalidation rules simpler (for
example, the return value from stat_sha1_file() used to be invalidated
by basically any other object call, but now it is affected only by other
calls to stat_sha1_file()).
We do steal the trick from alt_sha1_path() of returning a pointer to the
filled buffer, which makes a few conversions more convenient.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'sha1-file.c')
-rw-r--r-- | sha1-file.c | 44 |
1 files changed, 16 insertions, 28 deletions
diff --git a/sha1-file.c b/sha1-file.c index 478eac326b..15db6b61a9 100644 --- a/sha1-file.c +++ b/sha1-file.c @@ -346,27 +346,20 @@ static void fill_sha1_path(struct strbuf *buf, const unsigned char *sha1) } } -void loose_object_path(struct repository *r, struct strbuf *buf, - const unsigned char *sha1) +static const char *odb_loose_path(const char *path, struct strbuf *buf, + const unsigned char *sha1) { strbuf_reset(buf); - strbuf_addstr(buf, r->objects->objectdir); + strbuf_addstr(buf, path); strbuf_addch(buf, '/'); fill_sha1_path(buf, sha1); + return buf->buf; } -struct strbuf *alt_scratch_buf(struct object_directory *odb) +const char *loose_object_path(struct repository *r, struct strbuf *buf, + const unsigned char *sha1) { - strbuf_setlen(&odb->scratch, odb->base_len); - return &odb->scratch; -} - -static const char *alt_sha1_path(struct object_directory *odb, - const unsigned char *sha1) -{ - struct strbuf *buf = alt_scratch_buf(odb); - fill_sha1_path(buf, sha1); - return buf->buf; + return odb_loose_path(r->objects->objectdir, buf, sha1); } /* @@ -547,9 +540,6 @@ struct object_directory *alloc_alt_odb(const char *dir) struct object_directory *ent; FLEX_ALLOC_STR(ent, path, dir); - strbuf_init(&ent->scratch, 0); - strbuf_addf(&ent->scratch, "%s/", dir); - ent->base_len = ent->scratch.len; return ent; } @@ -745,10 +735,12 @@ static int check_and_freshen_local(const struct object_id *oid, int freshen) static int check_and_freshen_nonlocal(const struct object_id *oid, int freshen) { struct object_directory *odb; + static struct strbuf path = STRBUF_INIT; + prepare_alt_odb(the_repository); for (odb = the_repository->objects->alt_odb_list; odb; odb = odb->next) { - const char *path = alt_sha1_path(odb, oid->hash); - if (check_and_freshen_file(path, freshen)) + odb_loose_path(odb->path, &path, oid->hash); + if (check_and_freshen_file(path.buf, freshen)) return 1; } return 0; @@ -889,7 +881,7 @@ int git_open_cloexec(const char *name, int flags) * * The "path" out-parameter will give the path of the object we found (if any). * Note that it may point to static storage and is only valid until another - * call to loose_object_path(), etc. + * call to stat_sha1_file(). */ static int stat_sha1_file(struct repository *r, const unsigned char *sha1, struct stat *st, const char **path) @@ -897,16 +889,14 @@ static int stat_sha1_file(struct repository *r, const unsigned char *sha1, struct object_directory *odb; static struct strbuf buf = STRBUF_INIT; - loose_object_path(r, &buf, sha1); - *path = buf.buf; - + *path = loose_object_path(r, &buf, sha1); if (!lstat(*path, st)) return 0; prepare_alt_odb(r); errno = ENOENT; for (odb = r->objects->alt_odb_list; odb; odb = odb->next) { - *path = alt_sha1_path(odb, sha1); + *path = odb_loose_path(odb->path, &buf, sha1); if (!lstat(*path, st)) return 0; } @@ -926,9 +916,7 @@ static int open_sha1_file(struct repository *r, int most_interesting_errno; static struct strbuf buf = STRBUF_INIT; - loose_object_path(r, &buf, sha1); - *path = buf.buf; - + *path = loose_object_path(r, &buf, sha1); fd = git_open(*path); if (fd >= 0) return fd; @@ -936,7 +924,7 @@ static int open_sha1_file(struct repository *r, prepare_alt_odb(r); for (odb = r->objects->alt_odb_list; odb; odb = odb->next) { - *path = alt_sha1_path(odb, sha1); + *path = odb_loose_path(odb->path, &buf, sha1); fd = git_open(*path); if (fd >= 0) return fd; |