1#ifndef REMOTE_H 2#define REMOTE_H 3 4#include"parse-options.h" 5#include"hashmap.h" 6 7enum{ 8 REMOTE_UNCONFIGURED =0, 9 REMOTE_CONFIG, 10 REMOTE_REMOTES, 11 REMOTE_BRANCHES 12}; 13 14struct remote { 15struct hashmap_entry ent;/* must be first */ 16 17const char*name; 18int origin, configured_in_repo; 19 20const char*foreign_vcs; 21 22const char**url; 23int url_nr; 24int url_alloc; 25 26const char**pushurl; 27int pushurl_nr; 28int pushurl_alloc; 29 30const char**push_refspec; 31struct refspec *push; 32int push_refspec_nr; 33int push_refspec_alloc; 34 35const char**fetch_refspec; 36struct refspec *fetch; 37int fetch_refspec_nr; 38int fetch_refspec_alloc; 39 40/* 41 * -1 to never fetch tags 42 * 0 to auto-follow tags on heuristic (default) 43 * 1 to always auto-follow tags 44 * 2 to always fetch tags 45 */ 46int fetch_tags; 47int skip_default_update; 48int mirror; 49int prune; 50int prune_tags; 51 52const char*receivepack; 53const char*uploadpack; 54 55/* 56 * for curl remotes only 57 */ 58char*http_proxy; 59char*http_proxy_authmethod; 60}; 61 62struct remote *remote_get(const char*name); 63struct remote *pushremote_get(const char*name); 64intremote_is_configured(struct remote *remote,int in_repo); 65 66typedefinteach_remote_fn(struct remote *remote,void*priv); 67intfor_each_remote(each_remote_fn fn,void*priv); 68 69intremote_has_url(struct remote *remote,const char*url); 70 71struct refspec { 72unsigned force :1; 73unsigned pattern :1; 74unsigned matching :1; 75unsigned exact_sha1 :1; 76 77char*src; 78char*dst; 79}; 80 81externconst struct refspec *tag_refspec; 82 83struct ref { 84struct ref *next; 85struct object_id old_oid; 86struct object_id new_oid; 87struct object_id old_oid_expect;/* used by expect-old */ 88char*symref; 89unsigned int 90 force:1, 91 forced_update:1, 92 expect_old_sha1:1, 93 deletion:1; 94 95enum{ 96 REF_NOT_MATCHED =0,/* initial value */ 97 REF_MATCHED, 98 REF_UNADVERTISED_NOT_ALLOWED 99} match_status; 100 101/* 102 * Order is important here, as we write to FETCH_HEAD 103 * in numeric order. And the default NOT_FOR_MERGE 104 * should be 0, so that xcalloc'd structures get it 105 * by default. 106 */ 107enum{ 108 FETCH_HEAD_MERGE = -1, 109 FETCH_HEAD_NOT_FOR_MERGE =0, 110 FETCH_HEAD_IGNORE =1 111} fetch_head_status; 112 113enum{ 114 REF_STATUS_NONE =0, 115 REF_STATUS_OK, 116 REF_STATUS_REJECT_NONFASTFORWARD, 117 REF_STATUS_REJECT_ALREADY_EXISTS, 118 REF_STATUS_REJECT_NODELETE, 119 REF_STATUS_REJECT_FETCH_FIRST, 120 REF_STATUS_REJECT_NEEDS_FORCE, 121 REF_STATUS_REJECT_STALE, 122 REF_STATUS_REJECT_SHALLOW, 123 REF_STATUS_UPTODATE, 124 REF_STATUS_REMOTE_REJECT, 125 REF_STATUS_EXPECTING_REPORT, 126 REF_STATUS_ATOMIC_PUSH_FAILED 127} status; 128char*remote_status; 129struct ref *peer_ref;/* when renaming */ 130char name[FLEX_ARRAY];/* more */ 131}; 132 133#define REF_NORMAL (1u << 0) 134#define REF_HEADS (1u << 1) 135#define REF_TAGS (1u << 2) 136 137externstruct ref *find_ref_by_name(const struct ref *list,const char*name); 138 139struct ref *alloc_ref(const char*name); 140struct ref *copy_ref(const struct ref *ref); 141struct ref *copy_ref_list(const struct ref *ref); 142voidsort_ref_list(struct ref **,int(*cmp)(const void*,const void*)); 143externintcount_refspec_match(const char*,struct ref *refs,struct ref **matched_ref); 144intref_compare_name(const void*,const void*); 145 146intcheck_ref_type(const struct ref *ref,int flags); 147 148/* 149 * Frees the entire list and peers of elements. 150 */ 151voidfree_refs(struct ref *ref); 152 153struct oid_array; 154externstruct ref **get_remote_heads(int in,char*src_buf,size_t src_len, 155struct ref **list,unsigned int flags, 156struct oid_array *extra_have, 157struct oid_array *shallow); 158 159intresolve_remote_symref(struct ref *ref,struct ref *list); 160intref_newer(const struct object_id *new_oid,const struct object_id *old_oid); 161 162/* 163 * Remove and free all but the first of any entries in the input list 164 * that map the same remote reference to the same local reference. If 165 * there are two entries that map different remote references to the 166 * same local reference, emit an error message and die. Return a 167 * pointer to the head of the resulting list. 168 */ 169struct ref *ref_remove_duplicates(struct ref *ref_map); 170 171intvalid_fetch_refspec(const char*refspec); 172struct refspec *parse_fetch_refspec(int nr_refspec,const char**refspec); 173externstruct refspec *parse_push_refspec(int nr_refspec,const char**refspec); 174 175voidfree_refspec(int nr_refspec,struct refspec *refspec); 176 177externintquery_refspecs(struct refspec *specs,int nr,struct refspec *query); 178char*apply_refspecs(struct refspec *refspecs,int nr_refspec, 179const char*name); 180 181intcheck_push_refs(struct ref *src,int nr_refspec,const char**refspec); 182intmatch_push_refs(struct ref *src,struct ref **dst, 183int nr_refspec,const char**refspec,int all); 184voidset_ref_status_for_push(struct ref *remote_refs,int send_mirror, 185int force_update); 186 187/* 188 * Given a list of the remote refs and the specification of things to 189 * fetch, makes a (separate) list of the refs to fetch and the local 190 * refs to store into. 191 * 192 * *tail is the pointer to the tail pointer of the list of results 193 * beforehand, and will be set to the tail pointer of the list of 194 * results afterward. 195 * 196 * missing_ok is usually false, but when we are adding branch.$name.merge 197 * it is Ok if the branch is not at the remote anymore. 198 */ 199intget_fetch_map(const struct ref *remote_refs,const struct refspec *refspec, 200struct ref ***tail,int missing_ok); 201 202struct ref *get_remote_ref(const struct ref *remote_refs,const char*name); 203 204/* 205 * For the given remote, reads the refspec's src and sets the other fields. 206 */ 207intremote_find_tracking(struct remote *remote,struct refspec *refspec); 208 209struct branch { 210const char*name; 211const char*refname; 212 213const char*remote_name; 214const char*pushremote_name; 215 216const char**merge_name; 217struct refspec **merge; 218int merge_nr; 219int merge_alloc; 220 221const char*push_tracking_ref; 222}; 223 224struct branch *branch_get(const char*name); 225const char*remote_for_branch(struct branch *branch,int*explicit); 226const char*pushremote_for_branch(struct branch *branch,int*explicit); 227const char*remote_ref_for_branch(struct branch *branch,int for_push, 228int*explicit); 229 230intbranch_has_merge_config(struct branch *branch); 231intbranch_merge_matches(struct branch *,int n,const char*); 232 233/** 234 * Return the fully-qualified refname of the tracking branch for `branch`. 235 * I.e., what "branch@{upstream}" would give you. Returns NULL if no 236 * upstream is defined. 237 * 238 * If `err` is not NULL and no upstream is defined, a more specific error 239 * message is recorded there (if the function does not return NULL, then 240 * `err` is not touched). 241 */ 242const char*branch_get_upstream(struct branch *branch,struct strbuf *err); 243 244/** 245 * Return the tracking branch that corresponds to the ref we would push to 246 * given a bare `git push` while `branch` is checked out. 247 * 248 * The return value and `err` conventions match those of `branch_get_upstream`. 249 */ 250const char*branch_get_push(struct branch *branch,struct strbuf *err); 251 252/* Flags to match_refs. */ 253enum match_refs_flags { 254 MATCH_REFS_NONE =0, 255 MATCH_REFS_ALL = (1<<0), 256 MATCH_REFS_MIRROR = (1<<1), 257 MATCH_REFS_PRUNE = (1<<2), 258 MATCH_REFS_FOLLOW_TAGS = (1<<3) 259}; 260 261/* Reporting of tracking info */ 262intstat_tracking_info(struct branch *branch,int*num_ours,int*num_theirs, 263const char**upstream_name); 264intformat_tracking_info(struct branch *branch,struct strbuf *sb); 265 266struct ref *get_local_heads(void); 267/* 268 * Find refs from a list which are likely to be pointed to by the given HEAD 269 * ref. If 'all' is false, returns the most likely ref; otherwise, returns a 270 * list of all candidate refs. If no match is found (or 'head' is NULL), 271 * returns NULL. All returns are newly allocated and should be freed. 272 */ 273struct ref *guess_remote_head(const struct ref *head, 274const struct ref *refs, 275int all); 276 277/* Return refs which no longer exist on remote */ 278struct ref *get_stale_heads(struct refspec *refs,int ref_count,struct ref *fetch_map); 279 280/* 281 * Compare-and-swap 282 */ 283#define CAS_OPT_NAME"force-with-lease" 284 285struct push_cas_option { 286unsigned use_tracking_for_rest:1; 287struct push_cas { 288struct object_id expect; 289unsigned use_tracking:1; 290char*refname; 291} *entry; 292int nr; 293int alloc; 294}; 295 296externintparseopt_push_cas_option(const struct option *,const char*arg,int unset); 297 298externintis_empty_cas(const struct push_cas_option *); 299voidapply_push_cas(struct push_cas_option *,struct remote *,struct ref *); 300 301#define TAG_REFSPEC"refs/tags/*:refs/tags/*" 302 303voidadd_prune_tags_to_fetch_refspec(struct remote *remote); 304 305#endif