X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcopy.cpp;h=2d2a7ca9c023c557954e05924d9181f4280dae97;hb=HEAD;hp=5b524a40cd367d5e1973c6d2edfacc7d17ef33d5;hpb=b5ccba555f4985233532041c34e28d71dd58933f;p=builder.git diff --git a/source/copy.cpp b/source/copy.cpp deleted file mode 100644 index 5b524a4..0000000 --- a/source/copy.cpp +++ /dev/null @@ -1,95 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include "builder.h" -#include "copy.h" -#include "installedfile.h" - -using namespace std; -using namespace Msp; - -Copy::Copy(Builder &b): - Tool(b, "CP") -{ } - -Target *Copy::create_target(const list &sources, const string &arg) const -{ - FileTarget &file_tgt = dynamic_cast(*sources.front()); - const SourcePackage &pkg = dynamic_cast(*file_tgt.get_package()); - InstalledFile *inst = new InstalledFile(builder, pkg, file_tgt, arg); - inst->set_tool(*this); - return inst; -} - -Task *Copy::run(const Target &target) const -{ - const InstalledFile &install = dynamic_cast(target); - Worker *worker = new Worker(install); - return new InternalTask(worker); -} - - -Copy::Worker::Worker(const InstalledFile &t): - target(t) -{ } - -void Copy::Worker::main() -{ - const FileTarget &source = target.get_source(); - const FS::Path &src_path = source.get_path(); - const FS::Path &dst_path = target.get_path(); - FS::mkpath(FS::dirname(dst_path), 0755); - - // Remove old file. Not doing this would cause Bad Stuff when installing libraries. - if(FS::exists(dst_path)) - { - try - { - unlink(dst_path); - } - catch(const exception &e) - { - IO::print(IO::cerr, "%s\n", e.what()); - status = Task::ERROR; - return; - } - } - - try - { - IO::File in(src_path.str()); - IO::File out(dst_path.str(), IO::M_WRITE); - - // Actual transfer loop - char buf[16384]; - while(!in.eof()) - { - unsigned len = in.read(buf, sizeof(buf)); - out.write(buf, len); - } - } - catch(const exception &e) - { - IO::print(IO::cerr, "%s\n", e.what()); - status = Task::ERROR; - return; - } - - // Preserve file permissions - struct stat st; - if(stat(src_path.str().c_str(), &st)==0) - chmod(dst_path.str().c_str(), st.st_mode&0777); - - const FS::Path &link = target.get_symlink(); - if(!link.empty()) - { - FS::Path relpath = FS::relative(dst_path, FS::dirname(link)); - symlink(relpath.str().c_str(), link.str().c_str()); - } - - status = Task::SUCCESS; -}