]> git.lyx.org Git - lyx.git/blobdiff - src/vc-backend.C
Remove the now superseeded SConscript files, and some small missing parts to SConstruct
[lyx.git] / src / vc-backend.C
index 3b4ef26a23132ff2248c66059c5156f3567e7f04..3225bc18ba9a42d5261395c1f5b8275bddb84c63 100644 (file)
@@ -1,31 +1,64 @@
-#include <config.h>
-
-#ifdef __GNUG__
-#pragma implementation
-#endif
+/**
+ * \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 <fstream>
+#include <config.h>
 
 #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"
+
+#include "support/path.h"
+#include "support/filetools.h"
+#include "support/fs_extras.h"
+#include "support/lstrings.h"
+#include "support/systemcall.h"
+
+#include <boost/filesystem/operations.hpp>
+#include <boost/regex.hpp>
+
+#include <fstream>
+
+using lyx::support::addName;
+using lyx::support::addPath;
+using lyx::support::contains;
+using lyx::support::onlyFilename;
+using lyx::support::onlyPath;
+using lyx::support::Path;
+using lyx::support::quoteName;
+using lyx::support::rtrim;
+using lyx::support::split;
+using lyx::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::ifstream;
 using std::getline;
+using std::string;
+using std::ifstream;
+
+namespace fs = boost::filesystem;
+
 
 int VCS::doVCCommand(string const & cmd, string const & path)
 {
        lyxerr[Debug::LYXVC] << "doVCCommand: " << cmd << endl;
-        Systemcalls one;
+       Systemcall one;
        Path p(path);
-       int ret = one.startscript(Systemcalls::System, cmd);
+       int const ret = one.startscript(Systemcall::Wait, cmd);
        return ret;
 }
 
@@ -37,25 +70,24 @@ RCS::RCS(string const & m)
 }
 
 
-string RCS::find_file(string const & file)
+string const RCS::find_file(string const & file)
 {
        string tmp(file);
        // Check if *,v exists.
        tmp += ",v";
-       FileInfo f;
        lyxerr[Debug::LYXVC] << "Checking if file is under rcs: "
                             << tmp << endl;
-       if (f.newFile(tmp).readable()) {
+       if (fs::is_readable(tmp)) {
                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 = addName(addPath(onlyPath(file), "RCS"), file);
                tmp += ",v";
                lyxerr[Debug::LYXVC] << "Checking if file is under rcs: "
                                     << tmp << endl;
-               if (f.newFile(tmp).readable()) {
+               if (fs::is_readable(tmp)) {
                        lyxerr[Debug::LYXVC] << "Yes " << file
                                             << " it is under rcs."<< endl;
                        return tmp;
@@ -65,11 +97,10 @@ string RCS::find_file(string const & file)
 }
 
 
-void RCS::retrive(string const & file)
+void RCS::retrieve(string 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),
                         string());
 }
 
@@ -86,7 +117,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;
@@ -94,7 +125,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;
@@ -104,15 +135,17 @@ void RCS::scanMaster()
                        // nothing
                } else if (contains(token, "locks")) {
                        // get locker here
-                       if (contains(token, ";")) {
+                       if (contains(token, ';')) {
                                locker_ = "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 <user>:<version>
                                s1 = split(s1, s2, ':');
                                // s2 is user, and s1 is version
@@ -121,8 +154,8 @@ void RCS::scanMaster()
                                        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;
@@ -133,7 +166,6 @@ void RCS::scanMaster()
                                << endl;
                }
        }
-       version_ = "RCS: " + version_;
 }
 
 
@@ -141,54 +173,52 @@ 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)
 {
-       doVCCommand("rlog \""
-                   + OnlyFilename(owner_->fileName()) + "\" > " + tmpf, owner_->filepath);
+       doVCCommand("rlog " + quoteName(onlyFilename(owner_->fileName()))
+                   + " > " + tmpf,
+                   owner_->filePath());
 }
 
 
@@ -200,17 +230,15 @@ CVS::CVS(string const & m, string const & f)
 }
 
 
-string CVS::find_file(string const & file)
+string const CVS::find_file(string 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";
+       string const dir = onlyPath(file) + "/CVS/Entries";
+       string const tmpf = "/" + onlyFilename(file) + "/";
        lyxerr[Debug::LYXVC] << "LyXVC: checking in `" << dir
-                            << "' for `" << tmpf << "'" << endl;
-       FileInfo f(dir);
-       if (f.readable()) {
+                            << "' for `" << tmpf << '\'' << endl;
+       if (fs::is_readable(dir)) {
                // 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.
@@ -231,31 +259,32 @@ void CVS::scanMaster()
                             << 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;
+       string tmpf = "/" + onlyFilename(file_) + "/";
+       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_);
+                       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";
                                vcstatus = UNLOCKED;
@@ -273,17 +302,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());
 }
 
 
@@ -296,10 +325,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();
 }
 
 
@@ -312,7 +344,9 @@ void CVS::undoLast()
 }
 
 
-void CVS::getLog(string const &)
+void CVS::getLog(string const & tmpf)
 {
-       lyxerr << "Sorry not implemented." << endl;
+       doVCCommand("cvs log " + quoteName(onlyFilename(owner_->fileName()))
+                   + " > " + tmpf,
+                   owner_->filePath());
 }