Skip to content

Commit 9aef286

Browse files
committed
Improve error message when reading a directory
Before: $ ./build/quick-lint-js src error: failed to read from file: Is a directory After: $ ./build/quick-lint-js src error: failed to read from src: Is a directory
1 parent e76a04e commit 9aef286

File tree

2 files changed

+16
-11
lines changed

2 files changed

+16
-11
lines changed

src/file.cpp

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ read_file_result read_file_result::failure(const std::string &error) {
5353
}
5454

5555
namespace {
56-
void read_file_buffered(platform_file_ref file, int buffer_size,
57-
read_file_result *out) {
56+
void read_file_buffered(platform_file_ref file, const char *path,
57+
int buffer_size, read_file_result *out) {
5858
// TODO(strager): Use byte_buffer to avoid copying the file content every
5959
// iteration.
6060
for (;;) {
@@ -72,7 +72,8 @@ void read_file_buffered(platform_file_ref file, int buffer_size,
7272
file_read_result read_result =
7373
file.read(&out->content.data()[size_before], buffer_size);
7474
if (!read_result.at_end_of_file && read_result.error_message.has_value()) {
75-
out->error = "failed to read from file: " + *read_result.error_message;
75+
out->error = std::string("failed to read from ") + path + ": " +
76+
*read_result.error_message;
7677
return;
7778
}
7879
std::optional<int> new_size =
@@ -87,7 +88,8 @@ void read_file_buffered(platform_file_ref file, int buffer_size,
8788
}
8889

8990
read_file_result read_file_with_expected_size(platform_file_ref file,
90-
int file_size, int buffer_size) {
91+
const char *path, int file_size,
92+
int buffer_size) {
9193
read_file_result result;
9294

9395
std::optional<int> size_to_read = checked_add(file_size, 1);
@@ -100,7 +102,8 @@ read_file_result read_file_with_expected_size(platform_file_ref file,
100102
file_read_result read_result =
101103
file.read(result.content.data(), *size_to_read);
102104
if (!read_result.at_end_of_file && read_result.error_message.has_value()) {
103-
result.error = "failed to read from file: " + *read_result.error_message;
105+
result.error = std::string("failed to read from ") + path + ": " +
106+
*read_result.error_message;
104107
return result;
105108
}
106109
if (read_result.bytes_read == file_size) {
@@ -110,8 +113,8 @@ read_file_result read_file_with_expected_size(platform_file_ref file,
110113
file.read(result.content.data() + file_size, 1);
111114
if (!extra_read_result.at_end_of_file &&
112115
extra_read_result.error_message.has_value()) {
113-
result.error =
114-
"failed to read from file: " + *extra_read_result.error_message;
116+
result.error = std::string("failed to read from ") + path + ": " +
117+
*extra_read_result.error_message;
115118
return result;
116119
}
117120
result.content.resize(read_result.bytes_read +
@@ -121,13 +124,13 @@ read_file_result read_file_with_expected_size(platform_file_ref file,
121124
return result;
122125
} else {
123126
// We didn't read the entire file the first time. Keep reading.
124-
read_file_buffered(file, buffer_size, &result);
127+
read_file_buffered(file, path, buffer_size, &result);
125128
return result;
126129
}
127130
} else {
128131
result.content.resize(read_result.bytes_read);
129132
// We did not read the entire file. There is more data to read.
130-
read_file_buffered(file, buffer_size, &result);
133+
read_file_buffered(file, path, buffer_size, &result);
131134
return result;
132135
}
133136
}
@@ -149,7 +152,8 @@ read_file_result read_file(const char *path, windows_handle_file_ref file) {
149152
std::string("file too large to read into memory: ") + path);
150153
}
151154
return read_file_with_expected_size(
152-
/*file=*/file, /*file_size=*/narrow_cast<int>(file_size.QuadPart),
155+
/*file=*/file, /*path=*/path,
156+
/*file_size=*/narrow_cast<int>(file_size.QuadPart),
153157
/*buffer_size=*/buffer_size);
154158
}
155159
#endif
@@ -182,7 +186,7 @@ read_file_result read_file(const char *path, posix_fd_file_ref file) {
182186
std::string("file too large to read into memory: ") + path);
183187
}
184188
return read_file_with_expected_size(
185-
/*file=*/file, /*file_size=*/narrow_cast<int>(file_size),
189+
/*file=*/file, /*path=*/path, /*file_size=*/narrow_cast<int>(file_size),
186190
/*buffer_size=*/reasonable_buffer_size(s));
187191
}
188192
#endif

test/test-file.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ TEST_F(test_file, read_directory) {
8383
read_file_result file_content = read_file(temp_file_path.c_str());
8484
EXPECT_FALSE(file_content.ok());
8585
EXPECT_FALSE(file_content.is_not_found_error);
86+
EXPECT_THAT(file_content.error, HasSubstr(temp_file_path));
8687
EXPECT_THAT(
8788
file_content.error,
8889
testing::AnyOf(

0 commit comments

Comments
 (0)