summaryrefslogtreecommitdiff
path: root/remote.h
diff options
context:
space:
mode:
Diffstat (limited to 'remote.h')
-rw-r--r--remote.h101
1 files changed, 90 insertions, 11 deletions
diff --git a/remote.h b/remote.h
index 0e1d2b245b..5a59198252 100644
--- a/remote.h
+++ b/remote.h
@@ -6,6 +6,16 @@
#include "hashmap.h"
#include "refspec.h"
+struct transport_ls_refs_options;
+
+/**
+ * The API gives access to the configuration related to remotes. It handles
+ * all three configuration mechanisms historically and currently used by Git,
+ * and presents the information in a uniform fashion. Note that the code also
+ * handles plain URLs without any configuration, giving them just the default
+ * information.
+ */
+
enum {
REMOTE_UNCONFIGURED = 0,
REMOTE_CONFIG,
@@ -16,16 +26,22 @@ enum {
struct remote {
struct hashmap_entry ent;
+ /* The user's nickname for the remote */
const char *name;
+
int origin, configured_in_repo;
const char *foreign_vcs;
+ /* An array of all of the url_nr URLs configured for the remote */
const char **url;
+
int url_nr;
int url_alloc;
+ /* An array of all of the pushurl_nr push URLs configured for the remote */
const char **pushurl;
+
int pushurl_nr;
int pushurl_alloc;
@@ -34,48 +50,79 @@ struct remote {
struct refspec fetch;
/*
+ * The setting for whether to fetch tags (as a separate rule from the
+ * configured refspecs);
* -1 to never fetch tags
* 0 to auto-follow tags on heuristic (default)
* 1 to always auto-follow tags
* 2 to always fetch tags
*/
int fetch_tags;
+
int skip_default_update;
int mirror;
int prune;
int prune_tags;
+ /**
+ * The configured helper programs to run on the remote side, for
+ * Git-native protocols.
+ */
const char *receivepack;
const char *uploadpack;
- /*
- * for curl remotes only
- */
+ /* The proxy to use for curl (http, https, ftp, etc.) URLs. */
char *http_proxy;
+
+ /* The method used for authenticating against `http_proxy`. */
char *http_proxy_authmethod;
};
+/**
+ * struct remotes can be found by name with remote_get().
+ * remote_get(NULL) will return the default remote, given the current branch
+ * and configuration.
+ */
struct remote *remote_get(const char *name);
+
struct remote *pushremote_get(const char *name);
int remote_is_configured(struct remote *remote, int in_repo);
typedef int each_remote_fn(struct remote *remote, void *priv);
+
+/* iterate through struct remotes */
int for_each_remote(each_remote_fn fn, void *priv);
int remote_has_url(struct remote *remote, const char *url);
+struct ref_push_report {
+ const char *ref_name;
+ struct object_id *old_oid;
+ struct object_id *new_oid;
+ unsigned int forced_update:1;
+ struct ref_push_report *next;
+};
+
struct ref {
struct ref *next;
struct object_id old_oid;
struct object_id new_oid;
struct object_id old_oid_expect; /* used by expect-old */
char *symref;
+ char *tracking_ref;
unsigned int
force:1,
forced_update:1,
expect_old_sha1:1,
exact_oid:1,
- deletion:1;
+ deletion:1,
+ /* Need to check if local reflog reaches the remote tip. */
+ check_reachable:1,
+ /*
+ * Store the result of the check enabled by "check_reachable";
+ * implies the local reflog does not reach the remote tip.
+ */
+ unreachable:1;
enum {
REF_NOT_MATCHED = 0, /* initial value */
@@ -89,7 +136,7 @@ struct ref {
* should be 0, so that xcalloc'd structures get it
* by default.
*/
- enum {
+ enum fetch_head_status {
FETCH_HEAD_MERGE = -1,
FETCH_HEAD_NOT_FOR_MERGE = 0,
FETCH_HEAD_IGNORE = 1
@@ -105,12 +152,14 @@ struct ref {
REF_STATUS_REJECT_NEEDS_FORCE,
REF_STATUS_REJECT_STALE,
REF_STATUS_REJECT_SHALLOW,
+ REF_STATUS_REJECT_REMOTE_UPDATED,
REF_STATUS_UPTODATE,
REF_STATUS_REMOTE_REJECT,
REF_STATUS_EXPECTING_REPORT,
REF_STATUS_ATOMIC_PUSH_FAILED
} status;
char *remote_status;
+ struct ref_push_report *report;
struct ref *peer_ref; /* when renaming */
char name[FLEX_ARRAY]; /* more */
};
@@ -139,7 +188,7 @@ void free_refs(struct ref *ref);
struct oid_array;
struct packet_reader;
-struct argv_array;
+struct strvec;
struct string_list;
struct ref **get_remote_heads(struct packet_reader *reader,
struct ref **list, unsigned int flags,
@@ -149,8 +198,9 @@ struct ref **get_remote_heads(struct packet_reader *reader,
/* Used for protocol v2 in order to retrieve refs from a remote */
struct ref **get_remote_refs(int fd_out, struct packet_reader *reader,
struct ref **list, int for_push,
- const struct argv_array *ref_prefixes,
- const struct string_list *server_options);
+ struct transport_ls_refs_options *transport_options,
+ const struct string_list *server_options,
+ int stateless_rpc);
int resolve_remote_symref(struct ref *ref, struct ref *list);
@@ -163,6 +213,12 @@ int resolve_remote_symref(struct ref *ref, struct ref *list);
*/
struct ref *ref_remove_duplicates(struct ref *ref_map);
+/*
+ * Remove all entries in the input list which match any negative refspec in
+ * the refspec list.
+ */
+struct ref *apply_negative_refspecs(struct ref *ref_map, struct refspec *rs);
+
int query_refspecs(struct refspec *rs, struct refspec_item *query);
char *apply_refspecs(struct refspec *rs, const char *name);
@@ -175,7 +231,8 @@ void set_ref_status_for_push(struct ref *remote_refs, int send_mirror,
/*
* Given a list of the remote refs and the specification of things to
* fetch, makes a (separate) list of the refs to fetch and the local
- * refs to store into.
+ * refs to store into. Note that negative refspecs are ignored here, and
+ * should be handled separately.
*
* *tail is the pointer to the tail pointer of the list of results
* beforehand, and will be set to the tail pointer of the list of
@@ -194,16 +251,36 @@ struct ref *get_remote_ref(const struct ref *remote_refs, const char *name);
*/
int remote_find_tracking(struct remote *remote, struct refspec_item *refspec);
+/**
+ * struct branch holds the configuration for a branch. It can be looked up with
+ * branch_get(name) for "refs/heads/{name}", or with branch_get(NULL) for HEAD.
+ */
struct branch {
+
+ /* The short name of the branch. */
const char *name;
+
+ /* The full path for the branch ref. */
const char *refname;
+ /* The name of the remote listed in the configuration. */
const char *remote_name;
+
const char *pushremote_name;
+ /* An array of the "merge" lines in the configuration. */
const char **merge_name;
+
+ /**
+ * An array of the struct refspecs used for the merge lines. That is,
+ * merge[i]->dst is a local tracking ref which should be merged into this
+ * branch by default.
+ */
struct refspec_item **merge;
+
+ /* The number of merge configurations */
int merge_nr;
+
int merge_alloc;
const char *push_tracking_ref;
@@ -212,10 +289,11 @@ struct branch {
struct branch *branch_get(const char *name);
const char *remote_for_branch(struct branch *branch, int *explicit);
const char *pushremote_for_branch(struct branch *branch, int *explicit);
-const char *remote_ref_for_branch(struct branch *branch, int for_push,
- int *explicit);
+const char *remote_ref_for_branch(struct branch *branch, int for_push);
+/* returns true if the given branch has merge configuration given. */
int branch_has_merge_config(struct branch *branch);
+
int branch_merge_matches(struct branch *, int n, const char *);
/**
@@ -281,6 +359,7 @@ struct ref *get_stale_heads(struct refspec *rs, struct ref *fetch_map);
struct push_cas_option {
unsigned use_tracking_for_rest:1;
+ unsigned use_force_if_includes:1;
struct push_cas {
struct object_id expect;
unsigned use_tracking:1;