mirror of
https://git.proxmox.com/git/libgit2
synced 2025-08-05 16:06:18 +00:00
refs: implement function to read references from file
Currently, we only provide functions to read references directly from a repository's reference store via e.g. `git_reference_lookup`. But in some cases, we may want to read files not connected to the current repository, e.g. when looking up HEAD of connected work trees. This commit implements `git_reference__read_head`, which will read out and allocate a reference at an arbitrary path.
This commit is contained in:
parent
602972560a
commit
5b65ac2578
34
src/refs.c
34
src/refs.c
@ -249,6 +249,40 @@ int git_reference_lookup_resolved(
|
||||
return 0;
|
||||
}
|
||||
|
||||
int git_reference__read_head(
|
||||
git_reference **out,
|
||||
git_repository *repo,
|
||||
const char *path)
|
||||
{
|
||||
git_buf reference = GIT_BUF_INIT;
|
||||
char *name = NULL;
|
||||
int error;
|
||||
|
||||
if ((error = git_futils_readbuffer(&reference, path)) < 0)
|
||||
goto out;
|
||||
git_buf_rtrim(&reference);
|
||||
|
||||
if (git__strncmp(reference.ptr, GIT_SYMREF, strlen(GIT_SYMREF)) == 0) {
|
||||
git_buf_consume(&reference, reference.ptr + strlen(GIT_SYMREF));
|
||||
|
||||
name = git_path_basename(path);
|
||||
|
||||
if ((*out = git_reference__alloc_symbolic(name, reference.ptr)) == NULL) {
|
||||
error = -1;
|
||||
goto out;
|
||||
}
|
||||
} else {
|
||||
if ((error = git_reference_lookup(out, repo, reference.ptr)) < 0)
|
||||
goto out;
|
||||
}
|
||||
|
||||
out:
|
||||
free(name);
|
||||
git_buf_clear(&reference);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
int git_reference_dwim(git_reference **out, git_repository *repo, const char *refname)
|
||||
{
|
||||
int error = 0, i;
|
||||
|
14
src/refs.h
14
src/refs.h
@ -107,6 +107,20 @@ int git_reference_lookup_resolved(
|
||||
const char *name,
|
||||
int max_deref);
|
||||
|
||||
/**
|
||||
* Read reference from a file.
|
||||
*
|
||||
* This function will read in the file at `path`. If it is a
|
||||
* symref, it will return a new unresolved symbolic reference
|
||||
* with the given name pointing to the reference pointed to by
|
||||
* the file. If it is not a symbolic reference, it will return
|
||||
* the resolved reference.
|
||||
*/
|
||||
int git_reference__read_head(
|
||||
git_reference **out,
|
||||
git_repository *repo,
|
||||
const char *path);
|
||||
|
||||
int git_reference__log_signature(git_signature **out, git_repository *repo);
|
||||
|
||||
/** Update a reference after a commit. */
|
||||
|
Loading…
Reference in New Issue
Block a user