1 /*
2  * Utilities for paths and pathnames
3  */
4 #include "cache.h"
5 #include "repository.h"
6 #include "strbuf.h"
7 #include "string-list.h"
8 #include "dir.h"
9 #include "worktree.h"
10 #include "submodule-config.h"
11 #include "path.h"
12 #include "packfile.h"
13 #include "object-store.h"
14 #include "lockfile.h"
15 #include "exec-cmd.h"
16 
get_st_mode_bits(const char * path,int * mode)17 static int get_st_mode_bits(const char *path, int *mode)
18 {
19 	struct stat st;
20 	if (lstat(path, &st) < 0)
21 		return -1;
22 	*mode = st.st_mode;
23 	return 0;
24 }
25 
26 static char bad_path[] = "/bad-path/";
27 
get_pathname(void)28 static struct strbuf *get_pathname(void)
29 {
30 	static struct strbuf pathname_array[4] = {
31 		STRBUF_INIT, STRBUF_INIT, STRBUF_INIT, STRBUF_INIT
32 	};
33 	static int index;
34 	struct strbuf *sb = &pathname_array[index];
35 	index = (index + 1) % ARRAY_SIZE(pathname_array);
36 	strbuf_reset(sb);
37 	return sb;
38 }
39 
cleanup_path(const char * path)40 static const char *cleanup_path(const char *path)
41 {
42 	/* Clean it up */
43 	if (skip_prefix(path, "./", &path)) {
44 		while (*path == '/')
45 			path++;
46 	}
47 	return path;
48 }
49 
strbuf_cleanup_path(struct strbuf * sb)50 static void strbuf_cleanup_path(struct strbuf *sb)
51 {
52 	const char *path = cleanup_path(sb->buf);
53 	if (path > sb->buf)
54 		strbuf_remove(sb, 0, path - sb->buf);
55 }
56 
mksnpath(char * buf,size_t n,const char * fmt,...)57 char *mksnpath(char *buf, size_t n, const char *fmt, ...)
58 {
59 	va_list args;
60 	unsigned len;
61 
62 	va_start(args, fmt);
63 	len = vsnprintf(buf, n, fmt, args);
64 	va_end(args);
65 	if (len >= n) {
66 		strlcpy(buf, bad_path, n);
67 		return buf;
68 	}
69 	return (char *)cleanup_path(buf);
70 }
71 
dir_prefix(const char * buf,const char * dir)72 static int dir_prefix(const char *buf, const char *dir)
73 {
74 	int len = strlen(dir);
75 	return !strncmp(buf, dir, len) &&
76 		(is_dir_sep(buf[len]) || buf[len] == '\0');
77 }
78 
79 /* $buf =~ m|$dir/+$file| but without regex */
is_dir_file(const char * buf,const char * dir,const char * file)80 static int is_dir_file(const char *buf, const char *dir, const char *file)
81 {
82 	int len = strlen(dir);
83 	if (strncmp(buf, dir, len) || !is_dir_sep(buf[len]))
84 		return 0;
85 	while (is_dir_sep(buf[len]))
86 		len++;
87 	return !strcmp(buf + len, file);
88 }
89 
replace_dir(struct strbuf * buf,int len,const char * newdir)90 static void replace_dir(struct strbuf *buf, int len, const char *newdir)
91 {
92 	int newlen = strlen(newdir);
93 	int need_sep = (buf->buf[len] && !is_dir_sep(buf->buf[len])) &&
94 		!is_dir_sep(newdir[newlen - 1]);
95 	if (need_sep)
96 		len--;	 /* keep one char, to be replaced with '/'  */
97 	strbuf_splice(buf, 0, len, newdir, newlen);
98 	if (need_sep)
99 		buf->buf[newlen] = '/';
100 }
101 
102 struct common_dir {
103 	/* Not considered garbage for report_linked_checkout_garbage */
104 	unsigned ignore_garbage:1;
105 	unsigned is_dir:1;
106 	/* Belongs to the common dir, though it may contain paths that don't */
107 	unsigned is_common:1;
108 	const char *path;
109 };
110 
111 static struct common_dir common_list[] = {
112 	{ 0, 1, 1, "branches" },
113 	{ 0, 1, 1, "common" },
114 	{ 0, 1, 1, "hooks" },
115 	{ 0, 1, 1, "info" },
116 	{ 0, 0, 0, "info/sparse-checkout" },
117 	{ 1, 1, 1, "logs" },
118 	{ 1, 0, 0, "logs/HEAD" },
119 	{ 0, 1, 0, "logs/refs/bisect" },
120 	{ 0, 1, 0, "logs/refs/rewritten" },
121 	{ 0, 1, 0, "logs/refs/worktree" },
122 	{ 0, 1, 1, "lost-found" },
123 	{ 0, 1, 1, "objects" },
124 	{ 0, 1, 1, "refs" },
125 	{ 0, 1, 0, "refs/bisect" },
126 	{ 0, 1, 0, "refs/rewritten" },
127 	{ 0, 1, 0, "refs/worktree" },
128 	{ 0, 1, 1, "remotes" },
129 	{ 0, 1, 1, "worktrees" },
130 	{ 0, 1, 1, "rr-cache" },
131 	{ 0, 1, 1, "svn" },
132 	{ 0, 0, 1, "config" },
133 	{ 1, 0, 1, "gc.pid" },
134 	{ 0, 0, 1, "packed-refs" },
135 	{ 0, 0, 1, "shallow" },
136 	{ 0, 0, 0, NULL }
137 };
138 
139 /*
140  * A compressed trie.  A trie node consists of zero or more characters that
141  * are common to all elements with this prefix, optionally followed by some
142  * children.  If value is not NULL, the trie node is a terminal node.
143  *
144  * For example, consider the following set of strings:
145  * abc
146  * def
147  * definite
148  * definition
149  *
150  * The trie would look like:
151  * root: len = 0, children a and d non-NULL, value = NULL.
152  *    a: len = 2, contents = bc, value = (data for "abc")
153  *    d: len = 2, contents = ef, children i non-NULL, value = (data for "def")
154  *       i: len = 3, contents = nit, children e and i non-NULL, value = NULL
155  *           e: len = 0, children all NULL, value = (data for "definite")
156  *           i: len = 2, contents = on, children all NULL,
157  *              value = (data for "definition")
158  */
159 struct trie {
160 	struct trie *children[256];
161 	int len;
162 	char *contents;
163 	void *value;
164 };
165 
make_trie_node(const char * key,void * value)166 static struct trie *make_trie_node(const char *key, void *value)
167 {
168 	struct trie *new_node = xcalloc(1, sizeof(*new_node));
169 	new_node->len = strlen(key);
170 	if (new_node->len) {
171 		new_node->contents = xmalloc(new_node->len);
172 		memcpy(new_node->contents, key, new_node->len);
173 	}
174 	new_node->value = value;
175 	return new_node;
176 }
177 
178 /*
179  * Add a key/value pair to a trie.  The key is assumed to be \0-terminated.
180  * If there was an existing value for this key, return it.
181  */
add_to_trie(struct trie * root,const char * key,void * value)182 static void *add_to_trie(struct trie *root, const char *key, void *value)
183 {
184 	struct trie *child;
185 	void *old;
186 	int i;
187 
188 	if (!*key) {
189 		/* we have reached the end of the key */
190 		old = root->value;
191 		root->value = value;
192 		return old;
193 	}
194 
195 	for (i = 0; i < root->len; i++) {
196 		if (root->contents[i] == key[i])
197 			continue;
198 
199 		/*
200 		 * Split this node: child will contain this node's
201 		 * existing children.
202 		 */
203 		child = xmalloc(sizeof(*child));
204 		memcpy(child->children, root->children, sizeof(root->children));
205 
206 		child->len = root->len - i - 1;
207 		if (child->len) {
208 			child->contents = xstrndup(root->contents + i + 1,
209 						   child->len);
210 		}
211 		child->value = root->value;
212 		root->value = NULL;
213 		root->len = i;
214 
215 		memset(root->children, 0, sizeof(root->children));
216 		root->children[(unsigned char)root->contents[i]] = child;
217 
218 		/* This is the newly-added child. */
219 		root->children[(unsigned char)key[i]] =
220 			make_trie_node(key + i + 1, value);
221 		return NULL;
222 	}
223 
224 	/* We have matched the entire compressed section */
225 	if (key[i]) {
226 		child = root->children[(unsigned char)key[root->len]];
227 		if (child) {
228 			return add_to_trie(child, key + root->len + 1, value);
229 		} else {
230 			child = make_trie_node(key + root->len + 1, value);
231 			root->children[(unsigned char)key[root->len]] = child;
232 			return NULL;
233 		}
234 	}
235 
236 	old = root->value;
237 	root->value = value;
238 	return old;
239 }
240 
241 typedef int (*match_fn)(const char *unmatched, void *value, void *baton);
242 
243 /*
244  * Search a trie for some key.  Find the longest /-or-\0-terminated
245  * prefix of the key for which the trie contains a value.  If there is
246  * no such prefix, return -1.  Otherwise call fn with the unmatched
247  * portion of the key and the found value.  If fn returns 0 or
248  * positive, then return its return value.  If fn returns negative,
249  * then call fn with the next-longest /-terminated prefix of the key
250  * (i.e. a parent directory) for which the trie contains a value, and
251  * handle its return value the same way.  If there is no shorter
252  * /-terminated prefix with a value left, then return the negative
253  * return value of the most recent fn invocation.
254  *
255  * The key is partially normalized: consecutive slashes are skipped.
256  *
257  * For example, consider the trie containing only [logs,
258  * logs/refs/bisect], both with values, but not logs/refs.
259  *
260  * | key                | unmatched      | prefix to node   | return value |
261  * |--------------------|----------------|------------------|--------------|
262  * | a                  | not called     | n/a              | -1           |
263  * | logstore           | not called     | n/a              | -1           |
264  * | logs               | \0             | logs             | as per fn    |
265  * | logs/              | /              | logs             | as per fn    |
266  * | logs/refs          | /refs          | logs             | as per fn    |
267  * | logs/refs/         | /refs/         | logs             | as per fn    |
268  * | logs/refs/b        | /refs/b        | logs             | as per fn    |
269  * | logs/refs/bisected | /refs/bisected | logs             | as per fn    |
270  * | logs/refs/bisect   | \0             | logs/refs/bisect | as per fn    |
271  * | logs/refs/bisect/  | /              | logs/refs/bisect | as per fn    |
272  * | logs/refs/bisect/a | /a             | logs/refs/bisect | as per fn    |
273  * | (If fn in the previous line returns -1, then fn is called once more:) |
274  * | logs/refs/bisect/a | /refs/bisect/a | logs             | as per fn    |
275  * |--------------------|----------------|------------------|--------------|
276  */
trie_find(struct trie * root,const char * key,match_fn fn,void * baton)277 static int trie_find(struct trie *root, const char *key, match_fn fn,
278 		     void *baton)
279 {
280 	int i;
281 	int result;
282 	struct trie *child;
283 
284 	if (!*key) {
285 		/* we have reached the end of the key */
286 		if (root->value && !root->len)
287 			return fn(key, root->value, baton);
288 		else
289 			return -1;
290 	}
291 
292 	for (i = 0; i < root->len; i++) {
293 		/* Partial path normalization: skip consecutive slashes. */
294 		if (key[i] == '/' && key[i+1] == '/') {
295 			key++;
296 			continue;
297 		}
298 		if (root->contents[i] != key[i])
299 			return -1;
300 	}
301 
302 	/* Matched the entire compressed section */
303 	key += i;
304 	if (!*key) {
305 		/* End of key */
306 		if (root->value)
307 			return fn(key, root->value, baton);
308 		else
309 			return -1;
310 	}
311 
312 	/* Partial path normalization: skip consecutive slashes */
313 	while (key[0] == '/' && key[1] == '/')
314 		key++;
315 
316 	child = root->children[(unsigned char)*key];
317 	if (child)
318 		result = trie_find(child, key + 1, fn, baton);
319 	else
320 		result = -1;
321 
322 	if (result >= 0 || (*key != '/' && *key != 0))
323 		return result;
324 	if (root->value)
325 		return fn(key, root->value, baton);
326 	else
327 		return -1;
328 }
329 
330 static struct trie common_trie;
331 static int common_trie_done_setup;
332 
init_common_trie(void)333 static void init_common_trie(void)
334 {
335 	struct common_dir *p;
336 
337 	if (common_trie_done_setup)
338 		return;
339 
340 	for (p = common_list; p->path; p++)
341 		add_to_trie(&common_trie, p->path, p);
342 
343 	common_trie_done_setup = 1;
344 }
345 
346 /*
347  * Helper function for update_common_dir: returns 1 if the dir
348  * prefix is common.
349  */
check_common(const char * unmatched,void * value,void * baton)350 static int check_common(const char *unmatched, void *value, void *baton)
351 {
352 	struct common_dir *dir = value;
353 
354 	if (dir->is_dir && (unmatched[0] == 0 || unmatched[0] == '/'))
355 		return dir->is_common;
356 
357 	if (!dir->is_dir && unmatched[0] == 0)
358 		return dir->is_common;
359 
360 	return 0;
361 }
362 
update_common_dir(struct strbuf * buf,int git_dir_len,const char * common_dir)363 static void update_common_dir(struct strbuf *buf, int git_dir_len,
364 			      const char *common_dir)
365 {
366 	char *base = buf->buf + git_dir_len;
367 	int has_lock_suffix = strbuf_strip_suffix(buf, LOCK_SUFFIX);
368 
369 	init_common_trie();
370 	if (trie_find(&common_trie, base, check_common, NULL) > 0)
371 		replace_dir(buf, git_dir_len, common_dir);
372 
373 	if (has_lock_suffix)
374 		strbuf_addstr(buf, LOCK_SUFFIX);
375 }
376 
report_linked_checkout_garbage(void)377 void report_linked_checkout_garbage(void)
378 {
379 	struct strbuf sb = STRBUF_INIT;
380 	const struct common_dir *p;
381 	int len;
382 
383 	if (!the_repository->different_commondir)
384 		return;
385 	strbuf_addf(&sb, "%s/", get_git_dir());
386 	len = sb.len;
387 	for (p = common_list; p->path; p++) {
388 		const char *path = p->path;
389 		if (p->ignore_garbage)
390 			continue;
391 		strbuf_setlen(&sb, len);
392 		strbuf_addstr(&sb, path);
393 		if (file_exists(sb.buf))
394 			report_garbage(PACKDIR_FILE_GARBAGE, sb.buf);
395 	}
396 	strbuf_release(&sb);
397 }
398 
adjust_git_path(const struct repository * repo,struct strbuf * buf,int git_dir_len)399 static void adjust_git_path(const struct repository *repo,
400 			    struct strbuf *buf, int git_dir_len)
401 {
402 	const char *base = buf->buf + git_dir_len;
403 	if (is_dir_file(base, "info", "grafts"))
404 		strbuf_splice(buf, 0, buf->len,
405 			      repo->graft_file, strlen(repo->graft_file));
406 	else if (!strcmp(base, "index"))
407 		strbuf_splice(buf, 0, buf->len,
408 			      repo->index_file, strlen(repo->index_file));
409 	else if (dir_prefix(base, "objects"))
410 		replace_dir(buf, git_dir_len + 7, repo->objects->odb->path);
411 	else if (git_hooks_path && dir_prefix(base, "hooks"))
412 		replace_dir(buf, git_dir_len + 5, git_hooks_path);
413 	else if (repo->different_commondir)
414 		update_common_dir(buf, git_dir_len, repo->commondir);
415 }
416 
strbuf_worktree_gitdir(struct strbuf * buf,const struct repository * repo,const struct worktree * wt)417 static void strbuf_worktree_gitdir(struct strbuf *buf,
418 				   const struct repository *repo,
419 				   const struct worktree *wt)
420 {
421 	if (!wt)
422 		strbuf_addstr(buf, repo->gitdir);
423 	else if (!wt->id)
424 		strbuf_addstr(buf, repo->commondir);
425 	else
426 		strbuf_git_common_path(buf, repo, "worktrees/%s", wt->id);
427 }
428 
do_git_path(const struct repository * repo,const struct worktree * wt,struct strbuf * buf,const char * fmt,va_list args)429 static void do_git_path(const struct repository *repo,
430 			const struct worktree *wt, struct strbuf *buf,
431 			const char *fmt, va_list args)
432 {
433 	int gitdir_len;
434 	strbuf_worktree_gitdir(buf, repo, wt);
435 	if (buf->len && !is_dir_sep(buf->buf[buf->len - 1]))
436 		strbuf_addch(buf, '/');
437 	gitdir_len = buf->len;
438 	strbuf_vaddf(buf, fmt, args);
439 	if (!wt)
440 		adjust_git_path(repo, buf, gitdir_len);
441 	strbuf_cleanup_path(buf);
442 }
443 
repo_git_path(const struct repository * repo,const char * fmt,...)444 char *repo_git_path(const struct repository *repo,
445 		    const char *fmt, ...)
446 {
447 	struct strbuf path = STRBUF_INIT;
448 	va_list args;
449 	va_start(args, fmt);
450 	do_git_path(repo, NULL, &path, fmt, args);
451 	va_end(args);
452 	return strbuf_detach(&path, NULL);
453 }
454 
strbuf_repo_git_path(struct strbuf * sb,const struct repository * repo,const char * fmt,...)455 void strbuf_repo_git_path(struct strbuf *sb,
456 			  const struct repository *repo,
457 			  const char *fmt, ...)
458 {
459 	va_list args;
460 	va_start(args, fmt);
461 	do_git_path(repo, NULL, sb, fmt, args);
462 	va_end(args);
463 }
464 
git_path_buf(struct strbuf * buf,const char * fmt,...)465 char *git_path_buf(struct strbuf *buf, const char *fmt, ...)
466 {
467 	va_list args;
468 	strbuf_reset(buf);
469 	va_start(args, fmt);
470 	do_git_path(the_repository, NULL, buf, fmt, args);
471 	va_end(args);
472 	return buf->buf;
473 }
474 
strbuf_git_path(struct strbuf * sb,const char * fmt,...)475 void strbuf_git_path(struct strbuf *sb, const char *fmt, ...)
476 {
477 	va_list args;
478 	va_start(args, fmt);
479 	do_git_path(the_repository, NULL, sb, fmt, args);
480 	va_end(args);
481 }
482 
git_path(const char * fmt,...)483 const char *git_path(const char *fmt, ...)
484 {
485 	struct strbuf *pathname = get_pathname();
486 	va_list args;
487 	va_start(args, fmt);
488 	do_git_path(the_repository, NULL, pathname, fmt, args);
489 	va_end(args);
490 	return pathname->buf;
491 }
492 
git_pathdup(const char * fmt,...)493 char *git_pathdup(const char *fmt, ...)
494 {
495 	struct strbuf path = STRBUF_INIT;
496 	va_list args;
497 	va_start(args, fmt);
498 	do_git_path(the_repository, NULL, &path, fmt, args);
499 	va_end(args);
500 	return strbuf_detach(&path, NULL);
501 }
502 
mkpathdup(const char * fmt,...)503 char *mkpathdup(const char *fmt, ...)
504 {
505 	struct strbuf sb = STRBUF_INIT;
506 	va_list args;
507 	va_start(args, fmt);
508 	strbuf_vaddf(&sb, fmt, args);
509 	va_end(args);
510 	strbuf_cleanup_path(&sb);
511 	return strbuf_detach(&sb, NULL);
512 }
513 
mkpath(const char * fmt,...)514 const char *mkpath(const char *fmt, ...)
515 {
516 	va_list args;
517 	struct strbuf *pathname = get_pathname();
518 	va_start(args, fmt);
519 	strbuf_vaddf(pathname, fmt, args);
520 	va_end(args);
521 	return cleanup_path(pathname->buf);
522 }
523 
worktree_git_path(const struct worktree * wt,const char * fmt,...)524 const char *worktree_git_path(const struct worktree *wt, const char *fmt, ...)
525 {
526 	struct strbuf *pathname = get_pathname();
527 	va_list args;
528 	va_start(args, fmt);
529 	do_git_path(the_repository, wt, pathname, fmt, args);
530 	va_end(args);
531 	return pathname->buf;
532 }
533 
do_worktree_path(const struct repository * repo,struct strbuf * buf,const char * fmt,va_list args)534 static void do_worktree_path(const struct repository *repo,
535 			     struct strbuf *buf,
536 			     const char *fmt, va_list args)
537 {
538 	strbuf_addstr(buf, repo->worktree);
539 	if(buf->len && !is_dir_sep(buf->buf[buf->len - 1]))
540 		strbuf_addch(buf, '/');
541 
542 	strbuf_vaddf(buf, fmt, args);
543 	strbuf_cleanup_path(buf);
544 }
545 
repo_worktree_path(const struct repository * repo,const char * fmt,...)546 char *repo_worktree_path(const struct repository *repo, const char *fmt, ...)
547 {
548 	struct strbuf path = STRBUF_INIT;
549 	va_list args;
550 
551 	if (!repo->worktree)
552 		return NULL;
553 
554 	va_start(args, fmt);
555 	do_worktree_path(repo, &path, fmt, args);
556 	va_end(args);
557 
558 	return strbuf_detach(&path, NULL);
559 }
560 
strbuf_repo_worktree_path(struct strbuf * sb,const struct repository * repo,const char * fmt,...)561 void strbuf_repo_worktree_path(struct strbuf *sb,
562 			       const struct repository *repo,
563 			       const char *fmt, ...)
564 {
565 	va_list args;
566 
567 	if (!repo->worktree)
568 		return;
569 
570 	va_start(args, fmt);
571 	do_worktree_path(repo, sb, fmt, args);
572 	va_end(args);
573 }
574 
575 /* Returns 0 on success, negative on failure. */
do_submodule_path(struct strbuf * buf,const char * path,const char * fmt,va_list args)576 static int do_submodule_path(struct strbuf *buf, const char *path,
577 			     const char *fmt, va_list args)
578 {
579 	struct strbuf git_submodule_common_dir = STRBUF_INIT;
580 	struct strbuf git_submodule_dir = STRBUF_INIT;
581 	int ret;
582 
583 	ret = submodule_to_gitdir(&git_submodule_dir, path);
584 	if (ret)
585 		goto cleanup;
586 
587 	strbuf_complete(&git_submodule_dir, '/');
588 	strbuf_addbuf(buf, &git_submodule_dir);
589 	strbuf_vaddf(buf, fmt, args);
590 
591 	if (get_common_dir_noenv(&git_submodule_common_dir, git_submodule_dir.buf))
592 		update_common_dir(buf, git_submodule_dir.len, git_submodule_common_dir.buf);
593 
594 	strbuf_cleanup_path(buf);
595 
596 cleanup:
597 	strbuf_release(&git_submodule_dir);
598 	strbuf_release(&git_submodule_common_dir);
599 	return ret;
600 }
601 
git_pathdup_submodule(const char * path,const char * fmt,...)602 char *git_pathdup_submodule(const char *path, const char *fmt, ...)
603 {
604 	int err;
605 	va_list args;
606 	struct strbuf buf = STRBUF_INIT;
607 	va_start(args, fmt);
608 	err = do_submodule_path(&buf, path, fmt, args);
609 	va_end(args);
610 	if (err) {
611 		strbuf_release(&buf);
612 		return NULL;
613 	}
614 	return strbuf_detach(&buf, NULL);
615 }
616 
strbuf_git_path_submodule(struct strbuf * buf,const char * path,const char * fmt,...)617 int strbuf_git_path_submodule(struct strbuf *buf, const char *path,
618 			      const char *fmt, ...)
619 {
620 	int err;
621 	va_list args;
622 	va_start(args, fmt);
623 	err = do_submodule_path(buf, path, fmt, args);
624 	va_end(args);
625 
626 	return err;
627 }
628 
do_git_common_path(const struct repository * repo,struct strbuf * buf,const char * fmt,va_list args)629 static void do_git_common_path(const struct repository *repo,
630 			       struct strbuf *buf,
631 			       const char *fmt,
632 			       va_list args)
633 {
634 	strbuf_addstr(buf, repo->commondir);
635 	if (buf->len && !is_dir_sep(buf->buf[buf->len - 1]))
636 		strbuf_addch(buf, '/');
637 	strbuf_vaddf(buf, fmt, args);
638 	strbuf_cleanup_path(buf);
639 }
640 
git_common_path(const char * fmt,...)641 const char *git_common_path(const char *fmt, ...)
642 {
643 	struct strbuf *pathname = get_pathname();
644 	va_list args;
645 	va_start(args, fmt);
646 	do_git_common_path(the_repository, pathname, fmt, args);
647 	va_end(args);
648 	return pathname->buf;
649 }
650 
strbuf_git_common_path(struct strbuf * sb,const struct repository * repo,const char * fmt,...)651 void strbuf_git_common_path(struct strbuf *sb,
652 			    const struct repository *repo,
653 			    const char *fmt, ...)
654 {
655 	va_list args;
656 	va_start(args, fmt);
657 	do_git_common_path(repo, sb, fmt, args);
658 	va_end(args);
659 }
660 
validate_headref(const char * path)661 int validate_headref(const char *path)
662 {
663 	struct stat st;
664 	char buffer[256];
665 	const char *refname;
666 	struct object_id oid;
667 	int fd;
668 	ssize_t len;
669 
670 	if (lstat(path, &st) < 0)
671 		return -1;
672 
673 	/* Make sure it is a "refs/.." symlink */
674 	if (S_ISLNK(st.st_mode)) {
675 		len = readlink(path, buffer, sizeof(buffer)-1);
676 		if (len >= 5 && !memcmp("refs/", buffer, 5))
677 			return 0;
678 		return -1;
679 	}
680 
681 	/*
682 	 * Anything else, just open it and try to see if it is a symbolic ref.
683 	 */
684 	fd = open(path, O_RDONLY);
685 	if (fd < 0)
686 		return -1;
687 	len = read_in_full(fd, buffer, sizeof(buffer)-1);
688 	close(fd);
689 
690 	if (len < 0)
691 		return -1;
692 	buffer[len] = '\0';
693 
694 	/*
695 	 * Is it a symbolic ref?
696 	 */
697 	if (skip_prefix(buffer, "ref:", &refname)) {
698 		while (isspace(*refname))
699 			refname++;
700 		if (starts_with(refname, "refs/"))
701 			return 0;
702 	}
703 
704 	/*
705 	 * Is this a detached HEAD?
706 	 */
707 	if (!get_oid_hex(buffer, &oid))
708 		return 0;
709 
710 	return -1;
711 }
712 
getpw_str(const char * username,size_t len)713 static struct passwd *getpw_str(const char *username, size_t len)
714 {
715 	struct passwd *pw;
716 	char *username_z = xmemdupz(username, len);
717 	pw = getpwnam(username_z);
718 	free(username_z);
719 	return pw;
720 }
721 
722 /*
723  * Return a string with ~ and ~user expanded via getpw*. Returns NULL on getpw
724  * failure or if path is NULL.
725  *
726  * If real_home is true, strbuf_realpath($HOME) is used in the `~/` expansion.
727  *
728  * If the path starts with `%(prefix)/`, the remainder is interpreted as
729  * relative to where Git is installed, and expanded to the absolute path.
730  */
interpolate_path(const char * path,int real_home)731 char *interpolate_path(const char *path, int real_home)
732 {
733 	struct strbuf user_path = STRBUF_INIT;
734 	const char *to_copy = path;
735 
736 	if (path == NULL)
737 		goto return_null;
738 
739 	if (skip_prefix(path, "%(prefix)/", &path))
740 		return system_path(path);
741 
742 	if (path[0] == '~') {
743 		const char *first_slash = strchrnul(path, '/');
744 		const char *username = path + 1;
745 		size_t username_len = first_slash - username;
746 		if (username_len == 0) {
747 			const char *home = getenv("HOME");
748 			if (!home)
749 				goto return_null;
750 			if (real_home)
751 				strbuf_add_real_path(&user_path, home);
752 			else
753 				strbuf_addstr(&user_path, home);
754 #ifdef GIT_WINDOWS_NATIVE
755 			convert_slashes(user_path.buf);
756 #endif
757 		} else {
758 			struct passwd *pw = getpw_str(username, username_len);
759 			if (!pw)
760 				goto return_null;
761 			strbuf_addstr(&user_path, pw->pw_dir);
762 		}
763 		to_copy = first_slash;
764 	}
765 	strbuf_addstr(&user_path, to_copy);
766 	return strbuf_detach(&user_path, NULL);
767 return_null:
768 	strbuf_release(&user_path);
769 	return NULL;
770 }
771 
772 /*
773  * First, one directory to try is determined by the following algorithm.
774  *
775  * (0) If "strict" is given, the path is used as given and no DWIM is
776  *     done. Otherwise:
777  * (1) "~/path" to mean path under the running user's home directory;
778  * (2) "~user/path" to mean path under named user's home directory;
779  * (3) "relative/path" to mean cwd relative directory; or
780  * (4) "/absolute/path" to mean absolute directory.
781  *
782  * Unless "strict" is given, we check "%s/.git", "%s", "%s.git/.git", "%s.git"
783  * in this order. We select the first one that is a valid git repository, and
784  * chdir() to it. If none match, or we fail to chdir, we return NULL.
785  *
786  * If all goes well, we return the directory we used to chdir() (but
787  * before ~user is expanded), avoiding getcwd() resolving symbolic
788  * links.  User relative paths are also returned as they are given,
789  * except DWIM suffixing.
790  */
enter_repo(const char * path,int strict)791 const char *enter_repo(const char *path, int strict)
792 {
793 	static struct strbuf validated_path = STRBUF_INIT;
794 	static struct strbuf used_path = STRBUF_INIT;
795 
796 	if (!path)
797 		return NULL;
798 
799 	if (!strict) {
800 		static const char *suffix[] = {
801 			"/.git", "", ".git/.git", ".git", NULL,
802 		};
803 		const char *gitfile;
804 		int len = strlen(path);
805 		int i;
806 		while ((1 < len) && (path[len-1] == '/'))
807 			len--;
808 
809 		/*
810 		 * We can handle arbitrary-sized buffers, but this remains as a
811 		 * sanity check on untrusted input.
812 		 */
813 		if (PATH_MAX <= len)
814 			return NULL;
815 
816 		strbuf_reset(&used_path);
817 		strbuf_reset(&validated_path);
818 		strbuf_add(&used_path, path, len);
819 		strbuf_add(&validated_path, path, len);
820 
821 		if (used_path.buf[0] == '~') {
822 			char *newpath = interpolate_path(used_path.buf, 0);
823 			if (!newpath)
824 				return NULL;
825 			strbuf_attach(&used_path, newpath, strlen(newpath),
826 				      strlen(newpath));
827 		}
828 		for (i = 0; suffix[i]; i++) {
829 			struct stat st;
830 			size_t baselen = used_path.len;
831 			strbuf_addstr(&used_path, suffix[i]);
832 			if (!stat(used_path.buf, &st) &&
833 			    (S_ISREG(st.st_mode) ||
834 			    (S_ISDIR(st.st_mode) && is_git_directory(used_path.buf)))) {
835 				strbuf_addstr(&validated_path, suffix[i]);
836 				break;
837 			}
838 			strbuf_setlen(&used_path, baselen);
839 		}
840 		if (!suffix[i])
841 			return NULL;
842 		gitfile = read_gitfile(used_path.buf);
843 		if (gitfile) {
844 			strbuf_reset(&used_path);
845 			strbuf_addstr(&used_path, gitfile);
846 		}
847 		if (chdir(used_path.buf))
848 			return NULL;
849 		path = validated_path.buf;
850 	}
851 	else {
852 		const char *gitfile = read_gitfile(path);
853 		if (gitfile)
854 			path = gitfile;
855 		if (chdir(path))
856 			return NULL;
857 	}
858 
859 	if (is_git_directory(".")) {
860 		set_git_dir(".", 0);
861 		check_repository_format(NULL);
862 		return path;
863 	}
864 
865 	return NULL;
866 }
867 
calc_shared_perm(int mode)868 static int calc_shared_perm(int mode)
869 {
870 	int tweak;
871 
872 	if (get_shared_repository() < 0)
873 		tweak = -get_shared_repository();
874 	else
875 		tweak = get_shared_repository();
876 
877 	if (!(mode & S_IWUSR))
878 		tweak &= ~0222;
879 	if (mode & S_IXUSR)
880 		/* Copy read bits to execute bits */
881 		tweak |= (tweak & 0444) >> 2;
882 	if (get_shared_repository() < 0)
883 		mode = (mode & ~0777) | tweak;
884 	else
885 		mode |= tweak;
886 
887 	return mode;
888 }
889 
890 
adjust_shared_perm(const char * path)891 int adjust_shared_perm(const char *path)
892 {
893 	int old_mode, new_mode;
894 
895 	if (!get_shared_repository())
896 		return 0;
897 	if (get_st_mode_bits(path, &old_mode) < 0)
898 		return -1;
899 
900 	new_mode = calc_shared_perm(old_mode);
901 	if (S_ISDIR(old_mode)) {
902 		/* Copy read bits to execute bits */
903 		new_mode |= (new_mode & 0444) >> 2;
904 		new_mode |= FORCE_DIR_SET_GID;
905 	}
906 
907 	if (((old_mode ^ new_mode) & ~S_IFMT) &&
908 			chmod(path, (new_mode & ~S_IFMT)) < 0)
909 		return -2;
910 	return 0;
911 }
912 
safe_create_dir(const char * dir,int share)913 void safe_create_dir(const char *dir, int share)
914 {
915 	if (mkdir(dir, 0777) < 0) {
916 		if (errno != EEXIST) {
917 			perror(dir);
918 			exit(1);
919 		}
920 	}
921 	else if (share && adjust_shared_perm(dir))
922 		die(_("Could not make %s writable by group"), dir);
923 }
924 
have_same_root(const char * path1,const char * path2)925 static int have_same_root(const char *path1, const char *path2)
926 {
927 	int is_abs1, is_abs2;
928 
929 	is_abs1 = is_absolute_path(path1);
930 	is_abs2 = is_absolute_path(path2);
931 	return (is_abs1 && is_abs2 && tolower(path1[0]) == tolower(path2[0])) ||
932 	       (!is_abs1 && !is_abs2);
933 }
934 
935 /*
936  * Give path as relative to prefix.
937  *
938  * The strbuf may or may not be used, so do not assume it contains the
939  * returned path.
940  */
relative_path(const char * in,const char * prefix,struct strbuf * sb)941 const char *relative_path(const char *in, const char *prefix,
942 			  struct strbuf *sb)
943 {
944 	int in_len = in ? strlen(in) : 0;
945 	int prefix_len = prefix ? strlen(prefix) : 0;
946 	int in_off = 0;
947 	int prefix_off = 0;
948 	int i = 0, j = 0;
949 
950 	if (!in_len)
951 		return "./";
952 	else if (!prefix_len)
953 		return in;
954 
955 	if (have_same_root(in, prefix))
956 		/* bypass dos_drive, for "c:" is identical to "C:" */
957 		i = j = has_dos_drive_prefix(in);
958 	else {
959 		return in;
960 	}
961 
962 	while (i < prefix_len && j < in_len && prefix[i] == in[j]) {
963 		if (is_dir_sep(prefix[i])) {
964 			while (is_dir_sep(prefix[i]))
965 				i++;
966 			while (is_dir_sep(in[j]))
967 				j++;
968 			prefix_off = i;
969 			in_off = j;
970 		} else {
971 			i++;
972 			j++;
973 		}
974 	}
975 
976 	if (
977 	    /* "prefix" seems like prefix of "in" */
978 	    i >= prefix_len &&
979 	    /*
980 	     * but "/foo" is not a prefix of "/foobar"
981 	     * (i.e. prefix not end with '/')
982 	     */
983 	    prefix_off < prefix_len) {
984 		if (j >= in_len) {
985 			/* in="/a/b", prefix="/a/b" */
986 			in_off = in_len;
987 		} else if (is_dir_sep(in[j])) {
988 			/* in="/a/b/c", prefix="/a/b" */
989 			while (is_dir_sep(in[j]))
990 				j++;
991 			in_off = j;
992 		} else {
993 			/* in="/a/bbb/c", prefix="/a/b" */
994 			i = prefix_off;
995 		}
996 	} else if (
997 		   /* "in" is short than "prefix" */
998 		   j >= in_len &&
999 		   /* "in" not end with '/' */
1000 		   in_off < in_len) {
1001 		if (is_dir_sep(prefix[i])) {
1002 			/* in="/a/b", prefix="/a/b/c/" */
1003 			while (is_dir_sep(prefix[i]))
1004 				i++;
1005 			in_off = in_len;
1006 		}
1007 	}
1008 	in += in_off;
1009 	in_len -= in_off;
1010 
1011 	if (i >= prefix_len) {
1012 		if (!in_len)
1013 			return "./";
1014 		else
1015 			return in;
1016 	}
1017 
1018 	strbuf_reset(sb);
1019 	strbuf_grow(sb, in_len);
1020 
1021 	while (i < prefix_len) {
1022 		if (is_dir_sep(prefix[i])) {
1023 			strbuf_addstr(sb, "../");
1024 			while (is_dir_sep(prefix[i]))
1025 				i++;
1026 			continue;
1027 		}
1028 		i++;
1029 	}
1030 	if (!is_dir_sep(prefix[prefix_len - 1]))
1031 		strbuf_addstr(sb, "../");
1032 
1033 	strbuf_addstr(sb, in);
1034 
1035 	return sb->buf;
1036 }
1037 
1038 /*
1039  * A simpler implementation of relative_path
1040  *
1041  * Get relative path by removing "prefix" from "in". This function
1042  * first appears in v1.5.6-1-g044bbbc, and makes git_dir shorter
1043  * to increase performance when traversing the path to work_tree.
1044  */
remove_leading_path(const char * in,const char * prefix)1045 const char *remove_leading_path(const char *in, const char *prefix)
1046 {
1047 	static struct strbuf buf = STRBUF_INIT;
1048 	int i = 0, j = 0;
1049 
1050 	if (!prefix || !prefix[0])
1051 		return in;
1052 	while (prefix[i]) {
1053 		if (is_dir_sep(prefix[i])) {
1054 			if (!is_dir_sep(in[j]))
1055 				return in;
1056 			while (is_dir_sep(prefix[i]))
1057 				i++;
1058 			while (is_dir_sep(in[j]))
1059 				j++;
1060 			continue;
1061 		} else if (in[j] != prefix[i]) {
1062 			return in;
1063 		}
1064 		i++;
1065 		j++;
1066 	}
1067 	if (
1068 	    /* "/foo" is a prefix of "/foo" */
1069 	    in[j] &&
1070 	    /* "/foo" is not a prefix of "/foobar" */
1071 	    !is_dir_sep(prefix[i-1]) && !is_dir_sep(in[j])
1072 	   )
1073 		return in;
1074 	while (is_dir_sep(in[j]))
1075 		j++;
1076 
1077 	strbuf_reset(&buf);
1078 	if (!in[j])
1079 		strbuf_addstr(&buf, ".");
1080 	else
1081 		strbuf_addstr(&buf, in + j);
1082 	return buf.buf;
1083 }
1084 
1085 /*
1086  * It is okay if dst == src, but they should not overlap otherwise.
1087  * The "dst" buffer must be at least as long as "src"; normalizing may shrink
1088  * the size of the path, but will never grow it.
1089  *
1090  * Performs the following normalizations on src, storing the result in dst:
1091  * - Ensures that components are separated by '/' (Windows only)
1092  * - Squashes sequences of '/' except "//server/share" on Windows
1093  * - Removes "." components.
1094  * - Removes ".." components, and the components the precede them.
1095  * Returns failure (non-zero) if a ".." component appears as first path
1096  * component anytime during the normalization. Otherwise, returns success (0).
1097  *
1098  * Note that this function is purely textual.  It does not follow symlinks,
1099  * verify the existence of the path, or make any system calls.
1100  *
1101  * prefix_len != NULL is for a specific case of prefix_pathspec():
1102  * assume that src == dst and src[0..prefix_len-1] is already
1103  * normalized, any time "../" eats up to the prefix_len part,
1104  * prefix_len is reduced. In the end prefix_len is the remaining
1105  * prefix that has not been overridden by user pathspec.
1106  *
1107  * NEEDSWORK: This function doesn't perform normalization w.r.t. trailing '/'.
1108  * For everything but the root folder itself, the normalized path should not
1109  * end with a '/', then the callers need to be fixed up accordingly.
1110  *
1111  */
normalize_path_copy_len(char * dst,const char * src,int * prefix_len)1112 int normalize_path_copy_len(char *dst, const char *src, int *prefix_len)
1113 {
1114 	char *dst0;
1115 	const char *end;
1116 
1117 	/*
1118 	 * Copy initial part of absolute path: "/", "C:/", "//server/share/".
1119 	 */
1120 	end = src + offset_1st_component(src);
1121 	while (src < end) {
1122 		char c = *src++;
1123 		if (is_dir_sep(c))
1124 			c = '/';
1125 		*dst++ = c;
1126 	}
1127 	dst0 = dst;
1128 
1129 	while (is_dir_sep(*src))
1130 		src++;
1131 
1132 	for (;;) {
1133 		char c = *src;
1134 
1135 		/*
1136 		 * A path component that begins with . could be
1137 		 * special:
1138 		 * (1) "." and ends   -- ignore and terminate.
1139 		 * (2) "./"           -- ignore them, eat slash and continue.
1140 		 * (3) ".." and ends  -- strip one and terminate.
1141 		 * (4) "../"          -- strip one, eat slash and continue.
1142 		 */
1143 		if (c == '.') {
1144 			if (!src[1]) {
1145 				/* (1) */
1146 				src++;
1147 			} else if (is_dir_sep(src[1])) {
1148 				/* (2) */
1149 				src += 2;
1150 				while (is_dir_sep(*src))
1151 					src++;
1152 				continue;
1153 			} else if (src[1] == '.') {
1154 				if (!src[2]) {
1155 					/* (3) */
1156 					src += 2;
1157 					goto up_one;
1158 				} else if (is_dir_sep(src[2])) {
1159 					/* (4) */
1160 					src += 3;
1161 					while (is_dir_sep(*src))
1162 						src++;
1163 					goto up_one;
1164 				}
1165 			}
1166 		}
1167 
1168 		/* copy up to the next '/', and eat all '/' */
1169 		while ((c = *src++) != '\0' && !is_dir_sep(c))
1170 			*dst++ = c;
1171 		if (is_dir_sep(c)) {
1172 			*dst++ = '/';
1173 			while (is_dir_sep(c))
1174 				c = *src++;
1175 			src--;
1176 		} else if (!c)
1177 			break;
1178 		continue;
1179 
1180 	up_one:
1181 		/*
1182 		 * dst0..dst is prefix portion, and dst[-1] is '/';
1183 		 * go up one level.
1184 		 */
1185 		dst--;	/* go to trailing '/' */
1186 		if (dst <= dst0)
1187 			return -1;
1188 		/* Windows: dst[-1] cannot be backslash anymore */
1189 		while (dst0 < dst && dst[-1] != '/')
1190 			dst--;
1191 		if (prefix_len && *prefix_len > dst - dst0)
1192 			*prefix_len = dst - dst0;
1193 	}
1194 	*dst = '\0';
1195 	return 0;
1196 }
1197 
normalize_path_copy(char * dst,const char * src)1198 int normalize_path_copy(char *dst, const char *src)
1199 {
1200 	return normalize_path_copy_len(dst, src, NULL);
1201 }
1202 
1203 /*
1204  * path = Canonical absolute path
1205  * prefixes = string_list containing normalized, absolute paths without
1206  * trailing slashes (except for the root directory, which is denoted by "/").
1207  *
1208  * Determines, for each path in prefixes, whether the "prefix"
1209  * is an ancestor directory of path.  Returns the length of the longest
1210  * ancestor directory, excluding any trailing slashes, or -1 if no prefix
1211  * is an ancestor.  (Note that this means 0 is returned if prefixes is
1212  * ["/"].) "/foo" is not considered an ancestor of "/foobar".  Directories
1213  * are not considered to be their own ancestors.  path must be in a
1214  * canonical form: empty components, or "." or ".." components are not
1215  * allowed.
1216  */
longest_ancestor_length(const char * path,struct string_list * prefixes)1217 int longest_ancestor_length(const char *path, struct string_list *prefixes)
1218 {
1219 	int i, max_len = -1;
1220 
1221 	if (!strcmp(path, "/"))
1222 		return -1;
1223 
1224 	for (i = 0; i < prefixes->nr; i++) {
1225 		const char *ceil = prefixes->items[i].string;
1226 		int len = strlen(ceil);
1227 
1228 		if (len == 1 && ceil[0] == '/')
1229 			len = 0; /* root matches anything, with length 0 */
1230 		else if (!strncmp(path, ceil, len) && path[len] == '/')
1231 			; /* match of length len */
1232 		else
1233 			continue; /* no match */
1234 
1235 		if (len > max_len)
1236 			max_len = len;
1237 	}
1238 
1239 	return max_len;
1240 }
1241 
1242 /* strip arbitrary amount of directory separators at end of path */
chomp_trailing_dir_sep(const char * path,int len)1243 static inline int chomp_trailing_dir_sep(const char *path, int len)
1244 {
1245 	while (len && is_dir_sep(path[len - 1]))
1246 		len--;
1247 	return len;
1248 }
1249 
1250 /*
1251  * If path ends with suffix (complete path components), returns the offset of
1252  * the last character in the path before the suffix (sans trailing directory
1253  * separators), and -1 otherwise.
1254  */
stripped_path_suffix_offset(const char * path,const char * suffix)1255 static ssize_t stripped_path_suffix_offset(const char *path, const char *suffix)
1256 {
1257 	int path_len = strlen(path), suffix_len = strlen(suffix);
1258 
1259 	while (suffix_len) {
1260 		if (!path_len)
1261 			return -1;
1262 
1263 		if (is_dir_sep(path[path_len - 1])) {
1264 			if (!is_dir_sep(suffix[suffix_len - 1]))
1265 				return -1;
1266 			path_len = chomp_trailing_dir_sep(path, path_len);
1267 			suffix_len = chomp_trailing_dir_sep(suffix, suffix_len);
1268 		}
1269 		else if (path[--path_len] != suffix[--suffix_len])
1270 			return -1;
1271 	}
1272 
1273 	if (path_len && !is_dir_sep(path[path_len - 1]))
1274 		return -1;
1275 	return chomp_trailing_dir_sep(path, path_len);
1276 }
1277 
1278 /*
1279  * Returns true if the path ends with components, considering only complete path
1280  * components, and false otherwise.
1281  */
ends_with_path_components(const char * path,const char * components)1282 int ends_with_path_components(const char *path, const char *components)
1283 {
1284 	return stripped_path_suffix_offset(path, components) != -1;
1285 }
1286 
1287 /*
1288  * If path ends with suffix (complete path components), returns the
1289  * part before suffix (sans trailing directory separators).
1290  * Otherwise returns NULL.
1291  */
strip_path_suffix(const char * path,const char * suffix)1292 char *strip_path_suffix(const char *path, const char *suffix)
1293 {
1294 	ssize_t offset = stripped_path_suffix_offset(path, suffix);
1295 
1296 	return offset == -1 ? NULL : xstrndup(path, offset);
1297 }
1298 
daemon_avoid_alias(const char * p)1299 int daemon_avoid_alias(const char *p)
1300 {
1301 	int sl, ndot;
1302 
1303 	/*
1304 	 * This resurrects the belts and suspenders paranoia check by HPA
1305 	 * done in <435560F7.4080006@zytor.com> thread, now enter_repo()
1306 	 * does not do getcwd() based path canonicalization.
1307 	 *
1308 	 * sl becomes true immediately after seeing '/' and continues to
1309 	 * be true as long as dots continue after that without intervening
1310 	 * non-dot character.
1311 	 */
1312 	if (!p || (*p != '/' && *p != '~'))
1313 		return -1;
1314 	sl = 1; ndot = 0;
1315 	p++;
1316 
1317 	while (1) {
1318 		char ch = *p++;
1319 		if (sl) {
1320 			if (ch == '.')
1321 				ndot++;
1322 			else if (ch == '/') {
1323 				if (ndot < 3)
1324 					/* reject //, /./ and /../ */
1325 					return -1;
1326 				ndot = 0;
1327 			}
1328 			else if (ch == 0) {
1329 				if (0 < ndot && ndot < 3)
1330 					/* reject /.$ and /..$ */
1331 					return -1;
1332 				return 0;
1333 			}
1334 			else
1335 				sl = ndot = 0;
1336 		}
1337 		else if (ch == 0)
1338 			return 0;
1339 		else if (ch == '/') {
1340 			sl = 1;
1341 			ndot = 0;
1342 		}
1343 	}
1344 }
1345 
1346 /*
1347  * On NTFS, we need to be careful to disallow certain synonyms of the `.git/`
1348  * directory:
1349  *
1350  * - For historical reasons, file names that end in spaces or periods are
1351  *   automatically trimmed. Therefore, `.git . . ./` is a valid way to refer
1352  *   to `.git/`.
1353  *
1354  * - For other historical reasons, file names that do not conform to the 8.3
1355  *   format (up to eight characters for the basename, three for the file
1356  *   extension, certain characters not allowed such as `+`, etc) are associated
1357  *   with a so-called "short name", at least on the `C:` drive by default.
1358  *   Which means that `git~1/` is a valid way to refer to `.git/`.
1359  *
1360  *   Note: Technically, `.git/` could receive the short name `git~2` if the
1361  *   short name `git~1` were already used. In Git, however, we guarantee that
1362  *   `.git` is the first item in a directory, therefore it will be associated
1363  *   with the short name `git~1` (unless short names are disabled).
1364  *
1365  * - For yet other historical reasons, NTFS supports so-called "Alternate Data
1366  *   Streams", i.e. metadata associated with a given file, referred to via
1367  *   `<filename>:<stream-name>:<stream-type>`. There exists a default stream
1368  *   type for directories, allowing `.git/` to be accessed via
1369  *   `.git::$INDEX_ALLOCATION/`.
1370  *
1371  * When this function returns 1, it indicates that the specified file/directory
1372  * name refers to a `.git` file or directory, or to any of these synonyms, and
1373  * Git should therefore not track it.
1374  *
1375  * For performance reasons, _all_ Alternate Data Streams of `.git/` are
1376  * forbidden, not just `::$INDEX_ALLOCATION`.
1377  *
1378  * This function is intended to be used by `git fsck` even on platforms where
1379  * the backslash is a regular filename character, therefore it needs to handle
1380  * backlash characters in the provided `name` specially: they are interpreted
1381  * as directory separators.
1382  */
is_ntfs_dotgit(const char * name)1383 int is_ntfs_dotgit(const char *name)
1384 {
1385 	char c;
1386 
1387 	/*
1388 	 * Note that when we don't find `.git` or `git~1` we end up with `name`
1389 	 * advanced partway through the string. That's okay, though, as we
1390 	 * return immediately in those cases, without looking at `name` any
1391 	 * further.
1392 	 */
1393 	c = *(name++);
1394 	if (c == '.') {
1395 		/* .git */
1396 		if (((c = *(name++)) != 'g' && c != 'G') ||
1397 		    ((c = *(name++)) != 'i' && c != 'I') ||
1398 		    ((c = *(name++)) != 't' && c != 'T'))
1399 			return 0;
1400 	} else if (c == 'g' || c == 'G') {
1401 		/* git ~1 */
1402 		if (((c = *(name++)) != 'i' && c != 'I') ||
1403 		    ((c = *(name++)) != 't' && c != 'T') ||
1404 		    *(name++) != '~' ||
1405 		    *(name++) != '1')
1406 			return 0;
1407 	} else
1408 		return 0;
1409 
1410 	for (;;) {
1411 		c = *(name++);
1412 		if (!c || c == '\\' || c == '/' || c == ':')
1413 			return 1;
1414 		if (c != '.' && c != ' ')
1415 			return 0;
1416 	}
1417 }
1418 
is_ntfs_dot_generic(const char * name,const char * dotgit_name,size_t len,const char * dotgit_ntfs_shortname_prefix)1419 static int is_ntfs_dot_generic(const char *name,
1420 			       const char *dotgit_name,
1421 			       size_t len,
1422 			       const char *dotgit_ntfs_shortname_prefix)
1423 {
1424 	int saw_tilde;
1425 	size_t i;
1426 
1427 	if ((name[0] == '.' && !strncasecmp(name + 1, dotgit_name, len))) {
1428 		i = len + 1;
1429 only_spaces_and_periods:
1430 		for (;;) {
1431 			char c = name[i++];
1432 			if (!c || c == ':')
1433 				return 1;
1434 			if (c != ' ' && c != '.')
1435 				return 0;
1436 		}
1437 	}
1438 
1439 	/*
1440 	 * Is it a regular NTFS short name, i.e. shortened to 6 characters,
1441 	 * followed by ~1, ... ~4?
1442 	 */
1443 	if (!strncasecmp(name, dotgit_name, 6) && name[6] == '~' &&
1444 	    name[7] >= '1' && name[7] <= '4') {
1445 		i = 8;
1446 		goto only_spaces_and_periods;
1447 	}
1448 
1449 	/*
1450 	 * Is it a fall-back NTFS short name (for details, see
1451 	 * https://en.wikipedia.org/wiki/8.3_filename?
1452 	 */
1453 	for (i = 0, saw_tilde = 0; i < 8; i++)
1454 		if (name[i] == '\0')
1455 			return 0;
1456 		else if (saw_tilde) {
1457 			if (name[i] < '0' || name[i] > '9')
1458 				return 0;
1459 		} else if (name[i] == '~') {
1460 			if (name[++i] < '1' || name[i] > '9')
1461 				return 0;
1462 			saw_tilde = 1;
1463 		} else if (i >= 6)
1464 			return 0;
1465 		else if (name[i] & 0x80) {
1466 			/*
1467 			 * We know our needles contain only ASCII, so we clamp
1468 			 * here to make the results of tolower() sane.
1469 			 */
1470 			return 0;
1471 		} else if (tolower(name[i]) != dotgit_ntfs_shortname_prefix[i])
1472 			return 0;
1473 
1474 	goto only_spaces_and_periods;
1475 }
1476 
1477 /*
1478  * Inline helper to make sure compiler resolves strlen() on literals at
1479  * compile time.
1480  */
is_ntfs_dot_str(const char * name,const char * dotgit_name,const char * dotgit_ntfs_shortname_prefix)1481 static inline int is_ntfs_dot_str(const char *name, const char *dotgit_name,
1482 				  const char *dotgit_ntfs_shortname_prefix)
1483 {
1484 	return is_ntfs_dot_generic(name, dotgit_name, strlen(dotgit_name),
1485 				   dotgit_ntfs_shortname_prefix);
1486 }
1487 
is_ntfs_dotgitmodules(const char * name)1488 int is_ntfs_dotgitmodules(const char *name)
1489 {
1490 	return is_ntfs_dot_str(name, "gitmodules", "gi7eba");
1491 }
1492 
is_ntfs_dotgitignore(const char * name)1493 int is_ntfs_dotgitignore(const char *name)
1494 {
1495 	return is_ntfs_dot_str(name, "gitignore", "gi250a");
1496 }
1497 
is_ntfs_dotgitattributes(const char * name)1498 int is_ntfs_dotgitattributes(const char *name)
1499 {
1500 	return is_ntfs_dot_str(name, "gitattributes", "gi7d29");
1501 }
1502 
is_ntfs_dotmailmap(const char * name)1503 int is_ntfs_dotmailmap(const char *name)
1504 {
1505 	return is_ntfs_dot_str(name, "mailmap", "maba30");
1506 }
1507 
looks_like_command_line_option(const char * str)1508 int looks_like_command_line_option(const char *str)
1509 {
1510 	return str && str[0] == '-';
1511 }
1512 
xdg_config_home_for(const char * subdir,const char * filename)1513 char *xdg_config_home_for(const char *subdir, const char *filename)
1514 {
1515 	const char *home, *config_home;
1516 
1517 	assert(subdir);
1518 	assert(filename);
1519 	config_home = getenv("XDG_CONFIG_HOME");
1520 	if (config_home && *config_home)
1521 		return mkpathdup("%s/%s/%s", config_home, subdir, filename);
1522 
1523 	home = getenv("HOME");
1524 	if (home)
1525 		return mkpathdup("%s/.config/%s/%s", home, subdir, filename);
1526 
1527 	return NULL;
1528 }
1529 
xdg_config_home(const char * filename)1530 char *xdg_config_home(const char *filename)
1531 {
1532 	return xdg_config_home_for("git", filename);
1533 }
1534 
xdg_cache_home(const char * filename)1535 char *xdg_cache_home(const char *filename)
1536 {
1537 	const char *home, *cache_home;
1538 
1539 	assert(filename);
1540 	cache_home = getenv("XDG_CACHE_HOME");
1541 	if (cache_home && *cache_home)
1542 		return mkpathdup("%s/git/%s", cache_home, filename);
1543 
1544 	home = getenv("HOME");
1545 	if (home)
1546 		return mkpathdup("%s/.cache/git/%s", home, filename);
1547 	return NULL;
1548 }
1549 
1550 REPO_GIT_PATH_FUNC(squash_msg, "SQUASH_MSG")
1551 REPO_GIT_PATH_FUNC(merge_msg, "MERGE_MSG")
1552 REPO_GIT_PATH_FUNC(merge_rr, "MERGE_RR")
1553 REPO_GIT_PATH_FUNC(merge_mode, "MERGE_MODE")
1554 REPO_GIT_PATH_FUNC(merge_head, "MERGE_HEAD")
1555 REPO_GIT_PATH_FUNC(merge_autostash, "MERGE_AUTOSTASH")
1556 REPO_GIT_PATH_FUNC(auto_merge, "AUTO_MERGE")
1557 REPO_GIT_PATH_FUNC(fetch_head, "FETCH_HEAD")
1558 REPO_GIT_PATH_FUNC(shallow, "shallow")
1559