blob: 519e04227b72f92a338836ce457d2a5be2b80218 [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"
Alexander Potashev8ca12c02009-01-10 15:07:50 +03003#include "dir.h"
Junio C Hamanodd8e9122011-05-12 14:31:08 -07004#include "streaming.h"
Linus Torvalds12dccc12005-06-05 21:59:54 -07005
Kjetil Barvik81a9aa62009-02-09 21:54:08 +01006static void create_directories(const char *path, int path_len,
7 const struct checkout *state)
Linus Torvalds12dccc12005-06-05 21:59:54 -07008{
Jeff King3733e692016-02-22 17:44:28 -05009 char *buf = xmallocz(path_len);
Kjetil Barvik81a9aa62009-02-09 21:54:08 +010010 int len = 0;
Linus Torvalds12dccc12005-06-05 21:59:54 -070011
Kjetil Barvik81a9aa62009-02-09 21:54:08 +010012 while (len < path_len) {
13 do {
14 buf[len] = path[len];
15 len++;
16 } while (len < path_len && path[len] != '/');
17 if (len >= path_len)
18 break;
Linus Torvalds12dccc12005-06-05 21:59:54 -070019 buf[len] = 0;
Junio C Hamanofa2e71c2007-07-17 22:58:28 -070020
Kjetil Barvikbad4a542009-01-18 16:14:52 +010021 /*
22 * For 'checkout-index --prefix=<dir>', <dir> is
23 * allowed to be a symlink to an existing directory,
24 * and we set 'state->base_dir_len' below, such that
25 * we test the path components of the prefix with the
26 * stat() function instead of the lstat() function.
27 */
Kjetil Barvik57199892009-02-09 21:54:06 +010028 if (has_dirs_only_path(buf, len, state->base_dir_len))
Junio C Hamanofa2e71c2007-07-17 22:58:28 -070029 continue; /* ok, it is already a directory. */
30
31 /*
Kjetil Barvikbad4a542009-01-18 16:14:52 +010032 * If this mkdir() would fail, it could be that there
33 * is already a symlink or something else exists
34 * there, therefore we then try to unlink it and try
35 * one more time to create the directory.
Junio C Hamanofa2e71c2007-07-17 22:58:28 -070036 */
Junio C Hamanof312de02005-07-06 01:21:46 -070037 if (mkdir(buf, 0777)) {
Junio C Hamanofa2e71c2007-07-17 22:58:28 -070038 if (errno == EEXIST && state->force &&
Alex Riesen691f1a22009-04-29 23:22:56 +020039 !unlink_or_warn(buf) && !mkdir(buf, 0777))
Junio C Hamanofa2e71c2007-07-17 22:58:28 -070040 continue;
Thomas Rast0721c312009-06-27 17:58:47 +020041 die_errno("cannot create directory at '%s'", buf);
Linus Torvalds12dccc12005-06-05 21:59:54 -070042 }
43 }
44 free(buf);
45}
46
Michael Haggerty2f29e0c2014-03-13 10:19:08 +010047static void remove_subtree(struct strbuf *path)
Linus Torvalds12dccc12005-06-05 21:59:54 -070048{
Michael Haggerty2f29e0c2014-03-13 10:19:08 +010049 DIR *dir = opendir(path->buf);
Linus Torvalds12dccc12005-06-05 21:59:54 -070050 struct dirent *de;
Michael Haggerty2f29e0c2014-03-13 10:19:08 +010051 int origlen = path->len;
Junio C Hamanoa6080a02007-06-07 00:04:01 -070052
Linus Torvalds12dccc12005-06-05 21:59:54 -070053 if (!dir)
Michael Haggerty2f29e0c2014-03-13 10:19:08 +010054 die_errno("cannot opendir '%s'", path->buf);
Linus Torvalds12dccc12005-06-05 21:59:54 -070055 while ((de = readdir(dir)) != NULL) {
56 struct stat st;
Michael Haggerty2f29e0c2014-03-13 10:19:08 +010057
Alexander Potashev8ca12c02009-01-10 15:07:50 +030058 if (is_dot_or_dotdot(de->d_name))
Linus Torvalds12dccc12005-06-05 21:59:54 -070059 continue;
Michael Haggerty2f29e0c2014-03-13 10:19:08 +010060
61 strbuf_addch(path, '/');
62 strbuf_addstr(path, de->d_name);
63 if (lstat(path->buf, &st))
64 die_errno("cannot lstat '%s'", path->buf);
Linus Torvalds12dccc12005-06-05 21:59:54 -070065 if (S_ISDIR(st.st_mode))
Michael Haggerty2f29e0c2014-03-13 10:19:08 +010066 remove_subtree(path);
67 else if (unlink(path->buf))
68 die_errno("cannot unlink '%s'", path->buf);
69 strbuf_setlen(path, origlen);
Linus Torvalds12dccc12005-06-05 21:59:54 -070070 }
71 closedir(dir);
Michael Haggerty2f29e0c2014-03-13 10:19:08 +010072 if (rmdir(path->buf))
73 die_errno("cannot rmdir '%s'", path->buf);
Linus Torvalds12dccc12005-06-05 21:59:54 -070074}
75
Linus Torvaldsd48a72f2005-07-14 09:58:45 -070076static int create_file(const char *path, unsigned int mode)
Linus Torvalds12dccc12005-06-05 21:59:54 -070077{
Linus Torvalds12dccc12005-06-05 21:59:54 -070078 mode = (mode & 0100) ? 0777 : 0666;
Alex Riesen781411e2006-01-05 09:58:06 +010079 return open(path, O_WRONLY | O_CREAT | O_EXCL, mode);
Linus Torvalds12dccc12005-06-05 21:59:54 -070080}
81
Nguyễn Thái Ngọc Duy9c5e6c82013-07-09 22:29:00 +070082static void *read_blob_entry(const struct cache_entry *ce, unsigned long *size)
Linus Torvaldsf0807e62007-04-13 09:26:04 -070083{
84 enum object_type type;
85 void *new = read_sha1_file(ce->sha1, &type, size);
86
87 if (new) {
88 if (type == OBJ_BLOB)
89 return new;
90 free(new);
91 }
92 return NULL;
93}
94
Nguyễn Thái Ngọc Duy9c5e6c82013-07-09 22:29:00 +070095static int open_output_fd(char *path, const struct cache_entry *ce, int to_tempfile)
Junio C Hamanofd5db552011-05-12 21:36:42 -070096{
97 int symlink = (ce->ce_mode & S_IFMT) != S_IFREG;
98 if (to_tempfile) {
Jeff King330c8e22015-09-24 17:06:53 -040099 xsnprintf(path, TEMPORARY_FILENAME_LENGTH, "%s",
100 symlink ? ".merge_link_XXXXXX" : ".merge_file_XXXXXX");
Junio C Hamanofd5db552011-05-12 21:36:42 -0700101 return mkstemp(path);
102 } else {
103 return create_file(path, !symlink ? ce->ce_mode : 0666);
104 }
105}
106
107static int fstat_output(int fd, const struct checkout *state, struct stat *st)
108{
109 /* use fstat() only when path == ce->name */
110 if (fstat_is_reliable() &&
111 state->refresh_cache && !state->base_dir_len) {
112 fstat(fd, st);
113 return 1;
114 }
115 return 0;
116}
117
Nguyễn Thái Ngọc Duy9c5e6c82013-07-09 22:29:00 +0700118static int streaming_write_entry(const struct cache_entry *ce, char *path,
Junio C Hamanob6691092011-05-20 14:33:31 -0700119 struct stream_filter *filter,
Junio C Hamanodd8e9122011-05-12 14:31:08 -0700120 const struct checkout *state, int to_tempfile,
121 int *fstat_done, struct stat *statbuf)
122{
Jeff Kingd9c31e12013-03-25 17:49:36 -0400123 int result = 0;
Junio C Hamano47a02ff2012-03-07 17:54:15 +0700124 int fd;
Junio C Hamanodd8e9122011-05-12 14:31:08 -0700125
126 fd = open_output_fd(path, ce, to_tempfile);
Jeff Kingd9c31e12013-03-25 17:49:36 -0400127 if (fd < 0)
128 return -1;
129
130 result |= stream_blob_to_fd(fd, ce->sha1, filter, 1);
131 *fstat_done = fstat_output(fd, state, statbuf);
132 result |= close(fd);
133
134 if (result)
Junio C Hamanodd8e9122011-05-12 14:31:08 -0700135 unlink(path);
136 return result;
137}
138
Nguyễn Thái Ngọc Duy9c5e6c82013-07-09 22:29:00 +0700139static int write_entry(struct cache_entry *ce,
140 char *path, const struct checkout *state, int to_tempfile)
Linus Torvalds12dccc12005-06-05 21:59:54 -0700141{
Kjetil Barvik4857c762009-02-09 21:54:50 +0100142 unsigned int ce_mode_s_ifmt = ce->ce_mode & S_IFMT;
Kjetil Barvike4c72922009-02-09 21:54:51 +0100143 int fd, ret, fstat_done = 0;
Kjetil Barvik4857c762009-02-09 21:54:50 +0100144 char *new;
145 struct strbuf buf = STRBUF_INIT;
146 unsigned long size;
147 size_t wrote, newsize = 0;
Kjetil Barvike4c72922009-02-09 21:54:51 +0100148 struct stat st;
Linus Torvalds12dccc12005-06-05 21:59:54 -0700149
Junio C Hamanob6691092011-05-20 14:33:31 -0700150 if (ce_mode_s_ifmt == S_IFREG) {
John Keeping7297a442013-03-14 20:00:51 +0000151 struct stream_filter *filter = get_stream_filter(ce->name, ce->sha1);
Junio C Hamanob6691092011-05-20 14:33:31 -0700152 if (filter &&
153 !streaming_write_entry(ce, path, filter,
154 state, to_tempfile,
155 &fstat_done, &st))
156 goto finish;
157 }
Junio C Hamanodd8e9122011-05-12 14:31:08 -0700158
Kjetil Barvik4857c762009-02-09 21:54:50 +0100159 switch (ce_mode_s_ifmt) {
Linus Torvalds12dccc12005-06-05 21:59:54 -0700160 case S_IFREG:
Kjetil Barvik4857c762009-02-09 21:54:50 +0100161 case S_IFLNK:
162 new = read_blob_entry(ce, &size);
Linus Torvaldsf0807e62007-04-13 09:26:04 -0700163 if (!new)
Nguyễn Thái Ngọc Duyd43e9072010-11-28 11:36:38 +0700164 return error("unable to read sha1 file of %s (%s)",
Linus Torvaldsf0807e62007-04-13 09:26:04 -0700165 path, sha1_to_hex(ce->sha1));
Junio C Hamano1a9d7e92007-08-14 01:41:02 -0700166
Kjetil Barvik4857c762009-02-09 21:54:50 +0100167 if (ce_mode_s_ifmt == S_IFLNK && has_symlinks && !to_tempfile) {
168 ret = symlink(new, path);
169 free(new);
170 if (ret)
Nguyễn Thái Ngọc Duye1ebb3c2016-05-08 16:47:44 +0700171 return error_errno("unable to create symlink %s",
172 path);
Kjetil Barvik4857c762009-02-09 21:54:50 +0100173 break;
174 }
175
Junio C Hamano1a9d7e92007-08-14 01:41:02 -0700176 /*
177 * Convert from git internal format to working tree format
178 */
Kjetil Barvik4857c762009-02-09 21:54:50 +0100179 if (ce_mode_s_ifmt == S_IFREG &&
180 convert_to_working_tree(ce->name, new, size, &buf)) {
Junio C Hamano1a9d7e92007-08-14 01:41:02 -0700181 free(new);
René Scharfec32f7492007-10-21 11:23:49 +0200182 new = strbuf_detach(&buf, &newsize);
183 size = newsize;
Junio C Hamano1a9d7e92007-08-14 01:41:02 -0700184 }
185
Junio C Hamanofd5db552011-05-12 21:36:42 -0700186 fd = open_output_fd(path, ce, to_tempfile);
Linus Torvalds12dccc12005-06-05 21:59:54 -0700187 if (fd < 0) {
188 free(new);
Nguyễn Thái Ngọc Duye1ebb3c2016-05-08 16:47:44 +0700189 return error_errno("unable to create file %s", path);
Linus Torvalds12dccc12005-06-05 21:59:54 -0700190 }
Linus Torvalds6c510be2007-02-13 11:07:23 -0800191
Andy Whitcroft93822c22007-01-08 15:58:23 +0000192 wrote = write_in_full(fd, new, size);
Junio C Hamanofd5db552011-05-12 21:36:42 -0700193 if (!to_tempfile)
194 fstat_done = fstat_output(fd, state, &st);
Linus Torvalds12dccc12005-06-05 21:59:54 -0700195 close(fd);
196 free(new);
197 if (wrote != size)
Nguyễn Thái Ngọc Duyd43e9072010-11-28 11:36:38 +0700198 return error("unable to write file %s", path);
Linus Torvalds12dccc12005-06-05 21:59:54 -0700199 break;
Martin Waitz302b9282007-05-21 22:08:28 +0200200 case S_IFGITLINK:
Linus Torvaldsf0807e62007-04-13 09:26:04 -0700201 if (to_tempfile)
Thomas Rast42063f92013-07-18 14:26:55 +0200202 return error("cannot create temporary submodule %s", path);
Linus Torvaldsf0807e62007-04-13 09:26:04 -0700203 if (mkdir(path, 0777) < 0)
Thomas Rast42063f92013-07-18 14:26:55 +0200204 return error("cannot create submodule directory %s", path);
Linus Torvaldsf0807e62007-04-13 09:26:04 -0700205 break;
Linus Torvalds12dccc12005-06-05 21:59:54 -0700206 default:
Nguyễn Thái Ngọc Duyd43e9072010-11-28 11:36:38 +0700207 return error("unknown file mode for %s in index", path);
Linus Torvalds12dccc12005-06-05 21:59:54 -0700208 }
209
Junio C Hamanodd8e9122011-05-12 14:31:08 -0700210finish:
Linus Torvalds6ee67f22005-06-05 23:15:40 -0700211 if (state->refresh_cache) {
Nguyễn Thái Ngọc Duyd4a20242014-06-13 19:19:34 +0700212 assert(state->istate);
Kjetil Barvike4c72922009-02-09 21:54:51 +0100213 if (!fstat_done)
214 lstat(ce->name, &st);
Linus Torvalds12dccc12005-06-05 21:59:54 -0700215 fill_stat_cache_info(ce, &st);
Nguyễn Thái Ngọc Duy078a58e2014-06-13 19:19:39 +0700216 ce->ce_flags |= CE_UPDATE_IN_BASE;
Nguyễn Thái Ngọc Duyd4a20242014-06-13 19:19:34 +0700217 state->istate->cache_changed |= CE_ENTRY_CHANGED;
Linus Torvalds12dccc12005-06-05 21:59:54 -0700218 }
219 return 0;
220}
221
Linus Torvaldsb6986d82009-07-29 20:22:25 -0700222/*
223 * This is like 'lstat()', except it refuses to follow symlinks
Junio C Hamanoda02ca52009-08-16 23:53:12 -0700224 * in the path, after skipping "skiplen".
Linus Torvaldsb6986d82009-07-29 20:22:25 -0700225 */
Junio C Hamano61b97df2010-01-11 22:27:31 -0800226static int check_path(const char *path, int len, struct stat *st, int skiplen)
Linus Torvaldsb6986d82009-07-29 20:22:25 -0700227{
Junio C Hamanoda02ca52009-08-16 23:53:12 -0700228 const char *slash = path + len;
229
230 while (path < slash && *slash != '/')
231 slash--;
232 if (!has_dirs_only_path(path, slash - path, skiplen)) {
Linus Torvaldsb6986d82009-07-29 20:22:25 -0700233 errno = ENOENT;
234 return -1;
235 }
236 return lstat(path, st);
237}
238
Junio C Hamanoaf2a6512013-10-23 10:52:42 -0700239/*
240 * Write the contents from ce out to the working tree.
241 *
242 * When topath[] is not NULL, instead of writing to the working tree
243 * file named by ce, a temporary file is created by this function and
244 * its name is returned in topath[], which must be able to hold at
245 * least TEMPORARY_FILENAME_LENGTH bytes long.
246 */
Nguyễn Thái Ngọc Duy9c5e6c82013-07-09 22:29:00 +0700247int checkout_entry(struct cache_entry *ce,
248 const struct checkout *state, char *topath)
Linus Torvalds12dccc12005-06-05 21:59:54 -0700249{
Michael Haggertyf63272a2014-03-13 10:19:07 +0100250 static struct strbuf path = STRBUF_INIT;
Shawn Pearcede84f992006-03-05 03:24:15 -0500251 struct stat st;
Linus Torvalds12dccc12005-06-05 21:59:54 -0700252
Shawn Pearcede84f992006-03-05 03:24:15 -0500253 if (topath)
254 return write_entry(ce, topath, state, 1);
255
Michael Haggertyf63272a2014-03-13 10:19:07 +0100256 strbuf_reset(&path);
257 strbuf_add(&path, state->base_dir, state->base_dir_len);
258 strbuf_add(&path, ce->name, ce_namelen(ce));
Linus Torvalds12dccc12005-06-05 21:59:54 -0700259
Michael Haggertyf63272a2014-03-13 10:19:07 +0100260 if (!check_path(path.buf, path.len, &st, state->base_dir_len)) {
Nguyễn Thái Ngọc Duy56cac482009-12-14 18:43:58 +0700261 unsigned changed = ce_match_stat(ce, &st, CE_MATCH_IGNORE_VALID|CE_MATCH_IGNORE_SKIP_WORKTREE);
Linus Torvalds12dccc12005-06-05 21:59:54 -0700262 if (!changed)
263 return 0;
264 if (!state->force) {
265 if (!state->quiet)
Michael Haggertyf63272a2014-03-13 10:19:07 +0100266 fprintf(stderr,
267 "%s already exists, no checkout\n",
268 path.buf);
Junio C Hamano4b12dae2005-10-03 12:44:48 -0700269 return -1;
Linus Torvalds12dccc12005-06-05 21:59:54 -0700270 }
271
272 /*
273 * We unlink the old file, to get the new one with the
274 * right permissions (including umask, which is nasty
275 * to emulate by hand - much easier to let the system
276 * just do the right thing)
277 */
Linus Torvaldsd48a72f2005-07-14 09:58:45 -0700278 if (S_ISDIR(st.st_mode)) {
Linus Torvaldsf0807e62007-04-13 09:26:04 -0700279 /* If it is a gitlink, leave it alone! */
Linus Torvalds7a51ed62008-01-14 16:03:17 -0800280 if (S_ISGITLINK(ce->ce_mode))
Linus Torvaldsf0807e62007-04-13 09:26:04 -0700281 return 0;
Linus Torvaldsd48a72f2005-07-14 09:58:45 -0700282 if (!state->force)
Michael Haggertyf63272a2014-03-13 10:19:07 +0100283 return error("%s is a directory", path.buf);
Michael Haggerty2f29e0c2014-03-13 10:19:08 +0100284 remove_subtree(&path);
Michael Haggertyf63272a2014-03-13 10:19:07 +0100285 } else if (unlink(path.buf))
Nguyễn Thái Ngọc Duye1ebb3c2016-05-08 16:47:44 +0700286 return error_errno("unable to unlink old '%s'", path.buf);
Shawn Pearcede84f992006-03-05 03:24:15 -0500287 } else if (state->not_new)
Linus Torvalds12dccc12005-06-05 21:59:54 -0700288 return 0;
Michael Haggertyf63272a2014-03-13 10:19:07 +0100289
290 create_directories(path.buf, path.len, state);
291 return write_entry(ce, path.buf, state, 0);
Linus Torvalds12dccc12005-06-05 21:59:54 -0700292}