diff --git a/include/git2/odb.h b/include/git2/odb.h index f2633d11c..3854fa6f6 100644 --- a/include/git2/odb.h +++ b/include/git2/odb.h @@ -88,6 +88,23 @@ GIT_EXTERN(int) git_odb_add_backend(git_odb *odb, git_odb_backend *backend, int */ GIT_EXTERN(int) git_odb_add_alternate(git_odb *odb, git_odb_backend *backend, int priority); +/** + * Add an on-disk alternate to an existing Object DB. + * + * Note that the added path must point to an `objects`, not + * to a full repository, to use it as an alternate store. + * + * Alternate backends are always checked for objects *after* + * all the main backends have been exhausted. + * + * Writing is disabled on alternate backends. + * + * @param odb database to add the backend to + * @param path path to the objects folder for the alternate + * @return 0 on success; error code otherwise + */ +GIT_EXTERN(int) git_odb_add_disk_alternate(git_odb *odb, const char *path); + /** * Close an open object database. * diff --git a/src/odb.c b/src/odb.c index e622eb076..63b68284a 100644 --- a/src/odb.c +++ b/src/odb.c @@ -470,6 +470,11 @@ static int load_alternates(git_odb *odb, const char *objects_dir, int alternate_ return result; } +int git_odb_add_disk_alternate(git_odb *odb, const char *path) +{ + return add_default_backends(odb, path, 1, 0); +} + int git_odb_open(git_odb **out, const char *objects_dir) { git_odb *db; @@ -481,8 +486,7 @@ int git_odb_open(git_odb **out, const char *objects_dir) if (git_odb_new(&db) < 0) return -1; - if (add_default_backends(db, objects_dir, 0, 0) < 0) - { + if (add_default_backends(db, objects_dir, 0, 0) < 0) { git_odb_free(db); return -1; }