changeset 15369:c73f1fdfb27a v8.1.0692

patch 8.1.0692: if a buffer was deleted a channel can't write to it commit https://github.com/vim/vim/commit/8b62d87e4243d3dc9bf4f17bfe1a8953077a70c9 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Jan 5 00:02:57 2019 +0100 patch 8.1.0692: if a buffer was deleted a channel can't write to it Problem: If a buffer was deleted a channel can't write to it. Solution: When the buffer exists but was unloaded, prepare it for writing. (closes #3764)
author Bram Moolenaar <Bram@vim.org>
date Sat, 05 Jan 2019 00:15:07 +0100
parents f5211d5e6e9b
children f307b3bc3764
files src/channel.c src/testdir/test_channel.vim src/version.c
diffstat 3 files changed, 51 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/channel.c
+++ b/src/channel.c
@@ -1099,6 +1099,25 @@ channel_set_job(channel_T *channel, job_
 }
 
 /*
+ * Prepare buffer "buf" for writing channel output to.
+ */
+	static void
+prepare_buffer(buf_T *buf)
+{
+    buf_T *save_curbuf = curbuf;
+
+    buf_copy_options(buf, BCO_ENTER);
+    curbuf = buf;
+#ifdef FEAT_QUICKFIX
+    set_option_value((char_u *)"bt", 0L, (char_u *)"nofile", OPT_LOCAL);
+    set_option_value((char_u *)"bh", 0L, (char_u *)"hide", OPT_LOCAL);
+#endif
+    if (curbuf->b_ml.ml_mfp == NULL)
+	ml_open(curbuf);
+    curbuf = save_curbuf;
+}
+
+/*
  * Find a buffer matching "name" or create a new one.
  * Returns NULL if there is something very wrong (error already reported).
  */
@@ -1120,14 +1139,9 @@ find_buffer(char_u *name, int err, int m
 				     NULL, (linenr_T)0, BLN_LISTED | BLN_NEW);
 	if (buf == NULL)
 	    return NULL;
-	buf_copy_options(buf, BCO_ENTER);
+	prepare_buffer(buf);
+
 	curbuf = buf;
-#ifdef FEAT_QUICKFIX
-	set_option_value((char_u *)"bt", 0L, (char_u *)"nofile", OPT_LOCAL);
-	set_option_value((char_u *)"bh", 0L, (char_u *)"hide", OPT_LOCAL);
-#endif
-	if (curbuf->b_ml.ml_mfp == NULL)
-	    ml_open(curbuf);
 	if (msg)
 	    ml_replace(1, (char_u *)(err ? "Reading from channel error..."
 				   : "Reading from channel output..."), TRUE);
@@ -1244,6 +1258,9 @@ channel_set_options(channel_T *channel, 
 		ch_log(channel, "writing out to buffer '%s'",
 						       (char *)buf->b_ffname);
 		set_bufref(&channel->ch_part[PART_OUT].ch_bufref, buf);
+		// if the buffer was deleted or unloaded resurrect it
+		if (buf->b_ml.ml_mfp == NULL)
+		    prepare_buffer(buf);
 	    }
 	}
     }
@@ -1287,6 +1304,9 @@ channel_set_options(channel_T *channel, 
 		ch_log(channel, "writing err to buffer '%s'",
 						       (char *)buf->b_ffname);
 		set_bufref(&channel->ch_part[PART_ERR].ch_bufref, buf);
+		// if the buffer was deleted or unloaded resurrect it
+		if (buf->b_ml.ml_mfp == NULL)
+		    prepare_buffer(buf);
 	    }
 	}
     }
--- a/src/testdir/test_channel.vim
+++ b/src/testdir/test_channel.vim
@@ -1645,6 +1645,28 @@ func Test_collapse_buffers()
   bwipe!
 endfunc
 
+func Test_write_to_deleted_buffer()
+  if !executable('echo') || !has('job')
+    return
+  endif
+  let job = job_start('echo hello', {'out_io': 'buffer', 'out_name': 'test_buffer', 'out_msg': 0})
+  call WaitForAssert({-> assert_equal("dead", job_status(job))})
+  let bufnr = bufnr('test_buffer')
+  call assert_equal(['hello'], getbufline(bufnr, 1, '$'))
+  call assert_equal('nofile', getbufvar(bufnr, '&buftype'))
+  call assert_equal('hide', getbufvar(bufnr, '&bufhidden'))
+  bdel test_buffer
+  call assert_equal([], getbufline(bufnr, 1, '$'))
+
+  let job = job_start('echo hello', {'out_io': 'buffer', 'out_name': 'test_buffer', 'out_msg': 0})
+  call WaitForAssert({-> assert_equal("dead", job_status(job))})
+  call assert_equal(['hello'], getbufline(bufnr, 1, '$'))
+  call assert_equal('nofile', getbufvar(bufnr, '&buftype'))
+  call assert_equal('hide', getbufvar(bufnr, '&bufhidden'))
+
+  bwipe! test_buffer
+endfunc
+
 func Test_cmd_parsing()
   if !has('unix')
     return
--- a/src/version.c
+++ b/src/version.c
@@ -800,6 +800,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    692,
+/**/
     691,
 /**/
     690,