From 60ef3e81f4a54d9f7ee617d57021f0811ec8ada5 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 29 Oct 2016 14:37:56 +0200 Subject: [PATCH 1/2] patch 8.0.0053 Problem: No test for what 8.0.0047 fixes. Solution: Add a test. (Hirohito Higashi) --- src/testdir/test_popup.vim | 28 +++++++++++++++++++++++++++- src/version.c | 2 ++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/testdir/test_popup.vim b/src/testdir/test_popup.vim index cc93ff84fa..f1e2c98c47 100644 --- a/src/testdir/test_popup.vim +++ b/src/testdir/test_popup.vim @@ -378,7 +378,7 @@ func DummyCompleteFour(findstart, base) endif endfunc -" Test that 'completefunc' works when it's OK. +" Test that 'omnifunc' works when it's OK. func Test_omnifunc_with_check() new setlocal omnifunc=DummyCompleteFour @@ -437,5 +437,31 @@ func Test_complete_no_undo() q! endfunc +function! DummyCompleteFive(findstart, base) + if a:findstart + return 0 + else + return [ + \ { 'word': 'January', 'info': "info1-1\n1-2\n1-3" }, + \ { 'word': 'February', 'info': "info2-1\n2-2\n2-3" }, + \ { 'word': 'March', 'info': "info3-1\n3-2\n3-3" }, + \ { 'word': 'April', 'info': "info4-1\n4-2\n4-3" }, + \ { 'word': 'May', 'info': "info5-1\n5-2\n5-3" }, + \ ] + endif +endfunc + +" Test that 'completefunc' on Scratch buffer with preview window works when +" it's OK. +func Test_completefunc_with_scratch_buffer() + new +setlocal\ buftype=nofile\ bufhidden=wipe\ noswapfile + set completeopt+=preview + setlocal completefunc=DummyCompleteFive + call feedkeys("A\\\\\\", "x") + call assert_equal(['April'], getline(1, '$')) + pclose + q! + set completeopt& +endfunc " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 5e337d6a17..47c65d6e3e 100644 --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 53, /**/ 52, /**/ From fb63090b62801d718fe7e1f44407358404c08724 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 29 Oct 2016 14:55:00 +0200 Subject: [PATCH 2/2] patch 8.0.0054 Problem: On Windows job_stop() stops cmd.exe, not the processes it runs. (Linwei) Solution: Iterate over all processes and terminate the one where the parent is the job process. Now only when there is no job object. (Yasuhiro Matsumoto, closes #1203) --- src/os_win32.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++-- src/version.c | 2 ++ 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/os_win32.c b/src/os_win32.c index d52beb8869..9fcb054d0e 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -50,6 +50,10 @@ # endif #endif +#ifdef FEAT_JOB_CHANNEL +# include +#endif + #ifdef __MINGW32__ # ifndef FROM_LEFT_1ST_BUTTON_PRESSED # define FROM_LEFT_1ST_BUTTON_PRESSED 0x0001 @@ -5020,6 +5024,48 @@ mch_detect_ended_job(job_T *job_list) return NULL; } + static BOOL +terminate_all(HANDLE process, int code) +{ + PROCESSENTRY32 pe; + HANDLE h = INVALID_HANDLE_VALUE; + DWORD pid = GetProcessId(process); + + if (pid != 0) + { + h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (h != INVALID_HANDLE_VALUE) + { + pe.dwSize = sizeof(PROCESSENTRY32); + if (!Process32First(h, &pe)) + goto theend; + + do + { + if (pe.th32ParentProcessID == pid) + { + HANDLE ph = OpenProcess( + PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID); + if (ph != NULL) + { + terminate_all(ph, code); + CloseHandle(ph); + } + } + } while (Process32Next(h, &pe)); + + CloseHandle(h); + } + } + +theend: + return TerminateProcess(process, code); +} + +/* + * Send a (deadly) signal to "job". + * Return FAIL if it didn't work. + */ int mch_stop_job(job_T *job, char_u *how) { @@ -5027,10 +5073,10 @@ mch_stop_job(job_T *job, char_u *how) if (STRCMP(how, "term") == 0 || STRCMP(how, "kill") == 0 || *how == NUL) { + /* deadly signal */ if (job->jv_job_object != NULL) return TerminateJobObject(job->jv_job_object, 0) ? OK : FAIL; - else - return TerminateProcess(job->jv_proc_info.hProcess, 0) ? OK : FAIL; + return terminate_all(job->jv_proc_info.hProcess, 0) ? OK : FAIL; } if (!AttachConsole(job->jv_proc_info.dwProcessId)) diff --git a/src/version.c b/src/version.c index 47c65d6e3e..68aff327f8 100644 --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 54, /**/ 53, /**/