Add automatic provides for lua pre-loaded modules
authorJ. Ali Harlow <ali@juiblex.co.uk>
Wed, 3 Jun 2009 07:26:09 +0000 (08:26 +0100)
committerJ. Ali Harlow <ali@juiblex.co.uk>
Wed, 3 Jun 2009 07:26:09 +0000 (08:26 +0100)
librazor/lua.c
librazor/razor.h
librazor/transaction.c

index 97e08d7..dd33048 100644 (file)
@@ -328,6 +328,24 @@ RAZOR_EXPORT void razor_set_lua_loader(const char *modname, void (*loader)())
        ploader->func = loader;
 }
 
+RAZOR_EXPORT void (*razor_get_lua_loader(const char *modname))()
+{
+       uint32_t name;
+       struct razor_lua_loader *ploader, *end;
+
+       if (!razor_preload.init)
+               return 0;
+
+       name = hashtable_lookup(&razor_preload.modules, modname);
+
+       end = razor_preload.loaders.data + razor_preload.loaders.size;
+       for(ploader = razor_preload.loaders.data; ploader < end; ploader++)
+               if (ploader->name == name)
+                       return ploader->func;
+
+       return 0;
+}
+
 static void razor_lua_preload(lua_State *L)
 {
        struct razor_lua_loader *ploader, *end;
index cbe0f7a..64b1536 100644 (file)
@@ -57,7 +57,12 @@ enum razor_property_flags {
        RAZOR_PROPERTY_PRE              = 1 << 5,
        RAZOR_PROPERTY_POST             = 1 << 6,
        RAZOR_PROPERTY_PREUN            = 1 << 7,
-       RAZOR_PROPERTY_POSTUN           = 1 << 8
+       RAZOR_PROPERTY_POSTUN           = 1 << 8,
+       RAZOR_PROPERTY_SCRIPT_MASK      =
+               RAZOR_PROPERTY_PRE |
+               RAZOR_PROPERTY_POST |
+               RAZOR_PROPERTY_PREUN |
+               RAZOR_PROPERTY_POSTUN
 };
 
 /**
@@ -382,6 +387,7 @@ int razor_versioncmp(const char *s1, const char *s2);
 void razor_disable_root_name_checks(int disable);
 
 void razor_set_lua_loader(const char *modname, void (*loader)());
+void (*razor_get_lua_loader(const char *modname))();
 
 
 #endif /* _RAZOR_H_ */
index 04e1a08..e6e9bfb 100644 (file)
@@ -463,14 +463,25 @@ clear_requires_flags(struct transaction_set *ts)
        struct razor_property *p;
        const char *pool;
        int i, count;
+       char *sub;
 
        count = ts->set->properties.size / sizeof *p;
        p = ts->set->properties.data;
        pool = ts->set->string_pool.data;
        for (i = 0; i < count; i++) {
                ts->properties[i] &= ~TRANS_PROPERTY_SATISFIED;
-               if (strncmp(&pool[p[i].name], "rpmlib(", 7) == 0)
-                       ts->properties[i] |= TRANS_PROPERTY_SATISFIED;
+               sub = strchr(&pool[p[i].name], '(');
+               if (sub && sub[strlen(sub) - 1] == ')') {
+                       sub = strdup(sub + 1);
+                       sub[strlen(sub) - 1] = '\0';
+                       if (strncmp(&pool[p[i].name], "rpmlib(", 7) == 0)
+                               ts->properties[i] |= TRANS_PROPERTY_SATISFIED;
+                       if (strncmp(&pool[p[i].name], "lua(", 4) == 0 &&
+                           razor_get_lua_loader(sub) &&
+                           p[i].flags & RAZOR_PROPERTY_SCRIPT_MASK)
+                               ts->properties[i] |= TRANS_PROPERTY_SATISFIED;
+                       free(sub);
+               }
        }
 }