]> git.lyx.org Git - lyx.git/blobdiff - src/VCBackend.cpp
Pure HTML output for math macros.
[lyx.git] / src / VCBackend.cpp
index dd3aa9b9cf6af7c5373ca33d93c1b1db547bf48d..5bbc1746b417ae0dd2720dbb4c575a4d8076e637 100644 (file)
@@ -19,6 +19,7 @@
 #include "frontends/alert.h"
 #include "frontends/Application.h"
 
+#include "support/convert.h"
 #include "support/debug.h"
 #include "support/filetools.h"
 #include "support/gettext.h"
@@ -289,6 +290,55 @@ string RCS::revisionInfo(LyXVC::RevisionInfo const info)
 }
 
 
+bool RCS::prepareFileRevision(string const &revis, string & f)
+{
+       string rev = revis;
+
+       if (isStrInt(rev)) {
+               int back = convert<int>(rev);
+               if (back > 0)
+                       return false;
+               if (back == 0)
+                       rev = version_;
+               // we care about the last number from revision string
+               // in case of backward indexing
+               if (back < 0) {
+                       string cur, base;
+                       cur = rsplit(version_, base , '.' );
+                       if (!isStrInt(cur))
+                               return false;
+                       int want = convert<int>(cur) + back;
+                       if (want <= 0)
+                               return false;
+
+                       rev = base + "." + convert<string>(want);
+               }
+       }
+
+       FileName tmpf = FileName::tempName("lyxvcrev");
+       if (tmpf.empty()) {
+               LYXERR(Debug::LYXVC, "Could not generate logfile " << tmpf);
+               return N_("Error: Could not generate logfile.");
+       }
+
+       doVCCommand("co -p" + rev + " "
+                     + quoteName(onlyFilename(owner_->absFileName()))
+                     + " > " + quoteName(tmpf.toFilesystemEncoding()),
+               FileName(owner_->filePath()));
+       if (tmpf.isFileEmpty())
+               return false;
+
+       f = tmpf.absFilename();
+       return true;
+}
+
+
+bool RCS::prepareFileRevisionEnabled()
+{
+       return true;
+}
+
+
 /////////////////////////////////////////////////////////////////////
 //
 // CVS
@@ -362,7 +412,7 @@ void CVS::scanMaster()
                                locker_ = "Unlocked";
                                vcstatus = UNLOCKED;
                        } else {
-                               // Here we should also to some more checking
+                               // Here we should also do some more checking
                                // to see if there are conflicts or not.
                                locker_ = "Locked";
                                vcstatus = LOCKED;
@@ -492,6 +542,18 @@ string CVS::revisionInfo(LyXVC::RevisionInfo const info)
 }
 
 
+bool CVS::prepareFileRevision(string const &, string &)
+{
+       return false;
+}
+
+
+bool CVS::prepareFileRevisionEnabled()
+{
+       return false;
+}
+
+
 /////////////////////////////////////////////////////////////////////
 //
 // SVN
@@ -536,16 +598,13 @@ FileName const SVN::findFile(FileName const & file)
 
 void SVN::scanMaster()
 {
-       locker_.clear();
        // vcstatus code is somewhat superflous, until we want
        // to implement read-only toggle for svn.
        vcstatus = NOLOCKING;
        if (checkLockMode()) {
                if (isLocked()) {
-                       locker_ = "Locked";
                        vcstatus = LOCKED;
                } else {
-                       locker_ = "Unlocked";
                        vcstatus = UNLOCKED;
                }
        }
@@ -684,13 +743,13 @@ void SVN::fileLock(bool lock, FileName const & tmpf, string &status)
 
        if (!isLocked() && lock)
                frontend::Alert::error(_("Revision control error."),
-                       _("Error when acquiring write lock.\n"
-                       "Most probably another user is editing\n"
+                       _("Error while acquiring write lock.\n"
+                       "Another user is most probably editing\n"
                        "the current document now!\n"
                        "Also check the access to the repository."));
        if (isLocked() && !lock)
                frontend::Alert::error(_("Revision control error."),
-                       _("Error when releasing write lock.\n"
+                       _("Error while releasing write lock.\n"
                        "Check the access to the repository."));
 }
 
@@ -708,7 +767,7 @@ string SVN::checkOut()
                    FileName(owner_->filePath()));
 
        string log;
-       string res = scanLogFile(tmpf, log);
+       string const res = scanLogFile(tmpf, log);
        if (!res.empty())
                frontend::Alert::error(_("Revision control error."),
                        bformat(_("Error when updating from repository.\n"
@@ -741,8 +800,8 @@ string SVN::repoUpdate()
        }
 
        doVCCommand("svn diff " + quoteName(owner_->filePath())
-       + " > " + quoteName(tmpf.toFilesystemEncoding()),
-       FileName(owner_->filePath()));
+                   + " > " + quoteName(tmpf.toFilesystemEncoding()),
+               FileName(owner_->filePath()));
        docstring res = tmpf.fileContents("UTF-8");
        if (!res.empty()) {
                LYXERR(Debug::LYXVC, "Diff detected:\n" << res);
@@ -900,6 +959,10 @@ string SVN::revisionInfo(LyXVC::RevisionInfo const info)
 bool SVN::getFileRevisionInfo()
 {
        FileName tmpf = FileName::tempName("lyxvcout");
+       if (tmpf.empty()) {
+               LYXERR(Debug::LYXVC, "Could not generate logfile " << tmpf);
+               return N_("Error: Could not generate logfile.");
+       }
 
        doVCCommand("svn info --xml " + quoteName(onlyFilename(owner_->absFileName()))
                    + " > " + quoteName(tmpf.toFilesystemEncoding()),
@@ -949,6 +1012,10 @@ bool SVN::getFileRevisionInfo()
 bool SVN::getTreeRevisionInfo()
 {
        FileName tmpf = FileName::tempName("lyxvcout");
+       if (tmpf.empty()) {
+               LYXERR(Debug::LYXVC, "Could not generate logfile " << tmpf);
+               return N_("Error: Could not generate logfile.");
+       }
 
        doVCCommand("svnversion -n . > " + quoteName(tmpf.toFilesystemEncoding()),
                    FileName(owner_->filePath()));
@@ -976,6 +1043,49 @@ void SVN::getLog(FileName const & tmpf)
 }
 
 
+bool SVN::prepareFileRevision(string const & revis, string & f)
+{
+       if (!isStrInt(revis))
+               return false;
+
+       int rev = convert<int>(revis);
+       if (rev <= 0)
+               if (!getFileRevisionInfo())
+                       return false;
+       if (rev == 0)
+               rev = convert<int>(rev_file_cache_);
+       // go back for minus rev
+       else if (rev < 0) {
+               rev = rev + convert<int>(rev_file_cache_);
+               if (rev < 1)
+                       return false;
+       }
+
+       FileName tmpf = FileName::tempName("lyxvcrev");
+       if (tmpf.empty()) {
+               LYXERR(Debug::LYXVC, "Could not generate logfile " << tmpf);
+               return N_("Error: Could not generate logfile.");
+       }
+
+       doVCCommand("svn cat -r " + convert<string>(rev) + " "
+                     + quoteName(onlyFilename(owner_->absFileName()))
+                     + " > " + quoteName(tmpf.toFilesystemEncoding()),
+               FileName(owner_->filePath()));
+       if (tmpf.isFileEmpty())
+               return false;
+
+       f = tmpf.absFilename();
+       return true;
+}
+
+
+bool SVN::prepareFileRevisionEnabled()
+{
+       return true;
+}
+
+
+
 bool SVN::toggleReadOnlyEnabled()
 {
        return false;