diff options
Diffstat (limited to 'sha1-file.c')
-rw-r--r-- | sha1-file.c | 122 |
1 files changed, 44 insertions, 78 deletions
diff --git a/sha1-file.c b/sha1-file.c index 15db6b61a9..503262edd2 100644 --- a/sha1-file.c +++ b/sha1-file.c @@ -346,11 +346,12 @@ static void fill_sha1_path(struct strbuf *buf, const unsigned char *sha1) } } -static const char *odb_loose_path(const char *path, struct strbuf *buf, +static const char *odb_loose_path(struct object_directory *odb, + struct strbuf *buf, const unsigned char *sha1) { strbuf_reset(buf); - strbuf_addstr(buf, path); + strbuf_addstr(buf, odb->path); strbuf_addch(buf, '/'); fill_sha1_path(buf, sha1); return buf->buf; @@ -359,7 +360,7 @@ static const char *odb_loose_path(const char *path, struct strbuf *buf, const char *loose_object_path(struct repository *r, struct strbuf *buf, const unsigned char *sha1) { - return odb_loose_path(r->objects->objectdir, buf, sha1); + return odb_loose_path(r->objects->odb, buf, sha1); } /* @@ -383,7 +384,7 @@ static int alt_odb_usable(struct raw_object_store *o, * Prevent the common mistake of listing the same * thing twice, or object directory itself. */ - for (odb = o->alt_odb_list; odb; odb = odb->next) { + for (odb = o->odb; odb; odb = odb->next) { if (!fspathcmp(path->buf, odb->path)) return 0; } @@ -442,11 +443,12 @@ static int link_alt_odb_entry(struct repository *r, const char *entry, return -1; } - ent = alloc_alt_odb(pathbuf.buf); + ent = xcalloc(1, sizeof(*ent)); + ent->path = xstrdup(pathbuf.buf); /* add the alternate entry */ - *r->objects->alt_odb_tail = ent; - r->objects->alt_odb_tail = &(ent->next); + *r->objects->odb_tail = ent; + r->objects->odb_tail = &(ent->next); ent->next = NULL; /* recursively add alternates */ @@ -500,7 +502,7 @@ static void link_alt_odb_entries(struct repository *r, const char *alt, return; } - strbuf_add_absolute_path(&objdirbuf, r->objects->objectdir); + strbuf_add_absolute_path(&objdirbuf, r->objects->odb->path); if (strbuf_normalize_path(&objdirbuf) < 0) die(_("unable to normalize object directory: %s"), objdirbuf.buf); @@ -535,15 +537,6 @@ static void read_info_alternates(struct repository *r, free(path); } -struct object_directory *alloc_alt_odb(const char *dir) -{ - struct object_directory *ent; - - FLEX_ALLOC_STR(ent, path, dir); - - return ent; -} - void add_to_alternates_file(const char *reference) { struct lock_file lock = LOCK_INIT; @@ -580,7 +573,7 @@ void add_to_alternates_file(const char *reference) fprintf_or_die(out, "%s\n", reference); if (commit_lock_file(&lock)) die_errno(_("unable to move new alternates file into place")); - if (the_repository->objects->alt_odb_tail) + if (the_repository->objects->loaded_alternates) link_alt_odb_entries(the_repository, reference, '\n', NULL, 0); } @@ -680,7 +673,7 @@ int foreach_alt_odb(alt_odb_fn fn, void *cb) int r = 0; prepare_alt_odb(the_repository); - for (ent = the_repository->objects->alt_odb_list; ent; ent = ent->next) { + for (ent = the_repository->objects->odb->next; ent; ent = ent->next) { r = fn(ent, cb); if (r) break; @@ -690,13 +683,13 @@ int foreach_alt_odb(alt_odb_fn fn, void *cb) void prepare_alt_odb(struct repository *r) { - if (r->objects->alt_odb_tail) + if (r->objects->loaded_alternates) return; - r->objects->alt_odb_tail = &r->objects->alt_odb_list; link_alt_odb_entries(r, r->objects->alternate_db, PATH_SEP, NULL, 0); - read_info_alternates(r, r->objects->objectdir, 0); + read_info_alternates(r, r->objects->odb->path, 0); + r->objects->loaded_alternates = 1; } /* Returns 1 if we have successfully freshened the file, 0 otherwise. */ @@ -723,24 +716,27 @@ int check_and_freshen_file(const char *fn, int freshen) return 1; } -static int check_and_freshen_local(const struct object_id *oid, int freshen) +static int check_and_freshen_odb(struct object_directory *odb, + const struct object_id *oid, + int freshen) { - static struct strbuf buf = STRBUF_INIT; - - loose_object_path(the_repository, &buf, oid->hash); + static struct strbuf path = STRBUF_INIT; + odb_loose_path(odb, &path, oid->hash); + return check_and_freshen_file(path.buf, freshen); +} - return check_and_freshen_file(buf.buf, freshen); +static int check_and_freshen_local(const struct object_id *oid, int freshen) +{ + return check_and_freshen_odb(the_repository->objects->odb, oid, 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) { - odb_loose_path(odb->path, &path, oid->hash); - if (check_and_freshen_file(path.buf, freshen)) + for (odb = the_repository->objects->odb->next; odb; odb = odb->next) { + if (check_and_freshen_odb(odb, oid, freshen)) return 1; } return 0; @@ -889,14 +885,9 @@ static int stat_sha1_file(struct repository *r, const unsigned char *sha1, struct object_directory *odb; static struct strbuf buf = STRBUF_INIT; - *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 = odb_loose_path(odb->path, &buf, sha1); + for (odb = r->objects->odb; odb; odb = odb->next) { + *path = odb_loose_path(odb, &buf, sha1); if (!lstat(*path, st)) return 0; } @@ -913,21 +904,16 @@ static int open_sha1_file(struct repository *r, { int fd; struct object_directory *odb; - int most_interesting_errno; + int most_interesting_errno = ENOENT; static struct strbuf buf = STRBUF_INIT; - *path = loose_object_path(r, &buf, sha1); - fd = git_open(*path); - if (fd >= 0) - return fd; - most_interesting_errno = errno; - prepare_alt_odb(r); - for (odb = r->objects->alt_odb_list; odb; odb = odb->next) { - *path = odb_loose_path(odb->path, &buf, sha1); + for (odb = r->objects->odb; odb; odb = odb->next) { + *path = odb_loose_path(odb, &buf, sha1); fd = git_open(*path); if (fd >= 0) return fd; + if (most_interesting_errno == ENOENT) most_interesting_errno = errno; } @@ -2120,43 +2106,23 @@ int for_each_loose_file_in_objdir(const char *path, return r; } -struct loose_alt_odb_data { - each_loose_object_fn *cb; - void *data; -}; - -static int loose_from_alt_odb(struct object_directory *odb, - void *vdata) -{ - struct loose_alt_odb_data *data = vdata; - struct strbuf buf = STRBUF_INIT; - int r; - - strbuf_addstr(&buf, odb->path); - r = for_each_loose_file_in_objdir_buf(&buf, - data->cb, NULL, NULL, - data->data); - strbuf_release(&buf); - return r; -} - int for_each_loose_object(each_loose_object_fn cb, void *data, enum for_each_object_flags flags) { - struct loose_alt_odb_data alt; - int r; + struct object_directory *odb; - r = for_each_loose_file_in_objdir(get_object_directory(), - cb, NULL, NULL, data); - if (r) - return r; + prepare_alt_odb(the_repository); + for (odb = the_repository->objects->odb; odb; odb = odb->next) { + int r = for_each_loose_file_in_objdir(odb->path, cb, NULL, + NULL, data); + if (r) + return r; - if (flags & FOR_EACH_OBJECT_LOCAL_ONLY) - return 0; + if (flags & FOR_EACH_OBJECT_LOCAL_ONLY) + break; + } - alt.cb = cb; - alt.data = data; - return foreach_alt_odb(loose_from_alt_odb, &alt); + return 0; } static int check_stream_sha1(git_zstream *stream, |