From 3e5b7ed9bbe9a9659486a9d4c51f3466d1e877ec Mon Sep 17 00:00:00 2001 From: Tilman Sauerbeck Date: Fri, 25 Aug 2006 12:54:15 +0200 Subject: [PATCH] added support for INSTALL rules. based on a patch by johannes. documentation needs to be updated. --- pkgadd.cc | 52 +++++++++++++++++++++++++++++++++++++++++++++++++--- pkgadd.h | 4 +++- pkgutil.cc | 10 +++++++++- pkgutil.h | 2 +- 4 files changed, 62 insertions(+), 6 deletions(-) diff --git a/pkgadd.cc b/pkgadd.cc index 8178b0a..8856851 100644 --- a/pkgadd.cc +++ b/pkgadd.cc @@ -78,6 +78,7 @@ void pkgadd::run(int argc, char** argv) else if (!installed && o_upgrade) throw runtime_error("package " + package.first + " not previously installed (skip -u to install)"); + set non_install_files = apply_install_rules(package.first, package.second, config_rules); set conflicting_files = db_find_conflicts(package.first, package.second); if (!conflicting_files.empty()) { @@ -101,7 +102,7 @@ void pkgadd::run(int argc, char** argv) db_add_pkg(package.first, package.second); db_commit(); - pkg_install(o_package, keep_list); + pkg_install(o_package, keep_list, non_install_files); ldconfig(); } } @@ -140,9 +141,9 @@ vector pkgadd::read_config() const if (sscanf(line.c_str(), "%s %s %s %s", event, pattern, action, dummy) != 3) throw runtime_error(filename + ":" + itos(linecount) + ": wrong number of arguments, aborting"); - if (!strcmp(event, "UPGRADE")) { + if (!strcmp(event, "UPGRADE") || !strcmp(event, "INSTALL")) { rule_t rule; - rule.event = UPGRADE; + rule.event = strcmp(event, "UPGRADE") ? INSTALL : UPGRADE; rule.pattern = pattern; if (!strcmp(action, "YES")) { rule.action = true; @@ -201,6 +202,51 @@ set pkgadd::make_keep_list(const set& files, const vector pkgadd::apply_install_rules(const string& name, pkginfo_t& info, const vector& rules) +{ + // TODO: better algo(?) + set install_set; + set non_install_set; + vector found; + + find_rules(rules, INSTALL, found); + + for (set::const_iterator i = info.files.begin(); i != info.files.end(); i++) { + bool install_file = true; + + for (vector::reverse_iterator j = found.rbegin(); j != found.rend(); j++) { + if (rule_applies_to_file(*j, *i)) { + install_file = (*j).action; + break; + } + } + + if (install_file) + install_set.insert(install_set.end(), *i); + else + non_install_set.insert(*i); + } + + info.files.clear(); + info.files = install_set; + +#ifndef NDEBUG + cerr << "Install set:" << endl; + for (set::iterator j = info.files.begin(); j != info.files.end(); j++) { + cerr << " " << (*j) << endl; + } + cerr << endl; + + cerr << "Non-Install set:" << endl; + for (set::iterator j = non_install_set.begin(); j != non_install_set.end(); j++) { + cerr << " " << (*j) << endl; + } + cerr << endl; +#endif + + return non_install_set; +} + void pkgadd::find_rules(const vector& rules, rule_event_t event, vector& found) const { for (vector::const_iterator i = rules.begin(); i != rules.end(); i++) diff --git a/pkgadd.h b/pkgadd.h index b5b53e2..c69aab9 100644 --- a/pkgadd.h +++ b/pkgadd.h @@ -30,7 +30,8 @@ #define PKGADD_CONF_MAXLINE 1024 enum rule_event_t { - UPGRADE + UPGRADE, + INSTALL }; struct rule_t { @@ -48,6 +49,7 @@ public: private: vector read_config() const; set make_keep_list(const set& files, const vector& rules) const; + set apply_install_rules(const string& name, pkginfo_t& info, const vector& rules); void find_rules(const vector& rules, rule_event_t event, vector& found) const; bool rule_applies_to_file(const rule_t& rule, const string& file) const; }; diff --git a/pkgutil.cc b/pkgutil.cc index 9b41c5c..beaa74b 100644 --- a/pkgutil.cc +++ b/pkgutil.cc @@ -368,7 +368,7 @@ pair pkgutil::pkg_open(const string& filename) const return result; } -void pkgutil::pkg_install(const string& filename, const set& keep_list) const +void pkgutil::pkg_install(const string& filename, const set& keep_list, const set& non_install_list) const { TAR* t; unsigned int i; @@ -382,6 +382,14 @@ void pkgutil::pkg_install(const string& filename, const set& keep_list) string original_filename = trim_filename(root + string("/") + archive_filename); string real_filename = original_filename; + // Check if file is filtered out via INSTALL + if (non_install_list.find(archive_filename) != non_install_list.end()) { + if (TH_ISREG(t)) + tar_skip_regfile(t); + + continue; + } + // Check if file should be rejected if (file_exists(real_filename) && keep_list.find(archive_filename) != keep_list.end()) real_filename = trim_filename(reject_dir + string("/") + archive_filename); diff --git a/pkgutil.h b/pkgutil.h index 9806900..4c74de5 100644 --- a/pkgutil.h +++ b/pkgutil.h @@ -70,7 +70,7 @@ protected: // Tar.gz pair pkg_open(const string& filename) const; - void pkg_install(const string& filename, const set& keep_list) const; + void pkg_install(const string& filename, const set& keep_list, const set& non_install_files) const; void pkg_footprint(string& filename) const; void ldconfig() const; -- 2.26.2