On Sun, Apr 07, 2019 at 01:07:12PM +0530, Kapil Jain wrote: > Signed-off-by: Kapil Jain <jkapil.cs@xxxxxxxxx> > --- > > In read-cache, the read_index_from() function had a TODO task, this > patch completes that. This line at least should be above the "---" line (i.e. part of the commit message). > diff --git a/read-cache.c b/read-cache.c > index 4dc6de1b55..0444703284 100644 > --- a/read-cache.c > +++ b/read-cache.c > @@ -2256,7 +2256,7 @@ static void freshen_shared_index(const char *shared_index, int warn) > } > > int read_index_from(struct index_state *istate, const char *path, > - const char *gitdir) > + const char *gitdir, const struct repository *repo) "struct repository *" by convention is always the first argument. See https://public-inbox.org/git/xmqqsh2p6l43.fsf@xxxxxxxxxxxxxxxxxxxxxxxxx/ You also do not need "gitdir" as a separate argument because gitdir is an attribute of a repository. Passing it separately is just a trap to give inconsistent information (e.g. one repo and one gitdir from another one). I see you already use repo->gitdir below. Which means this argument "gitdir" is no longer used anyway. Please remove. > { > struct split_index *split_index; > int ret; > @@ -2292,7 +2292,7 @@ int read_index_from(struct index_state *istate, const char *path, > split_index->base = xcalloc(1, sizeof(*split_index->base)); > > base_oid_hex = oid_to_hex(&split_index->base_oid); > - base_path = xstrfmt("%s/sharedindex.%s", gitdir, base_oid_hex); > + base_path = xstrfmt("%s/sharedindex.%s", repo->gitdir, base_oid_hex); > trace2_region_enter_printf("index", "shared/do_read_index", > the_repository, "%s", base_path); "the_repository" here (and all others in this function) should be replaced with "repo". The TODO comment in this function should be removed as well. > ret = do_read_index(split_index->base, base_path, 1); > diff --git a/revision.c b/revision.c > index eb8e51bc63..247a4d5704 100644 > --- a/revision.c > +++ b/revision.c > @@ -1556,7 +1556,7 @@ void add_index_objects_to_pending(struct rev_info *revs, unsigned int flags) > > if (read_index_from(&istate, > worktree_git_path(wt, "index"), > - get_worktree_git_dir(wt)) > 0) > + get_worktree_git_dir(wt), the_repository) > 0) We have revs->repo to refer to the main repo being examined here. But if the "gitdir" argument is deleted, then revs->repo->gitdir gives a _wrong_ gitdir, it's not the same as get_worktree_git_dir(wt). So before you can continue here, you'll need to add a function, e.g. repo_worktree_init() (similar to repo_init() and repo_submodule_init()). This one should take "struct worktree *" as the argument and return "struct repository *" So, with something like a patch below (not tested), you should be able to write worktrees = repo_get_worktrees(revs->repo, 0); ... struct repository *r = repo_worktree_init(wt); if (read_index_from(&istate, r->index_file, r) > 0) do_add_index_objects_to_pending(revs, &istate, flags); repo_clear(r); -- 8< -- diff --git a/repository.c b/repository.c index 682c239fe3..5a0c7972db 100644 --- a/repository.c +++ b/repository.c @@ -10,6 +10,7 @@ #include "object.h" #include "lockfile.h" #include "submodule-config.h" +#include "worktree.h" /* The main repository */ static struct repository the_repo; @@ -227,6 +228,28 @@ int repo_submodule_init(struct repository *subrepo, return ret; } +int repo_worktree_init(struct repository *repo, + struct repository *source_repo, + const struct worktree *wt) +{ + struct strbuf gitdir = STRBUF_INIT; + int ret; + + if (!wt) + return -1; + + if (!wt->id) + strbuf_addstr(&gitdir, source_repo->commondir); + else + strbuf_addf(&gitdir, "%s/worktrees/%s", + source_repo->commondir, + wt->id); + + ret = repo_init(source_repo, gitdir.buf, wt->path); + strbuf_release(&gitdir); + return ret ? -1 : 0; +} + void repo_clear(struct repository *repo) { FREE_AND_NULL(repo->gitdir); diff --git a/repository.h b/repository.h index 4fb6a5885f..d3c21c7ab5 100644 --- a/repository.h +++ b/repository.h @@ -122,6 +122,10 @@ void repo_set_hash_algo(struct repository *repo, int algo); void initialize_the_repository(void); int repo_init(struct repository *r, const char *gitdir, const char *worktree); +struct worktree; +int repo_worktree_init(struct repository *r, struct repository *source, + const struct worktree *wt); + /* * Initialize the repository 'subrepo' as the submodule given by the * struct submodule 'sub' in parent repository 'superproject'. diff --git a/worktree.c b/worktree.c index b45bfeb9d3..188ea04c61 100644 --- a/worktree.c +++ b/worktree.c @@ -44,19 +44,19 @@ static void add_head_info(struct worktree *wt) /** * get the main worktree */ -static struct worktree *get_main_worktree(void) +static struct worktree *get_main_worktree(struct repository *r) { struct worktree *worktree = NULL; struct strbuf path = STRBUF_INIT; struct strbuf worktree_path = STRBUF_INIT; int is_bare = 0; - strbuf_add_absolute_path(&worktree_path, get_git_common_dir()); + strbuf_add_absolute_path(&worktree_path, r->commondir); is_bare = !strbuf_strip_suffix(&worktree_path, "/.git"); if (is_bare) strbuf_strip_suffix(&worktree_path, "/."); - strbuf_addf(&path, "%s/HEAD", get_git_common_dir()); + strbuf_addf(&path, "%s/HEAD", r->commondir); worktree = xcalloc(1, sizeof(*worktree)); worktree->path = strbuf_detach(&worktree_path, NULL); @@ -68,7 +68,7 @@ static struct worktree *get_main_worktree(void) return worktree; } -static struct worktree *get_linked_worktree(const char *id) +static struct worktree *get_linked_worktree(struct repository *r, const char *id) { struct worktree *worktree = NULL; struct strbuf path = STRBUF_INIT; @@ -77,7 +77,7 @@ static struct worktree *get_linked_worktree(const char *id) if (!id) die("Missing linked worktree name"); - strbuf_git_common_path(&path, the_repository, "worktrees/%s/gitdir", id); + strbuf_git_common_path(&path, r, "worktrees/%s/gitdir", id); if (strbuf_read_file(&worktree_path, path.buf, 0) <= 0) /* invalid gitdir file */ goto done; @@ -90,7 +90,7 @@ static struct worktree *get_linked_worktree(const char *id) } strbuf_reset(&path); - strbuf_addf(&path, "%s/worktrees/%s/HEAD", get_git_common_dir(), id); + strbuf_addf(&path, "%s/worktrees/%s/HEAD", r->commondir, id); worktree = xcalloc(1, sizeof(*worktree)); worktree->path = strbuf_detach(&worktree_path, NULL); @@ -127,7 +127,7 @@ static int compare_worktree(const void *a_, const void *b_) return fspathcmp((*a)->path, (*b)->path); } -struct worktree **get_worktrees(unsigned flags) +struct worktree **repo_get_worktrees(struct repository *r, unsigned flags) { struct worktree **list = NULL; struct strbuf path = STRBUF_INIT; @@ -137,9 +137,9 @@ struct worktree **get_worktrees(unsigned flags) ALLOC_ARRAY(list, alloc); - list[counter++] = get_main_worktree(); + list[counter++] = get_main_worktree(r); - strbuf_addf(&path, "%s/worktrees", get_git_common_dir()); + strbuf_addf(&path, "%s/worktrees", r->commondir); dir = opendir(path.buf); strbuf_release(&path); if (dir) { @@ -148,7 +148,7 @@ struct worktree **get_worktrees(unsigned flags) if (is_dot_or_dotdot(d->d_name)) continue; - if ((linked = get_linked_worktree(d->d_name))) { + if ((linked = get_linked_worktree(r, d->d_name))) { ALLOC_GROW(list, counter + 1, alloc); list[counter++] = linked; } diff --git a/worktree.h b/worktree.h index 9e3b0b7b6f..cb4307db16 100644 --- a/worktree.h +++ b/worktree.h @@ -30,7 +30,8 @@ struct worktree { * The caller is responsible for freeing the memory from the returned * worktree(s). */ -extern struct worktree **get_worktrees(unsigned flags); +struct worktree **repo_get_worktrees(struct repository *r, unsigned flags); +#define get_worktrees(flags) repo_get_worktrees(the_repository, flags) /* * Returns 1 if linked worktrees exist, 0 otherwise. -- 8< -- > do_add_index_objects_to_pending(revs, &istate, flags); > discard_index(&istate); > } > -- > 2.20.1 >