fetch-pack: write shallow, then check connectivity
[git/git.git] / transport.h
1 #ifndef TRANSPORT_H
2 #define TRANSPORT_H
3
4 #include "cache.h"
5 #include "run-command.h"
6 #include "remote.h"
7 #include "list-objects-filter-options.h"
8
9 struct string_list;
10
11 struct git_transport_options {
12 unsigned thin : 1;
13 unsigned keep : 1;
14 unsigned followtags : 1;
15 unsigned check_self_contained_and_connected : 1;
16 unsigned self_contained_and_connected : 1;
17 unsigned update_shallow : 1;
18 unsigned deepen_relative : 1;
19 unsigned from_promisor : 1;
20 unsigned no_dependents : 1;
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
32 int depth;
33 const char *deepen_since;
34 const struct string_list *deepen_not;
35 const char *uploadpack;
36 const char *receivepack;
37 struct push_cas_option *cas;
38 struct list_objects_filter_options filter_options;
39 };
40
41 enum transport_family {
42 TRANSPORT_FAMILY_ALL = 0,
43 TRANSPORT_FAMILY_IPV4,
44 TRANSPORT_FAMILY_IPV6
45 };
46
47 struct transport {
48 const struct transport_vtable *vtable;
49
50 struct remote *remote;
51 const char *url;
52 void *data;
53 const struct ref *remote_refs;
54
55 /**
56 * Indicates whether we already called get_refs_list(); set by
57 * transport.c::transport_get_remote_refs().
58 */
59 unsigned got_remote_refs : 1;
60
61 /*
62 * Transports that call take-over destroys the data specific to
63 * the transport type while doing so, and cannot be reused.
64 */
65 unsigned cannot_reuse : 1;
66
67 /*
68 * A hint from caller that it will be performing a clone, not
69 * normal fetch. IOW the repository is guaranteed empty.
70 */
71 unsigned cloning : 1;
72
73 /*
74 * Indicates that the transport is connected via a half-duplex
75 * connection and should operate in stateless-rpc mode.
76 */
77 unsigned stateless_rpc : 1;
78
79 /*
80 * These strings will be passed to the {pre, post}-receive hook,
81 * on the remote side, if both sides support the push options capability.
82 */
83 const struct string_list *push_options;
84
85 /*
86 * These strings will be passed to the remote side on each command
87 * request, if both sides support the server-option capability.
88 */
89 const struct string_list *server_options;
90
91 char *pack_lockfile;
92 signed verbose : 3;
93 /**
94 * Transports should not set this directly, and should use this
95 * value without having to check isatty(2), -q/--quiet
96 * (transport->verbose < 0), etc. - checking has already been done
97 * in transport_set_verbosity().
98 **/
99 unsigned progress : 1;
100 /*
101 * If transport is at least potentially smart, this points to
102 * git_transport_options structure to use in case transport
103 * actually turns out to be smart.
104 */
105 struct git_transport_options *smart_options;
106
107 enum transport_family family;
108 };
109
110 #define TRANSPORT_PUSH_ALL (1<<0)
111 #define TRANSPORT_PUSH_FORCE (1<<1)
112 #define TRANSPORT_PUSH_DRY_RUN (1<<2)
113 #define TRANSPORT_PUSH_MIRROR (1<<3)
114 #define TRANSPORT_PUSH_PORCELAIN (1<<4)
115 #define TRANSPORT_PUSH_SET_UPSTREAM (1<<5)
116 #define TRANSPORT_RECURSE_SUBMODULES_CHECK (1<<6)
117 #define TRANSPORT_PUSH_PRUNE (1<<7)
118 #define TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND (1<<8)
119 #define TRANSPORT_PUSH_NO_HOOK (1<<9)
120 #define TRANSPORT_PUSH_FOLLOW_TAGS (1<<10)
121 #define TRANSPORT_PUSH_CERT_ALWAYS (1<<11)
122 #define TRANSPORT_PUSH_CERT_IF_ASKED (1<<12)
123 #define TRANSPORT_PUSH_ATOMIC (1<<13)
124 #define TRANSPORT_PUSH_OPTIONS (1<<14)
125 #define TRANSPORT_RECURSE_SUBMODULES_ONLY (1<<15)
126
127 extern int transport_summary_width(const struct ref *refs);
128
129 /* Returns a transport suitable for the url */
130 struct transport *transport_get(struct remote *, const char *);
131
132 /*
133 * Check whether a transport is allowed by the environment.
134 *
135 * Type should generally be the URL scheme, as described in
136 * Documentation/git.txt
137 *
138 * from_user specifies if the transport was given by the user. If unknown pass
139 * a -1 to read from the environment to determine if the transport was given by
140 * the user.
141 *
142 */
143 int is_transport_allowed(const char *type, int from_user);
144
145 /*
146 * Check whether a transport is allowed by the environment,
147 * and die otherwise.
148 */
149 void transport_check_allowed(const char *type);
150
151 /* Transport options which apply to git:// and scp-style URLs */
152
153 /* The program to use on the remote side to send a pack */
154 #define TRANS_OPT_UPLOADPACK "uploadpack"
155
156 /* The program to use on the remote side to receive a pack */
157 #define TRANS_OPT_RECEIVEPACK "receivepack"
158
159 /* Transfer the data as a thin pack if not null */
160 #define TRANS_OPT_THIN "thin"
161
162 /* Check the current value of the remote ref */
163 #define TRANS_OPT_CAS "cas"
164
165 /* Keep the pack that was transferred if not null */
166 #define TRANS_OPT_KEEP "keep"
167
168 /* Limit the depth of the fetch if not null */
169 #define TRANS_OPT_DEPTH "depth"
170
171 /* Limit the depth of the fetch based on time if not null */
172 #define TRANS_OPT_DEEPEN_SINCE "deepen-since"
173
174 /* Limit the depth of the fetch based on revs if not null */
175 #define TRANS_OPT_DEEPEN_NOT "deepen-not"
176
177 /* Limit the deepen of the fetch if not null */
178 #define TRANS_OPT_DEEPEN_RELATIVE "deepen-relative"
179
180 /* Aggressively fetch annotated tags if possible */
181 #define TRANS_OPT_FOLLOWTAGS "followtags"
182
183 /* Accept refs that may update .git/shallow without --depth */
184 #define TRANS_OPT_UPDATE_SHALLOW "updateshallow"
185
186 /* Send push certificates */
187 #define TRANS_OPT_PUSH_CERT "pushcert"
188
189 /* Indicate that these objects are being fetched by a promisor */
190 #define TRANS_OPT_FROM_PROMISOR "from-promisor"
191
192 /*
193 * Indicate that only the objects wanted need to be fetched, not their
194 * dependents
195 */
196 #define TRANS_OPT_NO_DEPENDENTS "no-dependents"
197
198 /* Filter objects for partial clone and fetch */
199 #define TRANS_OPT_LIST_OBJECTS_FILTER "filter"
200
201 /**
202 * Returns 0 if the option was used, non-zero otherwise. Prints a
203 * message to stderr if the option is not used.
204 **/
205 int transport_set_option(struct transport *transport, const char *name,
206 const char *value);
207 void transport_set_verbosity(struct transport *transport, int verbosity,
208 int force_progress);
209
210 #define REJECT_NON_FF_HEAD 0x01
211 #define REJECT_NON_FF_OTHER 0x02
212 #define REJECT_ALREADY_EXISTS 0x04
213 #define REJECT_FETCH_FIRST 0x08
214 #define REJECT_NEEDS_FORCE 0x10
215
216 int transport_push(struct transport *connection,
217 struct refspec *rs, int flags,
218 unsigned int * reject_reasons);
219
220 /*
221 * Retrieve refs from a remote.
222 *
223 * Optionally a list of ref prefixes can be provided which can be sent to the
224 * server (when communicating using protocol v2) to enable it to limit the ref
225 * advertisement. Since ref filtering is done on the server's end (and only
226 * when using protocol v2), this can return refs which don't match the provided
227 * ref_prefixes.
228 */
229 const struct ref *transport_get_remote_refs(struct transport *transport,
230 const struct argv_array *ref_prefixes);
231
232 int transport_fetch_refs(struct transport *transport, struct ref *refs,
233 struct ref **fetched_refs);
234 void transport_unlock_pack(struct transport *transport);
235 int transport_disconnect(struct transport *transport);
236 char *transport_anonymize_url(const char *url);
237 void transport_take_over(struct transport *transport,
238 struct child_process *child);
239
240 int transport_connect(struct transport *transport, const char *name,
241 const char *exec, int fd[2]);
242
243 /* Transport methods defined outside transport.c */
244 int transport_helper_init(struct transport *transport, const char *name);
245 int bidirectional_transfer_loop(int input, int output);
246
247 /* common methods used by transport.c and builtin/send-pack.c */
248 void transport_update_tracking_ref(struct remote *remote, struct ref *ref, int verbose);
249
250 int transport_refs_pushed(struct ref *ref);
251
252 void transport_print_push_status(const char *dest, struct ref *refs,
253 int verbose, int porcelain, unsigned int *reject_reasons);
254
255 typedef void alternate_ref_fn(const char *refname, const struct object_id *oid, void *);
256 extern void for_each_alternate_ref(alternate_ref_fn, void *);
257 #endif