]> git.lyx.org Git - lyx.git/blobdiff - src/VCBackend.cpp
VCS: copy-paste error, these functions return bool.
[lyx.git] / src / VCBackend.cpp
index 79cabfa7398b176b6d0211e610ea68c7960783a6..1c8520e7a23d0bed4950803a32ca809f2abf3b35 100644 (file)
@@ -43,7 +43,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, false);
+       return one.startscript(Systemcall::Wait, cmd, string(), false);
 }
 
 
@@ -65,6 +65,40 @@ int VCS::doVCCommand(string const & cmd, FileName const & path, bool reportError
 }
 
 
+bool VCS::makeRCSRevision(string const &version, string &revis) const
+{
+       string rev = revis;
+       
+       if (isStrInt(rev)) {
+               int back = convert<int>(rev);
+               // if positive use as the last number in the whole revision string
+               if (back > 0) {
+                       string base;
+                       rsplit(version, base , '.' );
+                       rev = base + "." + rev;
+               }
+               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);
+               }
+       }
+
+       revis = rev;
+       return true;
+}
+       
+       
 /////////////////////////////////////////////////////////////////////
 //
 // RCS
@@ -213,7 +247,10 @@ bool RCS::isCheckInWithConfirmation()
                    + " > " + quoteName(tmpf.toFilesystemEncoding()),
                FileName(owner_->filePath()));
 
-       if (tmpf.fileContents("UTF-8").empty())
+       docstring diff = tmpf.fileContents("UTF-8");
+       tmpf.erase();
+
+       if (diff.empty())
                return false;
 
        return true;
@@ -264,13 +301,15 @@ bool RCS::lockingToggleEnabled()
 }
 
 
-void RCS::revert()
+bool RCS::revert()
 {
-       doVCCommand("co -f -u" + version_ + " "
+       if (doVCCommand("co -f -u" + version_ + " "
                    + quoteName(onlyFileName(owner_->absFileName())),
-                   FileName(owner_->filePath()));
+                   FileName(owner_->filePath())))
+               return false;
        // We ignore changes and just reload!
        owner_->markClean();
+       return true;
 }
 
 
@@ -324,36 +363,13 @@ 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 positive use as the last number in the whole revision string
-               if (back > 0) {
-                       string base;
-                       rsplit(version_, base , '.' );
-                       rev = base + "." + rev;
-               }
-               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);
-               }
-       }
+       if (!VCS::makeRCSRevision(version_, rev))
+               return false;
 
        FileName tmpf = FileName::tempName("lyxvcrev_" + rev + "_");
        if (tmpf.empty()) {
                LYXERR(Debug::LYXVC, "Could not generate logfile " << tmpf);
-               return N_("Error: Could not generate logfile.");
+               return false;
        }
 
        doVCCommand("co -p" + rev + " "
@@ -764,8 +780,8 @@ string CVS::repoUpdate()
                docstring const file = from_utf8(owner_->filePath());
                docstring text = bformat(_("There were detected changes "
                                "in the working directory:\n%1$s\n\n"
-                               "In case of file conflict you have to resolve them "
-                               "manually or revert to repository version later."), file);
+                               "Possible file conflicts must be then resolved manually "
+                               "or you will need to revert back to the repository version."), file);
                int ret = frontend::Alert::prompt(_("Changes detected"),
                                text, 0, 1, _("&Continue"), _("&Abort"), _("View &Log ..."));
                if (ret == 2 ) {
@@ -828,7 +844,7 @@ bool CVS::isRevertWithConfirmation()
 }
 
 
-void CVS::revert()
+bool CVS::revert()
 {
        // Reverts to the version in CVS repository and
        // gets the updated version from the repository.
@@ -836,7 +852,7 @@ void CVS::revert()
        switch (status) {
        case UpToDate:
                if (vcstatus != NOLOCKING)
-                       unedit();
+                       return 0 == unedit();
                break;
        case NeedsMerge:
        case NeedsCheckout:
@@ -853,7 +869,7 @@ void CVS::revert()
                        bformat(_("The document %1$s is not in repository.\n"
                                  "You have to check in the first revision before you can revert."),
                                file)) ;
-               break;
+               return false;
        }
        default: {
                docstring const file = owner_->fileName().displayName(20);
@@ -861,9 +877,10 @@ void CVS::revert()
                        bformat(_("Cannot revert document %1$s to repository version.\n"
                                  "The status '%2$s' is unexpected."),
                                file, toString(status)));
-               break;
+               return false;
                }
        }
+       return true;
 }
 
 
@@ -916,15 +933,32 @@ string CVS::revisionInfo(LyXVC::RevisionInfo const info)
 }
 
 
-bool CVS::prepareFileRevision(string const &, string &)
+bool CVS::prepareFileRevision(string const & revis, string & f)
 {
-       return false;
+       string rev = revis;
+       if (!VCS::makeRCSRevision(version_, rev))
+               return false;
+
+       FileName tmpf = FileName::tempName("lyxvcrev_" + rev + "_");
+       if (tmpf.empty()) {
+               LYXERR(Debug::LYXVC, "Could not generate logfile " << tmpf);
+               return false;
+       }
+
+       doVCCommandWithOutput("cvs update -p -r" + rev + " "
+               + getTarget(File),
+               FileName(owner_->filePath()), tmpf);
+       if (tmpf.isFileEmpty())
+               return false;
+
+       f = tmpf.absFileName();
+       return true;
 }
 
 
 bool CVS::prepareFileRevisionEnabled()
 {
-       return false;
+       return true;
 }
 
 
@@ -990,7 +1024,7 @@ bool SVN::checkLockMode()
        FileName tmpf = FileName::tempName("lyxvcout");
        if (tmpf.empty()){
                LYXERR(Debug::LYXVC, "Could not generate logfile " << tmpf);
-               return N_("Error: Could not generate logfile.");
+               return false;
        }
 
        LYXERR(Debug::LYXVC, "Detecting locking mode...");
@@ -1070,7 +1104,24 @@ bool SVN::checkInEnabled()
 
 bool SVN::isCheckInWithConfirmation()
 {
-       //FIXME diff
+       // FIXME one day common getDiff and perhaps OpMode for all backends
+
+       FileName tmpf = FileName::tempName("lyxvcout");
+       if (tmpf.empty()) {
+               LYXERR(Debug::LYXVC, "Could not generate logfile " << tmpf);
+               return true;
+       }
+
+       doVCCommandCall("svn diff " + quoteName(owner_->absFileName())
+                   + " > " + quoteName(tmpf.toFilesystemEncoding()),
+               FileName(owner_->filePath()));
+
+       docstring diff = tmpf.fileContents("UTF-8");
+       tmpf.erase();
+
+       if (diff.empty())
+               return false;
+
        return true;
 }
 
@@ -1274,15 +1325,17 @@ bool SVN::lockingToggleEnabled()
 }
 
 
-void SVN::revert()
+bool SVN::revert()
 {
        // Reverts to the version in SVN repository and
        // gets the updated version from the repository.
        string const fil = quoteName(onlyFileName(owner_->absFileName()));
 
-       doVCCommand("svn revert -q " + fil,
-                   FileName(owner_->filePath()));
+       if (doVCCommand("svn revert -q " + fil,
+                   FileName(owner_->filePath())))
+               return false;
        owner_->markClean();
+       return true;
 }
 
 
@@ -1349,7 +1402,7 @@ 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.");
+               return false;
        }
 
        doVCCommand("svn info --xml " + quoteName(onlyFileName(owner_->absFileName()))
@@ -1402,7 +1455,7 @@ 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.");
+               return false;
        }
 
        doVCCommand("svnversion -n . > " + quoteName(tmpf.toFilesystemEncoding()),
@@ -1453,7 +1506,7 @@ bool SVN::prepareFileRevision(string const & revis, string & f)
        FileName tmpf = FileName::tempName("lyxvcrev_" + revname + "_");
        if (tmpf.empty()) {
                LYXERR(Debug::LYXVC, "Could not generate logfile " << tmpf);
-               return N_("Error: Could not generate logfile.");
+               return false;
        }
 
        doVCCommand("svn cat -r " + revname + " "