diff options
author | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2019-10-12 10:34:54 -0500 |
---|---|---|
committer | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2019-10-12 10:34:54 -0500 |
commit | a36a55c3605bb89125d9d1819a9c32590008ea8f (patch) | |
tree | 74817edc4b676d13c017bee7c0319aad9932e73a /hscript/meta.cc | |
parent | 92ff05696506d423111fc7c0ff1e571f64af4615 (diff) | |
download | horizon-a36a55c3605bb89125d9d1819a9c32590008ea8f.tar.gz horizon-a36a55c3605bb89125d9d1819a9c32590008ea8f.tar.bz2 horizon-a36a55c3605bb89125d9d1819a9c32590008ea8f.tar.xz horizon-a36a55c3605bb89125d9d1819a9c32590008ea8f.zip |
hscript: Implement 'repository' key and add tests for it
Diffstat (limited to 'hscript/meta.cc')
-rw-r--r-- | hscript/meta.cc | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/hscript/meta.cc b/hscript/meta.cc index faec607..dc29b0c 100644 --- a/hscript/meta.cc +++ b/hscript/meta.cc @@ -19,7 +19,7 @@ using namespace Horizon::Keys; Key *Hostname::parseFromData(const std::string data, int lineno, int *errors, - int *warnings) { + int *) { std::regex valid_re("[A-Za-z0-9-_.]*"); if(!std::regex_match(data, valid_re)) { if(errors) *errors += 1; @@ -142,3 +142,39 @@ Key *PkgInstall::parseFromData(const std::string data, int lineno, int *errors, } return new PkgInstall(lineno, all_pkgs); } + +Key *Repository::parseFromData(const std::string data, int lineno, int *errors, + int *) { + if(data.empty() || (data[0] != '/' && data.compare(0, 4, "http"))) { + if(errors) *errors += 1; + output_error("installfile:" + std::to_string(lineno), + "repository: must be absolute path or HTTP(S) URL"); + return nullptr; + } + return new Repository(lineno, data); +} + +bool Repository::validate(ScriptOptions) const { + /* TODO XXX: Ensure URL is accessible if networking is available */ + return true; +} + +bool Repository::execute(ScriptOptions opts) const { + /* Runner.Execute.repository. */ + if(opts.test(Simulate)) { + output_info("installfile:" + std::to_string(this->lineno()), + "repository: write '" + this->value() + + "' to /etc/apk/repositories"); + } else { + std::ofstream repo_f("/target/etc/apk/repositories", + std::ios_base::ate); + if(!repo_f) { + output_error("installfile:" + std::to_string(this->lineno()), + "repository: could not open /etc/apk/repositories " + "for writing"); + return false; + } + repo_f << this->value() << std::endl; + } + return true; +} |