mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-02 16:34:37 +00:00
333 lines
11 KiB
C
333 lines
11 KiB
C
/*
|
|
* This file is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License, version 2,
|
|
* as published by the Free Software Foundation.
|
|
*
|
|
* In addition to the permissions in the GNU General Public License,
|
|
* the authors give you unlimited permission to link the compiled
|
|
* version of this file into combinations with other programs,
|
|
* and to distribute those combinations without any restriction
|
|
* coming from the use of this file. (The General Public License
|
|
* restrictions do apply in other respects; for example, they cover
|
|
* modification of the file, and distribution when not linked into
|
|
* a combined executable.)
|
|
*
|
|
* This file is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; see the file COPYING. If not, write to
|
|
* the Free Software Foundation, 51 Franklin Street, Fifth Floor,
|
|
* Boston, MA 02110-1301, USA.
|
|
*/
|
|
#ifndef INCLUDE_git_repository_h__
|
|
#define INCLUDE_git_repository_h__
|
|
|
|
#include "common.h"
|
|
#include "types.h"
|
|
#include "oid.h"
|
|
|
|
/**
|
|
* @file git2/repository.h
|
|
* @brief Git repository management routines
|
|
* @defgroup git_repository Git repository management routines
|
|
* @ingroup Git
|
|
* @{
|
|
*/
|
|
GIT_BEGIN_DECL
|
|
|
|
/**
|
|
* Open a git repository.
|
|
*
|
|
* The 'path' argument must point to an existing git repository
|
|
* folder, e.g.
|
|
*
|
|
* /path/to/my_repo/.git/ (normal repository)
|
|
* objects/
|
|
* index
|
|
* HEAD
|
|
*
|
|
* /path/to/bare_repo/ (bare repository)
|
|
* objects/
|
|
* index
|
|
* HEAD
|
|
*
|
|
* The method will automatically detect if 'path' is a normal
|
|
* or bare repository or fail is 'path' is neither.
|
|
*
|
|
* @param repository pointer to the repo which will be opened
|
|
* @param path the path to the repository
|
|
* @return 0 on success; error code otherwise
|
|
*/
|
|
GIT_EXTERN(int) git_repository_open(git_repository **repository, const char *path);
|
|
|
|
|
|
/**
|
|
* Open a git repository by manually specifying all its paths
|
|
*
|
|
* @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 git_object_directory The full path to the ODB folder.
|
|
* the folder where all the loose and packed objects are stored
|
|
* Equivalent to $GIT_OBJECT_DIRECTORY.
|
|
* If NULL, "$GIT_DIR/objects/" is assumed.
|
|
*
|
|
* @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_open2(git_repository **repository,
|
|
const char *git_dir,
|
|
const char *git_object_directory,
|
|
const char *git_index_file,
|
|
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);
|
|
|
|
/**
|
|
* Look for a git repository and copy its path in the given buffer. The lookup start
|
|
* from base_path and walk across parent directories if nothing has been found. The
|
|
* lookup ends when the first repository is found, or when reaching a directory
|
|
* referenced in ceiling_dirs or when the filesystem changes (in case across_fs
|
|
* is true).
|
|
*
|
|
* The method will automatically detect if the repository is bare (if there is
|
|
* a repository).
|
|
*
|
|
* @param repository_path The user allocated buffer which will contain the found path.
|
|
*
|
|
* @param size repository_path size
|
|
*
|
|
* @param start_path The base path where the lookup starts.
|
|
*
|
|
* @param across_fs If true, then the lookup will not stop when a filesystem device change
|
|
* is detected while exploring parent directories.
|
|
*
|
|
* @param ceiling_dirs A GIT_PATH_LIST_SEPARATOR separated list of absolute symbolic link
|
|
* free paths. The lookup will stop when any of this paths is reached. Note that the
|
|
* lookup always performs on start_path no matter start_path appears in ceiling_dirs
|
|
* ceiling_dirs might be NULL (which is equivalent to an empty string)
|
|
*
|
|
* @return 0 on success; error code otherwise
|
|
*/
|
|
GIT_EXTERN(int) git_repository_discover(char *repository_path, size_t size, const char *start_path, int across_fs, const char *ceiling_dirs);
|
|
|
|
/**
|
|
* Get the object database behind a Git repository
|
|
*
|
|
* @param repo a repository object
|
|
* @return a pointer to the object db
|
|
*/
|
|
GIT_EXTERN(git_odb *) git_repository_database(git_repository *repo);
|
|
|
|
/**
|
|
* Open the Index file of a Git repository
|
|
*
|
|
* This returns a new and unique `git_index` object representing the
|
|
* active index for the repository.
|
|
*
|
|
* This method may be called more than once (e.g. on different threads).
|
|
*
|
|
* Each returned `git_index` object is independent and suffers no race
|
|
* conditions: synchronization is done at the FS level.
|
|
*
|
|
* Each returned `git_index` object must be manually freed by the user,
|
|
* using `git_index_free`.
|
|
*
|
|
* @param index Pointer where to store the index
|
|
* @param repo a repository object
|
|
* @return 0 on success; error code if the index could not be opened
|
|
*/
|
|
GIT_EXTERN(int) git_repository_index(git_index **index, git_repository *repo);
|
|
|
|
/**
|
|
* Free a previously allocated repository
|
|
*
|
|
* Note that after a repository is free'd, all the objects it has spawned
|
|
* will still exist until they are manually closed by the user
|
|
* with `git_object_close`, but accessing any of the attributes of
|
|
* an object without a backing repository will result in undefined
|
|
* behavior
|
|
*
|
|
* @param repo repository handle to close. If NULL nothing occurs.
|
|
*/
|
|
GIT_EXTERN(void) git_repository_free(git_repository *repo);
|
|
|
|
/**
|
|
* Creates a new Git repository in the given folder.
|
|
*
|
|
* TODO:
|
|
* - Reinit the repository
|
|
* - Create config files
|
|
*
|
|
* @param repo_out pointer to the repo which will be created or reinitialized
|
|
* @param path the path to the repository
|
|
* @param is_bare if true, a Git repository without a working directory is created
|
|
* at the pointed path. If false, provided path will be considered as the working
|
|
* directory into which the .git directory will be created.
|
|
*
|
|
* @return 0 on success; error code otherwise
|
|
*/
|
|
GIT_EXTERN(int) git_repository_init(git_repository **repo_out, const char *path, unsigned is_bare);
|
|
|
|
/**
|
|
* Check if a repository's HEAD is detached
|
|
*
|
|
* A repository's HEAD is detached when it points directly to a commit
|
|
* instead of a branch.
|
|
*
|
|
* @param repo Repo to test
|
|
* @return 1 if HEAD is detached, 0 if i'ts not; error code if there
|
|
* was an error.
|
|
*/
|
|
GIT_EXTERN(int) git_repository_head_detached(git_repository *repo);
|
|
|
|
/**
|
|
* Check if the current branch is an orphan
|
|
*
|
|
* An orphan branch is one named from HEAD but which doesn't exist in
|
|
* the refs namespace, because it doesn't have any commit to point to.
|
|
*
|
|
* @param repo Repo to test
|
|
* @return 1 if the current branch is an orphan, 0 if it's not; error
|
|
* code if therewas an error
|
|
*/
|
|
GIT_EXTERN(int) git_repository_head_orphan(git_repository *repo);
|
|
|
|
/**
|
|
* Check if a repository is empty
|
|
*
|
|
* An empty repository has just been initialized and contains
|
|
* no commits.
|
|
*
|
|
* @param repo Repo to test
|
|
* @return 1 if the repository is empty, 0 if it isn't, error code
|
|
* if the repository is corrupted
|
|
*/
|
|
GIT_EXTERN(int) git_repository_is_empty(git_repository *repo);
|
|
|
|
/**
|
|
* Internal path identifiers for a repository
|
|
*/
|
|
typedef enum {
|
|
GIT_REPO_PATH,
|
|
GIT_REPO_PATH_INDEX,
|
|
GIT_REPO_PATH_ODB,
|
|
GIT_REPO_PATH_WORKDIR
|
|
} git_repository_pathid;
|
|
|
|
/**
|
|
* Get one of the paths to the repository
|
|
*
|
|
* Possible values for `id`:
|
|
*
|
|
* GIT_REPO_PATH: return the path to the repository
|
|
* GIT_REPO_PATH_INDEX: return the path to the index
|
|
* GIT_REPO_PATH_ODB: return the path to the ODB
|
|
* GIT_REPO_PATH_WORKDIR: return the path to the working
|
|
* directory
|
|
*
|
|
* @param repo a repository object
|
|
* @param id The ID of the path to return
|
|
* @return absolute path of the requested id
|
|
*/
|
|
GIT_EXTERN(const char *) git_repository_path(git_repository *repo, git_repository_pathid id);
|
|
|
|
/**
|
|
* Check if a repository is bare
|
|
*
|
|
* @param repo Repo to test
|
|
* @return 1 if the repository is empty, 0 otherwise.
|
|
*/
|
|
GIT_EXTERN(int) git_repository_is_bare(git_repository *repo);
|
|
|
|
/**
|
|
* Retrieve the relevant configuration for a repository
|
|
*
|
|
* By default he returned `git_config` instance contains a single
|
|
* configuration file, the `.gitconfig' file that may be found
|
|
* inside the repository.
|
|
*
|
|
* If the `user_config_path` variable is not NULL, the given config
|
|
* file will be also included in the configuration set. On most UNIX
|
|
* systems, this file may be found on `$HOME/.gitconfig`.
|
|
*
|
|
* If the `system_config_path` variable is not NULL, the given config
|
|
* file will be also included in the configuration set. On most UNIX
|
|
* systems, this file may be found on `$PREFIX/etc/gitconfig`.
|
|
*
|
|
* The resulting `git_config` instance will query the files in the following
|
|
* order:
|
|
*
|
|
* - Repository configuration file
|
|
* - User configuration file
|
|
* - System configuration file
|
|
*
|
|
* The method will fail if any of the passed config files cannot be
|
|
* found or accessed.
|
|
*
|
|
* The returned `git_config` instance is owned by the caller and must
|
|
* be manually free'd once it's no longer on use.
|
|
*
|
|
* @param out the repository's configuration
|
|
* @param repo the repository for which to get the config
|
|
* @param user_config_path Path to the user config file
|
|
* @param system_config_path Path to the system-wide config file
|
|
*/
|
|
GIT_EXTERN(int) git_repository_config(git_config **out,
|
|
git_repository *repo,
|
|
const char *user_config_path,
|
|
const char *system_config_path);
|
|
|
|
/** @} */
|
|
GIT_END_DECL
|
|
#endif
|