X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Ftar.cpp;h=6dee843df7ef4de8bee1baae45509a7fb2f34699;hb=4e2a160d94ca808cfb511cc2d38e115d989809f2;hp=bfb4f5f9761f245dfa83cd8279a0b7a01c05bab0;hpb=04c316da6d5d90e43cba262f54d90ca231f703bf;p=builder.git diff --git a/source/tar.cpp b/source/tar.cpp index bfb4f5f..6dee843 100644 --- a/source/tar.cpp +++ b/source/tar.cpp @@ -1,10 +1,3 @@ -/* $Id$ - -This file is part of builder -Copyright © 2007-2009 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - #include #include #include @@ -18,34 +11,46 @@ 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 list &sources, const string &arg) +{ + 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); -Tar::Worker::Worker(Tar &t): - tar(t) + tarball->set_tool(*this); + + return tarball; +} + +Task *Tar::run(const Target &target) const { - launch(); + const TarBall &tarball = dynamic_cast(target); + Worker *worker = new Worker(tarball); + return new InternalTask(worker); } + +Tar::Worker::Worker(const TarBall &tb): + tarball(tb) +{ } + 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_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); + 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) @@ -58,18 +63,18 @@ 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()); - struct stat st = FS::stat(ft->get_path()); - 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); + 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); @@ -81,7 +86,7 @@ void Tar::Worker::main() out.write(buf, 512); IO::File in(ft->get_path().str()); - for(int j=0; j