blob: 70212af260b53822ad72b169a6601a8e98a95ad0 [file] [log] [blame]
Linus Torvalds12dccc12005-06-05 21:59:54 -07001#include "cache.h"
Peter Eriksen8e440252006-04-02 14:44:09 +02002#include "blob.h"
Stefan Bellercbd53a22018-05-15 16:42:15 -07003#include "object-store.h"
Alexander Potashev8ca12c02009-01-10 15:07:50 +03004#include "dir.h"
Elijah Newrenf394e092023-03-21 06:25:54 +00005#include "gettext.h"
Elijah Newren41771fa2023-02-24 00:09:27 +00006#include "hex.h"
Junio C Hamanodd8e9122011-05-12 14:31:08 -07007#include "streaming.h"
Stefan Beller6d14eac2017-03-14 14:46:40 -07008#include "submodule.h"
Lars Schneider52f1d622017-08-20 17:47:20 +02009#include "progress.h"
Ben Peart883e2482017-09-22 12:35:40 -040010#include "fsmonitor.h"
Matheus Tavaresd052cc02021-03-23 11:19:32 -030011#include "entry.h"
Matheus Tavares04155bd2021-04-18 21:14:53 -030012#include "parallel-checkout.h"
Elijah Newrend5ebb502023-03-21 06:26:01 +000013#include "wrapper.h"
Linus Torvalds12dccc12005-06-05 21:59:54 -070014
Kjetil Barvik81a9aa62009-02-09 21:54:08 +010015static void create_directories(const char *path, int path_len,
16 const struct checkout *state)
Linus Torvalds12dccc12005-06-05 21:59:54 -070017{
Jeff King3733e692016-02-22 17:44:28 -050018 char *buf = xmallocz(path_len);
Kjetil Barvik81a9aa62009-02-09 21:54:08 +010019 int len = 0;
Linus Torvalds12dccc12005-06-05 21:59:54 -070020
Kjetil Barvik81a9aa62009-02-09 21:54:08 +010021 while (len < path_len) {
22 do {
23 buf[len] = path[len];
24 len++;
25 } while (len < path_len && path[len] != '/');
26 if (len >= path_len)
27 break;
Linus Torvalds12dccc12005-06-05 21:59:54 -070028 buf[len] = 0;
Junio C Hamanofa2e71c2007-07-17 22:58:28 -070029
Kjetil Barvikbad4a542009-01-18 16:14:52 +010030 /*
31 * For 'checkout-index --prefix=<dir>', <dir> is
32 * allowed to be a symlink to an existing directory,
33 * and we set 'state->base_dir_len' below, such that
34 * we test the path components of the prefix with the
35 * stat() function instead of the lstat() function.
36 */
Kjetil Barvik57199892009-02-09 21:54:06 +010037 if (has_dirs_only_path(buf, len, state->base_dir_len))
Junio C Hamanofa2e71c2007-07-17 22:58:28 -070038 continue; /* ok, it is already a directory. */
39
40 /*
Kjetil Barvikbad4a542009-01-18 16:14:52 +010041 * If this mkdir() would fail, it could be that there
42 * is already a symlink or something else exists
43 * there, therefore we then try to unlink it and try
44 * one more time to create the directory.
Junio C Hamanofa2e71c2007-07-17 22:58:28 -070045 */
Junio C Hamanof312de02005-07-06 01:21:46 -070046 if (mkdir(buf, 0777)) {
Junio C Hamanofa2e71c2007-07-17 22:58:28 -070047 if (errno == EEXIST && state->force &&
Alex Riesen691f1a22009-04-29 23:22:56 +020048 !unlink_or_warn(buf) && !mkdir(buf, 0777))
Junio C Hamanofa2e71c2007-07-17 22:58:28 -070049 continue;
Thomas Rast0721c312009-06-27 17:58:47 +020050 die_errno("cannot create directory at '%s'", buf);
Linus Torvalds12dccc12005-06-05 21:59:54 -070051 }
52 }
53 free(buf);
54}
55
Michael Haggerty2f29e0c2014-03-13 10:19:08 +010056static void remove_subtree(struct strbuf *path)
Linus Torvalds12dccc12005-06-05 21:59:54 -070057{
Michael Haggerty2f29e0c2014-03-13 10:19:08 +010058 DIR *dir = opendir(path->buf);
Linus Torvalds12dccc12005-06-05 21:59:54 -070059 struct dirent *de;
Michael Haggerty2f29e0c2014-03-13 10:19:08 +010060 int origlen = path->len;
Junio C Hamanoa6080a02007-06-07 00:04:01 -070061
Linus Torvalds12dccc12005-06-05 21:59:54 -070062 if (!dir)
Michael Haggerty2f29e0c2014-03-13 10:19:08 +010063 die_errno("cannot opendir '%s'", path->buf);
Elijah Newrenb548f0f2021-05-12 17:28:22 +000064 while ((de = readdir_skip_dot_and_dotdot(dir)) != NULL) {
Linus Torvalds12dccc12005-06-05 21:59:54 -070065 struct stat st;
Michael Haggerty2f29e0c2014-03-13 10:19:08 +010066
Michael Haggerty2f29e0c2014-03-13 10:19:08 +010067 strbuf_addch(path, '/');
68 strbuf_addstr(path, de->d_name);
69 if (lstat(path->buf, &st))
70 die_errno("cannot lstat '%s'", path->buf);
Linus Torvalds12dccc12005-06-05 21:59:54 -070071 if (S_ISDIR(st.st_mode))
Michael Haggerty2f29e0c2014-03-13 10:19:08 +010072 remove_subtree(path);
73 else if (unlink(path->buf))
74 die_errno("cannot unlink '%s'", path->buf);
75 strbuf_setlen(path, origlen);
Linus Torvalds12dccc12005-06-05 21:59:54 -070076 }
77 closedir(dir);
Michael Haggerty2f29e0c2014-03-13 10:19:08 +010078 if (rmdir(path->buf))
79 die_errno("cannot rmdir '%s'", path->buf);
Linus Torvalds12dccc12005-06-05 21:59:54 -070080}
81
Linus Torvaldsd48a72f2005-07-14 09:58:45 -070082static int create_file(const char *path, unsigned int mode)
Linus Torvalds12dccc12005-06-05 21:59:54 -070083{
Linus Torvalds12dccc12005-06-05 21:59:54 -070084 mode = (mode & 0100) ? 0777 : 0666;
Alex Riesen781411e2006-01-05 09:58:06 +010085 return open(path, O_WRONLY | O_CREAT | O_EXCL, mode);
Linus Torvalds12dccc12005-06-05 21:59:54 -070086}
87
Matt Coopere9aa7622021-11-02 15:46:08 +000088void *read_blob_entry(const struct cache_entry *ce, size_t *size)
Linus Torvaldsf0807e62007-04-13 09:26:04 -070089{
90 enum object_type type;
Matt Coopere9aa7622021-11-02 15:46:08 +000091 unsigned long ul;
92 void *blob_data = read_object_file(&ce->oid, &type, &ul);
Linus Torvaldsf0807e62007-04-13 09:26:04 -070093
Matt Coopere9aa7622021-11-02 15:46:08 +000094 *size = ul;
Brandon Williamsd8f71802018-02-14 10:59:41 -080095 if (blob_data) {
Linus Torvaldsf0807e62007-04-13 09:26:04 -070096 if (type == OBJ_BLOB)
Brandon Williamsd8f71802018-02-14 10:59:41 -080097 return blob_data;
98 free(blob_data);
Linus Torvaldsf0807e62007-04-13 09:26:04 -070099 }
100 return NULL;
101}
102
Nguyễn Thái Ngọc Duy9c5e6c82013-07-09 22:29:00 +0700103static int open_output_fd(char *path, const struct cache_entry *ce, int to_tempfile)
Junio C Hamanofd5db552011-05-12 21:36:42 -0700104{
105 int symlink = (ce->ce_mode & S_IFMT) != S_IFREG;
106 if (to_tempfile) {
Jeff King330c8e22015-09-24 17:06:53 -0400107 xsnprintf(path, TEMPORARY_FILENAME_LENGTH, "%s",
108 symlink ? ".merge_link_XXXXXX" : ".merge_file_XXXXXX");
Junio C Hamanofd5db552011-05-12 21:36:42 -0700109 return mkstemp(path);
110 } else {
111 return create_file(path, !symlink ? ce->ce_mode : 0666);
112 }
113}
114
Matheus Tavares49cfd902021-03-23 11:19:33 -0300115int fstat_checkout_output(int fd, const struct checkout *state, struct stat *st)
Junio C Hamanofd5db552011-05-12 21:36:42 -0700116{
117 /* use fstat() only when path == ce->name */
118 if (fstat_is_reliable() &&
119 state->refresh_cache && !state->base_dir_len) {
Matheus Tavares35e6e212020-07-08 23:10:39 -0300120 return !fstat(fd, st);
Junio C Hamanofd5db552011-05-12 21:36:42 -0700121 }
122 return 0;
123}
124
Nguyễn Thái Ngọc Duy9c5e6c82013-07-09 22:29:00 +0700125static int streaming_write_entry(const struct cache_entry *ce, char *path,
Junio C Hamanob6691092011-05-20 14:33:31 -0700126 struct stream_filter *filter,
Junio C Hamanodd8e9122011-05-12 14:31:08 -0700127 const struct checkout *state, int to_tempfile,
128 int *fstat_done, struct stat *statbuf)
129{
Jeff Kingd9c31e12013-03-25 17:49:36 -0400130 int result = 0;
Junio C Hamano47a02ff2012-03-07 17:54:15 +0700131 int fd;
Junio C Hamanodd8e9122011-05-12 14:31:08 -0700132
133 fd = open_output_fd(path, ce, to_tempfile);
Jeff Kingd9c31e12013-03-25 17:49:36 -0400134 if (fd < 0)
135 return -1;
136
brian m. carlson7eda0e42016-09-05 20:07:59 +0000137 result |= stream_blob_to_fd(fd, &ce->oid, filter, 1);
Matheus Tavares49cfd902021-03-23 11:19:33 -0300138 *fstat_done = fstat_checkout_output(fd, state, statbuf);
Jeff Kingd9c31e12013-03-25 17:49:36 -0400139 result |= close(fd);
140
141 if (result)
Junio C Hamanodd8e9122011-05-12 14:31:08 -0700142 unlink(path);
143 return result;
144}
145
Lars Schneider2841e8f2017-06-30 22:41:28 +0200146void enable_delayed_checkout(struct checkout *state)
147{
148 if (!state->delayed_checkout) {
149 state->delayed_checkout = xmalloc(sizeof(*state->delayed_checkout));
150 state->delayed_checkout->state = CE_CAN_DELAY;
Ævar Arnfjörð Bjarmasonbc40dfb2021-07-01 12:51:29 +0200151 string_list_init_nodup(&state->delayed_checkout->filters);
152 string_list_init_nodup(&state->delayed_checkout->paths);
Lars Schneider2841e8f2017-06-30 22:41:28 +0200153 }
154}
155
156static int remove_available_paths(struct string_list_item *item, void *cb_data)
157{
158 struct string_list *available_paths = cb_data;
159 struct string_list_item *available;
160
161 available = string_list_lookup(available_paths, item->string);
162 if (available)
Matheus Tavares611c7782022-07-14 08:49:12 -0300163 available->util = item->util;
Lars Schneider2841e8f2017-06-30 22:41:28 +0200164 return !available;
165}
166
Matheus Tavares611c7782022-07-14 08:49:12 -0300167int finish_delayed_checkout(struct checkout *state, int show_progress)
Lars Schneider2841e8f2017-06-30 22:41:28 +0200168{
169 int errs = 0;
SZEDER Gáborbf6d8192021-09-09 03:10:12 +0200170 unsigned processed_paths = 0;
Lars Schneider52f1d622017-08-20 17:47:20 +0200171 off_t filtered_bytes = 0;
Lars Schneider2841e8f2017-06-30 22:41:28 +0200172 struct string_list_item *filter, *path;
SZEDER Gáborbf6d8192021-09-09 03:10:12 +0200173 struct progress *progress = NULL;
Lars Schneider2841e8f2017-06-30 22:41:28 +0200174 struct delayed_checkout *dco = state->delayed_checkout;
175
176 if (!state->delayed_checkout)
177 return errs;
178
179 dco->state = CE_RETRY;
SZEDER Gáborbf6d8192021-09-09 03:10:12 +0200180 if (show_progress)
181 progress = start_delayed_progress(_("Filtering content"), dco->paths.nr);
Lars Schneider2841e8f2017-06-30 22:41:28 +0200182 while (dco->filters.nr > 0) {
183 for_each_string_list_item(filter, &dco->filters) {
184 struct string_list available_paths = STRING_LIST_INIT_NODUP;
185
186 if (!async_query_available_blobs(filter->string, &available_paths)) {
187 /* Filter reported an error */
188 errs = 1;
189 filter->string = "";
190 continue;
191 }
192 if (available_paths.nr <= 0) {
193 /*
194 * Filter responded with no entries. That means
195 * the filter is done and we can remove the
196 * filter from the list (see
197 * "string_list_remove_empty_items" call below).
198 */
199 filter->string = "";
200 continue;
201 }
202
203 /*
204 * In dco->paths we store a list of all delayed paths.
205 * The filter just send us a list of available paths.
206 * Remove them from the list.
207 */
208 filter_string_list(&dco->paths, 0,
209 &remove_available_paths, &available_paths);
210
211 for_each_string_list_item(path, &available_paths) {
212 struct cache_entry* ce;
213
214 if (!path->util) {
215 error("external filter '%s' signaled that '%s' "
216 "is now available although it has not been "
217 "delayed earlier",
218 filter->string, path->string);
219 errs |= 1;
220
221 /*
222 * Do not ask the filter for available blobs,
223 * again, as the filter is likely buggy.
224 */
225 filter->string = "";
226 continue;
227 }
228 ce = index_file_exists(state->istate, path->string,
229 strlen(path->string), 0);
Lars Schneider52f1d622017-08-20 17:47:20 +0200230 if (ce) {
SZEDER Gáborbf6d8192021-09-09 03:10:12 +0200231 display_progress(progress, ++processed_paths);
Matheus Tavares611c7782022-07-14 08:49:12 -0300232 errs |= checkout_entry(ce, state, NULL, path->util);
Lars Schneider52f1d622017-08-20 17:47:20 +0200233 filtered_bytes += ce->ce_stat_data.sd_size;
234 display_throughput(progress, filtered_bytes);
235 } else
236 errs = 1;
Lars Schneider2841e8f2017-06-30 22:41:28 +0200237 }
238 }
239 string_list_remove_empty_items(&dco->filters, 0);
240 }
Lars Schneider52f1d622017-08-20 17:47:20 +0200241 stop_progress(&progress);
Lars Schneider2841e8f2017-06-30 22:41:28 +0200242 string_list_clear(&dco->filters, 0);
243
244 /* At this point we should not have any delayed paths anymore. */
245 errs |= dco->paths.nr;
246 for_each_string_list_item(path, &dco->paths) {
247 error("'%s' was not filtered properly", path->string);
248 }
249 string_list_clear(&dco->paths, 0);
250
251 free(dco);
252 state->delayed_checkout = NULL;
253
254 return errs;
255}
256
Matheus Tavares584a0d12021-03-23 11:19:34 -0300257void update_ce_after_write(const struct checkout *state, struct cache_entry *ce,
258 struct stat *st)
259{
260 if (state->refresh_cache) {
261 assert(state->istate);
262 fill_stat_cache_info(state->istate, ce, st);
263 ce->ce_flags |= CE_UPDATE_IN_BASE;
264 mark_fsmonitor_invalid(state->istate, ce);
265 state->istate->cache_changed |= CE_ENTRY_CHANGED;
266 }
267}
268
Matheus Tavares30419e72021-03-23 11:19:35 -0300269/* Note: ca is used (and required) iff the entry refers to a regular file. */
270static int write_entry(struct cache_entry *ce, char *path, struct conv_attrs *ca,
Matheus Tavares611c7782022-07-14 08:49:12 -0300271 const struct checkout *state, int to_tempfile,
272 int *nr_checkouts)
Linus Torvalds12dccc12005-06-05 21:59:54 -0700273{
Kjetil Barvik4857c762009-02-09 21:54:50 +0100274 unsigned int ce_mode_s_ifmt = ce->ce_mode & S_IFMT;
Jeff Kingc602d3a2017-10-09 13:48:52 -0400275 struct delayed_checkout *dco = state->delayed_checkout;
Kjetil Barvike4c72922009-02-09 21:54:51 +0100276 int fd, ret, fstat_done = 0;
Brandon Williamsd8f71802018-02-14 10:59:41 -0800277 char *new_blob;
Kjetil Barvik4857c762009-02-09 21:54:50 +0100278 struct strbuf buf = STRBUF_INIT;
Matt Coopere9aa7622021-11-02 15:46:08 +0000279 size_t size;
Jeff King564bde92017-09-13 13:16:28 -0400280 ssize_t wrote;
281 size_t newsize = 0;
Kjetil Barvike4c72922009-02-09 21:54:51 +0100282 struct stat st;
Stefan Beller6d14eac2017-03-14 14:46:40 -0700283 const struct submodule *sub;
brian m. carlsonc397aac2020-03-16 18:05:03 +0000284 struct checkout_metadata meta;
Matheus Tavares611c7782022-07-14 08:49:12 -0300285 static int scratch_nr_checkouts;
brian m. carlsonc397aac2020-03-16 18:05:03 +0000286
287 clone_checkout_metadata(&meta, &state->meta, &ce->oid);
Linus Torvalds12dccc12005-06-05 21:59:54 -0700288
Junio C Hamanob6691092011-05-20 14:33:31 -0700289 if (ce_mode_s_ifmt == S_IFREG) {
Matheus Tavares30419e72021-03-23 11:19:35 -0300290 struct stream_filter *filter = get_stream_filter_ca(ca, &ce->oid);
Junio C Hamanob6691092011-05-20 14:33:31 -0700291 if (filter &&
292 !streaming_write_entry(ce, path, filter,
293 state, to_tempfile,
294 &fstat_done, &st))
295 goto finish;
296 }
Junio C Hamanodd8e9122011-05-12 14:31:08 -0700297
Kjetil Barvik4857c762009-02-09 21:54:50 +0100298 switch (ce_mode_s_ifmt) {
Kjetil Barvik4857c762009-02-09 21:54:50 +0100299 case S_IFLNK:
Brandon Williamsd8f71802018-02-14 10:59:41 -0800300 new_blob = read_blob_entry(ce, &size);
301 if (!new_blob)
Nguyễn Thái Ngọc Duyd43e9072010-11-28 11:36:38 +0700302 return error("unable to read sha1 file of %s (%s)",
Matheus Tavares9334ea82021-02-16 11:06:51 -0300303 ce->name, oid_to_hex(&ce->oid));
Junio C Hamano1a9d7e92007-08-14 01:41:02 -0700304
Jeff King7cbbf9d2017-10-09 13:50:05 -0400305 /*
306 * We can't make a real symlink; write out a regular file entry
307 * with the symlink destination as its contents.
308 */
309 if (!has_symlinks || to_tempfile)
310 goto write_file_entry;
311
Brandon Williamsd8f71802018-02-14 10:59:41 -0800312 ret = symlink(new_blob, path);
313 free(new_blob);
Jeff King7cbbf9d2017-10-09 13:50:05 -0400314 if (ret)
315 return error_errno("unable to create symlink %s", path);
316 break;
317
318 case S_IFREG:
Jeff Kingc602d3a2017-10-09 13:48:52 -0400319 /*
320 * We do not send the blob in case of a retry, so do not
321 * bother reading it at all.
322 */
Jeff King7cbbf9d2017-10-09 13:50:05 -0400323 if (dco && dco->state == CE_RETRY) {
Brandon Williamsd8f71802018-02-14 10:59:41 -0800324 new_blob = NULL;
Jeff Kingc602d3a2017-10-09 13:48:52 -0400325 size = 0;
326 } else {
Brandon Williamsd8f71802018-02-14 10:59:41 -0800327 new_blob = read_blob_entry(ce, &size);
328 if (!new_blob)
Jeff Kingc602d3a2017-10-09 13:48:52 -0400329 return error("unable to read sha1 file of %s (%s)",
Matheus Tavares9334ea82021-02-16 11:06:51 -0300330 ce->name, oid_to_hex(&ce->oid));
Kjetil Barvik4857c762009-02-09 21:54:50 +0100331 }
332
Junio C Hamano1a9d7e92007-08-14 01:41:02 -0700333 /*
334 * Convert from git internal format to working tree format
335 */
Jeff King7cbbf9d2017-10-09 13:50:05 -0400336 if (dco && dco->state != CE_NO_DELAY) {
Matheus Tavares30419e72021-03-23 11:19:35 -0300337 ret = async_convert_to_working_tree_ca(ca, ce->name,
338 new_blob, size,
339 &buf, &meta, dco);
Matheus Tavares611c7782022-07-14 08:49:12 -0300340 if (ret) {
341 struct string_list_item *item =
342 string_list_lookup(&dco->paths, ce->name);
343 if (item) {
344 item->util = nr_checkouts ? nr_checkouts
345 : &scratch_nr_checkouts;
346 free(new_blob);
347 goto delayed;
348 }
Lars Schneider2841e8f2017-06-30 22:41:28 +0200349 }
Matheus Tavares30419e72021-03-23 11:19:35 -0300350 } else {
351 ret = convert_to_working_tree_ca(ca, ce->name, new_blob,
352 size, &buf, &meta);
353 }
Junio C Hamano1a9d7e92007-08-14 01:41:02 -0700354
Jeff King7cbbf9d2017-10-09 13:50:05 -0400355 if (ret) {
Brandon Williamsd8f71802018-02-14 10:59:41 -0800356 free(new_blob);
357 new_blob = strbuf_detach(&buf, &newsize);
Jeff King7cbbf9d2017-10-09 13:50:05 -0400358 size = newsize;
359 }
360 /*
361 * No "else" here as errors from convert are OK at this
362 * point. If the error would have been fatal (e.g.
363 * filter is required), then we would have died already.
364 */
365
366 write_file_entry:
Junio C Hamanofd5db552011-05-12 21:36:42 -0700367 fd = open_output_fd(path, ce, to_tempfile);
Linus Torvalds12dccc12005-06-05 21:59:54 -0700368 if (fd < 0) {
Brandon Williamsd8f71802018-02-14 10:59:41 -0800369 free(new_blob);
Nguyễn Thái Ngọc Duye1ebb3c2016-05-08 16:47:44 +0700370 return error_errno("unable to create file %s", path);
Linus Torvalds12dccc12005-06-05 21:59:54 -0700371 }
Linus Torvalds6c510be2007-02-13 11:07:23 -0800372
Brandon Williamsd8f71802018-02-14 10:59:41 -0800373 wrote = write_in_full(fd, new_blob, size);
Junio C Hamanofd5db552011-05-12 21:36:42 -0700374 if (!to_tempfile)
Matheus Tavares49cfd902021-03-23 11:19:33 -0300375 fstat_done = fstat_checkout_output(fd, state, &st);
Linus Torvalds12dccc12005-06-05 21:59:54 -0700376 close(fd);
Brandon Williamsd8f71802018-02-14 10:59:41 -0800377 free(new_blob);
Jeff King564bde92017-09-13 13:16:28 -0400378 if (wrote < 0)
Nguyễn Thái Ngọc Duyd43e9072010-11-28 11:36:38 +0700379 return error("unable to write file %s", path);
Linus Torvalds12dccc12005-06-05 21:59:54 -0700380 break;
Jeff King7cbbf9d2017-10-09 13:50:05 -0400381
Martin Waitz302b9282007-05-21 22:08:28 +0200382 case S_IFGITLINK:
Linus Torvaldsf0807e62007-04-13 09:26:04 -0700383 if (to_tempfile)
Matheus Tavares9334ea82021-02-16 11:06:51 -0300384 return error("cannot create temporary submodule %s", ce->name);
Linus Torvaldsf0807e62007-04-13 09:26:04 -0700385 if (mkdir(path, 0777) < 0)
Thomas Rast42063f92013-07-18 14:26:55 +0200386 return error("cannot create submodule directory %s", path);
Stefan Beller6d14eac2017-03-14 14:46:40 -0700387 sub = submodule_from_ce(ce);
388 if (sub)
Ævar Arnfjörð Bjarmason4002ec32022-12-20 13:39:56 +0100389 return submodule_move_head(ce->name, state->super_prefix,
Stefan Bellercd279e22017-04-18 14:37:22 -0700390 NULL, oid_to_hex(&ce->oid),
391 state->force ? SUBMODULE_MOVE_HEAD_FORCE : 0);
Linus Torvaldsf0807e62007-04-13 09:26:04 -0700392 break;
Jeff King7cbbf9d2017-10-09 13:50:05 -0400393
Linus Torvalds12dccc12005-06-05 21:59:54 -0700394 default:
Matheus Tavares9334ea82021-02-16 11:06:51 -0300395 return error("unknown file mode for %s in index", ce->name);
Linus Torvalds12dccc12005-06-05 21:59:54 -0700396 }
397
Junio C Hamanodd8e9122011-05-12 14:31:08 -0700398finish:
Linus Torvalds6ee67f22005-06-05 23:15:40 -0700399 if (state->refresh_cache) {
Matheus Tavares584a0d12021-03-23 11:19:34 -0300400 if (!fstat_done && lstat(ce->name, &st) < 0)
401 return error_errno("unable to stat just-written file %s",
402 ce->name);
403 update_ce_after_write(state, ce , &st);
Linus Torvalds12dccc12005-06-05 21:59:54 -0700404 }
Matheus Tavares611c7782022-07-14 08:49:12 -0300405 if (nr_checkouts)
406 (*nr_checkouts)++;
Lars Schneider03b95332017-10-05 12:44:06 +0200407delayed:
Linus Torvalds12dccc12005-06-05 21:59:54 -0700408 return 0;
409}
410
Linus Torvaldsb6986d82009-07-29 20:22:25 -0700411/*
412 * This is like 'lstat()', except it refuses to follow symlinks
Junio C Hamanoda02ca52009-08-16 23:53:12 -0700413 * in the path, after skipping "skiplen".
Linus Torvaldsb6986d82009-07-29 20:22:25 -0700414 */
Junio C Hamano61b97df2010-01-11 22:27:31 -0800415static int check_path(const char *path, int len, struct stat *st, int skiplen)
Linus Torvaldsb6986d82009-07-29 20:22:25 -0700416{
Junio C Hamanoda02ca52009-08-16 23:53:12 -0700417 const char *slash = path + len;
418
419 while (path < slash && *slash != '/')
420 slash--;
421 if (!has_dirs_only_path(path, slash - path, skiplen)) {
Linus Torvaldsb6986d82009-07-29 20:22:25 -0700422 errno = ENOENT;
423 return -1;
424 }
425 return lstat(path, st);
426}
427
Duy Nguyenb8785792018-08-17 20:00:39 +0200428static void mark_colliding_entries(const struct checkout *state,
429 struct cache_entry *ce, struct stat *st)
430{
431 int i, trust_ino = check_stat;
432
Nguyễn Thái Ngọc Duye66ceca2018-11-20 17:28:53 +0100433#if defined(GIT_WINDOWS_NATIVE) || defined(__CYGWIN__)
Duy Nguyenb8785792018-08-17 20:00:39 +0200434 trust_ino = 0;
435#endif
436
437 ce->ce_flags |= CE_MATCHED;
438
Derrick Stolee3450a302021-04-01 01:49:55 +0000439 /* TODO: audit for interaction with sparse-index. */
440 ensure_full_index(state->istate);
Duy Nguyenb8785792018-08-17 20:00:39 +0200441 for (i = 0; i < state->istate->cache_nr; i++) {
442 struct cache_entry *dup = state->istate->cache[i];
443
Matheus Tavares04155bd2021-04-18 21:14:53 -0300444 if (dup == ce) {
445 /*
446 * Parallel checkout doesn't create the files in index
447 * order. So the other side of the collision may appear
448 * after the given cache_entry in the array.
449 */
450 if (parallel_checkout_status() == PC_RUNNING)
451 continue;
452 else
453 break;
454 }
Duy Nguyenb8785792018-08-17 20:00:39 +0200455
456 if (dup->ce_flags & (CE_MATCHED | CE_VALID | CE_SKIP_WORKTREE))
457 continue;
458
Nguyễn Thái Ngọc Duye66ceca2018-11-20 17:28:53 +0100459 if ((trust_ino && !match_stat_data(&dup->ce_stat_data, st)) ||
Duy Nguyenb8785792018-08-17 20:00:39 +0200460 (!trust_ino && !fspathcmp(ce->name, dup->name))) {
461 dup->ce_flags |= CE_MATCHED;
462 break;
463 }
464 }
465}
466
Matheus Tavaresae227512021-03-23 11:19:36 -0300467int checkout_entry_ca(struct cache_entry *ce, struct conv_attrs *ca,
468 const struct checkout *state, char *topath,
469 int *nr_checkouts)
Linus Torvalds12dccc12005-06-05 21:59:54 -0700470{
Michael Haggertyf63272a2014-03-13 10:19:07 +0100471 static struct strbuf path = STRBUF_INIT;
Shawn Pearcede84f992006-03-05 03:24:15 -0500472 struct stat st;
Matheus Tavaresae227512021-03-23 11:19:36 -0300473 struct conv_attrs ca_buf;
Linus Torvalds12dccc12005-06-05 21:59:54 -0700474
Thomas Gummerer536ec182018-12-20 13:48:15 +0000475 if (ce->ce_flags & CE_WT_REMOVE) {
476 if (topath)
477 /*
478 * No content and thus no path to create, so we have
479 * no pathname to return.
480 */
481 BUG("Can't remove entry to a path");
Ævar Arnfjörð Bjarmason4002ec32022-12-20 13:39:56 +0100482 unlink_entry(ce, state->super_prefix);
Thomas Gummerer536ec182018-12-20 13:48:15 +0000483 return 0;
484 }
485
Matheus Tavares30419e72021-03-23 11:19:35 -0300486 if (topath) {
Matheus Tavaresae227512021-03-23 11:19:36 -0300487 if (S_ISREG(ce->ce_mode) && !ca) {
Matheus Tavares30419e72021-03-23 11:19:35 -0300488 convert_attrs(state->istate, &ca_buf, ce->name);
489 ca = &ca_buf;
490 }
Matheus Tavares611c7782022-07-14 08:49:12 -0300491 return write_entry(ce, topath, ca, state, 1, nr_checkouts);
Matheus Tavares30419e72021-03-23 11:19:35 -0300492 }
Shawn Pearcede84f992006-03-05 03:24:15 -0500493
Michael Haggertyf63272a2014-03-13 10:19:07 +0100494 strbuf_reset(&path);
495 strbuf_add(&path, state->base_dir, state->base_dir_len);
496 strbuf_add(&path, ce->name, ce_namelen(ce));
Linus Torvalds12dccc12005-06-05 21:59:54 -0700497
Michael Haggertyf63272a2014-03-13 10:19:07 +0100498 if (!check_path(path.buf, path.len, &st, state->base_dir_len)) {
Stefan Beller6d14eac2017-03-14 14:46:40 -0700499 const struct submodule *sub;
Nguyễn Thái Ngọc Duy74cfc0e2018-08-13 18:14:32 +0200500 unsigned changed = ie_match_stat(state->istate, ce, &st,
501 CE_MATCH_IGNORE_VALID | CE_MATCH_IGNORE_SKIP_WORKTREE);
Stefan Beller6d14eac2017-03-14 14:46:40 -0700502 /*
503 * Needs to be checked before !changed returns early,
504 * as the possibly empty directory was not changed
505 */
506 sub = submodule_from_ce(ce);
507 if (sub) {
508 int err;
509 if (!is_submodule_populated_gently(ce->name, &err)) {
510 struct stat sb;
511 if (lstat(ce->name, &sb))
512 die(_("could not stat file '%s'"), ce->name);
513 if (!(st.st_mode & S_IFDIR))
514 unlink_or_warn(ce->name);
515
Ævar Arnfjörð Bjarmason4002ec32022-12-20 13:39:56 +0100516 return submodule_move_head(ce->name, state->super_prefix,
Stefan Bellercd279e22017-04-18 14:37:22 -0700517 NULL, oid_to_hex(&ce->oid), 0);
Stefan Beller6d14eac2017-03-14 14:46:40 -0700518 } else
Ævar Arnfjörð Bjarmason4002ec32022-12-20 13:39:56 +0100519 return submodule_move_head(ce->name, state->super_prefix,
Stefan Beller6d14eac2017-03-14 14:46:40 -0700520 "HEAD", oid_to_hex(&ce->oid),
Stefan Bellercd279e22017-04-18 14:37:22 -0700521 state->force ? SUBMODULE_MOVE_HEAD_FORCE : 0);
Stefan Beller6d14eac2017-03-14 14:46:40 -0700522 }
523
Linus Torvalds12dccc12005-06-05 21:59:54 -0700524 if (!changed)
525 return 0;
526 if (!state->force) {
527 if (!state->quiet)
Michael Haggertyf63272a2014-03-13 10:19:07 +0100528 fprintf(stderr,
529 "%s already exists, no checkout\n",
530 path.buf);
Junio C Hamano4b12dae2005-10-03 12:44:48 -0700531 return -1;
Linus Torvalds12dccc12005-06-05 21:59:54 -0700532 }
533
Duy Nguyenb8785792018-08-17 20:00:39 +0200534 if (state->clone)
535 mark_colliding_entries(state, ce, &st);
536
Linus Torvalds12dccc12005-06-05 21:59:54 -0700537 /*
538 * We unlink the old file, to get the new one with the
539 * right permissions (including umask, which is nasty
540 * to emulate by hand - much easier to let the system
541 * just do the right thing)
542 */
Linus Torvaldsd48a72f2005-07-14 09:58:45 -0700543 if (S_ISDIR(st.st_mode)) {
Linus Torvaldsf0807e62007-04-13 09:26:04 -0700544 /* If it is a gitlink, leave it alone! */
Linus Torvalds7a51ed62008-01-14 16:03:17 -0800545 if (S_ISGITLINK(ce->ce_mode))
Linus Torvaldsf0807e62007-04-13 09:26:04 -0700546 return 0;
Michael Haggerty2f29e0c2014-03-13 10:19:08 +0100547 remove_subtree(&path);
Michael Haggertyf63272a2014-03-13 10:19:07 +0100548 } else if (unlink(path.buf))
Nguyễn Thái Ngọc Duye1ebb3c2016-05-08 16:47:44 +0700549 return error_errno("unable to unlink old '%s'", path.buf);
Shawn Pearcede84f992006-03-05 03:24:15 -0500550 } else if (state->not_new)
Linus Torvalds12dccc12005-06-05 21:59:54 -0700551 return 0;
Michael Haggertyf63272a2014-03-13 10:19:07 +0100552
553 create_directories(path.buf, path.len, state);
Matheus Tavares30419e72021-03-23 11:19:35 -0300554
Matheus Tavaresae227512021-03-23 11:19:36 -0300555 if (S_ISREG(ce->ce_mode) && !ca) {
Matheus Tavares30419e72021-03-23 11:19:35 -0300556 convert_attrs(state->istate, &ca_buf, ce->name);
557 ca = &ca_buf;
558 }
559
Matheus Tavares611c7782022-07-14 08:49:12 -0300560 if (!enqueue_checkout(ce, ca, nr_checkouts))
Matheus Tavares04155bd2021-04-18 21:14:53 -0300561 return 0;
562
Matheus Tavares611c7782022-07-14 08:49:12 -0300563 return write_entry(ce, path.buf, ca, state, 0, nr_checkouts);
Linus Torvalds12dccc12005-06-05 21:59:54 -0700564}
Thomas Gummererb702dd12018-12-20 13:48:14 +0000565
Ævar Arnfjörð Bjarmason4002ec32022-12-20 13:39:56 +0100566void unlink_entry(const struct cache_entry *ce, const char *super_prefix)
Thomas Gummererb702dd12018-12-20 13:48:14 +0000567{
568 const struct submodule *sub = submodule_from_ce(ce);
569 if (sub) {
570 /* state.force is set at the caller. */
Ævar Arnfjörð Bjarmason4002ec32022-12-20 13:39:56 +0100571 submodule_move_head(ce->name, super_prefix, "HEAD", NULL,
Thomas Gummererb702dd12018-12-20 13:48:14 +0000572 SUBMODULE_MOVE_HEAD_FORCE);
573 }
Matheus Tavaresfab78a02021-03-18 15:43:47 -0300574 if (check_leading_path(ce->name, ce_namelen(ce), 1) >= 0)
Thomas Gummererb702dd12018-12-20 13:48:14 +0000575 return;
576 if (remove_or_warn(ce->ce_mode, ce->name))
577 return;
578 schedule_dir_for_removal(ce->name, ce_namelen(ce));
579}