]> git.lyx.org Git - lyx.git/blobdiff - src/VCBackend.cpp
scanLog for checkout svn in VCS.
[lyx.git] / src / VCBackend.cpp
index b8e4e4b0a8095b5018489dd9eee59797802a4e81..ff722f0d1976e86c6dfc0ba7e571105368ba0eb3 100644 (file)
@@ -44,7 +44,7 @@ int VCS::doVCCommand(string const & cmd, FileName const & path)
        int const ret = one.startscript(Systemcall::Wait, cmd);
        if (ret)
                frontend::Alert::error(_("Revision control error."),
-                       bformat(_("Please check you have installed the program called in\n"
+                       bformat(_("Some problem occured while running the command:\n"
                                  "'%1$s'."),
                        from_ascii(cmd)));
        return ret;
@@ -223,6 +223,12 @@ void RCS::getLog(FileName const & tmpf)
 }
 
 
+bool RCS::toggleReadOnlyEnabled()
+{
+       return true;
+}
+
+
 /////////////////////////////////////////////////////////////////////
 //
 // CVS
@@ -381,6 +387,10 @@ void CVS::getLog(FileName const & tmpf)
                    FileName(owner_->filePath()));
 }
 
+bool CVS::toggleReadOnlyEnabled()
+{
+       return false;
+}
 
 /////////////////////////////////////////////////////////////////////
 //
@@ -451,19 +461,51 @@ bool SVN::checkInEnabled()
        return true;
 }
 
+// FIXME Correctly return code should be checked instead of this.
+// This would need another solution than just plain startscript.
+string SVN::scanLogFile(FileName const & f)
+{
+       ifstream ifs(f.toFilesystemEncoding().c_str());
+       string line;
+
+       while (ifs){
+               getline(ifs,line);
+               lyxerr<<line<<"\n";
+               if (prefixIs(line, "C "))
+                       return line;
+               if (contains(line, "Commit failed"))
+                       return line;
+       }
+       return string();
+}
+
 
 void SVN::checkOut()
 {
-       // svn update or perhaps for svn this should be a noop
-       // we need to detect conflict (eg "C" in output)
-       // before we can do this.
-       lyxerr << "Sorry not implemented." << endl;
+       FileName tmpf = FileName::tempName("lyxvcout");
+       if (tmpf.empty()){
+               LYXERR(Debug::LYXVC, "Could not generate logfile " << tmpf);
+               return;
+       }
+
+       doVCCommand("svn update " + quoteName(onlyFilename(owner_->absFileName()))
+                   + " > " + tmpf.toFilesystemEncoding(),
+                   FileName(owner_->filePath()));
+
+       string res = scanLogFile(tmpf);
+       if (!res.empty())
+               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."),
+                       from_ascii(res)));
+       tmpf.erase();
 }
 
 
 bool SVN::checkOutEnabled()
 {
-       return false;
+       return true;
 }
 
 
@@ -502,5 +544,10 @@ void SVN::getLog(FileName const & tmpf)
 }
 
 
+bool SVN::toggleReadOnlyEnabled()
+{
+       return false;
+}
+
 
 } // namespace lyx