mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-09 15:00:04 +00:00
Add new Repository initialization method
Lets the user specify the ODB that will be used by the repository manually. Signed-off-by: Vicent Marti <tanoku@gmail.com>
This commit is contained in:
parent
c5846fbf24
commit
ec3c7a16c2
@ -97,6 +97,42 @@ GIT_EXTERN(int) git_repository_open2(git_repository **repository,
|
|||||||
const char *git_work_tree);
|
const char *git_work_tree);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open a git repository by manually specifying its paths and
|
||||||
|
* the object database it will use.
|
||||||
|
*
|
||||||
|
* @param repository pointer to the repo which will be opened
|
||||||
|
*
|
||||||
|
* @param git_dir The full path to the repository folder
|
||||||
|
* e.g. a '.git' folder for live repos, any folder for bare
|
||||||
|
* Equivalent to $GIT_DIR.
|
||||||
|
* Cannot be NULL.
|
||||||
|
*
|
||||||
|
* @param object_database A pointer to a git_odb created & initialized
|
||||||
|
* by the user (e.g. with custom backends). This object database
|
||||||
|
* will be owned by the repository and will be automatically free'd.
|
||||||
|
* It should not be manually free'd by the user, or this
|
||||||
|
* git_repository object will become invalid.
|
||||||
|
*
|
||||||
|
* @param git_index_file The full path to the index (dircache) file
|
||||||
|
* Equivalent to $GIT_INDEX_FILE.
|
||||||
|
* If NULL, "$GIT_DIR/index" is assumed.
|
||||||
|
*
|
||||||
|
* @param git_work_tree The full path to the working tree of the repository,
|
||||||
|
* if the repository is not bare.
|
||||||
|
* Equivalent to $GIT_WORK_TREE.
|
||||||
|
* If NULL, the repository is assumed to be bare.
|
||||||
|
*
|
||||||
|
* @return 0 on success; error code otherwise
|
||||||
|
*/
|
||||||
|
|
||||||
|
GIT_EXTERN(int) git_repository_open3(git_repository **repository,
|
||||||
|
const char *git_dir,
|
||||||
|
git_odb *object_database,
|
||||||
|
const char *git_index_file,
|
||||||
|
const char *git_work_tree);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lookup a reference to one of the objects in the repostory.
|
* Lookup a reference to one of the objects in the repostory.
|
||||||
*
|
*
|
||||||
|
@ -277,8 +277,8 @@ int git_odb_read(git_rawobj *out, git_odb *db, const git_oid *id)
|
|||||||
for (i = 0; i < db->backends.length && error < 0; ++i) {
|
for (i = 0; i < db->backends.length && error < 0; ++i) {
|
||||||
git_odb_backend *b = git_vector_get(&db->backends, i);
|
git_odb_backend *b = git_vector_get(&db->backends, i);
|
||||||
|
|
||||||
assert(b->read != NULL);
|
if (b->read != NULL)
|
||||||
error = b->read(out, b, id);
|
error = b->read(out, b, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
|
@ -225,6 +225,49 @@ static git_repository *repository_alloc()
|
|||||||
return repo;
|
return repo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int init_odb(git_repository *repo)
|
||||||
|
{
|
||||||
|
return git_odb_open(&repo->db, repo->path_odb);
|
||||||
|
}
|
||||||
|
|
||||||
|
int git_repository_open3(git_repository **repo_out,
|
||||||
|
const char *git_dir,
|
||||||
|
git_odb *object_database,
|
||||||
|
const char *git_index_file,
|
||||||
|
const char *git_work_tree)
|
||||||
|
{
|
||||||
|
git_repository *repo;
|
||||||
|
int error = GIT_SUCCESS;
|
||||||
|
|
||||||
|
assert(repo_out);
|
||||||
|
|
||||||
|
if (object_database == NULL)
|
||||||
|
return GIT_ERROR;
|
||||||
|
|
||||||
|
repo = repository_alloc();
|
||||||
|
if (repo == NULL)
|
||||||
|
return GIT_ENOMEM;
|
||||||
|
|
||||||
|
error = assign_repository_DIRs(repo,
|
||||||
|
git_dir,
|
||||||
|
NULL,
|
||||||
|
git_index_file,
|
||||||
|
git_work_tree);
|
||||||
|
|
||||||
|
if (error < GIT_SUCCESS)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
repo->db = object_database;
|
||||||
|
|
||||||
|
*repo_out = repo;
|
||||||
|
return GIT_SUCCESS;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
git_repository_free(repo);
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int git_repository_open2(git_repository **repo_out,
|
int git_repository_open2(git_repository **repo_out,
|
||||||
const char *git_dir,
|
const char *git_dir,
|
||||||
const char *git_object_directory,
|
const char *git_object_directory,
|
||||||
@ -249,7 +292,7 @@ int git_repository_open2(git_repository **repo_out,
|
|||||||
if (error < GIT_SUCCESS)
|
if (error < GIT_SUCCESS)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
error = git_odb_open(&repo->db, repo->path_odb);
|
error = init_odb(repo);
|
||||||
if (error < GIT_SUCCESS)
|
if (error < GIT_SUCCESS)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -276,8 +319,7 @@ int git_repository_open(git_repository **repo_out, const char *path)
|
|||||||
if (error < GIT_SUCCESS)
|
if (error < GIT_SUCCESS)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
error = init_odb(repo);
|
||||||
error = git_odb_open(&repo->db, repo->path_odb);
|
|
||||||
if (error < GIT_SUCCESS)
|
if (error < GIT_SUCCESS)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user