int refs_read_ref_full(struct ref_store *refs, const char *refname, int resolve_flags, unsigned char *sha1, int *flags) { if (refs_resolve_ref_unsafe(refs, refname, resolve_flags, sha1, flags)) return 0; return -1; }
int resolve_gitlink_ref(const char *submodule, const char *refname, unsigned char *sha1) { size_t len = strlen(submodule); struct ref_store *refs; int flags; while (len && submodule[len - 1] == '/') len--; if (!len) return -1; if (submodule[len]) { /* We need to strip off one or more trailing slashes */ char *stripped = xmemdupz(submodule, len); refs = get_submodule_ref_store(stripped); free(stripped); } else { refs = get_submodule_ref_store(submodule); } if (!refs) return -1; if (!refs_resolve_ref_unsafe(refs, refname, 0, sha1, &flags) || is_null_sha1(sha1)) return -1; return 0; }
char *refs_resolve_refdup(struct ref_store *refs, const char *refname, int resolve_flags, unsigned char *sha1, int *flags) { const char *result; result = refs_resolve_ref_unsafe(refs, refname, resolve_flags, sha1, flags); return xstrdup_or_null(result); }
/** * Update head_sha1, head_ref and is_detached of the given worktree */ static void add_head_info(struct worktree *wt) { int flags; const char *target; target = refs_resolve_ref_unsafe(get_worktree_ref_store(wt), "HEAD", 0, &wt->head_oid, &flags); if (!target) return; if (flags & REF_ISSYMREF) wt->head_ref = xstrdup(target); else wt->is_detached = 1; }
/* * note: this function should be able to detect shared symref even if * HEAD is temporarily detached (e.g. in the middle of rebase or * bisect). New commands that do similar things should update this * function as well. */ const struct worktree *find_shared_symref(const char *symref, const char *target) { const struct worktree *existing = NULL; static struct worktree **worktrees; int i = 0; if (worktrees) free_worktrees(worktrees); worktrees = get_worktrees(0); for (i = 0; worktrees[i]; i++) { struct worktree *wt = worktrees[i]; const char *symref_target; struct ref_store *refs; int flags; if (wt->is_bare) continue; if (wt->is_detached && !strcmp(symref, "HEAD")) { if (is_worktree_being_rebased(wt, target)) { existing = wt; break; } if (is_worktree_being_bisected(wt, target)) { existing = wt; break; } } refs = get_worktree_ref_store(wt); symref_target = refs_resolve_ref_unsafe(refs, symref, 0, NULL, &flags); if ((flags & REF_ISSYMREF) && symref_target && !strcmp(symref_target, target)) { existing = wt; break; } } return existing; }
const char *resolve_ref_unsafe(const char *refname, int resolve_flags, unsigned char *sha1, int *flags) { return refs_resolve_ref_unsafe(get_main_ref_store(), refname, resolve_flags, sha1, flags); }