X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Ftar.cpp;h=bcaa85272c5a7e6c24c97249e65fa29162a6a426;hb=8ee4fd693c8d15265f0c145221737a322f89618b;hp=0b0c38df775696fcf1e98d8333a3357df68af305;hpb=555190f7eafcf3a67750fc63872b23e17371aa98;p=builder.git diff --git a/source/tar.cpp b/source/tar.cpp index 0b0c38d..bcaa852 100644 --- a/source/tar.cpp +++ b/source/tar.cpp @@ -1,123 +1,105 @@ -/* $Id$ - -This file is part of builder -Copyright © 2007 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - -#include -#include +#include +#include +#include +#include +#include #include "builder.h" -#include "package.h" +#include "sourcepackage.h" #include "tar.h" #include "tarball.h" using namespace std; using namespace Msp; -Tar::Tar(Builder &b, const TarBall &t): - Action(b), - tarball(t), - worker(0) -{ - string basename=tarball.get_name().substr(tarball.get_name().rfind('/')+1); - announce(tarball.get_package()->get_name(), "TAR ", basename); - if(builder.get_verbose()>=2) - cout<<"Create "< &sources, const string &arg) { - delete worker; + if(!sources.front()->get_package()) + throw invalid_argument("Tar::create_target"); + + TarBall *tarball = new TarBall(builder, *sources.front()->get_package(), arg); + for(list::const_iterator i=sources.begin(); i!=sources.end(); ++i) + tarball->add_dependency(**i); + + tarball->set_tool(*this); + + return tarball; } -int Tar::check() +Task *Tar::run(const Target &target) const { - if(!worker) // True for dry run - { - signal_done.emit(); - return 0; - } - - if(worker->get_done()) - { - signal_done.emit(); - worker->join(); - return worker->get_error()?1:0; - } - - return -1; + const TarBall &tarball = dynamic_cast(target); + Worker *worker = new Worker(tarball); + return new InternalTask(worker); } -Tar::Worker::Worker(Tar &t): - tar(t), - done(false), - error(false) -{ - launch(); -} +Tar::Worker::Worker(const TarBall &tb): + tarball(tb) +{ } void Tar::Worker::main() { - const Path::Path &pkg_src=tar.tarball.get_package()->get_source(); - Path::Path basedir=Path::splitext(Path::basename(tar.tarball.get_name())).base; + const FS::Path &pkg_src = tarball.get_package()->get_source_directory(); + FS::Path basedir = FS::basepart(FS::basename(tarball.get_path())); - ofstream out(tar.tarball.get_name().c_str()); - 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); + const Target::Dependencies &deps = tarball.get_dependencies(); + for(Target::Dependencies::const_iterator i=deps.begin(); i!=deps.end(); ++i) { + FileTarget *ft = dynamic_cast(*i); + if(!ft) + continue; + char buf[4096]; memset(buf, 0, 512); - string rel_path=(basedir/relative((*i)->get_name(), pkg_src)).str(); + string rel_path = (basedir/relative(ft->get_path(), pkg_src)).str(); if(rel_path.size()>99) { - cout<<"Can't store "<get_name(), st); - store_number(buf+100, st.st_mode, 7); - store_number(buf+108, st.st_uid, 7); - store_number(buf+116, st.st_gid, 7); - store_number(buf+124, st.st_size, 11); - store_number(buf+136, st.st_mtime, 11); - buf[156]='0'; + FS::Stat st = FS::stat(ft->get_path()); + store_number(buf+100, 0666, 7); + store_number(buf+108, 0, 7); + store_number(buf+116, 0, 7); + store_number(buf+124, st.get_size(), 11); + store_number(buf+136, st.get_modify_time().to_unixtime(), 11); + buf[156] = '0'; memset(buf+148, ' ', 8); - unsigned chk=0; + unsigned chk = 0; for(unsigned j=0; j<512; ++j) - chk+=static_cast(buf[j]); + chk += static_cast(buf[j]); store_number(buf+148, chk, 7); - buf[155]=0; + buf[155] = 0; out.write(buf, 512); - ifstream in((*i)->get_name().c_str()); - for(int j=0; jget_path().str()); + for(unsigned j=0; j