Daniel Barkalow | 9b28851 | 2007-09-10 23:03:04 -0400 | [diff] [blame] | 1 | #ifndef TRANSPORT_H |
| 2 | #define TRANSPORT_H |
| 3 | |
| 4 | #include "cache.h" |
Junio C Hamano | 47a5918 | 2013-07-08 13:56:53 -0700 | [diff] [blame] | 5 | #include "run-command.h" |
Daniel Barkalow | 9b28851 | 2007-09-10 23:03:04 -0400 | [diff] [blame] | 6 | #include "remote.h" |
Jeff Hostetler | 640d8b7 | 2017-12-08 15:58:40 +0000 | [diff] [blame] | 7 | #include "list-objects-filter-options.h" |
Daniel Barkalow | 9b28851 | 2007-09-10 23:03:04 -0400 | [diff] [blame] | 8 | |
Nguyễn Thái Ngọc Duy | a45a260 | 2016-06-12 17:54:04 +0700 | [diff] [blame] | 9 | struct string_list; |
| 10 | |
Ilari Liusvaara | aa5af97 | 2009-12-09 17:26:30 +0200 | [diff] [blame] | 11 | struct git_transport_options { |
| 12 | unsigned thin : 1; |
| 13 | unsigned keep : 1; |
| 14 | unsigned followtags : 1; |
Nguyễn Thái Ngọc Duy | c6807a4 | 2013-05-26 08:16:17 +0700 | [diff] [blame] | 15 | unsigned check_self_contained_and_connected : 1; |
| 16 | unsigned self_contained_and_connected : 1; |
Nguyễn Thái Ngọc Duy | 48d25ca | 2013-12-05 20:02:42 +0700 | [diff] [blame] | 17 | unsigned update_shallow : 1; |
Nguyễn Thái Ngọc Duy | cccf74e | 2016-06-12 17:54:09 +0700 | [diff] [blame] | 18 | unsigned deepen_relative : 1; |
Jonathan Tan | 88e2f9e | 2017-12-05 16:58:49 +0000 | [diff] [blame] | 19 | unsigned from_promisor : 1; |
| 20 | unsigned no_dependents : 1; |
Jonathan Tan | cf1e7c0 | 2018-07-02 15:08:43 -0700 | [diff] [blame] | 21 | |
| 22 | /* |
| 23 | * If this transport supports connect or stateless-connect, |
| 24 | * the corresponding field in struct fetch_pack_args is copied |
| 25 | * here after fetching. |
| 26 | * |
| 27 | * See the definition of connectivity_checked in struct |
| 28 | * fetch_pack_args for more information. |
| 29 | */ |
| 30 | unsigned connectivity_checked:1; |
| 31 | |
Ilari Liusvaara | aa5af97 | 2009-12-09 17:26:30 +0200 | [diff] [blame] | 32 | int depth; |
Nguyễn Thái Ngọc Duy | 508ea88 | 2016-06-12 17:53:59 +0700 | [diff] [blame] | 33 | const char *deepen_since; |
Nguyễn Thái Ngọc Duy | a45a260 | 2016-06-12 17:54:04 +0700 | [diff] [blame] | 34 | const struct string_list *deepen_not; |
Ilari Liusvaara | aa5af97 | 2009-12-09 17:26:30 +0200 | [diff] [blame] | 35 | const char *uploadpack; |
| 36 | const char *receivepack; |
Junio C Hamano | 91048a9 | 2013-07-09 11:01:06 -0700 | [diff] [blame] | 37 | struct push_cas_option *cas; |
Jeff Hostetler | 640d8b7 | 2017-12-08 15:58:40 +0000 | [diff] [blame] | 38 | struct list_objects_filter_options filter_options; |
Jonathan Tan | 3390e42 | 2018-07-02 15:39:44 -0700 | [diff] [blame] | 39 | |
| 40 | /* |
| 41 | * This is only used during fetch. See the documentation of |
| 42 | * negotiation_tips in struct fetch_pack_args. |
| 43 | * |
| 44 | * This field is only supported by transports that support connect or |
| 45 | * stateless_connect. Set this field directly instead of using |
| 46 | * transport_set_option(). |
| 47 | */ |
| 48 | struct oid_array *negotiation_tips; |
Ilari Liusvaara | aa5af97 | 2009-12-09 17:26:30 +0200 | [diff] [blame] | 49 | }; |
| 50 | |
Eric Wong | c915f11 | 2016-02-03 04:09:14 +0000 | [diff] [blame] | 51 | enum transport_family { |
| 52 | TRANSPORT_FAMILY_ALL = 0, |
| 53 | TRANSPORT_FAMILY_IPV4, |
| 54 | TRANSPORT_FAMILY_IPV6 |
| 55 | }; |
| 56 | |
Daniel Barkalow | 9b28851 | 2007-09-10 23:03:04 -0400 | [diff] [blame] | 57 | struct transport { |
Jonathan Tan | e967ca3 | 2017-12-14 13:44:45 -0800 | [diff] [blame] | 58 | const struct transport_vtable *vtable; |
| 59 | |
Daniel Barkalow | 9b28851 | 2007-09-10 23:03:04 -0400 | [diff] [blame] | 60 | struct remote *remote; |
| 61 | const char *url; |
Daniel Barkalow | 9b28851 | 2007-09-10 23:03:04 -0400 | [diff] [blame] | 62 | void *data; |
Daniel Barkalow | 4577370 | 2007-10-29 21:05:40 -0400 | [diff] [blame] | 63 | const struct ref *remote_refs; |
Daniel Barkalow | 9b28851 | 2007-09-10 23:03:04 -0400 | [diff] [blame] | 64 | |
Daniel Barkalow | 9b28851 | 2007-09-10 23:03:04 -0400 | [diff] [blame] | 65 | /** |
Tay Ray Chuan | b0d66e1 | 2010-02-16 15:18:21 +0800 | [diff] [blame] | 66 | * Indicates whether we already called get_refs_list(); set by |
| 67 | * transport.c::transport_get_remote_refs(). |
| 68 | */ |
| 69 | unsigned got_remote_refs : 1; |
| 70 | |
Junio C Hamano | b26ed43 | 2013-08-07 15:47:18 -0700 | [diff] [blame] | 71 | /* |
| 72 | * Transports that call take-over destroys the data specific to |
| 73 | * the transport type while doing so, and cannot be reused. |
| 74 | */ |
| 75 | unsigned cannot_reuse : 1; |
| 76 | |
Nguyễn Thái Ngọc Duy | beea415 | 2013-12-05 20:02:39 +0700 | [diff] [blame] | 77 | /* |
| 78 | * A hint from caller that it will be performing a clone, not |
| 79 | * normal fetch. IOW the repository is guaranteed empty. |
| 80 | */ |
| 81 | unsigned cloning : 1; |
| 82 | |
Stefan Beller | f6a4e61 | 2016-07-14 14:49:47 -0700 | [diff] [blame] | 83 | /* |
Brandon Williams | edc9caf | 2018-03-15 10:31:34 -0700 | [diff] [blame] | 84 | * Indicates that the transport is connected via a half-duplex |
| 85 | * connection and should operate in stateless-rpc mode. |
| 86 | */ |
| 87 | unsigned stateless_rpc : 1; |
| 88 | |
| 89 | /* |
Stefan Beller | f6a4e61 | 2016-07-14 14:49:47 -0700 | [diff] [blame] | 90 | * These strings will be passed to the {pre, post}-receive hook, |
| 91 | * on the remote side, if both sides support the push options capability. |
| 92 | */ |
| 93 | const struct string_list *push_options; |
| 94 | |
Brandon Williams | ff47322 | 2018-04-23 15:46:23 -0700 | [diff] [blame] | 95 | /* |
| 96 | * These strings will be passed to the remote side on each command |
| 97 | * request, if both sides support the server-option capability. |
| 98 | */ |
| 99 | const struct string_list *server_options; |
| 100 | |
Shawn O. Pearce | 824d577 | 2007-09-19 00:49:31 -0400 | [diff] [blame] | 101 | char *pack_lockfile; |
Shawn O. Pearce | cff7123 | 2009-10-30 17:47:27 -0700 | [diff] [blame] | 102 | signed verbose : 3; |
Tay Ray Chuan | d01b3c0 | 2010-02-24 20:50:26 +0800 | [diff] [blame] | 103 | /** |
| 104 | * Transports should not set this directly, and should use this |
| 105 | * value without having to check isatty(2), -q/--quiet |
| 106 | * (transport->verbose < 0), etc. - checking has already been done |
| 107 | * in transport_set_verbosity(). |
| 108 | **/ |
Miklos Vajna | 21188b1 | 2008-10-09 01:40:32 +0200 | [diff] [blame] | 109 | unsigned progress : 1; |
Ilari Liusvaara | aa5af97 | 2009-12-09 17:26:30 +0200 | [diff] [blame] | 110 | /* |
| 111 | * If transport is at least potentially smart, this points to |
| 112 | * git_transport_options structure to use in case transport |
| 113 | * actually turns out to be smart. |
| 114 | */ |
| 115 | struct git_transport_options *smart_options; |
Eric Wong | c915f11 | 2016-02-03 04:09:14 +0000 | [diff] [blame] | 116 | |
| 117 | enum transport_family family; |
Daniel Barkalow | 9b28851 | 2007-09-10 23:03:04 -0400 | [diff] [blame] | 118 | }; |
| 119 | |
Brandon Williams | 14c01bd | 2016-12-19 10:25:31 -0800 | [diff] [blame] | 120 | #define TRANSPORT_PUSH_ALL (1<<0) |
| 121 | #define TRANSPORT_PUSH_FORCE (1<<1) |
| 122 | #define TRANSPORT_PUSH_DRY_RUN (1<<2) |
| 123 | #define TRANSPORT_PUSH_MIRROR (1<<3) |
| 124 | #define TRANSPORT_PUSH_PORCELAIN (1<<4) |
| 125 | #define TRANSPORT_PUSH_SET_UPSTREAM (1<<5) |
| 126 | #define TRANSPORT_RECURSE_SUBMODULES_CHECK (1<<6) |
| 127 | #define TRANSPORT_PUSH_PRUNE (1<<7) |
| 128 | #define TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND (1<<8) |
| 129 | #define TRANSPORT_PUSH_NO_HOOK (1<<9) |
| 130 | #define TRANSPORT_PUSH_FOLLOW_TAGS (1<<10) |
| 131 | #define TRANSPORT_PUSH_CERT_ALWAYS (1<<11) |
| 132 | #define TRANSPORT_PUSH_CERT_IF_ASKED (1<<12) |
| 133 | #define TRANSPORT_PUSH_ATOMIC (1<<13) |
| 134 | #define TRANSPORT_PUSH_OPTIONS (1<<14) |
Brandon Williams | 225e8bf | 2016-12-19 10:25:33 -0800 | [diff] [blame] | 135 | #define TRANSPORT_RECURSE_SUBMODULES_ONLY (1<<15) |
Shawn O. Pearce | 824d577 | 2007-09-19 00:49:31 -0400 | [diff] [blame] | 136 | |
Junio C Hamano | 11fd66d | 2016-10-21 15:28:07 -0700 | [diff] [blame] | 137 | extern int transport_summary_width(const struct ref *refs); |
Daniel Barkalow | 9b28851 | 2007-09-10 23:03:04 -0400 | [diff] [blame] | 138 | |
| 139 | /* Returns a transport suitable for the url */ |
| 140 | struct transport *transport_get(struct remote *, const char *); |
| 141 | |
Jeff King | a5adace | 2015-09-16 13:12:52 -0400 | [diff] [blame] | 142 | /* |
Brandon Williams | a768a02 | 2016-12-14 14:39:54 -0800 | [diff] [blame] | 143 | * Check whether a transport is allowed by the environment. |
| 144 | * |
| 145 | * Type should generally be the URL scheme, as described in |
| 146 | * Documentation/git.txt |
| 147 | * |
| 148 | * from_user specifies if the transport was given by the user. If unknown pass |
| 149 | * a -1 to read from the environment to determine if the transport was given by |
| 150 | * the user. |
| 151 | * |
Jeff King | 5088d3b | 2015-09-22 18:03:49 -0400 | [diff] [blame] | 152 | */ |
Brandon Williams | a768a02 | 2016-12-14 14:39:54 -0800 | [diff] [blame] | 153 | int is_transport_allowed(const char *type, int from_user); |
Jeff King | 5088d3b | 2015-09-22 18:03:49 -0400 | [diff] [blame] | 154 | |
| 155 | /* |
Jeff King | a5adace | 2015-09-16 13:12:52 -0400 | [diff] [blame] | 156 | * Check whether a transport is allowed by the environment, |
Jeff King | 5088d3b | 2015-09-22 18:03:49 -0400 | [diff] [blame] | 157 | * and die otherwise. |
Jeff King | a5adace | 2015-09-16 13:12:52 -0400 | [diff] [blame] | 158 | */ |
| 159 | void transport_check_allowed(const char *type); |
| 160 | |
Daniel Barkalow | 9b28851 | 2007-09-10 23:03:04 -0400 | [diff] [blame] | 161 | /* Transport options which apply to git:// and scp-style URLs */ |
| 162 | |
Daniel Barkalow | c29727d | 2007-09-10 23:03:11 -0400 | [diff] [blame] | 163 | /* The program to use on the remote side to send a pack */ |
| 164 | #define TRANS_OPT_UPLOADPACK "uploadpack" |
| 165 | |
Daniel Barkalow | 9b28851 | 2007-09-10 23:03:04 -0400 | [diff] [blame] | 166 | /* The program to use on the remote side to receive a pack */ |
| 167 | #define TRANS_OPT_RECEIVEPACK "receivepack" |
| 168 | |
| 169 | /* Transfer the data as a thin pack if not null */ |
| 170 | #define TRANS_OPT_THIN "thin" |
| 171 | |
Junio C Hamano | 91048a9 | 2013-07-09 11:01:06 -0700 | [diff] [blame] | 172 | /* Check the current value of the remote ref */ |
| 173 | #define TRANS_OPT_CAS "cas" |
| 174 | |
Daniel Barkalow | c29727d | 2007-09-10 23:03:11 -0400 | [diff] [blame] | 175 | /* Keep the pack that was transferred if not null */ |
| 176 | #define TRANS_OPT_KEEP "keep" |
| 177 | |
Daniel Barkalow | c29727d | 2007-09-10 23:03:11 -0400 | [diff] [blame] | 178 | /* Limit the depth of the fetch if not null */ |
| 179 | #define TRANS_OPT_DEPTH "depth" |
| 180 | |
Nguyễn Thái Ngọc Duy | 508ea88 | 2016-06-12 17:53:59 +0700 | [diff] [blame] | 181 | /* Limit the depth of the fetch based on time if not null */ |
| 182 | #define TRANS_OPT_DEEPEN_SINCE "deepen-since" |
| 183 | |
Nguyễn Thái Ngọc Duy | a45a260 | 2016-06-12 17:54:04 +0700 | [diff] [blame] | 184 | /* Limit the depth of the fetch based on revs if not null */ |
| 185 | #define TRANS_OPT_DEEPEN_NOT "deepen-not" |
| 186 | |
Nguyễn Thái Ngọc Duy | cccf74e | 2016-06-12 17:54:09 +0700 | [diff] [blame] | 187 | /* Limit the deepen of the fetch if not null */ |
| 188 | #define TRANS_OPT_DEEPEN_RELATIVE "deepen-relative" |
| 189 | |
Shawn O. Pearce | 41fa7d2 | 2008-03-03 22:27:40 -0500 | [diff] [blame] | 190 | /* Aggressively fetch annotated tags if possible */ |
| 191 | #define TRANS_OPT_FOLLOWTAGS "followtags" |
| 192 | |
Nguyễn Thái Ngọc Duy | 48d25ca | 2013-12-05 20:02:42 +0700 | [diff] [blame] | 193 | /* Accept refs that may update .git/shallow without --depth */ |
| 194 | #define TRANS_OPT_UPDATE_SHALLOW "updateshallow" |
| 195 | |
Junio C Hamano | a85b377 | 2014-09-12 11:17:07 -0700 | [diff] [blame] | 196 | /* Send push certificates */ |
| 197 | #define TRANS_OPT_PUSH_CERT "pushcert" |
| 198 | |
Jonathan Tan | 88e2f9e | 2017-12-05 16:58:49 +0000 | [diff] [blame] | 199 | /* Indicate that these objects are being fetched by a promisor */ |
| 200 | #define TRANS_OPT_FROM_PROMISOR "from-promisor" |
| 201 | |
| 202 | /* |
| 203 | * Indicate that only the objects wanted need to be fetched, not their |
| 204 | * dependents |
| 205 | */ |
| 206 | #define TRANS_OPT_NO_DEPENDENTS "no-dependents" |
| 207 | |
Jeff Hostetler | 640d8b7 | 2017-12-08 15:58:40 +0000 | [diff] [blame] | 208 | /* Filter objects for partial clone and fetch */ |
| 209 | #define TRANS_OPT_LIST_OBJECTS_FILTER "filter" |
| 210 | |
Daniel Barkalow | 9b28851 | 2007-09-10 23:03:04 -0400 | [diff] [blame] | 211 | /** |
| 212 | * Returns 0 if the option was used, non-zero otherwise. Prints a |
| 213 | * message to stderr if the option is not used. |
| 214 | **/ |
| 215 | int transport_set_option(struct transport *transport, const char *name, |
| 216 | const char *value); |
Tay Ray Chuan | d01b3c0 | 2010-02-24 20:50:26 +0800 | [diff] [blame] | 217 | void transport_set_verbosity(struct transport *transport, int verbosity, |
| 218 | int force_progress); |
Daniel Barkalow | 9b28851 | 2007-09-10 23:03:04 -0400 | [diff] [blame] | 219 | |
Chris Rorvick | 10643d4 | 2012-11-29 19:41:33 -0600 | [diff] [blame] | 220 | #define REJECT_NON_FF_HEAD 0x01 |
| 221 | #define REJECT_NON_FF_OTHER 0x02 |
Chris Rorvick | b24e604 | 2012-11-29 19:41:34 -0600 | [diff] [blame] | 222 | #define REJECT_ALREADY_EXISTS 0x04 |
Junio C Hamano | 75e5c0d | 2013-01-23 13:55:30 -0800 | [diff] [blame] | 223 | #define REJECT_FETCH_FIRST 0x08 |
| 224 | #define REJECT_NEEDS_FORCE 0x10 |
Chris Rorvick | 10643d4 | 2012-11-29 19:41:33 -0600 | [diff] [blame] | 225 | |
Daniel Barkalow | 9b28851 | 2007-09-10 23:03:04 -0400 | [diff] [blame] | 226 | int transport_push(struct transport *connection, |
Brandon Williams | 306f22d | 2018-05-16 15:58:17 -0700 | [diff] [blame] | 227 | struct refspec *rs, int flags, |
Chris Rorvick | 10643d4 | 2012-11-29 19:41:33 -0600 | [diff] [blame] | 228 | unsigned int * reject_reasons); |
Daniel Barkalow | 9b28851 | 2007-09-10 23:03:04 -0400 | [diff] [blame] | 229 | |
Brandon Williams | 1af8ae1 | 2018-03-15 10:31:23 -0700 | [diff] [blame] | 230 | /* |
| 231 | * Retrieve refs from a remote. |
| 232 | * |
| 233 | * Optionally a list of ref prefixes can be provided which can be sent to the |
| 234 | * server (when communicating using protocol v2) to enable it to limit the ref |
| 235 | * advertisement. Since ref filtering is done on the server's end (and only |
| 236 | * when using protocol v2), this can return refs which don't match the provided |
| 237 | * ref_prefixes. |
| 238 | */ |
| 239 | const struct ref *transport_get_remote_refs(struct transport *transport, |
| 240 | const struct argv_array *ref_prefixes); |
Daniel Barkalow | c29727d | 2007-09-10 23:03:11 -0400 | [diff] [blame] | 241 | |
Jonathan Tan | e2842b3 | 2018-08-01 13:13:20 -0700 | [diff] [blame] | 242 | int transport_fetch_refs(struct transport *transport, struct ref *refs); |
Shawn O. Pearce | 1788c39 | 2007-09-14 03:31:23 -0400 | [diff] [blame] | 243 | void transport_unlock_pack(struct transport *transport); |
Daniel Barkalow | 9b28851 | 2007-09-10 23:03:04 -0400 | [diff] [blame] | 244 | int transport_disconnect(struct transport *transport); |
Andreas Ericsson | 47abd85 | 2009-04-17 10:20:11 +0200 | [diff] [blame] | 245 | char *transport_anonymize_url(const char *url); |
Ilari Liusvaara | 61b075b | 2009-12-09 17:26:31 +0200 | [diff] [blame] | 246 | void transport_take_over(struct transport *transport, |
| 247 | struct child_process *child); |
Daniel Barkalow | 9b28851 | 2007-09-10 23:03:04 -0400 | [diff] [blame] | 248 | |
Ilari Liusvaara | b236752 | 2009-12-09 17:26:33 +0200 | [diff] [blame] | 249 | int transport_connect(struct transport *transport, const char *name, |
| 250 | const char *exec, int fd[2]); |
| 251 | |
Daniel Barkalow | 6eb996b | 2009-08-05 01:01:53 -0400 | [diff] [blame] | 252 | /* Transport methods defined outside transport.c */ |
Daniel Barkalow | c9e388b | 2009-09-03 22:13:49 -0400 | [diff] [blame] | 253 | int transport_helper_init(struct transport *transport, const char *name); |
Ilari Liusvaara | 419f37d | 2010-10-12 19:39:41 +0300 | [diff] [blame] | 254 | int bidirectional_transfer_loop(int input, int output); |
Daniel Barkalow | 6eb996b | 2009-08-05 01:01:53 -0400 | [diff] [blame] | 255 | |
Phil Hord | 09b7e22 | 2013-06-18 13:44:58 -0400 | [diff] [blame] | 256 | /* common methods used by transport.c and builtin/send-pack.c */ |
Michael Lukashov | f1863d0 | 2010-02-16 23:42:52 +0000 | [diff] [blame] | 257 | void transport_update_tracking_ref(struct remote *remote, struct ref *ref, int verbose); |
| 258 | |
| 259 | int transport_refs_pushed(struct ref *ref); |
| 260 | |
| 261 | void transport_print_push_status(const char *dest, struct ref *refs, |
Chris Rorvick | 10643d4 | 2012-11-29 19:41:33 -0600 | [diff] [blame] | 262 | int verbose, int porcelain, unsigned int *reject_reasons); |
Michael Lukashov | f1863d0 | 2010-02-16 23:42:52 +0000 | [diff] [blame] | 263 | |
Jeff King | 2429d63 | 2017-02-08 15:52:57 -0500 | [diff] [blame] | 264 | typedef void alternate_ref_fn(const char *refname, const struct object_id *oid, void *); |
Jeff King | 114a6a8 | 2011-05-19 17:33:17 -0400 | [diff] [blame] | 265 | extern void for_each_alternate_ref(alternate_ref_fn, void *); |
Daniel Barkalow | 9b28851 | 2007-09-10 23:03:04 -0400 | [diff] [blame] | 266 | #endif |