From c6b1bb70c96ea53e74978f05a626a7abb310a552 Mon Sep 17 00:00:00 2001 From: Krisztian Litkey Date: Thu, 8 Nov 2012 15:36:55 +0200 Subject: [PATCH] resolver: added support for automatically generating autoupdate targets. --- src/resolver/resolver.c | 9 ++++++++- src/resolver/resolver.h | 3 +++ src/resolver/target-sorter.c | 12 ++++++++++++ src/resolver/target.c | 37 +++++++++++++++++++++++++++++++++++++ src/resolver/target.h | 1 + 5 files changed, 61 insertions(+), 1 deletion(-) diff --git a/src/resolver/resolver.c b/src/resolver/resolver.c index a91acaa..fb3d4a1 100644 --- a/src/resolver/resolver.c +++ b/src/resolver/resolver.c @@ -57,9 +57,10 @@ mrp_resolver_t *mrp_resolver_parse(mrp_resolver_t *r, mrp_context_t *ctx, if (r == NULL) { r = mrp_allocz(sizeof(*r)); - r->ctx = ctx; } + r->ctx = ctx; + if (r != NULL) { if (parser_parse_file(&parser, path)) { if (create_targets(r, &parser) == 0 && @@ -150,6 +151,12 @@ int mrp_resolver_add_prepared_target(mrp_resolver_t *r, const char *target, } +int mrp_resolver_enable_autoupdate(mrp_resolver_t *r, const char *name) +{ + return generate_autoupdate_target(r, name); +} + + int mrp_resolver_update_targetl(mrp_resolver_t *r, const char *target, ...) { const char *name; diff --git a/src/resolver/resolver.h b/src/resolver/resolver.h index 747496e..82ca789 100644 --- a/src/resolver/resolver.h +++ b/src/resolver/resolver.h @@ -76,6 +76,9 @@ int mrp_resolver_add_prepared_target(mrp_resolver_t *r, const char *target, int mrp_resolver_add_alias(mrp_resolver_t *r, const char *target, const char *alias); +/** Enable autoupdate, generate autoupdate target if needed. */ +int mrp_resolver_enable_autoupdate(mrp_resolver_t *r, const char *name); + /** Destroy the given resolver context, freeing all associated resources. */ void mrp_resolver_destroy(mrp_resolver_t *r); diff --git a/src/resolver/target-sorter.c b/src/resolver/target-sorter.c index cccc805..2f51dac 100644 --- a/src/resolver/target-sorter.c +++ b/src/resolver/target-sorter.c @@ -67,6 +67,18 @@ int sort_targets(mrp_resolver_t *r) dump_graph(g, stdout); status = 0; + + for (i = 0; i < r->ntarget; i++) { + target_t *t = r->targets + i; + + mrp_free(t->update_targets); + mrp_free(t->update_facts); + mrp_free(t->fact_stamps); + t->update_targets = NULL; + t->update_facts = NULL; + t->fact_stamps = NULL; + } + for (i = 0; i < r->ntarget; i++) { if (sort_graph(g, i) < 0) { mrp_log_error("Failed to determine update order for " diff --git a/src/resolver/target.c b/src/resolver/target.c index ca0a06c..146a554 100644 --- a/src/resolver/target.c +++ b/src/resolver/target.c @@ -40,6 +40,7 @@ #include "resolver.h" #include "fact.h" #include "events.h" +#include "target-sorter.h" #include "target.h" @@ -192,6 +193,42 @@ target_t *create_target(mrp_resolver_t *r, const char *target, } +int generate_autoupdate_target(mrp_resolver_t *r, const char *name) +{ + const char **depends; + int ndepend, i, j; + target_t *t, *at; + + if (r->auto_update != NULL) + return FALSE; + + depends = alloca(r->ntarget * sizeof(depends[0])); + ndepend = 0; + + for (i = 0; i < r->ntarget; i++) { + t = r->targets + i; + + for (j = 0; j < t->ndepend; j++) { + if (*t->depends[j] == '$') { + depends[ndepend] = t->name; + ndepend++; + break; + } + } + } + + at = create_target(r, name, depends, ndepend, NULL, NULL); + + if (at != NULL) { + r->auto_update = at; + + return (sort_targets(r) == 0); + } + else + return FALSE; +} + + int compile_target_scripts(mrp_resolver_t *r) { target_t *t; diff --git a/src/resolver/target.h b/src/resolver/target.h index 508db06..1b53ab9 100644 --- a/src/resolver/target.h +++ b/src/resolver/target.h @@ -39,6 +39,7 @@ void destroy_targets(mrp_resolver_t *r); target_t *create_target(mrp_resolver_t *r, const char *target, const char **depends, int ndepend, const char *script_type, const char *script_source); +int generate_autoupdate_target(mrp_resolver_t *r, const char *name); int compile_target_scripts(mrp_resolver_t *r); int prepare_target_scripts(mrp_resolver_t *r); -- 2.7.4