struct object_directory {
struct object_directory *next;
- /* see alt_scratch_buf() */
- struct strbuf scratch;
- size_t base_len;
-
/*
* Used to store the results of readdir(3) calls when searching
* for unique abbreviated hashes. This cache is never
*/
void add_to_alternates_memory(const char *dir);
-/*
- * Returns a scratch strbuf pre-filled with the alternate object directory,
- * including a trailing slash, which can be used to access paths in the
- * alternate. Always use this over direct access to alt->scratch, as it
- * cleans up any previous use of the scratch buffer.
- */
-struct strbuf *alt_scratch_buf(struct object_directory *odb);
-
struct packed_git {
struct packed_git *next;
struct list_head mru;
* Put in `buf` the name of the file in the local object database that
* would be used to store a loose object with the specified sha1.
*/
-void loose_object_path(struct repository *r, struct strbuf *buf, const unsigned char *sha1);
+const char *loose_object_path(struct repository *r, struct strbuf *buf, const unsigned char *sha1);
void *map_sha1_file(struct repository *r, const unsigned char *sha1, unsigned long *size);
}
}
-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);
}
/*
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;
}
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;
*
* 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)
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;
}
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;
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;
int subdir_nr = ds->bin_pfx.hash[0];
struct object_directory *odb;
static struct object_directory *fakeent;
+ struct strbuf buf = STRBUF_INIT;
if (!fakeent) {
/*
int pos;
if (!odb->loose_objects_subdir_seen[subdir_nr]) {
- struct strbuf *buf = alt_scratch_buf(odb);
- for_each_file_in_obj_subdir(subdir_nr, buf,
+ strbuf_reset(&buf);
+ strbuf_addstr(&buf, odb->path);
+ for_each_file_in_obj_subdir(subdir_nr, &buf,
append_loose_object,
NULL, NULL,
&odb->loose_objects_cache);
pos++;
}
}
+
+ strbuf_release(&buf);
}
static int match_sha(unsigned len, const unsigned char *a, const unsigned char *b)