/* * Copyright (C) the libgit2 contributors. All rights reserved. * * This file is part of libgit2, distributed under the GNU GPL v2 with * a Linking Exception. For full terms see the included COPYING file. */ #ifndef INCLUDE_git_remote_h__ #define INCLUDE_git_remote_h__ #include "common.h" #include "repository.h" #include "refspec.h" #include "net.h" #include "indexer.h" #include "strarray.h" #include "transport.h" #include "pack.h" #include "proxy.h" /** * @file git2/remote.h * @brief Git remote management functions * @defgroup git_remote remote management functions * @ingroup Git * @{ */ GIT_BEGIN_DECL /** * Add a remote with the default fetch refspec to the repository's configuration. * * @param out the resulting remote * @param repo the repository in which to create the remote * @param name the remote's name * @param url the remote's url * @return 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code */ GIT_EXTERN(int) git_remote_create( git_remote **out, git_repository *repo, const char *name, const char *url); /** * Remote redirection settings; whether redirects to another host * are permitted. By default, git will follow a redirect on the * initial request (`/info/refs`), but not subsequent requests. */ typedef enum { /** * Do not follow any off-site redirects at any stage of * the fetch or push. */ GIT_REMOTE_REDIRECT_NONE = (1 << 0), /** * Allow off-site redirects only upon the initial request. * This is the default. */ GIT_REMOTE_REDIRECT_INITIAL = (1 << 1), /** * Allow redirects at any stage in the fetch or push. */ GIT_REMOTE_REDIRECT_ALL = (1 << 2) } git_remote_redirect_t; /** * Remote creation options flags */ typedef enum { /** Ignore the repository apply.insteadOf configuration */ GIT_REMOTE_CREATE_SKIP_INSTEADOF = (1 << 0), /** Don't build a fetchspec from the name if none is set */ GIT_REMOTE_CREATE_SKIP_DEFAULT_FETCHSPEC = (1 << 1) } git_remote_create_flags; /** * How to handle reference updates. */ typedef enum { /* Write the fetch results to FETCH_HEAD. */ GIT_REMOTE_UPDATE_FETCHHEAD = (1 << 0), /* Report unchanged tips in the update_tips callback. */ GIT_REMOTE_UPDATE_REPORT_UNCHANGED = (1 << 1) } git_remote_update_flags; /** * Remote creation options structure * * Initialize with `GIT_REMOTE_CREATE_OPTIONS_INIT`. Alternatively, you can * use `git_remote_create_options_init`. * */ typedef struct git_remote_create_options { unsigned int version; /** * The repository that should own the remote. * Setting this to NULL results in a detached remote. */ git_repository *repository; /** * The remote's name. * Setting this to NULL results in an in-memory/anonymous remote. */ const char *name; /** The fetchspec the remote should use. */ const char *fetchspec; /** Additional flags for the remote. See git_remote_create_flags. */ unsigned int flags; } git_remote_create_options; #define GIT_REMOTE_CREATE_OPTIONS_VERSION 1 #define GIT_REMOTE_CREATE_OPTIONS_INIT {GIT_REMOTE_CREATE_OPTIONS_VERSION} /** * Initialize git_remote_create_options structure * * Initializes a `git_remote_create_options` with default values. Equivalent to * creating an instance with `GIT_REMOTE_CREATE_OPTIONS_INIT`. * * @param opts The `git_remote_create_options` struct to initialize. * @param version The struct version; pass `GIT_REMOTE_CREATE_OPTIONS_VERSION`. * @return Zero on success; -1 on failure. */ GIT_EXTERN(int) git_remote_create_options_init( git_remote_create_options *opts, unsigned int version); /** * Create a remote, with options. * * This function allows more fine-grained control over the remote creation. * * Passing NULL as the opts argument will result in a detached remote. * * @param out the resulting remote * @param url the remote's url * @param opts the remote creation options * @return 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code */ GIT_EXTERN(int) git_remote_create_with_opts( git_remote **out, const char *url, const git_remote_create_options *opts); /** * Add a remote with the provided fetch refspec (or default if NULL) to the repository's * configuration. * * @param out the resulting remote * @param repo the repository in which to create the remote * @param name the remote's name * @param url the remote's url * @param fetch the remote fetch value * @return 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code */ GIT_EXTERN(int) git_remote_create_with_fetchspec( git_remote **out, git_repository *repo, const char *name, const char *url, const char *fetch); /** * Create an anonymous remote * * Create a remote with the given url in-memory. You can use this when * you have a URL instead of a remote's name. * * @param out pointer to the new remote objects * @param repo the associated repository * @param url the remote repository's URL * @return 0 or an error code */ GIT_EXTERN(int) git_remote_create_anonymous( git_remote **out, git_repository *repo, const char *url); /** * Create a remote without a connected local repo * * Create a remote with the given url in-memory. You can use this when * you have a URL instead of a remote's name. * * Contrasted with git_remote_create_anonymous, a detached remote * will not consider any repo configuration values (such as insteadof url * substitutions). * * @param out pointer to the new remote objects * @param url the remote repository's URL * @return 0 or an error code */ GIT_EXTERN(int) git_remote_create_detached( git_remote **out, const char *url); /** * Get the information for a particular remote * * The name will be checked for validity. * See `git_tag_create()` for rules about valid names. * * @param out pointer to the new remote object * @param repo the associated repository * @param name the remote's name * @return 0, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code */ GIT_EXTERN(int) git_remote_lookup(git_remote **out, git_repository *repo, const char *name); /** * Create a copy of an existing remote. All internal strings are also * duplicated. Callbacks are not duplicated. * * Call `git_remote_free` to free the data. * * @param dest pointer where to store the copy * @param source object to copy * @return 0 or an error code */ GIT_EXTERN(int) git_remote_dup(git_remote **dest, git_remote *source); /** * Get the remote's repository * * @param remote the remote * @return a pointer to the repository */ GIT_EXTERN(git_repository *) git_remote_owner(const git_remote *remote); /** * Get the remote's name * * @param remote the remote * @return a pointer to the name or NULL for in-memory remotes */ GIT_EXTERN(const char *) git_remote_name(const git_remote *remote); /** * Get the remote's url * * If url.*.insteadOf has been configured for this URL, it will * return the modified URL. If `git_remote_set_instance_pushurl` * has been called for this remote, then that URL will be returned. * * @param remote the remote * @return a pointer to the url */ GIT_EXTERN(const char *) git_remote_url(const git_remote *remote); /** * Get the remote's url for pushing. * * If url.*.pushInsteadOf has been configured for this URL, it * will return the modified URL. If `git_remote_set_instance_pushurl` * has been called for this remote, then that URL will be returned. * * @param remote the remote * @return a pointer to the url or NULL if no special url for pushing is set */ GIT_EXTERN(const char *) git_remote_pushurl(const git_remote *remote); /** * Set the remote's url in the configuration * * Remote objects already in memory will not be affected. This assumes * the common case of a single-url remote and will otherwise return an error. * * @param repo the repository in which to perform the change * @param remote the remote's name * @param url the url to set * @return 0 or an error value */ GIT_EXTERN(int) git_remote_set_url(git_repository *repo, const char *remote, const char *url); /** * Set the remote's url for pushing in the configuration. * * Remote objects already in memory will not be affected. This assumes * the common case of a single-url remote and will otherwise return an error. * * * @param repo the repository in which to perform the change * @param remote the remote's name * @param url the url to set * @return 0, or an error code */ GIT_EXTERN(int) git_remote_set_pushurl(git_repository *repo, const char *remote, const char *url); /** * Set the url for this particular url instance. The URL in the * configuration will be ignored, and will not be changed. * * @param remote the remote's name * @param url the url to set * @return 0 or an error value */ GIT_EXTERN(int) git_remote_set_instance_url(git_remote *remote, const char *url); /** * Set the push url for this particular url instance. The URL in the * configuration will be ignored, and will not be changed. * * @param remote the remote's name * @param url the url to set * @return 0 or an error value */ GIT_EXTERN(int) git_remote_set_instance_pushurl(git_remote *remote, const char *url); /** * Add a fetch refspec to the remote's configuration * * Add the given refspec to the fetch list in the configuration. No * loaded remote instances will be affected. * * @param repo the repository in which to change the configuration * @param remote the name of the remote to change * @param refspec the new fetch refspec * @return 0, GIT_EINVALIDSPEC if refspec is invalid or an error value */ GIT_EXTERN(int) git_remote_add_fetch(git_repository *repo, const char *remote, const char *refspec); /** * Get the remote's list of fetch refspecs * * The memory is owned by the user and should be freed with * `git_strarray_free`. * * @param array pointer to the array in which to store the strings * @param remote the remote to query * @return 0 or an error code. */ GIT_EXTERN(int) git_remote_get_fetch_refspecs(git_strarray *array, const git_remote *remote); /** * Add a push refspec to the remote's configuration * * Add the given refspec to the push list in the configuration. No * loaded remote instances will be affected. * * @param repo the repository in which to change the configuration * @param remote the name of the remote to change * @param refspec the new push refspec * @return 0, GIT_EINVALIDSPEC if refspec is invalid or an error value */ GIT_EXTERN(int) git_remote_add_push(git_repository *repo, const char *remote, const char *refspec); /** * Get the remote's list of push refspecs * * The memory is owned by the user and should be freed with * `git_strarray_free`. * * @param array pointer to the array in which to store the strings * @param remote the remote to query * @return 0 or an error code. */ GIT_EXTERN(int) git_remote_get_push_refspecs(git_strarray *array, const git_remote *remote); /** * Get the number of refspecs for a remote * * @param remote the remote * @return the amount of refspecs configured in this remote */ GIT_EXTERN(size_t) git_remote_refspec_count(const git_remote *remote); /** * Get a refspec from the remote * * @param remote the remote to query * @param n the refspec to get * @return the nth refspec */ GIT_EXTERN(const git_refspec *)git_remote_get_refspec(const git_remote *remote, size_t n); /** * Get the remote repository's reference advertisement list * * Get the list of references with which the server responds to a new * connection. * * The remote (or more exactly its transport) must have connected to * the remote repository. This list is available as soon as the * connection to the remote is initiated and it remains available * after disconnecting. * * The memory belongs to the remote. The pointer will be valid as long * as a new connection is not initiated, but it is recommended that * you make a copy in order to make use of the data. * * @param out pointer to the array * @param size the number of remote heads * @param remote the remote * @return 0 on success, or an error code */ GIT_EXTERN(int) git_remote_ls(const git_remote_head ***out, size_t *size, git_remote *remote); /** * Check whether the remote is connected * * Check whether the remote's underlying transport is connected to the * remote host. * * @param remote the remote * @return 1 if it's connected, 0 otherwise. */ GIT_EXTERN(int) git_remote_connected(const git_remote *remote); /** * Cancel the operation * * At certain points in its operation, the network code checks whether * the operation has been cancelled and if so stops the operation. * * @param remote the remote * @return 0 on success, or an error code */ GIT_EXTERN(int) git_remote_stop(git_remote *remote); /** * Disconnect from the remote * * Close the connection to the remote. * * @param remote the remote to disconnect from * @return 0 on success, or an error code */ GIT_EXTERN(int) git_remote_disconnect(git_remote *remote); /** * Free the memory associated with a remote * * This also disconnects from the remote, if the connection * has not been closed yet (using git_remote_disconnect). * * @param remote the remote to free */ GIT_EXTERN(void) git_remote_free(git_remote *remote); /** * Get a list of the configured remotes for a repo * * The string array must be freed by the user. * * @param out a string array which receives the names of the remotes * @param repo the repository to query * @return 0 or an error code */ GIT_EXTERN(int) git_remote_list(git_strarray *out, git_repository *repo); /** * Argument to the completion callback which tells it which operation * finished. */ typedef enum git_remote_completion_t { GIT_REMOTE_COMPLETION_DOWNLOAD, GIT_REMOTE_COMPLETION_INDEXING, GIT_REMOTE_COMPLETION_ERROR } git_remote_completion_t; /** Push network progress notification function */ typedef int GIT_CALLBACK(git_push_transfer_progress_cb)( unsigned int current, unsigned int total, size_t bytes, void *payload); /** * Represents an update which will be performed on the remote during push */ typedef struct { /** * The source name of the reference */ char *src_refname; /** * The name of the reference to update on the server */ char *dst_refname; /** * The current target of the reference */ git_oid src; /** * The new target for the reference */ git_oid dst; } git_push_update; /** * Callback used to inform of upcoming updates. * * @param updates an array containing the updates which will be sent * as commands to the destination. * @param len number of elements in `updates` * @param payload Payload provided by the caller */ typedef int GIT_CALLBACK(git_push_negotiation)(const git_push_update **updates, size_t len, void *payload); /** * Callback used to inform of the update status from the remote. * * Called for each updated reference on push. If `status` is * not `NULL`, the update was rejected by the remote server * and `status` contains the reason given. * * @param refname refname specifying to the remote ref * @param status status message sent from the remote * @param data data provided by the caller * @return 0 on success, otherwise an error */ typedef int GIT_CALLBACK(git_push_update_reference_cb)(const char *refname, const char *status, void *data); #ifndef GIT_DEPRECATE_HARD /** * Callback to resolve URLs before connecting to remote * * If you return GIT_PASSTHROUGH, you don't need to write anything to * url_resolved. * * @param url_resolved The buffer to write the resolved URL to * @param url The URL to resolve * @param direction GIT_DIRECTION_FETCH or GIT_DIRECTION_PUSH * @param payload Payload provided by the caller * @return 0 on success, GIT_PASSTHROUGH or an error * @deprecated Use `git_remote_set_instance_url` */ typedef int GIT_CALLBACK(git_url_resolve_cb)(git_buf *url_resolved, const char *url, int direction, void *payload); #endif /** * Callback invoked immediately before we attempt to connect to the * given url. Callers may change the URL before the connection by * calling `git_remote_set_instance_url` in the callback. * * @param remote The remote to be connected * @param direction GIT_DIRECTION_FETCH or GIT_DIRECTION_PUSH * @param payload Payload provided by the caller * @return 0 on success, or an error */ typedef int GIT_CALLBACK(git_remote_ready_cb)(git_remote *remote, int direction, void *payload); /** * The callback settings structure * * Set the callbacks to be called by the remote when informing the user * about the progress of the network operations. */ struct git_remote_callbacks { unsigned int version; /**< The version */ /** * Textual progress from the remote. Text send over the * progress side-band will be passed to this function (this is * the 'counting objects' output). */ git_transport_message_cb sideband_progress; /** * Completion is called when different parts of the download * process are done (currently unused). */ int GIT_CALLBACK(completion)(git_remote_completion_t type, void *data); /** * This will be called if the remote host requires * authentication in order to connect to it. * * Returning GIT_PASSTHROUGH will make libgit2 behave as * though this field isn't set. */ git_credential_acquire_cb credentials; /** * If cert verification fails, this will be called to let the * user make the final decision of whether to allow the * connection to proceed. Returns 0 to allow the connection * or a negative value to indicate an error. */ git_transport_certificate_check_cb certificate_check; /** * During the download of new data, this will be regularly * called with the current count of progress done by the * indexer. */ git_indexer_progress_cb transfer_progress; /** * Each time a reference is updated locally, this function * will be called with information about it. */ int GIT_CALLBACK(update_tips)(const char *refname, const git_oid *a, const git_oid *b, void *data); /** * Function to call with progress information during pack * building. Be aware that this is called inline with pack * building operations, so performance may be affected. */ git_packbuilder_progress pack_progress; /** * Function to call with progress information during the * upload portion of a push. Be aware that this is called * inline with pack building operations, so performance may be * affected. */ git_push_transfer_progress_cb push_transfer_progress; /** * See documentation of git_push_update_reference_cb */ git_push_update_reference_cb push_update_reference; /** * Called once between the negotiation step and the upload. It * provides information about what updates will be performed. */ git_push_negotiation push_negotiation; /** * Create the transport to use for this operation. Leave NULL * to auto-detect. */ git_transport_cb transport; /** * Callback when the remote is ready to connect. */ git_remote_ready_cb remote_ready; /** * This will be passed to each of the callbacks in this struct * as the last parameter. */ void *payload; #ifdef GIT_DEPRECATE_HARD void *reserved; #else /** * Resolve URL before connecting to remote. * The returned URL will be used to connect to the remote instead. * * This callback is deprecated; users should use * git_remote_ready_cb and configure the instance URL instead. */ git_url_resolve_cb resolve_url; #endif }; #define GIT_REMOTE_CALLBACKS_VERSION 1 #define GIT_REMOTE_CALLBACKS_INIT {GIT_REMOTE_CALLBACKS_VERSION} /** * Initializes a `git_remote_callbacks` with default values. Equivalent to * creating an instance with GIT_REMOTE_CALLBACKS_INIT. * * @param opts the `git_remote_callbacks` struct to initialize * @param version Version of struct; pass `GIT_REMOTE_CALLBACKS_VERSION` * @return Zero on success; -1 on failure. */ GIT_EXTERN(int) git_remote_init_callbacks( git_remote_callbacks *opts, unsigned int version); /** Acceptable prune settings when fetching */ typedef enum { /** * Use the setting from the configuration */ GIT_FETCH_PRUNE_UNSPECIFIED, /** * Force pruning on */ GIT_FETCH_PRUNE, /** * Force pruning off */ GIT_FETCH_NO_PRUNE } git_fetch_prune_t; /** * Automatic tag following option * * Lets us select the --tags option to use. */ typedef enum { /** * Use the setting from the configuration. */ GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED = 0, /** * Ask the server for tags pointing to objects we're already * downloading. */ GIT_REMOTE_DOWNLOAD_TAGS_AUTO, /** * Don't ask for any tags beyond the refspecs. */ GIT_REMOTE_DOWNLOAD_TAGS_NONE, /** * Ask for the all the tags. */ GIT_REMOTE_DOWNLOAD_TAGS_ALL } git_remote_autotag_option_t; /** Constants for fetch depth (shallowness of fetch). */ typedef enum { /** The fetch is "full" (not shallow). This is the default. */ GIT_FETCH_DEPTH_FULL = 0, /** The fetch should "unshallow" and fetch missing data. */ GIT_FETCH_DEPTH_UNSHALLOW = 2147483647 } git_fetch_depth_t; /** * Fetch options structure. * * Zero out for defaults. Initialize with `GIT_FETCH_OPTIONS_INIT` macro to * correctly set the `version` field. E.g. * * git_fetch_options opts = GIT_FETCH_OPTIONS_INIT; */ typedef struct { int version; /** * Callbacks to use for this fetch operation */ git_remote_callbacks callbacks; /** * Whether to perform a prune after the fetch */ git_fetch_prune_t prune; /** * How to handle reference updates; see `git_remote_update_flags`. */ unsigned int update_fetchhead; /** * Determines how to behave regarding tags on the remote, such * as auto-downloading tags for objects we're downloading or * downloading all of them. * * The default is to auto-follow tags. */ git_remote_autotag_option_t download_tags; /** * Proxy options to use, by default no proxy is used. */ git_proxy_options proxy_opts; /** * Depth of the fetch to perform, or `GIT_FETCH_DEPTH_FULL` * (or `0`) for full history, or `GIT_FETCH_DEPTH_UNSHALLOW` * to "unshallow" a shallow repository. * * The default is full (`GIT_FETCH_DEPTH_FULL` or `0`). */ int depth; /** * Whether to allow off-site redirects. If this is not * specified, the `http.followRedirects` configuration setting * will be consulted. */ git_remote_redirect_t follow_redirects; /** * Extra headers for this fetch operation */ git_strarray custom_headers; } git_fetch_options; #define GIT_FETCH_OPTIONS_VERSION 1 #define GIT_FETCH_OPTIONS_INIT { \ GIT_FETCH_OPTIONS_VERSION, \ GIT_REMOTE_CALLBACKS_INIT, \ GIT_FETCH_PRUNE_UNSPECIFIED, \ GIT_REMOTE_UPDATE_FETCHHEAD, \ GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED, \ GIT_PROXY_OPTIONS_INIT } /** * Initialize git_fetch_options structure * * Initializes a `git_fetch_options` with default values. Equivalent to * creating an instance with `GIT_FETCH_OPTIONS_INIT`. * * @param opts The `git_fetch_options` struct to initialize. * @param version The struct version; pass `GIT_FETCH_OPTIONS_VERSION`. * @return Zero on success; -1 on failure. */ GIT_EXTERN(int) git_fetch_options_init( git_fetch_options *opts, unsigned int version); /** * Controls the behavior of a git_push object. */ typedef struct { unsigned int version; /** * If the transport being used to push to the remote requires the creation * of a pack file, this controls the number of worker threads used by * the packbuilder when creating that pack file to be sent to the remote. * * If set to 0, the packbuilder will auto-detect the number of threads * to create. The default value is 1. */ unsigned int pb_parallelism; /** * Callbacks to use for this push operation */ git_remote_callbacks callbacks; /** * Proxy options to use, by default no proxy is used. */ git_proxy_options proxy_opts; /** * Whether to allow off-site redirects. If this is not * specified, the `http.followRedirects` configuration setting * will be consulted. */ git_remote_redirect_t follow_redirects; /** * Extra headers for this push operation */ git_strarray custom_headers; /** * "Push options" to deliver to the remote. */ git_strarray remote_push_options; } git_push_options; #define GIT_PUSH_OPTIONS_VERSION 1 #define GIT_PUSH_OPTIONS_INIT { GIT_PUSH_OPTIONS_VERSION, 1, GIT_REMOTE_CALLBACKS_INIT, GIT_PROXY_OPTIONS_INIT } /** * Initialize git_push_options structure * * Initializes a `git_push_options` with default values. Equivalent to * creating an instance with `GIT_PUSH_OPTIONS_INIT`. * * @param opts The `git_push_options` struct to initialize. * @param version The struct version; pass `GIT_PUSH_OPTIONS_VERSION`. * @return Zero on success; -1 on failure. */ GIT_EXTERN(int) git_push_options_init( git_push_options *opts, unsigned int version); /** * Remote creation options structure * * Initialize with `GIT_REMOTE_CREATE_OPTIONS_INIT`. Alternatively, you can * use `git_remote_create_options_init`. * */ typedef struct { unsigned int version; /** Callbacks to use for this connection */ git_remote_callbacks callbacks; /** HTTP Proxy settings */ git_proxy_options proxy_opts; /** * Whether to allow off-site redirects. If this is not * specified, the `http.followRedirects` configuration setting * will be consulted. */ git_remote_redirect_t follow_redirects; /** Extra HTTP headers to use in this connection */ git_strarray custom_headers; } git_remote_connect_options; #define GIT_REMOTE_CONNECT_OPTIONS_VERSION 1 #define GIT_REMOTE_CONNECT_OPTIONS_INIT { \ GIT_REMOTE_CONNECT_OPTIONS_VERSION, \ GIT_REMOTE_CALLBACKS_INIT, \ GIT_PROXY_OPTIONS_INIT } /** * Initialize git_remote_connect_options structure. * * Initializes a `git_remote_connect_options` with default values. * Equivalent to creating an instance with * `GIT_REMOTE_CONNECT_OPTIONS_INIT`. * * @param opts The `git_remote_connect_options` struct to initialize. * @param version The struct version; pass `GIT_REMOTE_CONNECT_OPTIONS_VERSION`. * @return Zero on success; -1 on failure. */ GIT_EXTERN(int) git_remote_connect_options_init( git_remote_connect_options *opts, unsigned int version); /** * Open a connection to a remote. * * The transport is selected based on the URL; the direction argument * is due to a limitation of the git protocol which starts up a * specific binary which can only do the one or the other. * * @param remote the remote to connect to * @param direction GIT_DIRECTION_FETCH if you want to fetch or * GIT_DIRECTION_PUSH if you want to push * @param callbacks the callbacks to use for this connection * @param proxy_opts proxy settings * @param custom_headers extra HTTP headers to use in this connection * @return 0 or an error code */ GIT_EXTERN(int) git_remote_connect( git_remote *remote, git_direction direction, const git_remote_callbacks *callbacks, const git_proxy_options *proxy_opts, const git_strarray *custom_headers); /** * Open a connection to a remote with extended options. * * The transport is selected based on the URL; the direction argument * is due to a limitation of the git protocol which starts up a * specific binary which can only do the one or the other. * * The given options structure will form the defaults for connection * options and callback setup. Callers may override these defaults * by specifying `git_fetch_options` or `git_push_options` in * subsequent calls. * * @param remote the remote to connect to * @param direction GIT_DIRECTION_FETCH if you want to fetch or * GIT_DIRECTION_PUSH if you want to push * @param opts the remote connection options * @return 0 or an error code */ GIT_EXTERN(int) git_remote_connect_ext( git_remote *remote, git_direction direction, const git_remote_connect_options *opts); /** * Download and index the packfile. * * Connect to the remote if it hasn't been done yet, negotiate with * the remote git which objects are missing, download and index the * packfile. * * The .idx file will be created and both it and the packfile with be * renamed to their final name. * * If options are specified and this remote is already connected then * the existing remote connection options will be discarded and the * remote will now use the new options. * * @param remote the remote * @param refspecs the refspecs to use for this negotiation and * download. Use NULL or an empty array to use the base refspecs * @param opts the options to use for this fetch or NULL * @return 0 or an error code */ GIT_EXTERN(int) git_remote_download( git_remote *remote, const git_strarray *refspecs, const git_fetch_options *opts); /** * Create a packfile and send it to the server * * Connect to the remote if it hasn't been done yet, negotiate with * the remote git which objects are missing, create a packfile with * the missing objects and send it. * * If options are specified and this remote is already connected then * the existing remote connection options will be discarded and the * remote will now use the new options. * * @param remote the remote * @param refspecs the refspecs to use for this negotiation and * upload. Use NULL or an empty array to use the base refspecs * @param opts the options to use for this push * @return 0 or an error code */ GIT_EXTERN(int) git_remote_upload( git_remote *remote, const git_strarray *refspecs, const git_push_options *opts); /** * Update the tips to the new state. * * If callbacks are not specified then the callbacks specified to * `git_remote_connect` will be used (if it was called). * * @param remote the remote to update * @param reflog_message The message to insert into the reflogs. If * NULL and fetching, the default is "fetch ", where is * the name of the remote (or its url, for in-memory remotes). This * parameter is ignored when pushing. * @param callbacks pointer to the callback structure to use or NULL * @param update_flags the git_remote_update_flags for these tips. * @param download_tags what the behaviour for downloading tags is for this fetch. This is * ignored for push. This must be the same value passed to `git_remote_download()`. * @return 0 or an error code */ GIT_EXTERN(int) git_remote_update_tips( git_remote *remote, const git_remote_callbacks *callbacks, unsigned int update_flags, git_remote_autotag_option_t download_tags, const char *reflog_message); /** * Download new data and update tips. * * Convenience function to connect to a remote, download the data, * disconnect and update the remote-tracking branches. * * If options are specified and this remote is already connected then * the existing remote connection options will be discarded and the * remote will now use the new options. * * @param remote the remote to fetch from * @param refspecs the refspecs to use for this fetch. Pass NULL or an * empty array to use the base refspecs. * @param opts options to use for this fetch or NULL * @param reflog_message The message to insert into the reflogs. If NULL, the * default is "fetch" * @return 0 or an error code */ GIT_EXTERN(int) git_remote_fetch( git_remote *remote, const git_strarray *refspecs, const git_fetch_options *opts, const char *reflog_message); /** * Prune tracking refs that are no longer present on remote. * * If callbacks are not specified then the callbacks specified to * `git_remote_connect` will be used (if it was called). * * @param remote the remote to prune * @param callbacks callbacks to use for this prune * @return 0 or an error code */ GIT_EXTERN(int) git_remote_prune( git_remote *remote, const git_remote_callbacks *callbacks); /** * Perform a push. * * If options are specified and this remote is already connected then * the existing remote connection options will be discarded and the * remote will now use the new options. * * @param remote the remote to push to * @param refspecs the refspecs to use for pushing. If NULL or an empty * array, the configured refspecs will be used * @param opts options to use for this push * @return 0 or an error code. */ GIT_EXTERN(int) git_remote_push( git_remote *remote, const git_strarray *refspecs, const git_push_options *opts); /** * Get the statistics structure that is filled in by the fetch operation. */ GIT_EXTERN(const git_indexer_progress *) git_remote_stats(git_remote *remote); /** * Retrieve the tag auto-follow setting * * @param remote the remote to query * @return the auto-follow setting */ GIT_EXTERN(git_remote_autotag_option_t) git_remote_autotag(const git_remote *remote); /** * Set the remote's tag following setting. * * The change will be made in the configuration. No loaded remotes * will be affected. * * @param repo the repository in which to make the change * @param remote the name of the remote * @param value the new value to take. * @return 0, or an error code. */ GIT_EXTERN(int) git_remote_set_autotag(git_repository *repo, const char *remote, git_remote_autotag_option_t value); /** * Retrieve the ref-prune setting * * @param remote the remote to query * @return the ref-prune setting */ GIT_EXTERN(int) git_remote_prune_refs(const git_remote *remote); /** * Give the remote a new name * * All remote-tracking branches and configuration settings * for the remote are updated. * * The new name will be checked for validity. * See `git_tag_create()` for rules about valid names. * * No loaded instances of a the remote with the old name will change * their name or their list of refspecs. * * @param problems non-default refspecs cannot be renamed and will be * stored here for further processing by the caller. Always free this * strarray on successful return. * @param repo the repository in which to rename * @param name the current name of the remote * @param new_name the new name the remote should bear * @return 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code */ GIT_EXTERN(int) git_remote_rename( git_strarray *problems, git_repository *repo, const char *name, const char *new_name); /** * Ensure the remote name is well-formed. * * @param valid output pointer to set with validity of given remote name * @param remote_name name to be checked. * @return 0 on success or an error code */ GIT_EXTERN(int) git_remote_name_is_valid(int *valid, const char *remote_name); /** * Delete an existing persisted remote. * * All remote-tracking branches and configuration settings * for the remote will be removed. * * @param repo the repository in which to act * @param name the name of the remote to delete * @return 0 on success, or an error code. */ GIT_EXTERN(int) git_remote_delete(git_repository *repo, const char *name); /** * Retrieve the name of the remote's default branch * * The default branch of a repository is the branch which HEAD points * to. If the remote does not support reporting this information * directly, it performs the guess as git does; that is, if there are * multiple branches which point to the same commit, the first one is * chosen. If the master branch is a candidate, it wins. * * This function must only be called after connecting. * * @param out the buffer in which to store the reference name * @param remote the remote * @return 0, GIT_ENOTFOUND if the remote does not have any references * or none of them point to HEAD's commit, or an error message. */ GIT_EXTERN(int) git_remote_default_branch(git_buf *out, git_remote *remote); /** @} */ GIT_END_DECL #endif