Merge branch 'en/stash-df-fix' into maint
"git stash", where the tentative change involves changing a directory to a file (or vice versa), was confused, which has been corrected. * en/stash-df-fix: stash: restore untracked files AFTER restoring tracked files stash: avoid feeding directories to update-index t3903: document a pair of directory/file bugs
This commit is contained in:
commit
e61304f21d
@ -313,6 +313,17 @@ static int reset_head(void)
|
|||||||
return run_command(&cp);
|
return run_command(&cp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int is_path_a_directory(const char *path)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* This function differs from abspath.c:is_directory() in that
|
||||||
|
* here we use lstat() instead of stat(); we do not want to
|
||||||
|
* follow symbolic links here.
|
||||||
|
*/
|
||||||
|
struct stat st;
|
||||||
|
return (!lstat(path, &st) && S_ISDIR(st.st_mode));
|
||||||
|
}
|
||||||
|
|
||||||
static void add_diff_to_buf(struct diff_queue_struct *q,
|
static void add_diff_to_buf(struct diff_queue_struct *q,
|
||||||
struct diff_options *options,
|
struct diff_options *options,
|
||||||
void *data)
|
void *data)
|
||||||
@ -320,6 +331,9 @@ static void add_diff_to_buf(struct diff_queue_struct *q,
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < q->nr; i++) {
|
for (i = 0; i < q->nr; i++) {
|
||||||
|
if (is_path_a_directory(q->queue[i]->one->path))
|
||||||
|
continue;
|
||||||
|
|
||||||
strbuf_addstr(data, q->queue[i]->one->path);
|
strbuf_addstr(data, q->queue[i]->one->path);
|
||||||
|
|
||||||
/* NUL-terminate: will be fed to update-index -z */
|
/* NUL-terminate: will be fed to update-index -z */
|
||||||
@ -521,9 +535,6 @@ static int do_apply_stash(const char *prefix, struct stash_info *info,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (info->has_u && restore_untracked(&info->u_tree))
|
|
||||||
return error(_("could not restore untracked files from stash"));
|
|
||||||
|
|
||||||
init_merge_options(&o, the_repository);
|
init_merge_options(&o, the_repository);
|
||||||
|
|
||||||
o.branch1 = "Updated upstream";
|
o.branch1 = "Updated upstream";
|
||||||
@ -558,6 +569,9 @@ static int do_apply_stash(const char *prefix, struct stash_info *info,
|
|||||||
unstage_changes_unless_new(&c_tree);
|
unstage_changes_unless_new(&c_tree);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (info->has_u && restore_untracked(&info->u_tree))
|
||||||
|
return error(_("could not restore untracked files from stash"));
|
||||||
|
|
||||||
if (!quiet) {
|
if (!quiet) {
|
||||||
struct child_process cp = CHILD_PROCESS_INIT;
|
struct child_process cp = CHILD_PROCESS_INIT;
|
||||||
|
|
||||||
|
@ -1307,4 +1307,62 @@ test_expect_success 'stash -c stash.useBuiltin=false warning ' '
|
|||||||
test_must_be_empty err
|
test_must_be_empty err
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'git stash succeeds despite directory/file change' '
|
||||||
|
test_create_repo directory_file_switch_v1 &&
|
||||||
|
(
|
||||||
|
cd directory_file_switch_v1 &&
|
||||||
|
test_commit init &&
|
||||||
|
|
||||||
|
test_write_lines this file has some words >filler &&
|
||||||
|
git add filler &&
|
||||||
|
git commit -m filler &&
|
||||||
|
|
||||||
|
git rm filler &&
|
||||||
|
mkdir filler &&
|
||||||
|
echo contents >filler/file &&
|
||||||
|
git stash push
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'git stash can pop file -> directory saved changes' '
|
||||||
|
test_create_repo directory_file_switch_v2 &&
|
||||||
|
(
|
||||||
|
cd directory_file_switch_v2 &&
|
||||||
|
test_commit init &&
|
||||||
|
|
||||||
|
test_write_lines this file has some words >filler &&
|
||||||
|
git add filler &&
|
||||||
|
git commit -m filler &&
|
||||||
|
|
||||||
|
git rm filler &&
|
||||||
|
mkdir filler &&
|
||||||
|
echo contents >filler/file &&
|
||||||
|
cp filler/file expect &&
|
||||||
|
git stash push --include-untracked &&
|
||||||
|
git stash apply --index &&
|
||||||
|
test_cmp expect filler/file
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'git stash can pop directory -> file saved changes' '
|
||||||
|
test_create_repo directory_file_switch_v3 &&
|
||||||
|
(
|
||||||
|
cd directory_file_switch_v3 &&
|
||||||
|
test_commit init &&
|
||||||
|
|
||||||
|
mkdir filler &&
|
||||||
|
test_write_lines some words >filler/file1 &&
|
||||||
|
test_write_lines and stuff >filler/file2 &&
|
||||||
|
git add filler &&
|
||||||
|
git commit -m filler &&
|
||||||
|
|
||||||
|
git rm -rf filler &&
|
||||||
|
echo contents >filler &&
|
||||||
|
cp filler expect &&
|
||||||
|
git stash push --include-untracked &&
|
||||||
|
git stash apply --index &&
|
||||||
|
test_cmp expect filler
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user