aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-07-09 13:31:54 +0100
committergingerBill <bill@gingerbill.org>2024-07-09 13:31:54 +0100
commitccdad8b8dd3af934ef12e833b79c239c8a04895e (patch)
treea9ec9a1a92d5be8ad2efdba617cba97ec9aba659 /src
parent45bf1808478ca5059dce582182cdf84582dd5a9a (diff)
Add `odin clear-cache`
Diffstat (limited to 'src')
-rw-r--r--src/cached.cpp81
-rw-r--r--src/main.cpp2
2 files changed, 83 insertions, 0 deletions
diff --git a/src/cached.cpp b/src/cached.cpp
index 62c7641e5..83950c82b 100644
--- a/src/cached.cpp
+++ b/src/cached.cpp
@@ -4,6 +4,87 @@ gb_internal GB_COMPARE_PROC(cached_file_cmp) {
return string_compare(x, y);
}
+bool recursively_delete_directory(wchar_t *wpath_c) {
+#if defined(GB_SYSTEM_WINDOWS)
+ auto const is_dots_w = [](wchar_t const *str) -> bool {
+ if (!str) {
+ return false;
+ }
+ return wcscmp(str, L".") == 0 || wcscmp(str, L"..") == 0;
+ };
+
+ TEMPORARY_ALLOCATOR_GUARD();
+
+ wchar_t dir_path[MAX_PATH] = {};
+ wchar_t filename[MAX_PATH] = {};
+ wcscpy(dir_path, wpath_c);
+ wcscat(dir_path, L"\\*");
+
+ wcscpy(filename, wpath_c);
+ wcscat(filename, L"\\");
+
+
+ WIN32_FIND_DATAW find_file_data = {};
+ HANDLE hfind = FindFirstFileW(dir_path, &find_file_data);
+ if (hfind == INVALID_HANDLE_VALUE) {
+ return false;
+ }
+ defer (FindClose(hfind));
+
+ wcscpy(dir_path, filename);
+
+ for (;;) {
+ if (FindNextFileW(hfind, &find_file_data)) {
+ if (is_dots_w(find_file_data.cFileName)) {
+ continue;
+ }
+ wcscat(filename, find_file_data.cFileName);
+
+ if (find_file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
+ if (!recursively_delete_directory(filename)) {
+ return false;
+ }
+ RemoveDirectoryW(filename);
+ wcscpy(filename, dir_path);
+ } else {
+ if (find_file_data.dwFileAttributes & FILE_ATTRIBUTE_READONLY) {
+ _wchmod(filename, _S_IWRITE);
+ }
+ if (!DeleteFileW(filename)) {
+ return false;
+ }
+ wcscpy(filename, dir_path);
+ }
+ } else {
+ if (GetLastError() == ERROR_NO_MORE_FILES) {
+ break;
+ }
+ return false;
+ }
+ }
+
+
+ return RemoveDirectoryW(wpath_c);
+#else
+ return false;
+#endif
+}
+
+bool recursively_delete_directory(String const &path) {
+#if defined(GB_SYSTEM_WINDOWS)
+ String16 wpath = string_to_string16(permanent_allocator(), path);
+ wchar_t *wpath_c = alloc_wstring(permanent_allocator(), wpath);
+ return recursively_delete_directory(wpath_c);
+#else
+ return false;
+#endif
+}
+
+int try_clear_cache(void) {
+ bool ok = recursively_delete_directory(str_lit(".odin-cache"));
+ return ok ? 0 : 1;
+}
+
u64 crc64_with_seed(void const *data, isize len, u64 seed) {
isize remaining;
diff --git a/src/main.cpp b/src/main.cpp
index 006a7ddbc..49c34014b 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -3057,6 +3057,8 @@ int main(int arg_count, char const **arg_ptr) {
} else if (command == "root") {
gb_printf("%.*s", LIT(odin_root_dir()));
return 0;
+ } else if (command == "clear-cache") {
+ return try_clear_cache();
} else {
String argv1 = {};
if (args.count > 1) {