From 0d304d4228332b2233d40207ca686083cb4a5ae1 Mon Sep 17 00:00:00 2001 From: Yousong Zhou Date: Sat, 25 Mar 2017 13:23:06 +0800 Subject: busybox: vi: backporting patches to fix ZZ and :x command Signed-off-by: Yousong Zhou --- ...t-touch-file-with-x-when-modified_count-0.patch | 100 +++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 package/utils/busybox/patches/401-vi-don-t-touch-file-with-x-when-modified_count-0.patch (limited to 'package/utils/busybox/patches/401-vi-don-t-touch-file-with-x-when-modified_count-0.patch') diff --git a/package/utils/busybox/patches/401-vi-don-t-touch-file-with-x-when-modified_count-0.patch b/package/utils/busybox/patches/401-vi-don-t-touch-file-with-x-when-modified_count-0.patch new file mode 100644 index 0000000000..e83999d303 --- /dev/null +++ b/package/utils/busybox/patches/401-vi-don-t-touch-file-with-x-when-modified_count-0.patch @@ -0,0 +1,100 @@ +From e88608eae24ae5934034e1ecb6c494fefbf1b9ae Mon Sep 17 00:00:00 2001 +From: Denys Vlasenko +Date: Mon, 13 Mar 2017 20:50:42 +0100 +Subject: [PATCH 1/2] vi: don't touch file with :x when modified_count == 0 + +Along with it, there are other changes + + - Check for uppercase X is removed as the expression will be always false and + :X itself is another totally different command in standard vim + - The status line will show number of written lines instead of lines requested + by the colon command. This is also how the standard vim is doing, though + the difference is that '!' has to be explicitly specified in vim to allow + partial writes + +Signed-off-by: Yousong Zhou +Signed-off-by: Denys Vlasenko +--- + editors/vi.c | 43 ++++++++++++++++++++++++++----------------- + 1 file changed, 26 insertions(+), 17 deletions(-) + +--- a/editors/vi.c ++++ b/editors/vi.c +@@ -1038,7 +1038,9 @@ static void colon(char *buf) + || strncmp(p, "wn", cnt) == 0 + || (p[0] == 'x' && !p[1]) + ) { +- cnt = file_write(current_filename, text, end - 1); ++ if (modified_count != 0 || p[0] != 'x') { ++ cnt = file_write(current_filename, text, end - 1); ++ } + if (cnt < 0) { + if (cnt == -1) + status_line_bold("Write error: %s", strerror(errno)); +@@ -1049,8 +1051,9 @@ static void colon(char *buf) + current_filename, + count_lines(text, end - 1), cnt + ); +- if (p[0] == 'x' || p[1] == 'q' || p[1] == 'n' +- || p[0] == 'X' || p[1] == 'Q' || p[1] == 'N' ++ if (p[0] == 'x' ++ || p[1] == 'q' || p[1] == 'n' ++ || p[1] == 'Q' || p[1] == 'N' + ) { + editing = 0; + } +@@ -1480,16 +1483,19 @@ static void colon(char *buf) + goto ret; + } + #endif +- // how many lines in text[]? +- li = count_lines(q, r); +- size = r - q + 1; + //if (useforce) { + // if "fn" is not write-able, chmod u+w + // sprintf(syscmd, "chmod u+w %s", fn); + // system(syscmd); + // forced = TRUE; + //} +- l = file_write(fn, q, r); ++ if (modified_count != 0 || cmd[0] != 'x') { ++ size = r - q + 1; ++ l = file_write(fn, q, r); ++ } else { ++ size = 0; ++ l = 0; ++ } + //if (useforce && forced) { + // chmod u-w + // sprintf(syscmd, "chmod u-w %s", fn); +@@ -1500,17 +1506,20 @@ static void colon(char *buf) + if (l == -1) + status_line_bold_errno(fn); + } else { ++ // how many lines written ++ li = count_lines(q, q + l - 1); + status_line("'%s' %dL, %dC", fn, li, l); +- if (q == text && r == end - 1 && l == size) { +- modified_count = 0; +- last_modified_count = -1; +- } +- if ((cmd[0] == 'x' || cmd[1] == 'q' || cmd[1] == 'n' +- || cmd[0] == 'X' || cmd[1] == 'Q' || cmd[1] == 'N' +- ) +- && l == size +- ) { +- editing = 0; ++ if (l == size) { ++ if (q == text && q + l == end) { ++ modified_count = 0; ++ last_modified_count = -1; ++ } ++ if (cmd[0] == 'x' ++ || cmd[1] == 'q' || cmd[1] == 'n' ++ || cmd[1] == 'Q' || cmd[1] == 'N' ++ ) { ++ editing = 0; ++ } + } + } + #if ENABLE_FEATURE_VI_YANKMARK -- cgit v1.2.3