aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2024-07-26 07:45:02 +0800
committerGitHub <noreply@github.com>2024-07-26 07:45:02 +0800
commitcd1550818b31d021cd48fd8c0c0b6ac9dada9084 (patch)
tree5a390e6bd8f8d242e89c7358990247155b26c17a
parentdd61be59af5bb97f2f28ec0040ab1597795a48c5 (diff)
parent114d1e7b43b8e1bc4143d1bc963cf90c248be059 (diff)
downloadrneovim-cd1550818b31d021cd48fd8c0c0b6ac9dada9084.tar.gz
rneovim-cd1550818b31d021cd48fd8c0c0b6ac9dada9084.tar.bz2
rneovim-cd1550818b31d021cd48fd8c0c0b6ac9dada9084.zip
Merge pull request #29758 from zeertzjq/vim-8.2.3543
vim-patch:{8.2.3543,9.1.0615}
-rw-r--r--src/nvim/bufwrite.c16
-rw-r--r--src/nvim/memline.c22
2 files changed, 16 insertions, 22 deletions
diff --git a/src/nvim/bufwrite.c b/src/nvim/bufwrite.c
index 5522ab1ca3..9f6eb8c9e8 100644
--- a/src/nvim/bufwrite.c
+++ b/src/nvim/bufwrite.c
@@ -821,10 +821,6 @@ static int buf_write_make_backup(char *fname, bool append, FileInfo *file_info_o
// Isolate one directory name, using an entry in 'bdir'.
size_t dir_len = copy_option_part(&dirp, IObuff, IOSIZE, ",");
char *p = IObuff + dir_len;
- bool trailing_pathseps = after_pathsep(IObuff, p) && p[-1] == p[-2];
- if (trailing_pathseps) {
- IObuff[dir_len - 2] = NUL;
- }
if (*dirp == NUL && !os_isdir(IObuff)) {
int ret;
char *failed_dir;
@@ -834,9 +830,9 @@ static int buf_write_make_backup(char *fname, bool append, FileInfo *file_info_o
xfree(failed_dir);
}
}
- if (trailing_pathseps) {
+ if (after_pathsep(IObuff, p) && p[-1] == p[-2]) {
// Ends with '//', Use Full path
- if ((p = make_percent_swname(IObuff, fname))
+ if ((p = make_percent_swname(IObuff, p, fname))
!= NULL) {
*backupp = modname(p, backup_ext, no_prepend_dot);
xfree(p);
@@ -963,10 +959,6 @@ nobackup:
// Isolate one directory name and make the backup file name.
size_t dir_len = copy_option_part(&dirp, IObuff, IOSIZE, ",");
char *p = IObuff + dir_len;
- bool trailing_pathseps = after_pathsep(IObuff, p) && p[-1] == p[-2];
- if (trailing_pathseps) {
- IObuff[dir_len - 2] = NUL;
- }
if (*dirp == NUL && !os_isdir(IObuff)) {
int ret;
char *failed_dir;
@@ -976,9 +968,9 @@ nobackup:
xfree(failed_dir);
}
}
- if (trailing_pathseps) {
+ if (after_pathsep(IObuff, p) && p[-1] == p[-2]) {
// path ends with '//', use full path
- if ((p = make_percent_swname(IObuff, fname))
+ if ((p = make_percent_swname(IObuff, p, fname))
!= NULL) {
*backupp = modname(p, backup_ext, no_prepend_dot);
xfree(p);
diff --git a/src/nvim/memline.c b/src/nvim/memline.c
index 5acf4f0c37..8af80fce5d 100644
--- a/src/nvim/memline.c
+++ b/src/nvim/memline.c
@@ -1325,11 +1325,9 @@ int recover_names(char *fname, bool do_list, list_T *ret_list, int nr, char **fn
} else {
int len = (int)strlen(dir_name);
p = dir_name + len;
- if (after_pathsep(dir_name, p)
- && len > 1
- && p[-1] == p[-2]) {
+ if (after_pathsep(dir_name, p) && len > 1 && p[-1] == p[-2]) {
// Ends with '//', Use Full path for swap name
- tail = make_percent_swname(dir_name, fname_res);
+ tail = make_percent_swname(dir_name, p, fname_res);
} else {
tail = path_tail(fname_res);
tail = concat_fnames(dir_name, tail, true);
@@ -1440,8 +1438,11 @@ int recover_names(char *fname, bool do_list, list_T *ret_list, int nr, char **fn
/// Append the full path to name with path separators made into percent
/// signs, to dir. An unnamed buffer is handled as "" (<currentdir>/"")
-char *make_percent_swname(const char *dir, const char *name)
- FUNC_ATTR_NONNULL_ARG(1)
+/// signs, to "dir". An unnamed buffer is handled as "" (<currentdir>/"")
+/// The last character in "dir" must be an extra slash or backslash, it is
+/// removed.
+char *make_percent_swname(char *dir, char *dir_end, const char *name)
+ FUNC_ATTR_NONNULL_ARG(1, 2)
{
char *d = NULL;
char *f = fix_fname(name != NULL ? name : "");
@@ -1455,6 +1456,8 @@ char *make_percent_swname(const char *dir, const char *name)
*d = '%';
}
}
+
+ dir_end[-1] = NUL; // remove one trailing slash
d = concat_fnames(dir, s, true);
xfree(s);
xfree(f);
@@ -3192,11 +3195,10 @@ char *makeswapname(char *fname, char *ffname, buf_T *buf, char *dir_name)
int len = (int)strlen(dir_name);
char *s = dir_name + len;
- if (after_pathsep(dir_name, s)
- && len > 1
- && s[-1] == s[-2]) { // Ends with '//', Use Full path
+ if (after_pathsep(dir_name, s) && len > 1 && s[-1] == s[-2]) {
+ // Ends with '//', Use Full path
char *r = NULL;
- s = make_percent_swname(dir_name, fname_res);
+ s = make_percent_swname(dir_name, s, fname_res);
if (s != NULL) {
r = modname(s, ".swp", false);
xfree(s);