]> git.lyx.org Git - lyx.git/blobdiff - src/VCBackend.cpp
God damn tabular dual head :-/
[lyx.git] / src / VCBackend.cpp
index d7e42a284c136a371c99e033093360cd93127e5c..ef85a62305a8729a84c37a3b6515c71eeed55603 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
@@ -346,14 +352,16 @@ bool CVS::checkOutEnabled()
 
 void CVS::revert()
 {
-       // This is sensitive operation, so at lest some check before
-       if (doVCCommand("cvs --help", FileName(owner_->filePath())))
-               return;
        // Reverts to the version in CVS repository and
        // gets the updated version from the repository.
        string const fil = quoteName(onlyFilename(owner_->absFileName()));
-
-       doVCCommand("rm -f " + fil + "; cvs update " + fil,
+       // This is sensitive operation, so at lest some check about
+       // existence of cvs program and its file
+       if (doVCCommand("cvs log "+ fil, FileName(owner_->filePath())))
+               return;
+       FileName f(owner_->absFileName());
+       f.removeFile();
+       doVCCommand("cvs update " + fil,
                    FileName(owner_->filePath()));
        owner_->markClean();
 }
@@ -381,5 +389,183 @@ void CVS::getLog(FileName const & tmpf)
                    FileName(owner_->filePath()));
 }
 
+bool CVS::toggleReadOnlyEnabled()
+{
+       return false;
+}
+
+/////////////////////////////////////////////////////////////////////
+//
+// SVN
+//
+/////////////////////////////////////////////////////////////////////
+
+SVN::SVN(FileName const & m, FileName const & f)
+{
+       master_ = m;
+       file_ = f;
+       scanMaster();
+}
+
+
+FileName const SVN::findFile(FileName const & file)
+{
+       // First we look for the CVS/Entries in the same dir
+       // where we have file.
+       FileName const entries(onlyPath(file.absFilename()) + "/.svn/entries");
+       string const tmpf = onlyFilename(file.absFilename());
+       LYXERR(Debug::LYXVC, "LyXVC: Checking if file is under svn in `" << entries
+                            << "' for `" << tmpf << '\'');
+       if (entries.isReadableFile()) {
+               // Ok we are at least in a CVS dir. Parse the CVS/Entries
+               // and see if we can find this file. We do a fast and
+               // dirty parse here.
+               ifstream ifs(entries.toFilesystemEncoding().c_str());
+               string line, oldline;
+               while (getline(ifs, line)) {
+                       if (line == "dir" || line == "file")
+                               LYXERR(Debug::LYXVC, "\tEntries: " << oldline);
+                       if (oldline == tmpf && line == "file")
+                               return entries;
+                       oldline = line;
+               }
+       }
+       return FileName();
+}
+
+
+void SVN::scanMaster()
+{
+       // if we want some locking under svn
+       // we need different infrastructure around
+       locker_ = "Unlocked";
+       vcstatus = UNLOCKED;
+}
+
+
+void SVN::registrer(string const & msg)
+{
+       doVCCommand("svn add -q " + quoteName(onlyFilename(owner_->absFileName())),
+                   FileName(owner_->filePath()));
+}
+
+
+void SVN::checkIn(string const & msg)
+{
+       FileName tmpf = FileName::tempName("lyxvcout");
+       if (tmpf.empty()){
+               LYXERR(Debug::LYXVC, "Could not generate logfile " << tmpf);
+               return;
+       }
+
+       doVCCommand("svn commit -m \"" + msg + "\" "
+                   + quoteName(onlyFilename(owner_->absFileName()))
+                   + " 2> " + tmpf.toFilesystemEncoding(),
+                   FileName(owner_->filePath()));
+
+       string res = scanLogFile(tmpf);
+       if (!res.empty())
+               frontend::Alert::error(_("Revision control error."),
+                               _("Error when commiting to repository.\n"
+                               "You have to manually resolve the problem.\n"
+                               "After pressing OK, LyX will reopen the document."));
+       tmpf.erase();
+}
+
+
+bool SVN::checkInEnabled()
+{
+       return true;
+}
+
+// FIXME Correctly return code should be checked instead of this.
+// This would need another solution than just plain startscript.
+// Hint from Andre': QProcess::readAllStandardError()...
+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()
+{
+       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 true;
+}
+
+
+void SVN::revert()
+{
+       // Reverts to the version in CVS repository and
+       // gets the updated version from the repository.
+       string const fil = quoteName(onlyFilename(owner_->absFileName()));
+
+       doVCCommand("svn revert -q " + fil,
+                   FileName(owner_->filePath()));
+       owner_->markClean();
+}
+
+
+void SVN::undoLast()
+{
+       // merge the current with the previous version
+       // in a reverse patch kind of way, so that the
+       // result is to revert the last changes.
+       lyxerr << "Sorry not implemented." << endl;
+}
+
+
+bool SVN::undoLastEnabled()
+{
+       return false;
+}
+
+
+void SVN::getLog(FileName const & tmpf)
+{
+       doVCCommand("svn log " + quoteName(onlyFilename(owner_->absFileName()))
+                   + " > " + tmpf.toFilesystemEncoding(),
+                   FileName(owner_->filePath()));
+}
+
+
+bool SVN::toggleReadOnlyEnabled()
+{
+       return false;
+}
+
 
 } // namespace lyx