X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Ftar.cpp;h=446aa922a0c6baba68209219b800f57fc3dd0f61;hb=d1eb133ab529cdae131be7b150209f03189248f3;hp=1869865b93bc1426f6e5afc75dfc82ef2bcb323d;hpb=0458300fda4f345f865a7f3ee4fc0f2020a91983;p=builder.git diff --git a/source/tar.cpp b/source/tar.cpp index 1869865..446aa92 100644 --- a/source/tar.cpp +++ b/source/tar.cpp @@ -1,16 +1,10 @@ -/* $Id$ - -This file is part of builder -Copyright © 2007-2009 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - #include #include #include #include #include #include "builder.h" +#include "internaltask.h" #include "sourcepackage.h" #include "tar.h" #include "tarball.h" @@ -18,36 +12,41 @@ Distributed under the LGPL using namespace std; using namespace Msp; -Tar::Tar(Builder &b, const TarBall &t): - InternalAction(b), - tarball(t) +Tar::Tar(Builder &b): + Tool(b, "TAR") { - string basename = FS::basename(tarball.get_path()); - announce(tarball.get_package()->get_name(), "TAR ", basename); - if(builder.get_verbose()>=2) - IO::print("Create %s\n", basename); - - if(!builder.get_dry_run()) - worker = new Worker(*this); + processing_unit = COMPONENT; } +Target *Tar::create_target(const vector &sources, const string &arg) +{ + if(sources.empty() || !sources.front()->get_package()) + throw invalid_argument("Tar::create_target"); + + TarBall *tarball = new TarBall(builder, *sources.front()->get_package(), arg); + for(Target *s: sources) + tarball->add_dependency(*s); + + tarball->set_tool(*this); + + return tarball; +} -Tar::Worker::Worker(Tar &t): - tar(t) +Task *Tar::run(const Target &target) const { - launch(); + const TarBall &tarball = dynamic_cast(target); + return new InternalTask([&tarball]{ return _run(tarball); }); } -void Tar::Worker::main() +bool Tar::_run(const TarBall &tarball) { - const FS::Path &pkg_src = tar.tarball.get_package()->get_source(); - FS::Path basedir = FS::basepart(FS::basename(tar.tarball.get_path())); + const FS::Path &pkg_src = tarball.get_package()->get_source_directory(); + FS::Path basedir = FS::basepart(FS::basename(tarball.get_path())); - IO::File out(tar.tarball.get_path().str(), IO::M_WRITE); - const TargetList &deps = tar.tarball.get_depends(); - for(TargetList::const_iterator i=deps.begin(); i!=deps.end(); ++i) + IO::File out(tarball.get_path().str(), IO::M_WRITE); + for(Target *d: tarball.get_dependencies()) { - FileTarget *ft = dynamic_cast(*i); + FileTarget *ft = dynamic_cast(d); if(!ft) continue; @@ -58,8 +57,7 @@ void Tar::Worker::main() if(rel_path.size()>99) { IO::print("Can't store %s in tar archive - too long name\n", rel_path); - error = true; - break; + return false; } memcpy(buf, rel_path.data(), rel_path.size()); @@ -89,10 +87,10 @@ void Tar::Worker::main() } } - done = true; + return true; } -void Tar::Worker::store_number(char *buf, unsigned value, unsigned length) +void Tar::store_number(char *buf, unsigned value, unsigned length) { for(unsigned i=length; i--;) {