1 #ifndef REMOTE_H 2 #define REMOTE_H 3 4 #include "cache.h" 5 #include "parse-options.h" 6 #include "hashmap.h" 7 #include "refspec.h" 8 9 struct transport_ls_refs_options; 10 11 /** 12 * The API gives access to the configuration related to remotes. It handles 13 * all three configuration mechanisms historically and currently used by Git, 14 * and presents the information in a uniform fashion. Note that the code also 15 * handles plain URLs without any configuration, giving them just the default 16 * information. 17 */ 18 19 enum { 20 REMOTE_UNCONFIGURED = 0, 21 REMOTE_CONFIG, 22 REMOTE_REMOTES, 23 REMOTE_BRANCHES 24 }; 25 26 struct remote { 27 struct hashmap_entry ent; 28 29 /* The user's nickname for the remote */ 30 const char *name; 31 32 int origin, configured_in_repo; 33 34 const char *foreign_vcs; 35 36 /* An array of all of the url_nr URLs configured for the remote */ 37 const char **url; 38 39 int url_nr; 40 int url_alloc; 41 42 /* An array of all of the pushurl_nr push URLs configured for the remote */ 43 const char **pushurl; 44 45 int pushurl_nr; 46 int pushurl_alloc; 47 48 struct refspec push; 49 50 struct refspec fetch; 51 52 /* 53 * The setting for whether to fetch tags (as a separate rule from the 54 * configured refspecs); 55 * -1 to never fetch tags 56 * 0 to auto-follow tags on heuristic (default) 57 * 1 to always auto-follow tags 58 * 2 to always fetch tags 59 */ 60 int fetch_tags; 61 62 int skip_default_update; 63 int mirror; 64 int prune; 65 int prune_tags; 66 67 /** 68 * The configured helper programs to run on the remote side, for 69 * Git-native protocols. 70 */ 71 const char *receivepack; 72 const char *uploadpack; 73 74 /* The proxy to use for curl (http, https, ftp, etc.) URLs. */ 75 char *http_proxy; 76 77 /* The method used for authenticating against `http_proxy`. */ 78 char *http_proxy_authmethod; 79 }; 80 81 /** 82 * struct remotes can be found by name with remote_get(). 83 * remote_get(NULL) will return the default remote, given the current branch 84 * and configuration. 85 */ 86 struct remote *remote_get(const char *name); 87 88 struct remote *pushremote_get(const char *name); 89 int remote_is_configured(struct remote *remote, int in_repo); 90 91 typedef int each_remote_fn(struct remote *remote, void *priv); 92 93 /* iterate through struct remotes */ 94 int for_each_remote(each_remote_fn fn, void *priv); 95 96 int remote_has_url(struct remote *remote, const char *url); 97 98 struct ref_push_report { 99 const char *ref_name; 100 struct object_id *old_oid; 101 struct object_id *new_oid; 102 unsigned int forced_update:1; 103 struct ref_push_report *next; 104 }; 105 106 struct ref { 107 struct ref *next; 108 struct object_id old_oid; 109 struct object_id new_oid; 110 struct object_id old_oid_expect; /* used by expect-old */ 111 char *symref; 112 char *tracking_ref; 113 unsigned int 114 force:1, 115 forced_update:1, 116 expect_old_sha1:1, 117 exact_oid:1, 118 deletion:1, 119 /* Need to check if local reflog reaches the remote tip. */ 120 check_reachable:1, 121 /* 122 * Store the result of the check enabled by "check_reachable"; 123 * implies the local reflog does not reach the remote tip. 124 */ 125 unreachable:1; 126 127 enum { 128 REF_NOT_MATCHED = 0, /* initial value */ 129 REF_MATCHED, 130 REF_UNADVERTISED_NOT_ALLOWED 131 } match_status; 132 133 /* 134 * Order is important here, as we write to FETCH_HEAD 135 * in numeric order. And the default NOT_FOR_MERGE 136 * should be 0, so that xcalloc'd structures get it 137 * by default. 138 */ 139 enum fetch_head_status { 140 FETCH_HEAD_MERGE = -1, 141 FETCH_HEAD_NOT_FOR_MERGE = 0, 142 FETCH_HEAD_IGNORE = 1 143 } fetch_head_status; 144 145 enum { 146 REF_STATUS_NONE = 0, 147 REF_STATUS_OK, 148 REF_STATUS_REJECT_NONFASTFORWARD, 149 REF_STATUS_REJECT_ALREADY_EXISTS, 150 REF_STATUS_REJECT_NODELETE, 151 REF_STATUS_REJECT_FETCH_FIRST, 152 REF_STATUS_REJECT_NEEDS_FORCE, 153 REF_STATUS_REJECT_STALE, 154 REF_STATUS_REJECT_SHALLOW, 155 REF_STATUS_REJECT_REMOTE_UPDATED, 156 REF_STATUS_UPTODATE, 157 REF_STATUS_REMOTE_REJECT, 158 REF_STATUS_EXPECTING_REPORT, 159 REF_STATUS_ATOMIC_PUSH_FAILED 160 } status; 161 char *remote_status; 162 struct ref_push_report *report; 163 struct ref *peer_ref; /* when renaming */ 164 char name[FLEX_ARRAY]; /* more */ 165 }; 166 167 #define REF_NORMAL (1u << 0) 168 #define REF_HEADS (1u << 1) 169 #define REF_TAGS (1u << 2) 170 171 struct ref *find_ref_by_name(const struct ref *list, const char *name); 172 173 struct ref *alloc_ref(const char *name); 174 struct ref *copy_ref(const struct ref *ref); 175 struct ref *copy_ref_list(const struct ref *ref); 176 void sort_ref_list(struct ref **, int (*cmp)(const void *, const void *)); 177 int count_refspec_match(const char *, struct ref *refs, struct ref **matched_ref); 178 int ref_compare_name(const void *, const void *); 179 180 int check_ref_type(const struct ref *ref, int flags); 181 182 /* 183 * Free a single ref and its peer, or an entire list of refs and their peers, 184 * respectively. 185 */ 186 void free_one_ref(struct ref *ref); 187 void free_refs(struct ref *ref); 188 189 struct oid_array; 190 struct packet_reader; 191 struct strvec; 192 struct string_list; 193 struct ref **get_remote_heads(struct packet_reader *reader, 194 struct ref **list, unsigned int flags, 195 struct oid_array *extra_have, 196 struct oid_array *shallow_points); 197 198 /* Used for protocol v2 in order to retrieve refs from a remote */ 199 struct ref **get_remote_refs(int fd_out, struct packet_reader *reader, 200 struct ref **list, int for_push, 201 struct transport_ls_refs_options *transport_options, 202 const struct string_list *server_options, 203 int stateless_rpc); 204 205 int resolve_remote_symref(struct ref *ref, struct ref *list); 206 207 /* 208 * Remove and free all but the first of any entries in the input list 209 * that map the same remote reference to the same local reference. If 210 * there are two entries that map different remote references to the 211 * same local reference, emit an error message and die. Return a 212 * pointer to the head of the resulting list. 213 */ 214 struct ref *ref_remove_duplicates(struct ref *ref_map); 215 216 /* 217 * Remove all entries in the input list which match any negative refspec in 218 * the refspec list. 219 */ 220 struct ref *apply_negative_refspecs(struct ref *ref_map, struct refspec *rs); 221 222 int query_refspecs(struct refspec *rs, struct refspec_item *query); 223 char *apply_refspecs(struct refspec *rs, const char *name); 224 225 int check_push_refs(struct ref *src, struct refspec *rs); 226 int match_push_refs(struct ref *src, struct ref **dst, 227 struct refspec *rs, int flags); 228 void set_ref_status_for_push(struct ref *remote_refs, int send_mirror, 229 int force_update); 230 231 /* 232 * Given a list of the remote refs and the specification of things to 233 * fetch, makes a (separate) list of the refs to fetch and the local 234 * refs to store into. Note that negative refspecs are ignored here, and 235 * should be handled separately. 236 * 237 * *tail is the pointer to the tail pointer of the list of results 238 * beforehand, and will be set to the tail pointer of the list of 239 * results afterward. 240 * 241 * missing_ok is usually false, but when we are adding branch.$name.merge 242 * it is Ok if the branch is not at the remote anymore. 243 */ 244 int get_fetch_map(const struct ref *remote_refs, const struct refspec_item *refspec, 245 struct ref ***tail, int missing_ok); 246 247 struct ref *get_remote_ref(const struct ref *remote_refs, const char *name); 248 249 /* 250 * For the given remote, reads the refspec's src and sets the other fields. 251 */ 252 int remote_find_tracking(struct remote *remote, struct refspec_item *refspec); 253 254 /** 255 * struct branch holds the configuration for a branch. It can be looked up with 256 * branch_get(name) for "refs/heads/{name}", or with branch_get(NULL) for HEAD. 257 */ 258 struct branch { 259 260 /* The short name of the branch. */ 261 const char *name; 262 263 /* The full path for the branch ref. */ 264 const char *refname; 265 266 /* The name of the remote listed in the configuration. */ 267 const char *remote_name; 268 269 const char *pushremote_name; 270 271 /* An array of the "merge" lines in the configuration. */ 272 const char **merge_name; 273 274 /** 275 * An array of the struct refspecs used for the merge lines. That is, 276 * merge[i]->dst is a local tracking ref which should be merged into this 277 * branch by default. 278 */ 279 struct refspec_item **merge; 280 281 /* The number of merge configurations */ 282 int merge_nr; 283 284 int merge_alloc; 285 286 const char *push_tracking_ref; 287 }; 288 289 struct branch *branch_get(const char *name); 290 const char *remote_for_branch(struct branch *branch, int *explicit); 291 const char *pushremote_for_branch(struct branch *branch, int *explicit); 292 const char *remote_ref_for_branch(struct branch *branch, int for_push); 293 294 /* returns true if the given branch has merge configuration given. */ 295 int branch_has_merge_config(struct branch *branch); 296 297 int branch_merge_matches(struct branch *, int n, const char *); 298 299 /** 300 * Return the fully-qualified refname of the tracking branch for `branch`. 301 * I.e., what "branch@{upstream}" would give you. Returns NULL if no 302 * upstream is defined. 303 * 304 * If `err` is not NULL and no upstream is defined, a more specific error 305 * message is recorded there (if the function does not return NULL, then 306 * `err` is not touched). 307 */ 308 const char *branch_get_upstream(struct branch *branch, struct strbuf *err); 309 310 /** 311 * Return the tracking branch that corresponds to the ref we would push to 312 * given a bare `git push` while `branch` is checked out. 313 * 314 * The return value and `err` conventions match those of `branch_get_upstream`. 315 */ 316 const char *branch_get_push(struct branch *branch, struct strbuf *err); 317 318 /* Flags to match_refs. */ 319 enum match_refs_flags { 320 MATCH_REFS_NONE = 0, 321 MATCH_REFS_ALL = (1 << 0), 322 MATCH_REFS_MIRROR = (1 << 1), 323 MATCH_REFS_PRUNE = (1 << 2), 324 MATCH_REFS_FOLLOW_TAGS = (1 << 3) 325 }; 326 327 /* Flags for --ahead-behind option. */ 328 enum ahead_behind_flags { 329 AHEAD_BEHIND_UNSPECIFIED = -1, 330 AHEAD_BEHIND_QUICK = 0, /* just eq/neq reporting */ 331 AHEAD_BEHIND_FULL = 1, /* traditional a/b reporting */ 332 }; 333 334 /* Reporting of tracking info */ 335 int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs, 336 const char **upstream_name, int for_push, 337 enum ahead_behind_flags abf); 338 int format_tracking_info(struct branch *branch, struct strbuf *sb, 339 enum ahead_behind_flags abf); 340 341 struct ref *get_local_heads(void); 342 /* 343 * Find refs from a list which are likely to be pointed to by the given HEAD 344 * ref. If 'all' is false, returns the most likely ref; otherwise, returns a 345 * list of all candidate refs. If no match is found (or 'head' is NULL), 346 * returns NULL. All returns are newly allocated and should be freed. 347 */ 348 struct ref *guess_remote_head(const struct ref *head, 349 const struct ref *refs, 350 int all); 351 352 /* Return refs which no longer exist on remote */ 353 struct ref *get_stale_heads(struct refspec *rs, struct ref *fetch_map); 354 355 /* 356 * Compare-and-swap 357 */ 358 #define CAS_OPT_NAME "force-with-lease" 359 360 struct push_cas_option { 361 unsigned use_tracking_for_rest:1; 362 unsigned use_force_if_includes:1; 363 struct push_cas { 364 struct object_id expect; 365 unsigned use_tracking:1; 366 char *refname; 367 } *entry; 368 int nr; 369 int alloc; 370 }; 371 372 int parseopt_push_cas_option(const struct option *, const char *arg, int unset); 373 374 int is_empty_cas(const struct push_cas_option *); 375 void apply_push_cas(struct push_cas_option *, struct remote *, struct ref *); 376 377 #endif 378