1 #define USE_THE_INDEX_COMPATIBILITY_MACROS
2 #include "builtin.h"
3 #include "config.h"
4 #include "parse-options.h"
5 #include "refs.h"
6 #include "lockfile.h"
7 #include "cache-tree.h"
8 #include "unpack-trees.h"
9 #include "merge-recursive.h"
10 #include "strvec.h"
11 #include "run-command.h"
12 #include "dir.h"
13 #include "entry.h"
14 #include "rerere.h"
15 #include "revision.h"
16 #include "log-tree.h"
17 #include "diffcore.h"
18 #include "exec-cmd.h"
19 #include "entry.h"
20 
21 #define INCLUDE_ALL_FILES 2
22 
23 static const char * const git_stash_usage[] = {
24 	N_("git stash list [<options>]"),
25 	N_("git stash show [<options>] [<stash>]"),
26 	N_("git stash drop [-q|--quiet] [<stash>]"),
27 	N_("git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]"),
28 	N_("git stash branch <branchname> [<stash>]"),
29 	"git stash clear",
30 	N_("git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n"
31 	   "          [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n"
32 	   "          [--pathspec-from-file=<file> [--pathspec-file-nul]]\n"
33 	   "          [--] [<pathspec>...]]"),
34 	N_("git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n"
35 	   "          [-u|--include-untracked] [-a|--all] [<message>]"),
36 	NULL
37 };
38 
39 static const char * const git_stash_list_usage[] = {
40 	N_("git stash list [<options>]"),
41 	NULL
42 };
43 
44 static const char * const git_stash_show_usage[] = {
45 	N_("git stash show [<options>] [<stash>]"),
46 	NULL
47 };
48 
49 static const char * const git_stash_drop_usage[] = {
50 	N_("git stash drop [-q|--quiet] [<stash>]"),
51 	NULL
52 };
53 
54 static const char * const git_stash_pop_usage[] = {
55 	N_("git stash pop [--index] [-q|--quiet] [<stash>]"),
56 	NULL
57 };
58 
59 static const char * const git_stash_apply_usage[] = {
60 	N_("git stash apply [--index] [-q|--quiet] [<stash>]"),
61 	NULL
62 };
63 
64 static const char * const git_stash_branch_usage[] = {
65 	N_("git stash branch <branchname> [<stash>]"),
66 	NULL
67 };
68 
69 static const char * const git_stash_clear_usage[] = {
70 	"git stash clear",
71 	NULL
72 };
73 
74 static const char * const git_stash_store_usage[] = {
75 	N_("git stash store [-m|--message <message>] [-q|--quiet] <commit>"),
76 	NULL
77 };
78 
79 static const char * const git_stash_push_usage[] = {
80 	N_("git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n"
81 	   "          [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n"
82 	   "          [--] [<pathspec>...]]"),
83 	NULL
84 };
85 
86 static const char * const git_stash_save_usage[] = {
87 	N_("git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n"
88 	   "               [-u|--include-untracked] [-a|--all] [<message>]"),
89 	NULL
90 };
91 
92 static const char ref_stash[] = "refs/stash";
93 static struct strbuf stash_index_path = STRBUF_INIT;
94 
95 /*
96  * w_commit is set to the commit containing the working tree
97  * b_commit is set to the base commit
98  * i_commit is set to the commit containing the index tree
99  * u_commit is set to the commit containing the untracked files tree
100  * w_tree is set to the working tree
101  * b_tree is set to the base tree
102  * i_tree is set to the index tree
103  * u_tree is set to the untracked files tree
104  */
105 struct stash_info {
106 	struct object_id w_commit;
107 	struct object_id b_commit;
108 	struct object_id i_commit;
109 	struct object_id u_commit;
110 	struct object_id w_tree;
111 	struct object_id b_tree;
112 	struct object_id i_tree;
113 	struct object_id u_tree;
114 	struct strbuf revision;
115 	int is_stash_ref;
116 	int has_u;
117 };
118 
free_stash_info(struct stash_info * info)119 static void free_stash_info(struct stash_info *info)
120 {
121 	strbuf_release(&info->revision);
122 }
123 
assert_stash_like(struct stash_info * info,const char * revision)124 static void assert_stash_like(struct stash_info *info, const char *revision)
125 {
126 	if (get_oidf(&info->b_commit, "%s^1", revision) ||
127 	    get_oidf(&info->w_tree, "%s:", revision) ||
128 	    get_oidf(&info->b_tree, "%s^1:", revision) ||
129 	    get_oidf(&info->i_tree, "%s^2:", revision))
130 		die(_("'%s' is not a stash-like commit"), revision);
131 }
132 
get_stash_info(struct stash_info * info,int argc,const char ** argv)133 static int get_stash_info(struct stash_info *info, int argc, const char **argv)
134 {
135 	int ret;
136 	char *end_of_rev;
137 	char *expanded_ref;
138 	const char *revision;
139 	const char *commit = NULL;
140 	struct object_id dummy;
141 	struct strbuf symbolic = STRBUF_INIT;
142 
143 	if (argc > 1) {
144 		int i;
145 		struct strbuf refs_msg = STRBUF_INIT;
146 
147 		for (i = 0; i < argc; i++)
148 			strbuf_addf(&refs_msg, " '%s'", argv[i]);
149 
150 		fprintf_ln(stderr, _("Too many revisions specified:%s"),
151 			   refs_msg.buf);
152 		strbuf_release(&refs_msg);
153 
154 		return -1;
155 	}
156 
157 	if (argc == 1)
158 		commit = argv[0];
159 
160 	strbuf_init(&info->revision, 0);
161 	if (!commit) {
162 		if (!ref_exists(ref_stash)) {
163 			free_stash_info(info);
164 			fprintf_ln(stderr, _("No stash entries found."));
165 			return -1;
166 		}
167 
168 		strbuf_addf(&info->revision, "%s@{0}", ref_stash);
169 	} else if (strspn(commit, "0123456789") == strlen(commit)) {
170 		strbuf_addf(&info->revision, "%s@{%s}", ref_stash, commit);
171 	} else {
172 		strbuf_addstr(&info->revision, commit);
173 	}
174 
175 	revision = info->revision.buf;
176 
177 	if (get_oid(revision, &info->w_commit)) {
178 		error(_("%s is not a valid reference"), revision);
179 		free_stash_info(info);
180 		return -1;
181 	}
182 
183 	assert_stash_like(info, revision);
184 
185 	info->has_u = !get_oidf(&info->u_tree, "%s^3:", revision);
186 
187 	end_of_rev = strchrnul(revision, '@');
188 	strbuf_add(&symbolic, revision, end_of_rev - revision);
189 
190 	ret = dwim_ref(symbolic.buf, symbolic.len, &dummy, &expanded_ref, 0);
191 	strbuf_release(&symbolic);
192 	switch (ret) {
193 	case 0: /* Not found, but valid ref */
194 		info->is_stash_ref = 0;
195 		break;
196 	case 1:
197 		info->is_stash_ref = !strcmp(expanded_ref, ref_stash);
198 		break;
199 	default: /* Invalid or ambiguous */
200 		free_stash_info(info);
201 	}
202 
203 	free(expanded_ref);
204 	return !(ret == 0 || ret == 1);
205 }
206 
do_clear_stash(void)207 static int do_clear_stash(void)
208 {
209 	struct object_id obj;
210 	if (get_oid(ref_stash, &obj))
211 		return 0;
212 
213 	return delete_ref(NULL, ref_stash, &obj, 0);
214 }
215 
clear_stash(int argc,const char ** argv,const char * prefix)216 static int clear_stash(int argc, const char **argv, const char *prefix)
217 {
218 	struct option options[] = {
219 		OPT_END()
220 	};
221 
222 	argc = parse_options(argc, argv, prefix, options,
223 			     git_stash_clear_usage,
224 			     PARSE_OPT_STOP_AT_NON_OPTION);
225 
226 	if (argc)
227 		return error(_("git stash clear with arguments is "
228 			       "unimplemented"));
229 
230 	return do_clear_stash();
231 }
232 
reset_tree(struct object_id * i_tree,int update,int reset)233 static int reset_tree(struct object_id *i_tree, int update, int reset)
234 {
235 	int nr_trees = 1;
236 	struct unpack_trees_options opts;
237 	struct tree_desc t[MAX_UNPACK_TREES];
238 	struct tree *tree;
239 	struct lock_file lock_file = LOCK_INIT;
240 
241 	read_cache_preload(NULL);
242 	if (refresh_cache(REFRESH_QUIET))
243 		return -1;
244 
245 	hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
246 
247 	memset(&opts, 0, sizeof(opts));
248 
249 	tree = parse_tree_indirect(i_tree);
250 	if (parse_tree(tree))
251 		return -1;
252 
253 	init_tree_desc(t, tree->buffer, tree->size);
254 
255 	opts.head_idx = 1;
256 	opts.src_index = &the_index;
257 	opts.dst_index = &the_index;
258 	opts.merge = 1;
259 	opts.reset = reset ? UNPACK_RESET_PROTECT_UNTRACKED : 0;
260 	opts.update = update;
261 	if (update)
262 		opts.preserve_ignored = 0; /* FIXME: !overwrite_ignore */
263 	opts.fn = oneway_merge;
264 
265 	if (unpack_trees(nr_trees, t, &opts))
266 		return -1;
267 
268 	if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
269 		return error(_("unable to write new index file"));
270 
271 	return 0;
272 }
273 
diff_tree_binary(struct strbuf * out,struct object_id * w_commit)274 static int diff_tree_binary(struct strbuf *out, struct object_id *w_commit)
275 {
276 	struct child_process cp = CHILD_PROCESS_INIT;
277 	const char *w_commit_hex = oid_to_hex(w_commit);
278 
279 	/*
280 	 * Diff-tree would not be very hard to replace with a native function,
281 	 * however it should be done together with apply_cached.
282 	 */
283 	cp.git_cmd = 1;
284 	strvec_pushl(&cp.args, "diff-tree", "--binary", NULL);
285 	strvec_pushf(&cp.args, "%s^2^..%s^2", w_commit_hex, w_commit_hex);
286 
287 	return pipe_command(&cp, NULL, 0, out, 0, NULL, 0);
288 }
289 
apply_cached(struct strbuf * out)290 static int apply_cached(struct strbuf *out)
291 {
292 	struct child_process cp = CHILD_PROCESS_INIT;
293 
294 	/*
295 	 * Apply currently only reads either from stdin or a file, thus
296 	 * apply_all_patches would have to be updated to optionally take a
297 	 * buffer.
298 	 */
299 	cp.git_cmd = 1;
300 	strvec_pushl(&cp.args, "apply", "--cached", NULL);
301 	return pipe_command(&cp, out->buf, out->len, NULL, 0, NULL, 0);
302 }
303 
reset_head(void)304 static int reset_head(void)
305 {
306 	struct child_process cp = CHILD_PROCESS_INIT;
307 
308 	/*
309 	 * Reset is overall quite simple, however there is no current public
310 	 * API for resetting.
311 	 */
312 	cp.git_cmd = 1;
313 	strvec_push(&cp.args, "reset");
314 
315 	return run_command(&cp);
316 }
317 
is_path_a_directory(const char * path)318 static int is_path_a_directory(const char *path)
319 {
320 	/*
321 	 * This function differs from abspath.c:is_directory() in that
322 	 * here we use lstat() instead of stat(); we do not want to
323 	 * follow symbolic links here.
324 	 */
325 	struct stat st;
326 	return (!lstat(path, &st) && S_ISDIR(st.st_mode));
327 }
328 
add_diff_to_buf(struct diff_queue_struct * q,struct diff_options * options,void * data)329 static void add_diff_to_buf(struct diff_queue_struct *q,
330 			    struct diff_options *options,
331 			    void *data)
332 {
333 	int i;
334 
335 	for (i = 0; i < q->nr; i++) {
336 		if (is_path_a_directory(q->queue[i]->one->path))
337 			continue;
338 
339 		strbuf_addstr(data, q->queue[i]->one->path);
340 
341 		/* NUL-terminate: will be fed to update-index -z */
342 		strbuf_addch(data, '\0');
343 	}
344 }
345 
restore_untracked(struct object_id * u_tree)346 static int restore_untracked(struct object_id *u_tree)
347 {
348 	int res;
349 	struct child_process cp = CHILD_PROCESS_INIT;
350 
351 	/*
352 	 * We need to run restore files from a given index, but without
353 	 * affecting the current index, so we use GIT_INDEX_FILE with
354 	 * run_command to fork processes that will not interfere.
355 	 */
356 	cp.git_cmd = 1;
357 	strvec_push(&cp.args, "read-tree");
358 	strvec_push(&cp.args, oid_to_hex(u_tree));
359 	strvec_pushf(&cp.env_array, "GIT_INDEX_FILE=%s",
360 		     stash_index_path.buf);
361 	if (run_command(&cp)) {
362 		remove_path(stash_index_path.buf);
363 		return -1;
364 	}
365 
366 	child_process_init(&cp);
367 	cp.git_cmd = 1;
368 	strvec_pushl(&cp.args, "checkout-index", "--all", NULL);
369 	strvec_pushf(&cp.env_array, "GIT_INDEX_FILE=%s",
370 		     stash_index_path.buf);
371 
372 	res = run_command(&cp);
373 	remove_path(stash_index_path.buf);
374 	return res;
375 }
376 
unstage_changes_unless_new(struct object_id * orig_tree)377 static void unstage_changes_unless_new(struct object_id *orig_tree)
378 {
379 	/*
380 	 * When we enter this function, there has been a clean merge of
381 	 * relevant trees, and the merge logic always stages whatever merges
382 	 * cleanly.  We want to unstage those changes, unless it corresponds
383 	 * to a file that didn't exist as of orig_tree.
384 	 *
385 	 * However, if any SKIP_WORKTREE path is modified relative to
386 	 * orig_tree, then we want to clear the SKIP_WORKTREE bit and write
387 	 * it to the worktree before unstaging.
388 	 */
389 
390 	struct checkout state = CHECKOUT_INIT;
391 	struct diff_options diff_opts;
392 	struct lock_file lock = LOCK_INIT;
393 	int i;
394 
395 	/* If any entries have skip_worktree set, we'll have to check 'em out */
396 	state.force = 1;
397 	state.quiet = 1;
398 	state.refresh_cache = 1;
399 	state.istate = &the_index;
400 
401 	/*
402 	 * Step 1: get a difference between orig_tree (which corresponding
403 	 * to the index before a merge was run) and the current index
404 	 * (reflecting the changes brought in by the merge).
405 	 */
406 	diff_setup(&diff_opts);
407 	diff_opts.flags.recursive = 1;
408 	diff_opts.detect_rename = 0;
409 	diff_opts.output_format = DIFF_FORMAT_NO_OUTPUT;
410 	diff_setup_done(&diff_opts);
411 
412 	do_diff_cache(orig_tree, &diff_opts);
413 	diffcore_std(&diff_opts);
414 
415 	/* Iterate over the paths that changed due to the merge... */
416 	for (i = 0; i < diff_queued_diff.nr; i++) {
417 		struct diff_filepair *p;
418 		struct cache_entry *ce;
419 		int pos;
420 
421 		/* Look up the path's position in the current index. */
422 		p = diff_queued_diff.queue[i];
423 		pos = index_name_pos(&the_index, p->two->path,
424 				     strlen(p->two->path));
425 
426 		/*
427 		 * Step 2: Place changes in the working tree
428 		 *
429 		 * Stash is about restoring changes *to the working tree*.
430 		 * So if the merge successfully got a new version of some
431 		 * path, but left it out of the working tree, then clear the
432 		 * SKIP_WORKTREE bit and write it to the working tree.
433 		 */
434 		if (pos >= 0 && ce_skip_worktree(active_cache[pos])) {
435 			struct stat st;
436 
437 			ce = active_cache[pos];
438 			if (!lstat(ce->name, &st)) {
439 				/* Conflicting path present; relocate it */
440 				struct strbuf new_path = STRBUF_INIT;
441 				int fd;
442 
443 				strbuf_addf(&new_path,
444 					    "%s.stash.XXXXXX", ce->name);
445 				fd = xmkstemp(new_path.buf);
446 				close(fd);
447 				printf(_("WARNING: Untracked file in way of "
448 					 "tracked file!  Renaming\n "
449 					 "           %s -> %s\n"
450 					 "         to make room.\n"),
451 				       ce->name, new_path.buf);
452 				if (rename(ce->name, new_path.buf))
453 					die("Failed to move %s to %s\n",
454 					    ce->name, new_path.buf);
455 				strbuf_release(&new_path);
456 			}
457 			checkout_entry(ce, &state, NULL, NULL);
458 			ce->ce_flags &= ~CE_SKIP_WORKTREE;
459 		}
460 
461 		/*
462 		 * Step 3: "unstage" changes, as long as they are still tracked
463 		 */
464 		if (p->one->oid_valid) {
465 			/*
466 			 * Path existed in orig_tree; restore index entry
467 			 * from that tree in order to "unstage" the changes.
468 			 */
469 			int option = ADD_CACHE_OK_TO_REPLACE;
470 			if (pos < 0)
471 				option = ADD_CACHE_OK_TO_ADD;
472 
473 			ce = make_cache_entry(&the_index,
474 					      p->one->mode,
475 					      &p->one->oid,
476 					      p->one->path,
477 					      0, 0);
478 			add_index_entry(&the_index, ce, option);
479 		}
480 	}
481 	diff_flush(&diff_opts);
482 
483 	/*
484 	 * Step 4: write the new index to disk
485 	 */
486 	repo_hold_locked_index(the_repository, &lock, LOCK_DIE_ON_ERROR);
487 	if (write_locked_index(&the_index, &lock,
488 			       COMMIT_LOCK | SKIP_IF_UNCHANGED))
489 		die(_("Unable to write index."));
490 }
491 
do_apply_stash(const char * prefix,struct stash_info * info,int index,int quiet)492 static int do_apply_stash(const char *prefix, struct stash_info *info,
493 			  int index, int quiet)
494 {
495 	int ret;
496 	int has_index = index;
497 	struct merge_options o;
498 	struct object_id c_tree;
499 	struct object_id index_tree;
500 	struct commit *result;
501 	const struct object_id *bases[1];
502 
503 	read_cache_preload(NULL);
504 	if (refresh_and_write_cache(REFRESH_QUIET, 0, 0))
505 		return -1;
506 
507 	if (write_cache_as_tree(&c_tree, 0, NULL))
508 		return error(_("cannot apply a stash in the middle of a merge"));
509 
510 	if (index) {
511 		if (oideq(&info->b_tree, &info->i_tree) ||
512 		    oideq(&c_tree, &info->i_tree)) {
513 			has_index = 0;
514 		} else {
515 			struct strbuf out = STRBUF_INIT;
516 
517 			if (diff_tree_binary(&out, &info->w_commit)) {
518 				strbuf_release(&out);
519 				return error(_("could not generate diff %s^!."),
520 					     oid_to_hex(&info->w_commit));
521 			}
522 
523 			ret = apply_cached(&out);
524 			strbuf_release(&out);
525 			if (ret)
526 				return error(_("conflicts in index. "
527 					       "Try without --index."));
528 
529 			discard_cache();
530 			read_cache();
531 			if (write_cache_as_tree(&index_tree, 0, NULL))
532 				return error(_("could not save index tree"));
533 
534 			reset_head();
535 			discard_cache();
536 			read_cache();
537 		}
538 	}
539 
540 	init_merge_options(&o, the_repository);
541 
542 	o.branch1 = "Updated upstream";
543 	o.branch2 = "Stashed changes";
544 
545 	if (oideq(&info->b_tree, &c_tree))
546 		o.branch1 = "Version stash was based on";
547 
548 	if (quiet)
549 		o.verbosity = 0;
550 
551 	if (o.verbosity >= 3)
552 		printf_ln(_("Merging %s with %s"), o.branch1, o.branch2);
553 
554 	bases[0] = &info->b_tree;
555 
556 	ret = merge_recursive_generic(&o, &c_tree, &info->w_tree, 1, bases,
557 				      &result);
558 	if (ret) {
559 		rerere(0);
560 
561 		if (index)
562 			fprintf_ln(stderr, _("Index was not unstashed."));
563 
564 		return ret;
565 	}
566 
567 	if (has_index) {
568 		if (reset_tree(&index_tree, 0, 0))
569 			return -1;
570 	} else {
571 		unstage_changes_unless_new(&c_tree);
572 	}
573 
574 	if (info->has_u && restore_untracked(&info->u_tree))
575 		return error(_("could not restore untracked files from stash"));
576 
577 	if (!quiet) {
578 		struct child_process cp = CHILD_PROCESS_INIT;
579 
580 		/*
581 		 * Status is quite simple and could be replaced with calls to
582 		 * wt_status in the future, but it adds complexities which may
583 		 * require more tests.
584 		 */
585 		cp.git_cmd = 1;
586 		cp.dir = prefix;
587 		strvec_pushf(&cp.env_array, GIT_WORK_TREE_ENVIRONMENT"=%s",
588 			     absolute_path(get_git_work_tree()));
589 		strvec_pushf(&cp.env_array, GIT_DIR_ENVIRONMENT"=%s",
590 			     absolute_path(get_git_dir()));
591 		strvec_push(&cp.args, "status");
592 		run_command(&cp);
593 	}
594 
595 	return 0;
596 }
597 
apply_stash(int argc,const char ** argv,const char * prefix)598 static int apply_stash(int argc, const char **argv, const char *prefix)
599 {
600 	int ret;
601 	int quiet = 0;
602 	int index = 0;
603 	struct stash_info info;
604 	struct option options[] = {
605 		OPT__QUIET(&quiet, N_("be quiet, only report errors")),
606 		OPT_BOOL(0, "index", &index,
607 			 N_("attempt to recreate the index")),
608 		OPT_END()
609 	};
610 
611 	argc = parse_options(argc, argv, prefix, options,
612 			     git_stash_apply_usage, 0);
613 
614 	if (get_stash_info(&info, argc, argv))
615 		return -1;
616 
617 	ret = do_apply_stash(prefix, &info, index, quiet);
618 	free_stash_info(&info);
619 	return ret;
620 }
621 
reject_reflog_ent(struct object_id * ooid,struct object_id * noid,const char * email,timestamp_t timestamp,int tz,const char * message,void * cb_data)622 static int reject_reflog_ent(struct object_id *ooid, struct object_id *noid,
623 			     const char *email, timestamp_t timestamp, int tz,
624 			     const char *message, void *cb_data)
625 {
626 	return 1;
627 }
628 
reflog_is_empty(const char * refname)629 static int reflog_is_empty(const char *refname)
630 {
631 	return !for_each_reflog_ent(refname, reject_reflog_ent, NULL);
632 }
633 
do_drop_stash(struct stash_info * info,int quiet)634 static int do_drop_stash(struct stash_info *info, int quiet)
635 {
636 	int ret;
637 	struct child_process cp_reflog = CHILD_PROCESS_INIT;
638 
639 	/*
640 	 * reflog does not provide a simple function for deleting refs. One will
641 	 * need to be added to avoid implementing too much reflog code here
642 	 */
643 
644 	cp_reflog.git_cmd = 1;
645 	strvec_pushl(&cp_reflog.args, "reflog", "delete", "--updateref",
646 		     "--rewrite", NULL);
647 	strvec_push(&cp_reflog.args, info->revision.buf);
648 	ret = run_command(&cp_reflog);
649 	if (!ret) {
650 		if (!quiet)
651 			printf_ln(_("Dropped %s (%s)"), info->revision.buf,
652 				  oid_to_hex(&info->w_commit));
653 	} else {
654 		return error(_("%s: Could not drop stash entry"),
655 			     info->revision.buf);
656 	}
657 
658 	if (reflog_is_empty(ref_stash))
659 		do_clear_stash();
660 
661 	return 0;
662 }
663 
assert_stash_ref(struct stash_info * info)664 static void assert_stash_ref(struct stash_info *info)
665 {
666 	if (!info->is_stash_ref) {
667 		error(_("'%s' is not a stash reference"), info->revision.buf);
668 		free_stash_info(info);
669 		exit(1);
670 	}
671 }
672 
drop_stash(int argc,const char ** argv,const char * prefix)673 static int drop_stash(int argc, const char **argv, const char *prefix)
674 {
675 	int ret;
676 	int quiet = 0;
677 	struct stash_info info;
678 	struct option options[] = {
679 		OPT__QUIET(&quiet, N_("be quiet, only report errors")),
680 		OPT_END()
681 	};
682 
683 	argc = parse_options(argc, argv, prefix, options,
684 			     git_stash_drop_usage, 0);
685 
686 	if (get_stash_info(&info, argc, argv))
687 		return -1;
688 
689 	assert_stash_ref(&info);
690 
691 	ret = do_drop_stash(&info, quiet);
692 	free_stash_info(&info);
693 	return ret;
694 }
695 
pop_stash(int argc,const char ** argv,const char * prefix)696 static int pop_stash(int argc, const char **argv, const char *prefix)
697 {
698 	int ret;
699 	int index = 0;
700 	int quiet = 0;
701 	struct stash_info info;
702 	struct option options[] = {
703 		OPT__QUIET(&quiet, N_("be quiet, only report errors")),
704 		OPT_BOOL(0, "index", &index,
705 			 N_("attempt to recreate the index")),
706 		OPT_END()
707 	};
708 
709 	argc = parse_options(argc, argv, prefix, options,
710 			     git_stash_pop_usage, 0);
711 
712 	if (get_stash_info(&info, argc, argv))
713 		return -1;
714 
715 	assert_stash_ref(&info);
716 	if ((ret = do_apply_stash(prefix, &info, index, quiet)))
717 		printf_ln(_("The stash entry is kept in case "
718 			    "you need it again."));
719 	else
720 		ret = do_drop_stash(&info, quiet);
721 
722 	free_stash_info(&info);
723 	return ret;
724 }
725 
branch_stash(int argc,const char ** argv,const char * prefix)726 static int branch_stash(int argc, const char **argv, const char *prefix)
727 {
728 	int ret;
729 	const char *branch = NULL;
730 	struct stash_info info;
731 	struct child_process cp = CHILD_PROCESS_INIT;
732 	struct option options[] = {
733 		OPT_END()
734 	};
735 
736 	argc = parse_options(argc, argv, prefix, options,
737 			     git_stash_branch_usage, 0);
738 
739 	if (!argc) {
740 		fprintf_ln(stderr, _("No branch name specified"));
741 		return -1;
742 	}
743 
744 	branch = argv[0];
745 
746 	if (get_stash_info(&info, argc - 1, argv + 1))
747 		return -1;
748 
749 	cp.git_cmd = 1;
750 	strvec_pushl(&cp.args, "checkout", "-b", NULL);
751 	strvec_push(&cp.args, branch);
752 	strvec_push(&cp.args, oid_to_hex(&info.b_commit));
753 	ret = run_command(&cp);
754 	if (!ret)
755 		ret = do_apply_stash(prefix, &info, 1, 0);
756 	if (!ret && info.is_stash_ref)
757 		ret = do_drop_stash(&info, 0);
758 
759 	free_stash_info(&info);
760 
761 	return ret;
762 }
763 
list_stash(int argc,const char ** argv,const char * prefix)764 static int list_stash(int argc, const char **argv, const char *prefix)
765 {
766 	struct child_process cp = CHILD_PROCESS_INIT;
767 	struct option options[] = {
768 		OPT_END()
769 	};
770 
771 	argc = parse_options(argc, argv, prefix, options,
772 			     git_stash_list_usage,
773 			     PARSE_OPT_KEEP_UNKNOWN);
774 
775 	if (!ref_exists(ref_stash))
776 		return 0;
777 
778 	cp.git_cmd = 1;
779 	strvec_pushl(&cp.args, "log", "--format=%gd: %gs", "-g",
780 		     "--first-parent", NULL);
781 	strvec_pushv(&cp.args, argv);
782 	strvec_push(&cp.args, ref_stash);
783 	strvec_push(&cp.args, "--");
784 	return run_command(&cp);
785 }
786 
787 static int show_stat = 1;
788 static int show_patch;
789 static int show_include_untracked;
790 static int use_legacy_stash;
791 
git_stash_config(const char * var,const char * value,void * cb)792 static int git_stash_config(const char *var, const char *value, void *cb)
793 {
794 	if (!strcmp(var, "stash.showstat")) {
795 		show_stat = git_config_bool(var, value);
796 		return 0;
797 	}
798 	if (!strcmp(var, "stash.showpatch")) {
799 		show_patch = git_config_bool(var, value);
800 		return 0;
801 	}
802 	if (!strcmp(var, "stash.showincludeuntracked")) {
803 		show_include_untracked = git_config_bool(var, value);
804 		return 0;
805 	}
806 	if (!strcmp(var, "stash.usebuiltin")) {
807 		use_legacy_stash = !git_config_bool(var, value);
808 		return 0;
809 	}
810 	return git_diff_basic_config(var, value, cb);
811 }
812 
diff_include_untracked(const struct stash_info * info,struct diff_options * diff_opt)813 static void diff_include_untracked(const struct stash_info *info, struct diff_options *diff_opt)
814 {
815 	const struct object_id *oid[] = { &info->w_commit, &info->u_tree };
816 	struct tree *tree[ARRAY_SIZE(oid)];
817 	struct tree_desc tree_desc[ARRAY_SIZE(oid)];
818 	struct unpack_trees_options unpack_tree_opt = { 0 };
819 	int i;
820 
821 	for (i = 0; i < ARRAY_SIZE(oid); i++) {
822 		tree[i] = parse_tree_indirect(oid[i]);
823 		if (parse_tree(tree[i]) < 0)
824 			die(_("failed to parse tree"));
825 		init_tree_desc(&tree_desc[i], tree[i]->buffer, tree[i]->size);
826 	}
827 
828 	unpack_tree_opt.head_idx = -1;
829 	unpack_tree_opt.src_index = &the_index;
830 	unpack_tree_opt.dst_index = &the_index;
831 	unpack_tree_opt.merge = 1;
832 	unpack_tree_opt.fn = stash_worktree_untracked_merge;
833 
834 	if (unpack_trees(ARRAY_SIZE(tree_desc), tree_desc, &unpack_tree_opt))
835 		die(_("failed to unpack trees"));
836 
837 	do_diff_cache(&info->b_commit, diff_opt);
838 }
839 
show_stash(int argc,const char ** argv,const char * prefix)840 static int show_stash(int argc, const char **argv, const char *prefix)
841 {
842 	int i;
843 	int ret = 0;
844 	struct stash_info info;
845 	struct rev_info rev;
846 	struct strvec stash_args = STRVEC_INIT;
847 	struct strvec revision_args = STRVEC_INIT;
848 	enum {
849 		UNTRACKED_NONE,
850 		UNTRACKED_INCLUDE,
851 		UNTRACKED_ONLY
852 	} show_untracked = show_include_untracked ? UNTRACKED_INCLUDE : UNTRACKED_NONE;
853 	struct option options[] = {
854 		OPT_SET_INT('u', "include-untracked", &show_untracked,
855 			    N_("include untracked files in the stash"),
856 			    UNTRACKED_INCLUDE),
857 		OPT_SET_INT_F(0, "only-untracked", &show_untracked,
858 			      N_("only show untracked files in the stash"),
859 			      UNTRACKED_ONLY, PARSE_OPT_NONEG),
860 		OPT_END()
861 	};
862 
863 	init_diff_ui_defaults();
864 	git_config(git_diff_ui_config, NULL);
865 	init_revisions(&rev, prefix);
866 
867 	argc = parse_options(argc, argv, prefix, options, git_stash_show_usage,
868 			     PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN |
869 			     PARSE_OPT_KEEP_DASHDASH);
870 
871 	strvec_push(&revision_args, argv[0]);
872 	for (i = 1; i < argc; i++) {
873 		if (argv[i][0] != '-')
874 			strvec_push(&stash_args, argv[i]);
875 		else
876 			strvec_push(&revision_args, argv[i]);
877 	}
878 
879 	ret = get_stash_info(&info, stash_args.nr, stash_args.v);
880 	strvec_clear(&stash_args);
881 	if (ret)
882 		return -1;
883 
884 	/*
885 	 * The config settings are applied only if there are not passed
886 	 * any options.
887 	 */
888 	if (revision_args.nr == 1) {
889 		if (show_stat)
890 			rev.diffopt.output_format = DIFF_FORMAT_DIFFSTAT;
891 
892 		if (show_patch)
893 			rev.diffopt.output_format |= DIFF_FORMAT_PATCH;
894 
895 		if (!show_stat && !show_patch) {
896 			free_stash_info(&info);
897 			return 0;
898 		}
899 	}
900 
901 	argc = setup_revisions(revision_args.nr, revision_args.v, &rev, NULL);
902 	if (argc > 1) {
903 		free_stash_info(&info);
904 		usage_with_options(git_stash_show_usage, options);
905 	}
906 	if (!rev.diffopt.output_format) {
907 		rev.diffopt.output_format = DIFF_FORMAT_PATCH;
908 		diff_setup_done(&rev.diffopt);
909 	}
910 
911 	rev.diffopt.flags.recursive = 1;
912 	setup_diff_pager(&rev.diffopt);
913 	switch (show_untracked) {
914 	case UNTRACKED_NONE:
915 		diff_tree_oid(&info.b_commit, &info.w_commit, "", &rev.diffopt);
916 		break;
917 	case UNTRACKED_ONLY:
918 		if (info.has_u)
919 			diff_root_tree_oid(&info.u_tree, "", &rev.diffopt);
920 		break;
921 	case UNTRACKED_INCLUDE:
922 		if (info.has_u)
923 			diff_include_untracked(&info, &rev.diffopt);
924 		else
925 			diff_tree_oid(&info.b_commit, &info.w_commit, "", &rev.diffopt);
926 		break;
927 	}
928 	log_tree_diff_flush(&rev);
929 
930 	free_stash_info(&info);
931 	return diff_result_code(&rev.diffopt, 0);
932 }
933 
do_store_stash(const struct object_id * w_commit,const char * stash_msg,int quiet)934 static int do_store_stash(const struct object_id *w_commit, const char *stash_msg,
935 			  int quiet)
936 {
937 	if (!stash_msg)
938 		stash_msg = "Created via \"git stash store\".";
939 
940 	if (update_ref(stash_msg, ref_stash, w_commit, NULL,
941 		       REF_FORCE_CREATE_REFLOG,
942 		       quiet ? UPDATE_REFS_QUIET_ON_ERR :
943 		       UPDATE_REFS_MSG_ON_ERR)) {
944 		if (!quiet) {
945 			fprintf_ln(stderr, _("Cannot update %s with %s"),
946 				   ref_stash, oid_to_hex(w_commit));
947 		}
948 		return -1;
949 	}
950 
951 	return 0;
952 }
953 
store_stash(int argc,const char ** argv,const char * prefix)954 static int store_stash(int argc, const char **argv, const char *prefix)
955 {
956 	int quiet = 0;
957 	const char *stash_msg = NULL;
958 	struct object_id obj;
959 	struct object_context dummy;
960 	struct option options[] = {
961 		OPT__QUIET(&quiet, N_("be quiet")),
962 		OPT_STRING('m', "message", &stash_msg, "message",
963 			   N_("stash message")),
964 		OPT_END()
965 	};
966 
967 	argc = parse_options(argc, argv, prefix, options,
968 			     git_stash_store_usage,
969 			     PARSE_OPT_KEEP_UNKNOWN);
970 
971 	if (argc != 1) {
972 		if (!quiet)
973 			fprintf_ln(stderr, _("\"git stash store\" requires one "
974 					     "<commit> argument"));
975 		return -1;
976 	}
977 
978 	if (get_oid_with_context(the_repository,
979 				 argv[0], quiet ? GET_OID_QUIETLY : 0, &obj,
980 				 &dummy)) {
981 		if (!quiet)
982 			fprintf_ln(stderr, _("Cannot update %s with %s"),
983 					     ref_stash, argv[0]);
984 		return -1;
985 	}
986 
987 	return do_store_stash(&obj, stash_msg, quiet);
988 }
989 
add_pathspecs(struct strvec * args,const struct pathspec * ps)990 static void add_pathspecs(struct strvec *args,
991 			  const struct pathspec *ps) {
992 	int i;
993 
994 	for (i = 0; i < ps->nr; i++)
995 		strvec_push(args, ps->items[i].original);
996 }
997 
998 /*
999  * `untracked_files` will be filled with the names of untracked files.
1000  * The return value is:
1001  *
1002  * = 0 if there are not any untracked files
1003  * > 0 if there are untracked files
1004  */
get_untracked_files(const struct pathspec * ps,int include_untracked,struct strbuf * untracked_files)1005 static int get_untracked_files(const struct pathspec *ps, int include_untracked,
1006 			       struct strbuf *untracked_files)
1007 {
1008 	int i;
1009 	int found = 0;
1010 	struct dir_struct dir = DIR_INIT;
1011 
1012 	if (include_untracked != INCLUDE_ALL_FILES)
1013 		setup_standard_excludes(&dir);
1014 
1015 	fill_directory(&dir, the_repository->index, ps);
1016 	for (i = 0; i < dir.nr; i++) {
1017 		struct dir_entry *ent = dir.entries[i];
1018 		found++;
1019 		strbuf_addstr(untracked_files, ent->name);
1020 		/* NUL-terminate: will be fed to update-index -z */
1021 		strbuf_addch(untracked_files, '\0');
1022 	}
1023 
1024 	dir_clear(&dir);
1025 	return found;
1026 }
1027 
1028 /*
1029  * The return value of `check_changes_tracked_files()` can be:
1030  *
1031  * < 0 if there was an error
1032  * = 0 if there are no changes.
1033  * > 0 if there are changes.
1034  */
check_changes_tracked_files(const struct pathspec * ps)1035 static int check_changes_tracked_files(const struct pathspec *ps)
1036 {
1037 	int result;
1038 	struct rev_info rev;
1039 	struct object_id dummy;
1040 	int ret = 0;
1041 
1042 	/* No initial commit. */
1043 	if (get_oid("HEAD", &dummy))
1044 		return -1;
1045 
1046 	if (read_cache() < 0)
1047 		return -1;
1048 
1049 	init_revisions(&rev, NULL);
1050 	copy_pathspec(&rev.prune_data, ps);
1051 
1052 	rev.diffopt.flags.quick = 1;
1053 	rev.diffopt.flags.ignore_submodules = 1;
1054 	rev.abbrev = 0;
1055 
1056 	add_head_to_pending(&rev);
1057 	diff_setup_done(&rev.diffopt);
1058 
1059 	result = run_diff_index(&rev, 1);
1060 	if (diff_result_code(&rev.diffopt, result)) {
1061 		ret = 1;
1062 		goto done;
1063 	}
1064 
1065 	object_array_clear(&rev.pending);
1066 	result = run_diff_files(&rev, 0);
1067 	if (diff_result_code(&rev.diffopt, result)) {
1068 		ret = 1;
1069 		goto done;
1070 	}
1071 
1072 done:
1073 	clear_pathspec(&rev.prune_data);
1074 	return ret;
1075 }
1076 
1077 /*
1078  * The function will fill `untracked_files` with the names of untracked files
1079  * It will return 1 if there were any changes and 0 if there were not.
1080  */
check_changes(const struct pathspec * ps,int include_untracked,struct strbuf * untracked_files)1081 static int check_changes(const struct pathspec *ps, int include_untracked,
1082 			 struct strbuf *untracked_files)
1083 {
1084 	int ret = 0;
1085 	if (check_changes_tracked_files(ps))
1086 		ret = 1;
1087 
1088 	if (include_untracked && get_untracked_files(ps, include_untracked,
1089 						     untracked_files))
1090 		ret = 1;
1091 
1092 	return ret;
1093 }
1094 
save_untracked_files(struct stash_info * info,struct strbuf * msg,struct strbuf files)1095 static int save_untracked_files(struct stash_info *info, struct strbuf *msg,
1096 				struct strbuf files)
1097 {
1098 	int ret = 0;
1099 	struct strbuf untracked_msg = STRBUF_INIT;
1100 	struct child_process cp_upd_index = CHILD_PROCESS_INIT;
1101 	struct index_state istate = { NULL };
1102 
1103 	cp_upd_index.git_cmd = 1;
1104 	strvec_pushl(&cp_upd_index.args, "update-index", "-z", "--add",
1105 		     "--remove", "--stdin", NULL);
1106 	strvec_pushf(&cp_upd_index.env_array, "GIT_INDEX_FILE=%s",
1107 			 stash_index_path.buf);
1108 
1109 	strbuf_addf(&untracked_msg, "untracked files on %s\n", msg->buf);
1110 	if (pipe_command(&cp_upd_index, files.buf, files.len, NULL, 0,
1111 			 NULL, 0)) {
1112 		ret = -1;
1113 		goto done;
1114 	}
1115 
1116 	if (write_index_as_tree(&info->u_tree, &istate, stash_index_path.buf, 0,
1117 				NULL)) {
1118 		ret = -1;
1119 		goto done;
1120 	}
1121 
1122 	if (commit_tree(untracked_msg.buf, untracked_msg.len,
1123 			&info->u_tree, NULL, &info->u_commit, NULL, NULL)) {
1124 		ret = -1;
1125 		goto done;
1126 	}
1127 
1128 done:
1129 	discard_index(&istate);
1130 	strbuf_release(&untracked_msg);
1131 	remove_path(stash_index_path.buf);
1132 	return ret;
1133 }
1134 
stash_patch(struct stash_info * info,const struct pathspec * ps,struct strbuf * out_patch,int quiet)1135 static int stash_patch(struct stash_info *info, const struct pathspec *ps,
1136 		       struct strbuf *out_patch, int quiet)
1137 {
1138 	int ret = 0;
1139 	struct child_process cp_read_tree = CHILD_PROCESS_INIT;
1140 	struct child_process cp_diff_tree = CHILD_PROCESS_INIT;
1141 	struct index_state istate = { NULL };
1142 	char *old_index_env = NULL, *old_repo_index_file;
1143 
1144 	remove_path(stash_index_path.buf);
1145 
1146 	cp_read_tree.git_cmd = 1;
1147 	strvec_pushl(&cp_read_tree.args, "read-tree", "HEAD", NULL);
1148 	strvec_pushf(&cp_read_tree.env_array, "GIT_INDEX_FILE=%s",
1149 		     stash_index_path.buf);
1150 	if (run_command(&cp_read_tree)) {
1151 		ret = -1;
1152 		goto done;
1153 	}
1154 
1155 	/* Find out what the user wants. */
1156 	old_repo_index_file = the_repository->index_file;
1157 	the_repository->index_file = stash_index_path.buf;
1158 	old_index_env = xstrdup_or_null(getenv(INDEX_ENVIRONMENT));
1159 	setenv(INDEX_ENVIRONMENT, the_repository->index_file, 1);
1160 
1161 	ret = run_add_interactive(NULL, "--patch=stash", ps);
1162 
1163 	the_repository->index_file = old_repo_index_file;
1164 	if (old_index_env && *old_index_env)
1165 		setenv(INDEX_ENVIRONMENT, old_index_env, 1);
1166 	else
1167 		unsetenv(INDEX_ENVIRONMENT);
1168 	FREE_AND_NULL(old_index_env);
1169 
1170 	/* State of the working tree. */
1171 	if (write_index_as_tree(&info->w_tree, &istate, stash_index_path.buf, 0,
1172 				NULL)) {
1173 		ret = -1;
1174 		goto done;
1175 	}
1176 
1177 	cp_diff_tree.git_cmd = 1;
1178 	strvec_pushl(&cp_diff_tree.args, "diff-tree", "-p", "-U1", "HEAD",
1179 		     oid_to_hex(&info->w_tree), "--", NULL);
1180 	if (pipe_command(&cp_diff_tree, NULL, 0, out_patch, 0, NULL, 0)) {
1181 		ret = -1;
1182 		goto done;
1183 	}
1184 
1185 	if (!out_patch->len) {
1186 		if (!quiet)
1187 			fprintf_ln(stderr, _("No changes selected"));
1188 		ret = 1;
1189 	}
1190 
1191 done:
1192 	discard_index(&istate);
1193 	remove_path(stash_index_path.buf);
1194 	return ret;
1195 }
1196 
stash_working_tree(struct stash_info * info,const struct pathspec * ps)1197 static int stash_working_tree(struct stash_info *info, const struct pathspec *ps)
1198 {
1199 	int ret = 0;
1200 	struct rev_info rev;
1201 	struct child_process cp_upd_index = CHILD_PROCESS_INIT;
1202 	struct strbuf diff_output = STRBUF_INIT;
1203 	struct index_state istate = { NULL };
1204 
1205 	init_revisions(&rev, NULL);
1206 	copy_pathspec(&rev.prune_data, ps);
1207 
1208 	set_alternate_index_output(stash_index_path.buf);
1209 	if (reset_tree(&info->i_tree, 0, 0)) {
1210 		ret = -1;
1211 		goto done;
1212 	}
1213 	set_alternate_index_output(NULL);
1214 
1215 	rev.diffopt.output_format = DIFF_FORMAT_CALLBACK;
1216 	rev.diffopt.format_callback = add_diff_to_buf;
1217 	rev.diffopt.format_callback_data = &diff_output;
1218 
1219 	if (read_cache_preload(&rev.diffopt.pathspec) < 0) {
1220 		ret = -1;
1221 		goto done;
1222 	}
1223 
1224 	add_pending_object(&rev, parse_object(the_repository, &info->b_commit),
1225 			   "");
1226 	if (run_diff_index(&rev, 0)) {
1227 		ret = -1;
1228 		goto done;
1229 	}
1230 
1231 	cp_upd_index.git_cmd = 1;
1232 	strvec_pushl(&cp_upd_index.args, "update-index",
1233 		     "--ignore-skip-worktree-entries",
1234 		     "-z", "--add", "--remove", "--stdin", NULL);
1235 	strvec_pushf(&cp_upd_index.env_array, "GIT_INDEX_FILE=%s",
1236 		     stash_index_path.buf);
1237 
1238 	if (pipe_command(&cp_upd_index, diff_output.buf, diff_output.len,
1239 			 NULL, 0, NULL, 0)) {
1240 		ret = -1;
1241 		goto done;
1242 	}
1243 
1244 	if (write_index_as_tree(&info->w_tree, &istate, stash_index_path.buf, 0,
1245 				NULL)) {
1246 		ret = -1;
1247 		goto done;
1248 	}
1249 
1250 done:
1251 	discard_index(&istate);
1252 	UNLEAK(rev);
1253 	object_array_clear(&rev.pending);
1254 	clear_pathspec(&rev.prune_data);
1255 	strbuf_release(&diff_output);
1256 	remove_path(stash_index_path.buf);
1257 	return ret;
1258 }
1259 
do_create_stash(const struct pathspec * ps,struct strbuf * stash_msg_buf,int include_untracked,int patch_mode,struct stash_info * info,struct strbuf * patch,int quiet)1260 static int do_create_stash(const struct pathspec *ps, struct strbuf *stash_msg_buf,
1261 			   int include_untracked, int patch_mode,
1262 			   struct stash_info *info, struct strbuf *patch,
1263 			   int quiet)
1264 {
1265 	int ret = 0;
1266 	int flags = 0;
1267 	int untracked_commit_option = 0;
1268 	const char *head_short_sha1 = NULL;
1269 	const char *branch_ref = NULL;
1270 	const char *branch_name = "(no branch)";
1271 	struct commit *head_commit = NULL;
1272 	struct commit_list *parents = NULL;
1273 	struct strbuf msg = STRBUF_INIT;
1274 	struct strbuf commit_tree_label = STRBUF_INIT;
1275 	struct strbuf untracked_files = STRBUF_INIT;
1276 
1277 	prepare_fallback_ident("git stash", "git@stash");
1278 
1279 	read_cache_preload(NULL);
1280 	if (refresh_and_write_cache(REFRESH_QUIET, 0, 0) < 0) {
1281 		ret = -1;
1282 		goto done;
1283 	}
1284 
1285 	if (get_oid("HEAD", &info->b_commit)) {
1286 		if (!quiet)
1287 			fprintf_ln(stderr, _("You do not have "
1288 					     "the initial commit yet"));
1289 		ret = -1;
1290 		goto done;
1291 	} else {
1292 		head_commit = lookup_commit(the_repository, &info->b_commit);
1293 	}
1294 
1295 	if (!check_changes(ps, include_untracked, &untracked_files)) {
1296 		ret = 1;
1297 		goto done;
1298 	}
1299 
1300 	branch_ref = resolve_ref_unsafe("HEAD", 0, NULL, &flags);
1301 	if (flags & REF_ISSYMREF)
1302 		branch_name = strrchr(branch_ref, '/') + 1;
1303 	head_short_sha1 = find_unique_abbrev(&head_commit->object.oid,
1304 					     DEFAULT_ABBREV);
1305 	strbuf_addf(&msg, "%s: %s ", branch_name, head_short_sha1);
1306 	pp_commit_easy(CMIT_FMT_ONELINE, head_commit, &msg);
1307 
1308 	strbuf_addf(&commit_tree_label, "index on %s\n", msg.buf);
1309 	commit_list_insert(head_commit, &parents);
1310 	if (write_cache_as_tree(&info->i_tree, 0, NULL) ||
1311 	    commit_tree(commit_tree_label.buf, commit_tree_label.len,
1312 			&info->i_tree, parents, &info->i_commit, NULL, NULL)) {
1313 		if (!quiet)
1314 			fprintf_ln(stderr, _("Cannot save the current "
1315 					     "index state"));
1316 		ret = -1;
1317 		goto done;
1318 	}
1319 
1320 	if (include_untracked) {
1321 		if (save_untracked_files(info, &msg, untracked_files)) {
1322 			if (!quiet)
1323 				fprintf_ln(stderr, _("Cannot save "
1324 						     "the untracked files"));
1325 			ret = -1;
1326 			goto done;
1327 		}
1328 		untracked_commit_option = 1;
1329 	}
1330 	if (patch_mode) {
1331 		ret = stash_patch(info, ps, patch, quiet);
1332 		if (ret < 0) {
1333 			if (!quiet)
1334 				fprintf_ln(stderr, _("Cannot save the current "
1335 						     "worktree state"));
1336 			goto done;
1337 		} else if (ret > 0) {
1338 			goto done;
1339 		}
1340 	} else {
1341 		if (stash_working_tree(info, ps)) {
1342 			if (!quiet)
1343 				fprintf_ln(stderr, _("Cannot save the current "
1344 						     "worktree state"));
1345 			ret = -1;
1346 			goto done;
1347 		}
1348 	}
1349 
1350 	if (!stash_msg_buf->len)
1351 		strbuf_addf(stash_msg_buf, "WIP on %s", msg.buf);
1352 	else
1353 		strbuf_insertf(stash_msg_buf, 0, "On %s: ", branch_name);
1354 
1355 	/*
1356 	 * `parents` will be empty after calling `commit_tree()`, so there is
1357 	 * no need to call `free_commit_list()`
1358 	 */
1359 	parents = NULL;
1360 	if (untracked_commit_option)
1361 		commit_list_insert(lookup_commit(the_repository,
1362 						 &info->u_commit),
1363 				   &parents);
1364 	commit_list_insert(lookup_commit(the_repository, &info->i_commit),
1365 			   &parents);
1366 	commit_list_insert(head_commit, &parents);
1367 
1368 	if (commit_tree(stash_msg_buf->buf, stash_msg_buf->len, &info->w_tree,
1369 			parents, &info->w_commit, NULL, NULL)) {
1370 		if (!quiet)
1371 			fprintf_ln(stderr, _("Cannot record "
1372 					     "working tree state"));
1373 		ret = -1;
1374 		goto done;
1375 	}
1376 
1377 done:
1378 	strbuf_release(&commit_tree_label);
1379 	strbuf_release(&msg);
1380 	strbuf_release(&untracked_files);
1381 	return ret;
1382 }
1383 
create_stash(int argc,const char ** argv,const char * prefix)1384 static int create_stash(int argc, const char **argv, const char *prefix)
1385 {
1386 	int ret = 0;
1387 	struct strbuf stash_msg_buf = STRBUF_INIT;
1388 	struct stash_info info;
1389 	struct pathspec ps;
1390 
1391 	/* Starting with argv[1], since argv[0] is "create" */
1392 	strbuf_join_argv(&stash_msg_buf, argc - 1, ++argv, ' ');
1393 
1394 	memset(&ps, 0, sizeof(ps));
1395 	if (!check_changes_tracked_files(&ps))
1396 		return 0;
1397 
1398 	ret = do_create_stash(&ps, &stash_msg_buf, 0, 0, &info,
1399 			      NULL, 0);
1400 	if (!ret)
1401 		printf_ln("%s", oid_to_hex(&info.w_commit));
1402 
1403 	strbuf_release(&stash_msg_buf);
1404 	return ret;
1405 }
1406 
do_push_stash(const struct pathspec * ps,const char * stash_msg,int quiet,int keep_index,int patch_mode,int include_untracked)1407 static int do_push_stash(const struct pathspec *ps, const char *stash_msg, int quiet,
1408 			 int keep_index, int patch_mode, int include_untracked)
1409 {
1410 	int ret = 0;
1411 	struct stash_info info;
1412 	struct strbuf patch = STRBUF_INIT;
1413 	struct strbuf stash_msg_buf = STRBUF_INIT;
1414 	struct strbuf untracked_files = STRBUF_INIT;
1415 
1416 	if (patch_mode && keep_index == -1)
1417 		keep_index = 1;
1418 
1419 	if (patch_mode && include_untracked) {
1420 		fprintf_ln(stderr, _("Can't use --patch and --include-untracked"
1421 				     " or --all at the same time"));
1422 		ret = -1;
1423 		goto done;
1424 	}
1425 
1426 	read_cache_preload(NULL);
1427 	if (!include_untracked && ps->nr) {
1428 		int i;
1429 		char *ps_matched = xcalloc(ps->nr, 1);
1430 
1431 		/* TODO: audit for interaction with sparse-index. */
1432 		ensure_full_index(&the_index);
1433 		for (i = 0; i < active_nr; i++)
1434 			ce_path_match(&the_index, active_cache[i], ps,
1435 				      ps_matched);
1436 
1437 		if (report_path_error(ps_matched, ps)) {
1438 			fprintf_ln(stderr, _("Did you forget to 'git add'?"));
1439 			ret = -1;
1440 			free(ps_matched);
1441 			goto done;
1442 		}
1443 		free(ps_matched);
1444 	}
1445 
1446 	if (refresh_and_write_cache(REFRESH_QUIET, 0, 0)) {
1447 		ret = -1;
1448 		goto done;
1449 	}
1450 
1451 	if (!check_changes(ps, include_untracked, &untracked_files)) {
1452 		if (!quiet)
1453 			printf_ln(_("No local changes to save"));
1454 		goto done;
1455 	}
1456 
1457 	if (!reflog_exists(ref_stash) && do_clear_stash()) {
1458 		ret = -1;
1459 		if (!quiet)
1460 			fprintf_ln(stderr, _("Cannot initialize stash"));
1461 		goto done;
1462 	}
1463 
1464 	if (stash_msg)
1465 		strbuf_addstr(&stash_msg_buf, stash_msg);
1466 	if (do_create_stash(ps, &stash_msg_buf, include_untracked, patch_mode,
1467 			    &info, &patch, quiet)) {
1468 		ret = -1;
1469 		goto done;
1470 	}
1471 
1472 	if (do_store_stash(&info.w_commit, stash_msg_buf.buf, 1)) {
1473 		ret = -1;
1474 		if (!quiet)
1475 			fprintf_ln(stderr, _("Cannot save the current status"));
1476 		goto done;
1477 	}
1478 
1479 	if (!quiet)
1480 		printf_ln(_("Saved working directory and index state %s"),
1481 			  stash_msg_buf.buf);
1482 
1483 	if (!patch_mode) {
1484 		if (include_untracked && !ps->nr) {
1485 			struct child_process cp = CHILD_PROCESS_INIT;
1486 
1487 			cp.git_cmd = 1;
1488 			strvec_pushl(&cp.args, "clean", "--force",
1489 				     "--quiet", "-d", NULL);
1490 			if (include_untracked == INCLUDE_ALL_FILES)
1491 				strvec_push(&cp.args, "-x");
1492 			if (run_command(&cp)) {
1493 				ret = -1;
1494 				goto done;
1495 			}
1496 		}
1497 		discard_cache();
1498 		if (ps->nr) {
1499 			struct child_process cp_add = CHILD_PROCESS_INIT;
1500 			struct child_process cp_diff = CHILD_PROCESS_INIT;
1501 			struct child_process cp_apply = CHILD_PROCESS_INIT;
1502 			struct strbuf out = STRBUF_INIT;
1503 
1504 			cp_add.git_cmd = 1;
1505 			strvec_push(&cp_add.args, "add");
1506 			if (!include_untracked)
1507 				strvec_push(&cp_add.args, "-u");
1508 			if (include_untracked == INCLUDE_ALL_FILES)
1509 				strvec_push(&cp_add.args, "--force");
1510 			strvec_push(&cp_add.args, "--");
1511 			add_pathspecs(&cp_add.args, ps);
1512 			if (run_command(&cp_add)) {
1513 				ret = -1;
1514 				goto done;
1515 			}
1516 
1517 			cp_diff.git_cmd = 1;
1518 			strvec_pushl(&cp_diff.args, "diff-index", "-p",
1519 				     "--cached", "--binary", "HEAD", "--",
1520 				     NULL);
1521 			add_pathspecs(&cp_diff.args, ps);
1522 			if (pipe_command(&cp_diff, NULL, 0, &out, 0, NULL, 0)) {
1523 				ret = -1;
1524 				goto done;
1525 			}
1526 
1527 			cp_apply.git_cmd = 1;
1528 			strvec_pushl(&cp_apply.args, "apply", "--index",
1529 				     "-R", NULL);
1530 			if (pipe_command(&cp_apply, out.buf, out.len, NULL, 0,
1531 					 NULL, 0)) {
1532 				ret = -1;
1533 				goto done;
1534 			}
1535 		} else {
1536 			struct child_process cp = CHILD_PROCESS_INIT;
1537 			cp.git_cmd = 1;
1538 			/* BUG: this nukes untracked files in the way */
1539 			strvec_pushl(&cp.args, "reset", "--hard", "-q",
1540 				     "--no-recurse-submodules", NULL);
1541 			if (run_command(&cp)) {
1542 				ret = -1;
1543 				goto done;
1544 			}
1545 		}
1546 
1547 		if (keep_index == 1 && !is_null_oid(&info.i_tree)) {
1548 			struct child_process cp = CHILD_PROCESS_INIT;
1549 
1550 			cp.git_cmd = 1;
1551 			strvec_pushl(&cp.args, "checkout", "--no-overlay",
1552 				     oid_to_hex(&info.i_tree), "--", NULL);
1553 			if (!ps->nr)
1554 				strvec_push(&cp.args, ":/");
1555 			else
1556 				add_pathspecs(&cp.args, ps);
1557 			if (run_command(&cp)) {
1558 				ret = -1;
1559 				goto done;
1560 			}
1561 		}
1562 		goto done;
1563 	} else {
1564 		struct child_process cp = CHILD_PROCESS_INIT;
1565 
1566 		cp.git_cmd = 1;
1567 		strvec_pushl(&cp.args, "apply", "-R", NULL);
1568 
1569 		if (pipe_command(&cp, patch.buf, patch.len, NULL, 0, NULL, 0)) {
1570 			if (!quiet)
1571 				fprintf_ln(stderr, _("Cannot remove "
1572 						     "worktree changes"));
1573 			ret = -1;
1574 			goto done;
1575 		}
1576 
1577 		if (keep_index < 1) {
1578 			struct child_process cp = CHILD_PROCESS_INIT;
1579 
1580 			cp.git_cmd = 1;
1581 			strvec_pushl(&cp.args, "reset", "-q", "--", NULL);
1582 			add_pathspecs(&cp.args, ps);
1583 			if (run_command(&cp)) {
1584 				ret = -1;
1585 				goto done;
1586 			}
1587 		}
1588 		goto done;
1589 	}
1590 
1591 done:
1592 	strbuf_release(&stash_msg_buf);
1593 	return ret;
1594 }
1595 
push_stash(int argc,const char ** argv,const char * prefix,int push_assumed)1596 static int push_stash(int argc, const char **argv, const char *prefix,
1597 		      int push_assumed)
1598 {
1599 	int force_assume = 0;
1600 	int keep_index = -1;
1601 	int patch_mode = 0;
1602 	int include_untracked = 0;
1603 	int quiet = 0;
1604 	int pathspec_file_nul = 0;
1605 	const char *stash_msg = NULL;
1606 	const char *pathspec_from_file = NULL;
1607 	struct pathspec ps;
1608 	struct option options[] = {
1609 		OPT_BOOL('k', "keep-index", &keep_index,
1610 			 N_("keep index")),
1611 		OPT_BOOL('p', "patch", &patch_mode,
1612 			 N_("stash in patch mode")),
1613 		OPT__QUIET(&quiet, N_("quiet mode")),
1614 		OPT_BOOL('u', "include-untracked", &include_untracked,
1615 			 N_("include untracked files in stash")),
1616 		OPT_SET_INT('a', "all", &include_untracked,
1617 			    N_("include ignore files"), 2),
1618 		OPT_STRING('m', "message", &stash_msg, N_("message"),
1619 			   N_("stash message")),
1620 		OPT_PATHSPEC_FROM_FILE(&pathspec_from_file),
1621 		OPT_PATHSPEC_FILE_NUL(&pathspec_file_nul),
1622 		OPT_END()
1623 	};
1624 
1625 	if (argc) {
1626 		force_assume = !strcmp(argv[0], "-p");
1627 		argc = parse_options(argc, argv, prefix, options,
1628 				     git_stash_push_usage,
1629 				     PARSE_OPT_KEEP_DASHDASH);
1630 	}
1631 
1632 	if (argc) {
1633 		if (!strcmp(argv[0], "--")) {
1634 			argc--;
1635 			argv++;
1636 		} else if (push_assumed && !force_assume) {
1637 			die("subcommand wasn't specified; 'push' can't be assumed due to unexpected token '%s'",
1638 			    argv[0]);
1639 		}
1640 	}
1641 
1642 	parse_pathspec(&ps, 0, PATHSPEC_PREFER_FULL | PATHSPEC_PREFIX_ORIGIN,
1643 		       prefix, argv);
1644 
1645 	if (pathspec_from_file) {
1646 		if (patch_mode)
1647 			die(_("--pathspec-from-file is incompatible with --patch"));
1648 
1649 		if (ps.nr)
1650 			die(_("--pathspec-from-file is incompatible with pathspec arguments"));
1651 
1652 		parse_pathspec_file(&ps, 0,
1653 				    PATHSPEC_PREFER_FULL | PATHSPEC_PREFIX_ORIGIN,
1654 				    prefix, pathspec_from_file, pathspec_file_nul);
1655 	} else if (pathspec_file_nul) {
1656 		die(_("--pathspec-file-nul requires --pathspec-from-file"));
1657 	}
1658 
1659 	return do_push_stash(&ps, stash_msg, quiet, keep_index, patch_mode,
1660 			     include_untracked);
1661 }
1662 
save_stash(int argc,const char ** argv,const char * prefix)1663 static int save_stash(int argc, const char **argv, const char *prefix)
1664 {
1665 	int keep_index = -1;
1666 	int patch_mode = 0;
1667 	int include_untracked = 0;
1668 	int quiet = 0;
1669 	int ret = 0;
1670 	const char *stash_msg = NULL;
1671 	struct pathspec ps;
1672 	struct strbuf stash_msg_buf = STRBUF_INIT;
1673 	struct option options[] = {
1674 		OPT_BOOL('k', "keep-index", &keep_index,
1675 			 N_("keep index")),
1676 		OPT_BOOL('p', "patch", &patch_mode,
1677 			 N_("stash in patch mode")),
1678 		OPT__QUIET(&quiet, N_("quiet mode")),
1679 		OPT_BOOL('u', "include-untracked", &include_untracked,
1680 			 N_("include untracked files in stash")),
1681 		OPT_SET_INT('a', "all", &include_untracked,
1682 			    N_("include ignore files"), 2),
1683 		OPT_STRING('m', "message", &stash_msg, "message",
1684 			   N_("stash message")),
1685 		OPT_END()
1686 	};
1687 
1688 	argc = parse_options(argc, argv, prefix, options,
1689 			     git_stash_save_usage,
1690 			     PARSE_OPT_KEEP_DASHDASH);
1691 
1692 	if (argc)
1693 		stash_msg = strbuf_join_argv(&stash_msg_buf, argc, argv, ' ');
1694 
1695 	memset(&ps, 0, sizeof(ps));
1696 	ret = do_push_stash(&ps, stash_msg, quiet, keep_index,
1697 			    patch_mode, include_untracked);
1698 
1699 	strbuf_release(&stash_msg_buf);
1700 	return ret;
1701 }
1702 
cmd_stash(int argc,const char ** argv,const char * prefix)1703 int cmd_stash(int argc, const char **argv, const char *prefix)
1704 {
1705 	pid_t pid = getpid();
1706 	const char *index_file;
1707 	struct strvec args = STRVEC_INIT;
1708 
1709 	struct option options[] = {
1710 		OPT_END()
1711 	};
1712 
1713 	git_config(git_stash_config, NULL);
1714 
1715 	if (use_legacy_stash ||
1716 	    !git_env_bool("GIT_TEST_STASH_USE_BUILTIN", -1))
1717 		warning(_("the stash.useBuiltin support has been removed!\n"
1718 			  "See its entry in 'git help config' for details."));
1719 
1720 	argc = parse_options(argc, argv, prefix, options, git_stash_usage,
1721 			     PARSE_OPT_KEEP_UNKNOWN | PARSE_OPT_KEEP_DASHDASH);
1722 
1723 	index_file = get_index_file();
1724 	strbuf_addf(&stash_index_path, "%s.stash.%" PRIuMAX, index_file,
1725 		    (uintmax_t)pid);
1726 
1727 	if (!argc)
1728 		return !!push_stash(0, NULL, prefix, 0);
1729 	else if (!strcmp(argv[0], "apply"))
1730 		return !!apply_stash(argc, argv, prefix);
1731 	else if (!strcmp(argv[0], "clear"))
1732 		return !!clear_stash(argc, argv, prefix);
1733 	else if (!strcmp(argv[0], "drop"))
1734 		return !!drop_stash(argc, argv, prefix);
1735 	else if (!strcmp(argv[0], "pop"))
1736 		return !!pop_stash(argc, argv, prefix);
1737 	else if (!strcmp(argv[0], "branch"))
1738 		return !!branch_stash(argc, argv, prefix);
1739 	else if (!strcmp(argv[0], "list"))
1740 		return !!list_stash(argc, argv, prefix);
1741 	else if (!strcmp(argv[0], "show"))
1742 		return !!show_stash(argc, argv, prefix);
1743 	else if (!strcmp(argv[0], "store"))
1744 		return !!store_stash(argc, argv, prefix);
1745 	else if (!strcmp(argv[0], "create"))
1746 		return !!create_stash(argc, argv, prefix);
1747 	else if (!strcmp(argv[0], "push"))
1748 		return !!push_stash(argc, argv, prefix, 0);
1749 	else if (!strcmp(argv[0], "save"))
1750 		return !!save_stash(argc, argv, prefix);
1751 	else if (*argv[0] != '-')
1752 		usage_msg_opt(xstrfmt(_("unknown subcommand: %s"), argv[0]),
1753 			      git_stash_usage, options);
1754 
1755 	/* Assume 'stash push' */
1756 	strvec_push(&args, "push");
1757 	strvec_pushv(&args, argv);
1758 	return !!push_stash(args.nr, args.v, prefix, 1);
1759 }
1760