Skip to content
This repository was archived by the owner on Feb 12, 2025. It is now read-only.
This repository was archived by the owner on Feb 12, 2025. It is now read-only.

is_path1_modified_after_path2 panics if either paths don't exist. #48

@SalBakraa

Description

@SalBakraa

If you decided to move nobuild.c after bootstrapping, the nobuild executable crashes. That sounds good, however the problem arises if you want to use this function to implement make like behaviour, where only modified files are recompiled.

I think the panic should be limited to the GO_REBUILD_URSELF macro, while the is_path1_modified_after_path2 function should be safe.

Here is my patch for it.

diff --git a/nobuild.h b/nobuild.h
index 1f41c42..6edf869 100644
--- a/nobuild.h
+++ b/nobuild.h
@@ -242,6 +242,17 @@ void chain_echo(Chain chain);
         assert(argc >= 1);                                             \
         const char *binary_path = argv[0];                             \
                                                                        \
+        if (!PATH_EXISTS(source_path)) {                               \
+            ERRO("Missing source file '%s', can't Rebuild.\n",         \
+                    source_path);                                      \
+            break;                                                     \
+        }                                                              \
+                                                                       \
+        if (!PATH_EXISTS(binary_path)) {                               \
+            ERRO("Missing binary file '%s', How???\n", binary_path);   \
+            break;                                                     \
+        }                                                              \
+                                                                       \
         if (is_path1_modified_after_path2(source_path, binary_path)) { \
             RENAME(binary_path, CONCAT(binary_path, ".old"));          \
             REBUILD_URSELF(binary_path, source_path);                  \
@@ -1066,6 +1077,16 @@ void path_rm(Cstr path)
 
 int is_path1_modified_after_path2(const char *path1, const char *path2)
 {
+    // Warn the user that the path is missing
+    if (!PATH_EXISTS(path1)) {
+        WARN("file %s does not exist", path2);
+        return 0;
+    }
+
+    if (!PATH_EXISTS(path2)) {
+        return 1;
+    }
+
 #ifdef _WIN32
     FILETIME path1_time, path2_time;

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions