]> git.lyx.org Git - features.git/blobdiff - src/VCBackend.cpp
Spots from Abdel
[features.git] / src / VCBackend.cpp
index 594bc68764541c8f8214ba3871649d968dbbf3a7..908593b967edffedb8722d790972e47c8c8f84d4 100644 (file)
@@ -12,7 +12,7 @@
 
 #include "VCBackend.h"
 #include "Buffer.h"
-#include "LyXFunc.h"
+#include "LyX.h"
 #include "FuncRequest.h"
 
 #include "frontends/alert.h"
@@ -44,7 +44,7 @@ int VCS::doVCCommandCall(string const & cmd, FileName const & path)
        LYXERR(Debug::LYXVC, "doVCCommandCall: " << cmd);
        Systemcall one;
        support::PathChanger p(path);
-       return one.startscript(Systemcall::Wait, cmd);
+       return one.startscript(Systemcall::Wait, cmd, false);
 }
 
 
@@ -273,7 +273,17 @@ void RCS::getLog(FileName const & tmpf)
 
 bool RCS::toggleReadOnlyEnabled()
 {
-       return true;
+       // This got broken somewhere along lfuns dispatch reorganization.
+       // reloadBuffer would be needed after this, but thats problematic
+       // since we are inside Buffer::dispatch.
+       // return true;
+       return false;
+}
+
+// FIXME This could be implemented with cache from scanMaster
+string RCS::revisionInfo(LyXVC::RevisionInfo const)
+{
+       return string();
 }
 
 
@@ -471,6 +481,13 @@ bool CVS::toggleReadOnlyEnabled()
        return false;
 }
 
+
+string CVS::revisionInfo(LyXVC::RevisionInfo const)
+{
+       return string();
+}
+
+
 /////////////////////////////////////////////////////////////////////
 //
 // SVN
@@ -516,6 +533,8 @@ 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()) {
@@ -523,7 +542,7 @@ void SVN::scanMaster()
                        vcstatus = LOCKED;
                } else {
                        locker_ = "Unlocked";
-                       vcstatus = LOCKED;
+                       vcstatus = UNLOCKED;
                }
        }
 }
@@ -563,9 +582,8 @@ bool SVN::checkLockMode()
 
 bool SVN::isLocked() const
 {
-       //refresh file info
-       FileName file(file_.absFilename());
-       return !file.isReadOnly();
+       file_.refresh();
+       return !file_.isReadOnly();
 }
 
 
@@ -595,12 +613,12 @@ string SVN::checkIn(string const & msg)
                frontend::Alert::error(_("Revision control error."),
                                _("Error when committing to repository.\n"
                                "You have to manually resolve the problem.\n"
-                               "After pressing OK, LyX will reopen the document."));
+                               "LyX will reopen the document after you press OK."));
        else
                fileLock(false, tmpf, log);
 
        tmpf.erase();
-       return "SVN: " + log;
+       return log.empty() ? string() : "SVN: " + log;
 }
 
 
@@ -623,9 +641,11 @@ string SVN::scanLogFile(FileName const & f, string & status)
 
        while (ifs) {
                getline(ifs, line);
-               lyxerr << line << "\n";
-               if (!line.empty()) status += line + "; ";
-               if (prefixIs(line, "C ") || contains(line, "Commit failed")) {
+               LYXERR(Debug::LYXVC, line << "\n");
+               if (!line.empty()) 
+                       status += line + "; ";
+               if (prefixIs(line, "C ") || prefixIs(line, "CU ")
+                                        || contains(line, "Commit failed")) {
                        ifs.close();
                        return line;
                }
@@ -644,7 +664,7 @@ void SVN::fileLock(bool lock, FileName const & tmpf, string &status)
        if (!locked_mode_ || (isLocked() == lock))
                return;
 
-       string arg = lock ? "lock " : "unlock ";
+       string const arg = lock ? "lock " : "unlock ";
        doVCCommand("svn "+ arg + quoteName(onlyFilename(owner_->absFileName()))
                    + " > " + quoteName(tmpf.toFilesystemEncoding()),
                    FileName(owner_->filePath()));
@@ -679,7 +699,7 @@ string SVN::checkOut()
                return N_("Error: Could not generate logfile.");
        }
 
-       doVCCommand("svn update " + quoteName(onlyFilename(owner_->absFileName()))
+       doVCCommand("svn update --non-interactive " + quoteName(onlyFilename(owner_->absFileName()))
                    + " > " + quoteName(tmpf.toFilesystemEncoding()),
                    FileName(owner_->filePath()));
 
@@ -689,13 +709,13 @@ string SVN::checkOut()
                frontend::Alert::error(_("Revision control error."),
                        bformat(_("Error when updating from repository.\n"
                                "You have to manually resolve the conflicts NOW!\n'%1$s'.\n\n"
-                               "After pressing OK, LyX will try to reopen resolved document."),
+                               "After pressing OK, LyX will try to reopen the resolved document."),
                        from_local8bit(res)));
 
        fileLock(true, tmpf, log);
 
        tmpf.erase();
-       return "SVN: " + log;
+       return log.empty() ? string() : "SVN: " + log;
 }
 
 
@@ -729,7 +749,7 @@ string SVN::repoUpdate()
                                "will be preferred."
                                "\n\nContinue?"), file);
                int ret = frontend::Alert::prompt(_("Changes detected"),
-                               text, 0, 1, _("&Yes"), _("&No"), _("See &Log"));
+                               text, 0, 1, _("&Yes"), _("&No"), _("View &Log ..."));
                if (ret == 2 ) {
                        dispatch(FuncRequest(LFUN_DIALOG_SHOW, "file " + tmpf.absFilename()));
                        ret = frontend::Alert::prompt(_("Changes detected"),
@@ -748,7 +768,7 @@ string SVN::repoUpdate()
        // FileName(owner_->filePath()));
        // res = "Revert log:\n" + tmpf.fileContents("UTF-8");
        doVCCommand("svn update --accept mine-full " + quoteName(owner_->filePath())
-       + " > " + quoteName(tmpf.toFilesystemEncoding()),
+               + " > " + quoteName(tmpf.toFilesystemEncoding()),
        FileName(owner_->filePath()));
        res += "Update log:\n" + tmpf.fileContents("UTF-8");
 
@@ -837,6 +857,58 @@ bool SVN::undoLastEnabled()
 }
 
 
+string SVN::revisionInfo(LyXVC::RevisionInfo const info)
+{
+       switch (info) {
+               case LyXVC::File:
+                       if (rev_file_cache_.empty())
+                               rev_file_cache_ = getFileRevisionInfo();
+                       if (rev_file_cache_.empty())
+                               rev_file_cache_ = "?";
+                       if (rev_file_cache_ == "?")
+                               return string();
+
+                       return rev_file_cache_;
+       }
+       return string();
+}
+
+
+std::string SVN::getFileRevisionInfo()
+{
+       FileName tmpf = FileName::tempName("lyxvcout");
+
+       doVCCommand("svn info --xml " + quoteName(onlyFilename(owner_->absFileName()))
+                   + " > " + quoteName(tmpf.toFilesystemEncoding()),
+                   FileName(owner_->filePath()));
+
+       if (tmpf.empty())
+               return string();
+
+       ifstream ifs(tmpf.toFilesystemEncoding().c_str());
+       string line;
+       // commit log part
+       bool c = false;
+       string rev;
+
+       while (ifs) {
+               getline(ifs, line);
+               LYXERR(Debug::LYXVC, line);
+               if (prefixIs(line, "<commit"))
+                       c = true;
+               if (c && prefixIs(line, "   revision=\"") && suffixIs(line, "\">")) {
+                       string l1 = subst(line, "revision=\"", "");
+                       string l2 = trim(subst(l1, "\">", ""));
+                       if (isStrInt(l2))
+                               rev = l2;
+               }
+       }
+       ifs.close();
+       tmpf.erase();
+       return rev;
+}
+
+
 void SVN::getLog(FileName const & tmpf)
 {
        doVCCommand("svn log " + quoteName(onlyFilename(owner_->absFileName()))