static int refs_from_alternate_cb(struct alternate_object_database *e, void *data) { struct strbuf path = STRBUF_INIT; size_t base_len; struct alternate_refs_data *cb = data; if (!strbuf_realpath(&path, e->path, 0)) goto out; if (!strbuf_strip_suffix(&path, "/objects")) goto out; base_len = path.len; /* Is this a git repository with refs? */ strbuf_addstr(&path, "/refs"); if (!is_directory(path.buf)) goto out; strbuf_setlen(&path, base_len); read_alternate_refs(path.buf, cb->fn, cb->data); out: strbuf_release(&path); return 0; }
void update_worktree_location(struct worktree *wt, const char *path_) { struct strbuf path = STRBUF_INIT; if (is_main_worktree(wt)) BUG("can't relocate main worktree"); strbuf_realpath(&path, path_, 1); if (fspathcmp(wt->path, path.buf)) { write_file(git_common_path("worktrees/%s/gitdir", wt->id), "%s/.git", path.buf); free(wt->path); wt->path = strbuf_detach(&path, NULL); } strbuf_release(&path); }