]> git.lyx.org Git - lyx.git/blobdiff - src/VCBackend.cpp
Hack to display section symbol
[lyx.git] / src / VCBackend.cpp
index bee398cc4eb6dc4cd866b3cb7c7c5f1bd74e38b2..ca603c9e1f8ed89c1c3ea9cd35ed045815485c41 100644 (file)
 #include "support/lstrings.h"
 #include "support/PathChanger.h"
 #include "support/Systemcall.h"
-#include "support/regex.h"
 #include "support/TempFile.h"
 
 #include <fstream>
 #include <iomanip>
+#include <regex>
 #include <sstream>
 
 using namespace std;
@@ -58,11 +58,15 @@ int VCS::doVCCommand(string const & cmd, FileName const & path, bool reportError
 
        if (owner_)
                owner_->setBusy(false);
-       if (ret && reportError)
+       if (ret && reportError) {
+               docstring rcsmsg;
+               if (prefixIs(cmd, "ci "))
+                       rcsmsg = "\n" + _("Check whether the GNU RCS package is installed on your system.");
                frontend::Alert::error(_("Revision control error."),
                        bformat(_("Some problem occurred while running the command:\n"
-                                 "'%1$s'."),
+                                 "'%1$s'.") + rcsmsg,
                        from_utf8(cmd)));
+       }
        return ret;
 }
 
@@ -101,18 +105,18 @@ bool VCS::makeRCSRevision(string const &version, string &revis) const
 }
 
 
-bool VCS::checkparentdirs(FileName const & file, std::string const & vcsdir)
+FileName VCS::checkParentDirs(FileName const & start, std::string const & file)
 {
-       FileName dirname = file.onlyPath();
+       FileName dirname = start.onlyPath();
        do {
-               FileName tocheck = FileName(addName(dirname.absFileName(), vcsdir));
+               FileName tocheck = FileName(addPathName(dirname.absFileName(), file));
                LYXERR(Debug::LYXVC, "check file: " << tocheck.absFileName());
                if (tocheck.exists())
-                       return true;
-               //this construct because of #8295
+                       return tocheck;
+               // this construct because of #8295
                dirname = FileName(dirname.absFileName()).parentPath();
        } while (!dirname.empty());
-       return false;
+       return FileName();
 }
 
 
@@ -157,8 +161,8 @@ bool RCS::retrieve(FileName const & file)
 {
        LYXERR(Debug::LYXVC, "LyXVC::RCS: retrieve.\n\t" << file);
        // The caller ensures that file does not exist, so no need to check that.
-       return doVCCommandCall("co -q -r " + quoteName(file.toFilesystemEncoding()),
-                              FileName()) == 0;
+       int const ret = doVCCommandCall("co -q -r " + quoteName(file.toFilesystemEncoding()));
+       return ret == 0;
 }
 
 
@@ -197,7 +201,7 @@ void RCS::scanMaster()
                        // get locker here
                        if (contains(token, ';')) {
                                locker_ = "Unlocked";
-                               vcstatus = UNLOCKED;
+                               vcstatus_ = UNLOCKED;
                                continue;
                        }
                        string tmpt;
@@ -211,7 +215,7 @@ void RCS::scanMaster()
                                // s2 is user, and s1 is version
                                if (s1 == version_) {
                                        locker_ = s2;
-                                       vcstatus = LOCKED;
+                                       vcstatus_ = LOCKED;
                                        break;
                                }
                        } while (!contains(tmpt, ';'));
@@ -534,6 +538,8 @@ FileName const CVS::findFile(FileName const & file)
 {
        // First we look for the CVS/Entries in the same dir
        // where we have file.
+       // Note that it is not necessary to search parent directories, since
+       // there will be a CVS/Entries file in every subdirectory.
        FileName const entries(onlyPath(file.absFileName()) + "/CVS/Entries");
        string const tmpf = '/' + onlyFileName(file.absFileName()) + '/';
        LYXERR(Debug::LYXVC, "LyXVC: Checking if file is under cvs in `" << entries
@@ -559,8 +565,8 @@ void CVS::scanMaster()
        LYXERR(Debug::LYXVC, "LyXVC::CVS: scanMaster. \n     Checking: " << master_);
        // Ok now we do the real scan...
        ifstream ifs(master_.toFilesystemEncoding().c_str());
-       string name = onlyFileName(owner_->absFileName());
-       string tmpf = '/' + name + '/';
+       string const name = onlyFileName(owner_->absFileName());
+       string const tmpf = '/' + name + '/';
        LYXERR(Debug::LYXVC, "\tlooking for `" << tmpf << '\'');
        string line;
        static regex const reg("/(.*)/(.*)/(.*)/(.*)/(.*)");
@@ -583,21 +589,21 @@ void CVS::scanMaster()
                        //sm[5]; // tag or tagdate
                        FileName file(owner_->absFileName());
                        if (file.isReadableFile()) {
-                               time_t mod = file.lastModified();
-                               string mod_date = rtrim(asctime(gmtime(&mod)), "\n");
+                               time_t const mod = file.lastModified();
+                               string const mod_date = rtrim(asctime(gmtime(&mod)), "\n");
                                LYXERR(Debug::LYXVC, "Date in Entries: `" << file_date
                                        << "'\nModification date of file: `" << mod_date << '\'');
                                if (file.isReadOnly()) {
                                        // readonly checkout is unlocked
-                                       vcstatus = UNLOCKED;
+                                       vcstatus_ = UNLOCKED;
                                } else {
                                        FileName bdir(addPath(master_.onlyPath().absFileName(),"Base"));
                                        FileName base(addName(bdir.absFileName(),name));
                                        // if base version is existent "cvs edit" was used to lock
-                                       vcstatus = base.isReadableFile() ? LOCKED : NOLOCKING;
+                                       vcstatus_ = base.isReadableFile() ? LOCKED : NOLOCKING;
                                }
                        } else {
-                               vcstatus = NOLOCKING;
+                               vcstatus_ = NOLOCKING;
                        }
                        break;
                }
@@ -807,7 +813,7 @@ void CVS::getDiff(OperationMode opmode, FileName const & tmpf)
 
 int CVS::edit()
 {
-       vcstatus = LOCKED;
+       vcstatus_ = LOCKED;
        return doVCCommand("cvs -q edit " + getTarget(File),
                FileName(owner_->filePath()));
 }
@@ -815,7 +821,7 @@ int CVS::edit()
 
 int CVS::unedit()
 {
-       vcstatus = UNLOCKED;
+       vcstatus_ = UNLOCKED;
        return doVCCommand("cvs -q unedit " + getTarget(File),
                FileName(owner_->filePath()));
 }
@@ -854,7 +860,7 @@ LyXVC::CommandResult CVS::checkIn(string const & msg, string & log)
        CvsStatus status = getStatus();
        switch (status) {
        case UpToDate:
-               if (vcstatus != NOLOCKING)
+               if (vcstatus_ != NOLOCKING)
                        if (unedit())
                                return LyXVC::ErrorCommand;
                log = "CVS: Proceeded";
@@ -896,7 +902,7 @@ bool CVS::isLocked() const
 
 bool CVS::checkInEnabled()
 {
-       if (vcstatus != NOLOCKING)
+       if (vcstatus_ != NOLOCKING)
                return isLocked();
        else
                return true;
@@ -912,7 +918,7 @@ bool CVS::isCheckInWithConfirmation()
 
 string CVS::checkOut()
 {
-       if (vcstatus != NOLOCKING && edit())
+       if (vcstatus_ != NOLOCKING && edit())
                return string();
        TempFile tempfile("lyxvout");
        FileName tmpf = tempfile.name();
@@ -939,7 +945,7 @@ string CVS::checkOut()
 
 bool CVS::checkOutEnabled()
 {
-       if (vcstatus != NOLOCKING)
+       if (vcstatus_ != NOLOCKING)
                return !isLocked();
        else
                return true;
@@ -1029,7 +1035,7 @@ bool CVS::revert()
        CvsStatus status = getStatus();
        switch (status) {
        case UpToDate:
-               if (vcstatus != NOLOCKING)
+               if (vcstatus_ != NOLOCKING)
                        return 0 == unedit();
                break;
        case NeedsMerge:
@@ -1150,39 +1156,30 @@ bool CVS::prepareFileRevisionEnabled()
 //
 /////////////////////////////////////////////////////////////////////
 
-SVN::SVN(FileName const & m, Buffer * b) : VCS(b)
+SVN::SVN(Buffer * b) : VCS(b)
 {
        // Here we know that the buffer file is either already in SVN or
        // about to be registered
-       master_ = m;
        locked_mode_ = false;
        scanMaster();
 }
 
 
-FileName const SVN::findFile(FileName const & file)
+bool SVN::findFile(FileName const & file)
 {
        // First we check the existence of repository meta data.
-       if (!VCS::checkparentdirs(file, ".svn")) {
+       if (VCS::checkParentDirs(file, ".svn").empty()) {
                LYXERR(Debug::LYXVC, "Cannot find SVN meta data for " << file);
-               return FileName();
+               return false;
        }
 
        // Now we check the status of the file.
-       TempFile tempfile("lyxvcout");
-       FileName tmpf = tempfile.name();
-       if (tmpf.empty()) {
-               LYXERR(Debug::LYXVC, "Could not generate logfile " << tmpf);
-               return FileName();
-       }
-
        string const fname = onlyFileName(file.absFileName());
        LYXERR(Debug::LYXVC, "LyXVC: Checking if file is under svn control for `" << fname << '\'');
-       bool found = 0 == doVCCommandCall("svn info " + quoteName(fname)
-                                               + " > " + quoteName(tmpf.toFilesystemEncoding()),
+       bool found = 0 == doVCCommandCall("svn info " + quoteName(fname),
                                                file.onlyPath());
        LYXERR(Debug::LYXVC, "SVN control: " << (found ? "enabled" : "disabled"));
-       return found ? file : FileName();
+       return found;
 }
 
 
@@ -1190,13 +1187,9 @@ void SVN::scanMaster()
 {
        // vcstatus code is somewhat superflous,
        // until we want to implement read-only toggle for svn.
-       vcstatus = NOLOCKING;
-       if (checkLockMode()) {
-               if (isLocked())
-                       vcstatus = LOCKED;
-               else
-                       vcstatus = UNLOCKED;
-       }
+       vcstatus_ = NOLOCKING;
+       if (checkLockMode())
+               vcstatus_ = isLocked() ? LOCKED : UNLOCKED;
 }
 
 
@@ -1252,7 +1245,7 @@ bool SVN::retrieve(FileName const & file)
 
 void SVN::registrer(string const & /*msg*/)
 {
-       doVCCommand("svn add -q " + quoteName(onlyFileName(owner_->absFileName())),
+       doVCCommand("svn add -q --parents " + quoteName(onlyFileName(owner_->absFileName())),
                    FileName(owner_->filePath()));
 }
 
@@ -1823,21 +1816,20 @@ bool SVN::toggleReadOnlyEnabled()
 //
 /////////////////////////////////////////////////////////////////////
 
-GIT::GIT(FileName const & m, Buffer * b) : VCS(b)
+GIT::GIT(Buffer * b) : VCS(b)
 {
        // Here we know that the buffer file is either already in GIT or
        // about to be registered
-       master_ = m;
        scanMaster();
 }
 
 
-FileName const GIT::findFile(FileName const & file)
+bool GIT::findFile(FileName const & file)
 {
        // First we check the existence of repository meta data.
-       if (!VCS::checkparentdirs(file, ".git")) {
+       if (VCS::checkParentDirs(file, ".git").empty()) {
                LYXERR(Debug::LYXVC, "Cannot find GIT meta data for " << file);
-               return FileName();
+               return false;
        }
 
        // Now we check the status of the file.
@@ -1845,7 +1837,7 @@ FileName const GIT::findFile(FileName const & file)
        FileName tmpf = tempfile.name();
        if (tmpf.empty()) {
                LYXERR(Debug::LYXVC, "Could not generate logfile " << tmpf);
-               return FileName();
+               return false;
        }
 
        string const fname = onlyFileName(file.absFileName());
@@ -1858,7 +1850,7 @@ FileName const GIT::findFile(FileName const & file)
        tmpf.refresh();
        bool found = !tmpf.isFileEmpty();
        LYXERR(Debug::LYXVC, "GIT control: " << (found ? "enabled" : "disabled"));
-       return found ? file : FileName();
+       return found;
 }
 
 
@@ -1866,7 +1858,7 @@ void GIT::scanMaster()
 {
        // vcstatus code is somewhat superflous,
        // until we want to implement read-only toggle for git.
-       vcstatus = NOLOCKING;
+       vcstatus_ = NOLOCKING;
 }