2 * Copyright (C) the libgit2 contributors. All rights reserved.
4 * This file is part of libgit2, distributed under the GNU GPL v2 with
5 * a Linking Exception. For full terms see the included COPYING file.
7 #ifndef INCLUDE_git_remote_h__
8 #define INCLUDE_git_remote_h__
11 #include "repository.h"
16 #include "transport.h"
22 * @brief Git remote management functions
23 * @defgroup git_remote remote management functions
30 * Add a remote with the default fetch refspec to the repository's configuration.
32 * @param out the resulting remote
33 * @param repo the repository in which to create the remote
34 * @param name the remote's name
35 * @param url the remote's url
36 * @return 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code
38 GIT_EXTERN(int) git_remote_create(
45 * Add a remote with the provided fetch refspec (or default if NULL) to the repository's
48 * @param out the resulting remote
49 * @param repo the repository in which to create the remote
50 * @param name the remote's name
51 * @param url the remote's url
52 * @param fetch the remote fetch value
53 * @return 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code
55 GIT_EXTERN(int) git_remote_create_with_fetchspec(
63 * Create an anonymous remote
65 * Create a remote with the given url in-memory. You can use this when
66 * you have a URL instead of a remote's name.
68 * @param out pointer to the new remote objects
69 * @param repo the associated repository
70 * @param url the remote repository's URL
71 * @return 0 or an error code
73 GIT_EXTERN(int) git_remote_create_anonymous(
79 * Get the information for a particular remote
81 * The name will be checked for validity.
82 * See `git_tag_create()` for rules about valid names.
84 * @param out pointer to the new remote object
85 * @param repo the associated repository
86 * @param name the remote's name
87 * @return 0, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code
89 GIT_EXTERN(int) git_remote_lookup(git_remote
**out
, git_repository
*repo
, const char *name
);
92 * Create a copy of an existing remote. All internal strings are also
93 * duplicated. Callbacks are not duplicated.
95 * Call `git_remote_free` to free the data.
97 * @param dest pointer where to store the copy
98 * @param source object to copy
99 * @return 0 or an error code
101 GIT_EXTERN(int) git_remote_dup(git_remote
**dest
, git_remote
*source
);
104 * Get the remote's repository
106 * @param remote the remote
107 * @return a pointer to the repository
109 GIT_EXTERN(git_repository
*) git_remote_owner(const git_remote
*remote
);
112 * Get the remote's name
114 * @param remote the remote
115 * @return a pointer to the name or NULL for in-memory remotes
117 GIT_EXTERN(const char *) git_remote_name(const git_remote
*remote
);
120 * Get the remote's url
122 * If url.*.insteadOf has been configured for this URL, it will
123 * return the modified URL.
125 * @param remote the remote
126 * @return a pointer to the url
128 GIT_EXTERN(const char *) git_remote_url(const git_remote
*remote
);
131 * Get the remote's url for pushing
133 * If url.*.pushInsteadOf has been configured for this URL, it
134 * will return the modified URL.
136 * @param remote the remote
137 * @return a pointer to the url or NULL if no special url for pushing is set
139 GIT_EXTERN(const char *) git_remote_pushurl(const git_remote
*remote
);
142 * Set the remote's url in the configuration
144 * Remote objects already in memory will not be affected. This assumes
145 * the common case of a single-url remote and will otherwise return an error.
147 * @param repo the repository in which to perform the change
148 * @param remote the remote's name
149 * @param url the url to set
150 * @return 0 or an error value
152 GIT_EXTERN(int) git_remote_set_url(git_repository
*repo
, const char *remote
, const char* url
);
155 * Set the remote's url for pushing in the configuration.
157 * Remote objects already in memory will not be affected. This assumes
158 * the common case of a single-url remote and will otherwise return an error.
161 * @param repo the repository in which to perform the change
162 * @param remote the remote's name
163 * @param url the url to set
165 GIT_EXTERN(int) git_remote_set_pushurl(git_repository
*repo
, const char *remote
, const char* url
);
168 * Add a fetch refspec to the remote's configuration
170 * Add the given refspec to the fetch list in the configuration. No
171 * loaded remote instances will be affected.
173 * @param repo the repository in which to change the configuration
174 * @param remote the name of the remote to change
175 * @param refspec the new fetch refspec
176 * @return 0, GIT_EINVALIDSPEC if refspec is invalid or an error value
178 GIT_EXTERN(int) git_remote_add_fetch(git_repository
*repo
, const char *remote
, const char *refspec
);
181 * Get the remote's list of fetch refspecs
183 * The memory is owned by the user and should be freed with
184 * `git_strarray_free`.
186 * @param array pointer to the array in which to store the strings
187 * @param remote the remote to query
189 GIT_EXTERN(int) git_remote_get_fetch_refspecs(git_strarray
*array
, const git_remote
*remote
);
192 * Add a push refspec to the remote's configuration
194 * Add the given refspec to the push list in the configuration. No
195 * loaded remote instances will be affected.
197 * @param repo the repository in which to change the configuration
198 * @param remote the name of the remote to change
199 * @param refspec the new push refspec
200 * @return 0, GIT_EINVALIDSPEC if refspec is invalid or an error value
202 GIT_EXTERN(int) git_remote_add_push(git_repository
*repo
, const char *remote
, const char *refspec
);
205 * Get the remote's list of push refspecs
207 * The memory is owned by the user and should be freed with
208 * `git_strarray_free`.
210 * @param array pointer to the array in which to store the strings
211 * @param remote the remote to query
213 GIT_EXTERN(int) git_remote_get_push_refspecs(git_strarray
*array
, const git_remote
*remote
);
216 * Get the number of refspecs for a remote
218 * @param remote the remote
219 * @return the amount of refspecs configured in this remote
221 GIT_EXTERN(size_t) git_remote_refspec_count(const git_remote
*remote
);
224 * Get a refspec from the remote
226 * @param remote the remote to query
227 * @param n the refspec to get
228 * @return the nth refspec
230 GIT_EXTERN(const git_refspec
*)git_remote_get_refspec(const git_remote
*remote
, size_t n
);
233 * Open a connection to a remote
235 * The transport is selected based on the URL. The direction argument
236 * is due to a limitation of the git protocol (over TCP or SSH) which
237 * starts up a specific binary which can only do the one or the other.
239 * @param remote the remote to connect to
240 * @param direction GIT_DIRECTION_FETCH if you want to fetch or
241 * GIT_DIRECTION_PUSH if you want to push
242 * @param callbacks the callbacks to use for this connection
243 * @param proxy_opts proxy settings
244 * @param custom_headers extra HTTP headers to use in this connection
245 * @return 0 or an error code
247 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
);
250 * Get the remote repository's reference advertisement list
252 * Get the list of references with which the server responds to a new
255 * The remote (or more exactly its transport) must have connected to
256 * the remote repository. This list is available as soon as the
257 * connection to the remote is initiated and it remains available
258 * after disconnecting.
260 * The memory belongs to the remote. The pointer will be valid as long
261 * as a new connection is not initiated, but it is recommended that
262 * you make a copy in order to make use of the data.
264 * @param out pointer to the array
265 * @param size the number of remote heads
266 * @param remote the remote
267 * @return 0 on success, or an error code
269 GIT_EXTERN(int) git_remote_ls(const git_remote_head
***out
, size_t *size
, git_remote
*remote
);
272 * Check whether the remote is connected
274 * Check whether the remote's underlying transport is connected to the
277 * @param remote the remote
278 * @return 1 if it's connected, 0 otherwise.
280 GIT_EXTERN(int) git_remote_connected(const git_remote
*remote
);
283 * Cancel the operation
285 * At certain points in its operation, the network code checks whether
286 * the operation has been cancelled and if so stops the operation.
288 * @param remote the remote
290 GIT_EXTERN(void) git_remote_stop(git_remote
*remote
);
293 * Disconnect from the remote
295 * Close the connection to the remote.
297 * @param remote the remote to disconnect from
299 GIT_EXTERN(void) git_remote_disconnect(git_remote
*remote
);
302 * Free the memory associated with a remote
304 * This also disconnects from the remote, if the connection
305 * has not been closed yet (using git_remote_disconnect).
307 * @param remote the remote to free
309 GIT_EXTERN(void) git_remote_free(git_remote
*remote
);
312 * Get a list of the configured remotes for a repo
314 * The string array must be freed by the user.
316 * @param out a string array which receives the names of the remotes
317 * @param repo the repository to query
318 * @return 0 or an error code
320 GIT_EXTERN(int) git_remote_list(git_strarray
*out
, git_repository
*repo
);
323 * Argument to the completion callback which tells it which operation
326 typedef enum git_remote_completion_type
{
327 GIT_REMOTE_COMPLETION_DOWNLOAD
,
328 GIT_REMOTE_COMPLETION_INDEXING
,
329 GIT_REMOTE_COMPLETION_ERROR
,
330 } git_remote_completion_type
;
332 /** Push network progress notification function */
333 typedef int (*git_push_transfer_progress
)(
334 unsigned int current
,
339 * Represents an update which will be performed on the remote during push
343 * The source name of the reference
347 * The name of the reference to update on the server
351 * The current target of the reference
355 * The new target for the reference
361 * @param updates an array containing the updates which will be sent
362 * as commands to the destination.
363 * @param len number of elements in `updates`
364 * @param payload Payload provided by the caller
366 typedef int (*git_push_negotiation
)(const git_push_update
**updates
, size_t len
, void *payload
);
369 * The callback settings structure
371 * Set the callbacks to be called by the remote when informing the user
372 * about the progress of the network operations.
374 struct git_remote_callbacks
{
375 unsigned int version
;
377 * Textual progress from the remote. Text send over the
378 * progress side-band will be passed to this function (this is
379 * the 'counting objects' output).
381 git_transport_message_cb sideband_progress
;
384 * Completion is called when different parts of the download
385 * process are done (currently unused).
387 int (*completion
)(git_remote_completion_type type
, void *data
);
390 * This will be called if the remote host requires
391 * authentication in order to connect to it.
393 * Returning GIT_PASSTHROUGH will make libgit2 behave as
394 * though this field isn't set.
396 git_cred_acquire_cb credentials
;
399 * If cert verification fails, this will be called to let the
400 * user make the final decision of whether to allow the
401 * connection to proceed. Returns 1 to allow the connection, 0
402 * to disallow it or a negative value to indicate an error.
404 git_transport_certificate_check_cb certificate_check
;
407 * During the download of new data, this will be regularly
408 * called with the current count of progress done by the
411 git_transfer_progress_cb transfer_progress
;
414 * Each time a reference is updated locally, this function
415 * will be called with information about it.
417 int (*update_tips
)(const char *refname
, const git_oid
*a
, const git_oid
*b
, void *data
);
420 * Function to call with progress information during pack
421 * building. Be aware that this is called inline with pack
422 * building operations, so performance may be affected.
424 git_packbuilder_progress pack_progress
;
427 * Function to call with progress information during the
428 * upload portion of a push. Be aware that this is called
429 * inline with pack building operations, so performance may be
432 git_push_transfer_progress push_transfer_progress
;
435 * Called for each updated reference on push. If `status` is
436 * not `NULL`, the update was rejected by the remote server
437 * and `status` contains the reason given.
439 int (*push_update_reference
)(const char *refname
, const char *status
, void *data
);
442 * Called once between the negotiation step and the upload. It
443 * provides information about what updates will be performed.
445 git_push_negotiation push_negotiation
;
448 * Create the transport to use for this operation. Leave NULL
451 git_transport_cb transport
;
454 * This will be passed to each of the callbacks in this struct
455 * as the last parameter.
460 #define GIT_REMOTE_CALLBACKS_VERSION 1
461 #define GIT_REMOTE_CALLBACKS_INIT {GIT_REMOTE_CALLBACKS_VERSION}
464 * Initializes a `git_remote_callbacks` with default values. Equivalent to
465 * creating an instance with GIT_REMOTE_CALLBACKS_INIT.
467 * @param opts the `git_remote_callbacks` struct to initialize
468 * @param version Version of struct; pass `GIT_REMOTE_CALLBACKS_VERSION`
469 * @return Zero on success; -1 on failure.
471 GIT_EXTERN(int) git_remote_init_callbacks(
472 git_remote_callbacks
*opts
,
473 unsigned int version
);
477 * Use the setting from the configuration
479 GIT_FETCH_PRUNE_UNSPECIFIED
,
491 * Automatic tag following option
493 * Lets us select the --tags option to use.
497 * Use the setting from the configuration.
499 GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED
= 0,
501 * Ask the server for tags pointing to objects we're already
504 GIT_REMOTE_DOWNLOAD_TAGS_AUTO
,
506 * Don't ask for any tags beyond the refspecs.
508 GIT_REMOTE_DOWNLOAD_TAGS_NONE
,
510 * Ask for the all the tags.
512 GIT_REMOTE_DOWNLOAD_TAGS_ALL
,
513 } git_remote_autotag_option_t
;
516 * Fetch options structure.
518 * Zero out for defaults. Initialize with `GIT_FETCH_OPTIONS_INIT` macro to
519 * correctly set the `version` field. E.g.
521 * git_fetch_options opts = GIT_FETCH_OPTIONS_INIT;
527 * Callbacks to use for this fetch operation
529 git_remote_callbacks callbacks
;
532 * Whether to perform a prune after the fetch
534 git_fetch_prune_t prune
;
537 * Whether to write the results to FETCH_HEAD. Defaults to
538 * on. Leave this default in order to behave like git.
540 int update_fetchhead
;
543 * Determines how to behave regarding tags on the remote, such
544 * as auto-downloading tags for objects we're downloading or
545 * downloading all of them.
547 * The default is to auto-follow tags.
549 git_remote_autotag_option_t download_tags
;
552 * Proxy options to use, by default no proxy is used.
554 git_proxy_options proxy_opts
;
557 * Extra headers for this fetch operation
559 git_strarray custom_headers
;
562 #define GIT_FETCH_OPTIONS_VERSION 1
563 #define GIT_FETCH_OPTIONS_INIT { GIT_FETCH_OPTIONS_VERSION, GIT_REMOTE_CALLBACKS_INIT, GIT_FETCH_PRUNE_UNSPECIFIED, 1, \
564 GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED, GIT_PROXY_OPTIONS_INIT }
567 * Initializes a `git_fetch_options` with default values. Equivalent to
568 * creating an instance with GIT_FETCH_OPTIONS_INIT.
570 * @param opts the `git_push_options` instance to initialize.
571 * @param version the version of the struct; you should pass
572 * `GIT_FETCH_OPTIONS_VERSION` here.
573 * @return Zero on success; -1 on failure.
575 GIT_EXTERN(int) git_fetch_init_options(
576 git_fetch_options
*opts
,
577 unsigned int version
);
581 * Controls the behavior of a git_push object.
584 unsigned int version
;
587 * If the transport being used to push to the remote requires the creation
588 * of a pack file, this controls the number of worker threads used by
589 * the packbuilder when creating that pack file to be sent to the remote.
591 * If set to 0, the packbuilder will auto-detect the number of threads
592 * to create. The default value is 1.
594 unsigned int pb_parallelism
;
597 * Callbacks to use for this push operation
599 git_remote_callbacks callbacks
;
602 * Proxy options to use, by default no proxy is used.
604 git_proxy_options proxy_opts
;
607 * Extra headers for this push operation
609 git_strarray custom_headers
;
612 #define GIT_PUSH_OPTIONS_VERSION 1
613 #define GIT_PUSH_OPTIONS_INIT { GIT_PUSH_OPTIONS_VERSION, 0, GIT_REMOTE_CALLBACKS_INIT, GIT_PROXY_OPTIONS_INIT }
616 * Initializes a `git_push_options` with default values. Equivalent to
617 * creating an instance with GIT_PUSH_OPTIONS_INIT.
619 * @param opts the `git_push_options` instance to initialize.
620 * @param version the version of the struct; you should pass
621 * `GIT_PUSH_OPTIONS_VERSION` here.
622 * @return Zero on success; -1 on failure.
624 GIT_EXTERN(int) git_push_init_options(
625 git_push_options
*opts
,
626 unsigned int version
);
629 * Download and index the packfile
631 * Connect to the remote if it hasn't been done yet, negotiate with
632 * the remote git which objects are missing, download and index the
635 * The .idx file will be created and both it and the packfile with be
636 * renamed to their final name.
638 * @param remote the remote
639 * @param refspecs the refspecs to use for this negotiation and
640 * download. Use NULL or an empty array to use the base refspecs
641 * @param opts the options to use for this fetch
642 * @return 0 or an error code
644 GIT_EXTERN(int) git_remote_download(git_remote
*remote
, const git_strarray
*refspecs
, const git_fetch_options
*opts
);
647 * Create a packfile and send it to the server
649 * Connect to the remote if it hasn't been done yet, negotiate with
650 * the remote git which objects are missing, create a packfile with the missing objects and send it.
652 * @param remote the remote
653 * @param refspecs the refspecs to use for this negotiation and
654 * upload. Use NULL or an empty array to use the base refspecs
655 * @param opts the options to use for this push
656 * @return 0 or an error code
658 GIT_EXTERN(int) git_remote_upload(git_remote
*remote
, const git_strarray
*refspecs
, const git_push_options
*opts
);
661 * Update the tips to the new state
663 * @param remote the remote to update
664 * @param reflog_message The message to insert into the reflogs. If
665 * NULL and fetching, the default is "fetch <name>", where <name> is
666 * the name of the remote (or its url, for in-memory remotes). This
667 * parameter is ignored when pushing.
668 * @param callbacks pointer to the callback structure to use
669 * @param update_fetchhead whether to write to FETCH_HEAD. Pass 1 to behave like git.
670 * @param download_tags what the behaviour for downloading tags is for this fetch. This is
671 * ignored for push. This must be the same value passed to `git_remote_download()`.
672 * @return 0 or an error code
674 GIT_EXTERN(int) git_remote_update_tips(
676 const git_remote_callbacks
*callbacks
,
677 int update_fetchhead
,
678 git_remote_autotag_option_t download_tags
,
679 const char *reflog_message
);
682 * Download new data and update tips
684 * Convenience function to connect to a remote, download the data,
685 * disconnect and update the remote-tracking branches.
687 * @param remote the remote to fetch from
688 * @param refspecs the refspecs to use for this fetch. Pass NULL or an
689 * empty array to use the base refspecs.
690 * @param opts options to use for this fetch
691 * @param reflog_message The message to insert into the reflogs. If NULL, the
693 * @return 0 or an error code
695 GIT_EXTERN(int) git_remote_fetch(
697 const git_strarray
*refspecs
,
698 const git_fetch_options
*opts
,
699 const char *reflog_message
);
702 * Prune tracking refs that are no longer present on remote
704 * @param remote the remote to prune
705 * @param callbacks callbacks to use for this prune
706 * @return 0 or an error code
708 GIT_EXTERN(int) git_remote_prune(git_remote
*remote
, const git_remote_callbacks
*callbacks
);
713 * Peform all the steps from a push.
715 * @param remote the remote to push to
716 * @param refspecs the refspecs to use for pushing. If none are
717 * passed, the configured refspecs will be used
718 * @param opts options to use for this push
720 GIT_EXTERN(int) git_remote_push(git_remote
*remote
,
721 const git_strarray
*refspecs
,
722 const git_push_options
*opts
);
725 * Get the statistics structure that is filled in by the fetch operation.
727 GIT_EXTERN(const git_transfer_progress
*) git_remote_stats(git_remote
*remote
);
730 * Retrieve the tag auto-follow setting
732 * @param remote the remote to query
733 * @return the auto-follow setting
735 GIT_EXTERN(git_remote_autotag_option_t
) git_remote_autotag(const git_remote
*remote
);
738 * Set the remote's tag following setting.
740 * The change will be made in the configuration. No loaded remotes
743 * @param repo the repository in which to make the change
744 * @param remote the name of the remote
745 * @param value the new value to take.
747 GIT_EXTERN(int) git_remote_set_autotag(git_repository
*repo
, const char *remote
, git_remote_autotag_option_t value
);
749 * Retrieve the ref-prune setting
751 * @param remote the remote to query
752 * @return the ref-prune setting
754 GIT_EXTERN(int) git_remote_prune_refs(const git_remote
*remote
);
757 * Give the remote a new name
759 * All remote-tracking branches and configuration settings
760 * for the remote are updated.
762 * The new name will be checked for validity.
763 * See `git_tag_create()` for rules about valid names.
765 * No loaded instances of a the remote with the old name will change
766 * their name or their list of refspecs.
768 * @param problems non-default refspecs cannot be renamed and will be
769 * stored here for further processing by the caller. Always free this
770 * strarray on successful return.
771 * @param repo the repository in which to rename
772 * @param name the current name of the remote
773 * @param new_name the new name the remote should bear
774 * @return 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code
776 GIT_EXTERN(int) git_remote_rename(
777 git_strarray
*problems
,
778 git_repository
*repo
,
780 const char *new_name
);
783 * Ensure the remote name is well-formed.
785 * @param remote_name name to be checked.
786 * @return 1 if the reference name is acceptable; 0 if it isn't
788 GIT_EXTERN(int) git_remote_is_valid_name(const char *remote_name
);
791 * Delete an existing persisted remote.
793 * All remote-tracking branches and configuration settings
794 * for the remote will be removed.
796 * @param repo the repository in which to act
797 * @param name the name of the remove to delete
798 * @return 0 on success, or an error code.
800 GIT_EXTERN(int) git_remote_delete(git_repository
*repo
, const char *name
);
803 * Retrieve the name of the remote's default branch
805 * The default branch of a repository is the branch which HEAD points
806 * to. If the remote does not support reporting this information
807 * directly, it performs the guess as git does; that is, if there are
808 * multiple branches which point to the same commit, the first one is
809 * chosen. If the master branch is a candidate, it wins.
811 * This function must only be called after connecting.
813 * @param out the buffern in which to store the reference name
814 * @param remote the remote
815 * @return 0, GIT_ENOTFOUND if the remote does not have any references
816 * or none of them point to HEAD's commit, or an error message.
818 GIT_EXTERN(int) git_remote_default_branch(git_buf
*out
, git_remote
*remote
);