commit fc6346c42a66d7fc562608e08dbd41e775facfc4 from: Stefan Sperling date: Wed Mar 27 11:51:30 2019 UTC don't leave file as unversioned in case of wt edit vs repo rm commit - 13d9040b96f5ba9ac50c137a9909f824dd5bde20 commit + fc6346c42a66d7fc562608e08dbd41e775facfc4 blob - 3f0523ffaec3bb0f816ab6a98521fbe8d543e3f6 blob + 694339afe5680f6668ebb29a16409b9056d82593 --- lib/worktree.c +++ lib/worktree.c @@ -1219,7 +1219,7 @@ delete_blob(struct got_worktree *worktree, struct got_ got_worktree_checkout_cb progress_cb, void *progress_arg, got_worktree_cancel_cb cancel_cb, void *cancel_arg) { - const struct got_error *err; + const struct got_error *err = NULL; unsigned char status; struct stat sb; char *ondisk_path; @@ -1231,17 +1231,29 @@ delete_blob(struct got_worktree *worktree, struct got_ err = get_file_status(&status, &sb, ie, ondisk_path, repo); if (err) return err; - - (*progress_cb)(progress_arg, GOT_STATUS_DELETE, ie->path); - if (status == GOT_STATUS_NO_CHANGE) { - err = remove_ondisk_file(worktree->root_path, ie->path); + if (status == GOT_STATUS_MODIFY || status == GOT_STATUS_CONFLICT || + status == GOT_STATUS_ADD) { + (*progress_cb)(progress_arg, GOT_STATUS_MERGE, ie->path); + /* + * Preserve the working file and change the deleted blob's + * entry into a schedule-add entry. + */ + err = got_fileindex_entry_update(ie, ondisk_path, NULL, NULL, + 0); if (err) return err; + } else { + (*progress_cb)(progress_arg, GOT_STATUS_DELETE, ie->path); + if (status == GOT_STATUS_NO_CHANGE) { + err = remove_ondisk_file(worktree->root_path, ie->path); + if (err) + return err; + } + got_fileindex_entry_remove(fileindex, ie); } - got_fileindex_entry_remove(fileindex, ie); - return NULL; + return err; } struct diff_cb_arg { blob - 5b27ea3fdd42c59f652befa84aa020bb8f3b7139 blob + f5e6128544c9c93da5fd836b3efe97bb428880fa --- regress/cmdline/update.sh +++ regress/cmdline/update.sh @@ -926,7 +926,7 @@ function test_update_conflict_wt_edit_vs_repo_rm { (cd $testroot/wt && got update > $testroot/stdout) - echo "D beta" > $testroot/stdout.expected + echo "G beta" > $testroot/stdout.expected echo -n "Updated to commit " >> $testroot/stdout.expected git_show_head $testroot/repo >> $testroot/stdout.expected echo >> $testroot/stdout.expected @@ -950,8 +950,8 @@ function test_update_conflict_wt_edit_vs_repo_rm { return 1 fi - # beta is now an unversioned file... we don't flag tree conflicts yet - echo '? beta' > $testroot/stdout.expected + # beta is now an added file... we don't flag tree conflicts yet + echo 'A beta' > $testroot/stdout.expected (cd $testroot/wt && got status > $testroot/stdout) cmp $testroot/stdout.expected $testroot/stdout ret="$?"