# HG changeset patch # User Dan Winship # Date 1204307108 18000 # Node ID 49deac048d07559b9d471cad6c99aeb3540c6522 # Parent 4722cd3437cb0baf9f67d1cde429d17f4c01d17a implement file dependencies for installs removes are trickier because there are no backlinks from the files array the properties array, so there's currently no way to efficiently determine what packages are affected by the removal of a particular file diff -r 4722cd3437cb -r 49deac048d07 razor.c --- a/razor.c Fri Feb 29 11:53:15 2008 -0500 +++ b/razor.c Fri Feb 29 12:45:08 2008 -0500 @@ -1785,8 +1785,9 @@ } static int -find_provider(struct razor_set *set, struct razor_property *requirement, - const char *requirement_strings) +find_property_provider(struct razor_set *set, + struct razor_property *requirement, + const char *requirement_strings) { struct razor_property *props = set->properties.data; int p, hi, lo, cmp; @@ -1842,6 +1843,29 @@ return -1; } +static int +find_file_provider(struct razor_set *set, const char *filename) +{ + struct razor_entry *entry; + + entry = find_entry(set, set->files.data, filename); + if (entry) + return list_first(&entry->packages, &set->package_pool)->data; + else + return -1; +} + +static int +find_provider(struct razor_set *set, struct razor_property *requirement, + const char *requirement_strings) +{ + const char *name = &requirement_strings[requirement->name]; + if (*name == '/') + return find_file_provider(set, name); + else + return find_property_provider(set, requirement, requirement_strings); +} + static void gather_new_requires(struct razor_set *system, struct razor_set *upstream, struct razor_package *pkg, struct array *new_requires) @@ -1894,10 +1918,6 @@ new_end = new_requires.data + new_requires.size; for (new = new_requires.data; new < new_end; new++) { - /* FIXME */ - if (pool[props[*new].name] == '/') - continue; - provider = find_provider(trans->upstream, &props[*new], pool); already = find_transaction_package(package_array,