From 3e0850a864cab9d37a6102f60bed33b223a5454c Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 17 May 2026 08:52:28 +0530 Subject: [PATCH] Fix failing test --- kitty/dnd.c | 15 ++++++++++++--- kitty/utils.py | 3 ++- kitty_tests/dnd_kitten.py | 7 ++++--- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/kitty/dnd.c b/kitty/dnd.c index 3a6f45dc3..dbb464533 100644 --- a/kitty/dnd.c +++ b/kitty/dnd.c @@ -2103,7 +2103,11 @@ add_payload(Window *w, DragRemoteItem *ri, bool has_more, const uint8_t *payload if (symlinkat((char*)ri->data, dirfd, ri->dir_entry_name) != 0) abrt(errno, "failed to create symlink for drag source item"); break; default: - if (mkdirat(dirfd, ri->dir_entry_name, dir_permissions) != 0 && errno != EEXIST) abrt(errno, "failed to create directory for drag source item"); + if (mkdirat(dirfd, ri->dir_entry_name, dir_permissions) != 0 && errno != EEXIST) { + int err = errno; + log_error("Failed to create directory for drag source item with name: %s and error: %s", ri->dir_entry_name, strerror(err)); + abrt(err, "failed to create directory for drag source item"); + } populate_dir_entries(w, ri); break; } @@ -2139,12 +2143,17 @@ toplevel_data_for_drag( const char *uri = mi.uri_list[uri_item_idx]; char *fname = sanitized_filename_from_url(uri); if (!fname) abrt(EINVAL, "could not sanitize filename for URI in drag source uri-list"); + if (!fname[0]) abrt(EINVAL, "URI must not have an empty path"); ri->dir_entry_name = fname; char path[32]; snprintf(path, sizeof(path), "%u", uri_item_idx); - if (mkdirat(ds.base_dir_fd_plus_one - 1, path, dir_permissions) != 0 && errno != EEXIST) abrt(errno, "failed to create directory for drag source item"); + if (mkdirat(ds.base_dir_fd_plus_one - 1, path, dir_permissions) != 0 && errno != EEXIST) { + int err = errno; + log_error("Failed to create directory for drag source item at: %s/%u with error: %s", ds.base_dir_for_remote_items, uri_item_idx, strerror(err)); + abrt(err, "failed to create directory for drag source item"); + } int fd = safe_openat(ds.base_dir_fd_plus_one - 1, path, O_RDONLY | O_DIRECTORY, 0); - if (fd < 0) abrt(errno, "failed to create directory for drag source item"); + if (fd < 0) abrt(errno, "failed to open directory for drag source item"); ri->top_level_parent_dir_fd_plus_one = fd + 1; if (!ds.file_promises) { free(mi.uri_list[uri_item_idx]); diff --git a/kitty/utils.py b/kitty/utils.py index 062f251e8..81cb9935c 100644 --- a/kitty/utils.py +++ b/kitty/utils.py @@ -1190,7 +1190,8 @@ def sanitized_filename_from_url(url: str) -> str: from urllib.parse import unquote, urlparse try: purl = urlparse(url) - fname = posixpath.basename(unquote(purl.path)) + fpath = purl.path.rstrip('/') or '/' + fname = posixpath.basename(unquote(fpath)) return fname.replace(os.sep, '_') except Exception: return '' diff --git a/kitty_tests/dnd_kitten.py b/kitty_tests/dnd_kitten.py index dae659ddd..0fe76caec 100644 --- a/kitty_tests/dnd_kitten.py +++ b/kitty_tests/dnd_kitten.py @@ -446,11 +446,12 @@ class TestDnDKitten(BaseTest): if line and not line.startswith('#'): purl = urlparse(line) if purl.scheme == 'file': - paths.add(purl.path) + fpath = purl.path.rstrip('/') or '/' + paths.add(fpath) if remote_client: - self.assertNotEqual(self.src_data_dir, os.path.dirname(purl.path)) + self.assertNotEqual(self.src_data_dir, os.path.dirname(fpath)) else: - self.assertEqual(self.src_data_dir, os.path.dirname(purl.path)) + self.assertEqual(self.src_data_dir, os.path.dirname(fpath)) src_items = set(os.listdir(self.src_data_dir)) self.assertEqual(src_items, {os.path.basename(x) for x in paths}) if remote_client: