X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fvc-backend.C;h=5fb8f6bb921d24fbd3c93246978a327cd4e8af48;hb=0657a91fd08e9c31d7f9e6be26055cc5050e5f8b;hp=d1608894fdcbda376e8ff459eabc7bb21fd22d59;hpb=18b8221ede82350caa51cc7db33a1f874b4e7396;p=lyx.git diff --git a/src/vc-backend.C b/src/vc-backend.C index d1608894fd..5fb8f6bb92 100644 --- a/src/vc-backend.C +++ b/src/vc-backend.C @@ -1,73 +1,107 @@ +/** + * \file vc-backend.C + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author Lars Gullik Bjønnes + * + * Full author contact details are available in file CREDITS. + */ + #include -#ifdef __GNUG__ -#pragma implementation -#endif +#include "vc-backend.h" +#include "debug.h" +#include "buffer.h" + +#include "support/path.h" +#include "support/filetools.h" +#include "support/fs_extras.h" +#include "support/lstrings.h" +#include "support/systemcall.h" + +#include +#include #include + + +namespace lyx { + +using support::addName; +using support::addPath; +using support::contains; +using support::FileName; +using support::onlyFilename; +using support::onlyPath; +using support::quoteName; +using support::rtrim; +using support::split; +using support::Systemcall; + +using boost::regex; +using boost::regex_match; +using boost::smatch; + +#ifndef CXX_GLOBAL_CSTD +using std::asctime; +using std::gmtime; +#endif + +using std::endl; +using std::getline; +using std::string; using std::ifstream; -#include "vc-backend.h" -#include "debug.h" -#include "support/FileInfo.h" -#include "support/LRegex.h" -#include "support/LSubstring.h" -#include "support/path.h" -#include "buffer.h" -#include "LyXView.h" -#include "lyxfunc.h" +namespace fs = boost::filesystem; int VCS::doVCCommand(string const & cmd, string const & path) { lyxerr[Debug::LYXVC] << "doVCCommand: " << cmd << endl; - Systemcalls one; - Path p(path); - int ret = one.startscript(Systemcalls::System, cmd); + Systemcall one; + support::Path p(path); + int const ret = one.startscript(Systemcall::Wait, cmd); return ret; } -RCS::RCS(string const & m) +RCS::RCS(FileName const & m) { master_ = m; scanMaster(); } -string RCS::find_file(string const & file) +FileName const RCS::find_file(FileName const & file) { - string tmp(file); // Check if *,v exists. - tmp += ",v"; - FileInfo f; + FileName tmp(file.absFilename() + ",v"); lyxerr[Debug::LYXVC] << "Checking if file is under rcs: " << tmp << endl; - if (f.newFile(tmp).readable()) { + if (fs::is_readable(tmp.toFilesystemEncoding())) { lyxerr[Debug::LYXVC] << "Yes " << file << " is under rcs." << endl; return tmp; } else { // Check if RCS/*,v exists. - tmp = AddName(AddPath(OnlyPath(file), "RCS"), file); - tmp += ",v"; + tmp = FileName(addName(addPath(onlyPath(file.absFilename()), "RCS"), file.absFilename()) + ",v"); lyxerr[Debug::LYXVC] << "Checking if file is under rcs: " << tmp << endl; - if (f.newFile(tmp).readable()) { + if (fs::is_readable(tmp.toFilesystemEncoding())) { lyxerr[Debug::LYXVC] << "Yes " << file << " it is under rcs."<< endl; return tmp; } } - return string(); + return FileName(); } -void RCS::retrive(string const & file) +void RCS::retrieve(FileName const & file) { - lyxerr[Debug::LYXVC] << "LyXVC::RCS: retrive.\n\t" << file << endl; - VCS::doVCCommand("co -q -r \"" - + file + "\"", + lyxerr[Debug::LYXVC] << "LyXVC::RCS: retrieve.\n\t" << file << endl; + VCS::doVCCommand("co -q -r " + quoteName(file.toFilesystemEncoding()), string()); } @@ -76,7 +110,7 @@ void RCS::scanMaster() { lyxerr[Debug::LYXVC] << "LyXVC::RCS: scanMaster." << endl; - ifstream ifs(master_.c_str()); + ifstream ifs(master_.toFilesystemEncoding().c_str()); string token; bool read_enough = false; @@ -84,7 +118,7 @@ void RCS::scanMaster() while (!read_enough && ifs >> token) { lyxerr[Debug::LYXVC] << "LyXVC::scanMaster: current lex text: `" - << token << "'" << endl; + << token << '\'' << endl; if (token.empty()) continue; @@ -92,7 +126,7 @@ void RCS::scanMaster() // get version here string tmv; ifs >> tmv; - tmv = strip(tmv, ';'); + tmv = rtrim(tmv, ";"); version_ = tmv; lyxerr[Debug::LYXVC] << "LyXVC: version found to be " << tmv << endl; @@ -102,25 +136,27 @@ void RCS::scanMaster() // nothing } else if (contains(token, "locks")) { // get locker here - if (contains(token, ";")) { + if (contains(token, ';')) { locker_ = "Unlocked"; - vcstat = UNLOCKED; + vcstatus = UNLOCKED; continue; } - string tmpt, s1, s2; + string tmpt; + string s1; + string s2; do { ifs >> tmpt; - s1 = strip(tmpt, ';'); + s1 = rtrim(tmpt, ";"); // tmp is now in the format : s1 = split(s1, s2, ':'); // s2 is user, and s1 is version if (s1 == version_) { locker_ = s2; - vcstat = LOCKED; + vcstatus = LOCKED; break; } - } while (!contains(tmpt, ";")); - + } while (!contains(tmpt, ';')); + } else if (token == "comment") { // we don't need to read any further than this. read_enough = true; @@ -131,7 +167,6 @@ void RCS::scanMaster() << endl; } } - version_ = "RCS: " + version_; } @@ -139,58 +174,56 @@ void RCS::registrer(string const & msg) { string cmd = "ci -q -u -i -t-\""; cmd += msg; - cmd += "\" \""; - cmd += OnlyFilename(owner_->fileName()); - cmd += "\""; - doVCCommand(cmd, owner_->filepath); - owner_->getUser()->owner()->getLyXFunc()->Dispatch("buffer-reload"); + cmd += "\" "; + cmd += quoteName(onlyFilename(owner_->fileName())); + doVCCommand(cmd, owner_->filePath()); } void RCS::checkIn(string const & msg) { - doVCCommand("ci -q -u -m\"" + msg + "\" \"" - + OnlyFilename(owner_->fileName()) + "\"", owner_->filepath); - owner_->getUser()->owner()->getLyXFunc()->Dispatch("buffer-reload"); + doVCCommand("ci -q -u -m\"" + msg + "\" " + + quoteName(onlyFilename(owner_->fileName())), + owner_->filePath()); } void RCS::checkOut() { - owner_->markLyxClean(); - doVCCommand("co -q -l \"" - + OnlyFilename(owner_->fileName()) + "\"", owner_->filepath); - owner_->getUser()->owner()->getLyXFunc()->Dispatch("buffer-reload"); + owner_->markClean(); + doVCCommand("co -q -l " + quoteName(onlyFilename(owner_->fileName())), + owner_->filePath()); } void RCS::revert() { - doVCCommand("co -f -u" + version() + " \"" - + OnlyFilename(owner_->fileName()) + "\"", owner_->filepath); + doVCCommand("co -f -u" + version() + " " + + quoteName(onlyFilename(owner_->fileName())), + owner_->filePath()); // We ignore changes and just reload! - owner_->markLyxClean(); - owner_->getUser()->owner() - ->getLyXFunc()->Dispatch("buffer-reload"); + owner_->markClean(); } void RCS::undoLast() { lyxerr[Debug::LYXVC] << "LyXVC: undoLast" << endl; - doVCCommand("rcs -o" + version() + " \"" - + OnlyFilename(owner_->fileName()) + "\"", owner_->filepath); + doVCCommand("rcs -o" + version() + " " + + quoteName(onlyFilename(owner_->fileName())), + owner_->filePath()); } -void RCS::getLog(string const & tmpf) +void RCS::getLog(FileName const & tmpf) { - doVCCommand("rlog \"" - + OnlyFilename(owner_->fileName()) + "\" > " + tmpf, owner_->filepath); + doVCCommand("rlog " + quoteName(onlyFilename(owner_->fileName())) + + " > " + tmpf.toFilesystemEncoding(), + owner_->filePath()); } -CVS::CVS(string const & m, string const & f) +CVS::CVS(FileName const & m, FileName const & f) { master_ = m; file_ = f; @@ -198,28 +231,27 @@ CVS::CVS(string const & m, string const & f) } -string CVS::find_file(string const & file) +FileName const CVS::find_file(FileName const & file) { // First we look for the CVS/Entries in the same dir // where we have file. - string dir = OnlyPath(file); - string tmpf = "/" + OnlyFilename(file) + "/"; - dir += "/CVS/Entries"; + FileName const dir(onlyPath(file.absFilename()) + "/CVS/Entries"); + string const tmpf = '/' + onlyFilename(file.absFilename()) + '/'; lyxerr[Debug::LYXVC] << "LyXVC: checking in `" << dir - << "' for `" << tmpf << "'" << endl; - FileInfo f(dir); - if (f.readable()) { + << "' for `" << tmpf << '\'' << endl; + if (fs::is_readable(dir.toFilesystemEncoding())) { // Ok we are at least in a CVS dir. Parse the CVS/Entries // and see if we can find this file. We do a fast and // dirty parse here. - ifstream ifs(dir.c_str()); + ifstream ifs(dir.toFilesystemEncoding().c_str()); string line; while (getline(ifs, line)) { lyxerr[Debug::LYXVC] << "\tEntries: " << line << endl; - if (contains(line, tmpf)) return dir; + if (contains(line, tmpf)) + return dir; } } - return string(); + return FileName(); } @@ -228,40 +260,41 @@ void CVS::scanMaster() lyxerr[Debug::LYXVC] << "LyXVC::CVS: scanMaster. \n Checking: " << master_ << endl; // Ok now we do the real scan... - ifstream ifs(master_.c_str()); - string tmpf = "/" + OnlyFilename(file_) + "/"; - lyxerr[Debug::LYXVC] << "\tlooking for `" << tmpf << "'" << endl; + ifstream ifs(master_.toFilesystemEncoding().c_str()); + string tmpf = '/' + onlyFilename(file_.absFilename()) + '/'; + lyxerr[Debug::LYXVC] << "\tlooking for `" << tmpf << '\'' << endl; string line; - LRegex reg("/(.*)/(.*)/(.*)/(.*)/(.*)"); - while(getline(ifs, line)) { + static regex const reg("/(.*)/(.*)/(.*)/(.*)/(.*)"); + while (getline(ifs, line)) { lyxerr[Debug::LYXVC] << "\t line: " << line << endl; if (contains(line, tmpf)) { // Ok extract the fields. - LRegex::SubMatches const & sm = reg.exec(line); + smatch sm; + + regex_match(line, sm, reg); + //sm[0]; // whole matched string //sm[1]; // filename - version_ = "CVS: "; - version_ += LSubstring(line, sm[2].first, - sm[2].second); - string file_date = LSubstring(line, sm[3].first, - sm[3].second); + version_ = sm.str(2); + string const file_date = sm.str(3); + //sm[4]; // options //sm[5]; // tag or tagdate - FileInfo fi(file_); - time_t mod = fi.getModificationTime(); - string mod_date = strip(asctime(gmtime(&mod)), '\n'); + // FIXME: must double check file is stattable/existing + time_t mod = fs::last_write_time(file_.toFilesystemEncoding()); + string mod_date = rtrim(asctime(gmtime(&mod)), "\n"); lyxerr[Debug::LYXVC] << "Date in Entries: `" << file_date << "'\nModification date of file: `" - << mod_date << "'" << endl; + << mod_date << '\'' << endl; if (file_date == mod_date) { locker_ = "Unlocked"; - vcstat = UNLOCKED; + vcstatus = UNLOCKED; } else { // Here we should also to some more checking // to see if there are conflicts or not. locker_ = "Locked"; - vcstat = LOCKED; + vcstatus = LOCKED; } break; } @@ -271,17 +304,17 @@ void CVS::scanMaster() void CVS::registrer(string const & msg) { - doVCCommand("cvs -q add -m \"" + msg + "\" \"" - + OnlyFilename(owner_->fileName()) + "\"", owner_->filepath); - owner_->getUser()->owner()->getLyXFunc()->Dispatch("buffer-reload"); + doVCCommand("cvs -q add -m \"" + msg + "\" " + + quoteName(onlyFilename(owner_->fileName())), + owner_->filePath()); } void CVS::checkIn(string const & msg) { - doVCCommand("cvs -q commit -m \"" + msg + "\" \"" - + OnlyFilename(owner_->fileName()) + "\"", owner_->filepath); - owner_->getUser()->owner()->getLyXFunc()->Dispatch("buffer-reload"); + doVCCommand("cvs -q commit -m \"" + msg + "\" " + + quoteName(onlyFilename(owner_->fileName())), + owner_->filePath()); } @@ -294,10 +327,13 @@ void CVS::checkOut() void CVS::revert() { - // not sure how to do this... - // rm file - // cvs update - lyxerr << "Sorry not implemented." << endl; + // Reverts to the version in CVS repository and + // gets the updated version from the repository. + string const fil = quoteName(onlyFilename(owner_->fileName())); + + doVCCommand("rm -f " + fil + "; cvs update " + fil, + owner_->filePath()); + owner_->markClean(); } @@ -310,7 +346,12 @@ void CVS::undoLast() } -void CVS::getLog(string const &) +void CVS::getLog(FileName const & tmpf) { - lyxerr << "Sorry not implemented." << endl; + doVCCommand("cvs log " + quoteName(onlyFilename(owner_->fileName())) + + " > " + tmpf.toFilesystemEncoding(), + owner_->filePath()); } + + +} // namespace lyx