X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Ftar.cpp;h=82330caa9762f34531be65b56fcffcdd2b2eb3f6;hb=338eefb513953ae55e8e3614c009c242ba8ad74e;hp=d3301a0dbcb1ae1e3d0bae93689d9400c8c9c772;hpb=dc00ddd224634c86f0a470f1f6f534be5d3e64a3;p=builder.git diff --git a/source/tar.cpp b/source/tar.cpp index d3301a0..82330ca 100644 --- a/source/tar.cpp +++ b/source/tar.cpp @@ -11,33 +11,44 @@ using namespace std; using namespace Msp; -Tar::Tar(Builder &b, const TarBall &t): - InternalAction(b), - tarball(t) +Tar::Tar(Builder &b): + Tool(b, "TAR") +{ } + +Target *Tar::create_target(const list &sources, const string &arg) const { - 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(!sources.front()->get_package()) + throw invalid_argument("Tar::create_target"); + const SourcePackage &src_pkg = dynamic_cast(*sources.front()->get_package()); + + TarBall *tarball = new TarBall(builder, src_pkg, arg); + for(list::const_iterator i=sources.begin(); i!=sources.end(); ++i) + tarball->add_depend(*i); - if(!builder.get_dry_run()) - worker = new Worker(*this); + return tarball; +} + +Task *Tar::run(const Target &target) const +{ + const TarBall &tarball = dynamic_cast(target); + Worker *worker = new Worker(tarball); + return new InternalTask(worker); } -Tar::Worker::Worker(Tar &t): - tar(t) +Tar::Worker::Worker(const TarBall &tb): + tarball(tb) { launch(); } void Tar::Worker::main() { - 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(); + 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(); + IO::File out(tarball.get_path().str(), IO::M_WRITE); + const TargetList &deps = tarball.get_depends(); for(TargetList::const_iterator i=deps.begin(); i!=deps.end(); ++i) { FileTarget *ft = dynamic_cast(*i); @@ -51,8 +62,8 @@ 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; + status = Task::ERROR; + return; } memcpy(buf, rel_path.data(), rel_path.size()); @@ -82,7 +93,7 @@ void Tar::Worker::main() } } - done = true; + status = Task::SUCCESS; } void Tar::Worker::store_number(char *buf, unsigned value, unsigned length)