Merge pull request #2119 from dscho/update-stash-to-current

Update the built-in `git stash` to the latest version
This commit is contained in:
Johannes Schindelin
2019-03-11 19:58:29 +01:00
committed by GitHub
5 changed files with 29 additions and 20 deletions

View File

@@ -99,7 +99,6 @@ static struct strbuf stash_index_path = STRBUF_INIT;
* i_tree is set to the index tree
* u_tree is set to the untracked files tree
*/
struct stash_info {
struct object_id w_commit;
struct object_id b_commit;
@@ -320,11 +319,7 @@ static void add_diff_to_buf(struct diff_queue_struct *q,
for (i = 0; i < q->nr; i++) {
strbuf_addstr(data, q->queue[i]->one->path);
/*
* The reason we add "0" at the end of this strbuf
* is because we will pass the output further to
* "git update-index -z ...".
*/
/* NUL-terminate: will be fed to update-index -z */
strbuf_addch(data, '\0');
}
}
@@ -579,9 +574,9 @@ static int do_drop_stash(const char *prefix, struct stash_info *info, int quiet)
static void assert_stash_ref(struct stash_info *info)
{
if (!info->is_stash_ref) {
free_stash_info(info);
error(_("'%s' is not a stash reference"), info->revision.buf);
exit(128);
free_stash_info(info);
exit(1);
}
}
@@ -837,7 +832,7 @@ static void add_pathspecs(struct argv_array *args,
int i;
for (i = 0; i < ps.nr; i++)
argv_array_push(args, ps.items[i].match);
argv_array_push(args, ps.items[i].original);
}
/*
@@ -869,7 +864,7 @@ static int get_untracked_files(struct pathspec ps, int include_untracked,
found++;
strbuf_addstr(untracked_files, ent->name);
/* NUL-terminate: will be fed to update-index -z */
strbuf_addch(untracked_files, 0);
strbuf_addch(untracked_files, '\0');
}
free(ent);
}
@@ -888,7 +883,6 @@ static int get_untracked_files(struct pathspec ps, int include_untracked,
* = 0 if there are no changes.
* > 0 if there are changes.
*/
static int check_changes_tracked_files(struct pathspec ps)
{
int result;
@@ -928,7 +922,6 @@ static int check_changes_tracked_files(struct pathspec ps)
* The function will fill `untracked_files` with the names of untracked files
* It will return 1 if there were any changes and 0 if there were not.
*/
static int check_changes(struct pathspec ps, int include_untracked,
struct strbuf *untracked_files)
{
@@ -1238,7 +1231,9 @@ static int create_stash(int argc, const char **argv, const char *prefix)
if (!check_changes_tracked_files(ps))
return 0;
if (!(ret = do_create_stash(ps, &stash_msg_buf, 0, 0, &info, NULL, 0)))
ret = do_create_stash(ps, &stash_msg_buf, 0, 0, &info,
NULL, 0);
if (!ret)
printf_ln("%s", oid_to_hex(&info.w_commit));
strbuf_release(&stash_msg_buf);
@@ -1429,8 +1424,6 @@ static int do_push_stash(struct pathspec ps, const char *stash_msg, int quiet,
if (keep_index < 1) {
struct child_process cp = CHILD_PROCESS_INIT;
discard_cache();
cp.git_cmd = 1;
argv_array_pushl(&cp.args, "reset", "-q", "--", NULL);
add_pathspecs(&cp.args, ps);
@@ -1475,7 +1468,8 @@ static int push_stash(int argc, const char **argv, const char *prefix)
git_stash_push_usage,
0);
parse_pathspec(&ps, 0, PATHSPEC_PREFER_FULL, prefix, argv);
parse_pathspec(&ps, 0, PATHSPEC_PREFER_FULL | PATHSPEC_PREFIX_ORIGIN,
prefix, argv);
return do_push_stash(ps, stash_msg, quiet, keep_index, patch_mode,
include_untracked);
}

View File

@@ -1518,6 +1518,9 @@ extern const char *git_sequence_editor(void);
extern const char *git_pager(int stdout_is_tty);
extern int is_terminal_dumb(void);
extern int git_ident_config(const char *, const char *, void *);
/*
* Prepare an ident to fall back on if the user didn't configure it.
*/
void prepare_fallback_ident(const char *name, const char *email);
extern void reset_ident_date(void);

View File

@@ -86,17 +86,17 @@ maybe_quiet () {
shift
if test -n "$GIT_QUIET"
then
eval "$@" 2>/dev/null
"$@" 2>/dev/null
else
eval "$@"
"$@"
fi
;;
*)
if test -n "$GIT_QUIET"
then
eval "$@" >/dev/null 2>&1
"$@" >/dev/null 2>&1
else
eval "$@"
"$@"
fi
;;
esac

View File

@@ -1164,6 +1164,12 @@ test_expect_success 'stash -- <subdir> works with binary files' '
test_path_is_file subdir/untracked
'
test_expect_success 'stash with user.name and user.email set works' '
test_config user.name "A U Thor" &&
test_config user.email "a.u@thor" &&
git stash
'
test_expect_success 'stash works when user.name and user.email are not set' '
git reset &&
>1 &&

View File

@@ -283,4 +283,10 @@ test_expect_success 'stash -u -- <non-existant> shows no changes when there are
test_i18ncmp expect actual
'
test_expect_success 'stash -u with globs' '
>untracked.txt &&
git stash -u -- ":(glob)**/*.txt" &&
test_path_is_missing untracked.txt
'
test_done