X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FVCBackend.cpp;h=d05e4428ac2e35b244078e0455f6548b391b6d9f;hb=cca78e3c8ae27431323746abd64f9d7db017099d;hp=bacad51916b2499fe90c7cf01de65981f369ffa8;hpb=6a9c45b50ba2922450f68a94841d6b732513bb56;p=lyx.git diff --git a/src/VCBackend.cpp b/src/VCBackend.cpp index bacad51916..d05e4428ac 100644 --- a/src/VCBackend.cpp +++ b/src/VCBackend.cpp @@ -36,12 +36,18 @@ using boost::smatch; namespace lyx { -int VCS::doVCCommand(string const & cmd, FileName const & path) -{ - LYXERR(Debug::LYXVC, "doVCCommand: " << cmd); +int VCS::doVCCommandCall(string const & cmd, FileName const & path){ + LYXERR(Debug::LYXVC, "doVCCommandCall: " << cmd); Systemcall one; support::PathChanger p(path); - int const ret = one.startscript(Systemcall::Wait, cmd); + return one.startscript(Systemcall::Wait, cmd); +} + +int VCS::doVCCommand(string const & cmd, FileName const & path) +{ + owner_->setBusy(true); + int const ret = doVCCommandCall(cmd, path); + owner_->setBusy(false); if (ret) frontend::Alert::error(_("Revision control error."), bformat(_("Some problem occured while running the command:\n" @@ -89,7 +95,7 @@ FileName const RCS::findFile(FileName const & file) void RCS::retrieve(FileName const & file) { LYXERR(Debug::LYXVC, "LyXVC::RCS: retrieve.\n\t" << file); - VCS::doVCCommand("co -q -r " + quoteName(file.toFilesystemEncoding()), + doVCCommandCall("co -q -r " + quoteName(file.toFilesystemEncoding()), FileName()); } @@ -164,11 +170,12 @@ void RCS::registrer(string const & msg) } -void RCS::checkIn(string const & msg) +string RCS::checkIn(string const & msg) { - doVCCommand("ci -q -u -m\"" + msg + "\" " + int ret = doVCCommand("ci -q -u -m\"" + msg + "\" " + quoteName(onlyFilename(owner_->absFileName())), FileName(owner_->filePath())); + return ret ? string() : "RCS: Proceeded"; } bool RCS::checkInEnabled() @@ -176,11 +183,12 @@ bool RCS::checkInEnabled() return owner_ && !owner_->isReadonly(); } -void RCS::checkOut() +string RCS::checkOut() { owner_->markClean(); - doVCCommand("co -q -l " + quoteName(onlyFilename(owner_->absFileName())), + int ret = doVCCommand("co -q -l " + quoteName(onlyFilename(owner_->absFileName())), FileName(owner_->filePath())); + return ret ? string() : "RCS: Proceeded"; } @@ -321,11 +329,12 @@ void CVS::registrer(string const & msg) } -void CVS::checkIn(string const & msg) +string CVS::checkIn(string const & msg) { - doVCCommand("cvs -q commit -m \"" + msg + "\" " + int ret = doVCCommand("cvs -q commit -m \"" + msg + "\" " + quoteName(onlyFilename(owner_->absFileName())), FileName(owner_->filePath())); + return ret ? string() : "CVS: Proceeded"; } @@ -335,12 +344,13 @@ bool CVS::checkInEnabled() } -void CVS::checkOut() +string CVS::checkOut() { // cvs update or perhaps for cvs this should be a noop // we need to detect conflict (eg "C" in output) // before we can do this. lyxerr << "Sorry not implemented." << endl; + return string(); } @@ -352,14 +362,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(); } @@ -443,16 +455,33 @@ void SVN::scanMaster() void SVN::registrer(string const & msg) { - doVCCommand("svn -q add " + quoteName(onlyFilename(owner_->absFileName())), + doVCCommand("svn add -q " + quoteName(onlyFilename(owner_->absFileName())), FileName(owner_->filePath())); } -void SVN::checkIn(string const & msg) +string SVN::checkIn(string const & msg) { - doVCCommand("svn -q commit -m \"" + msg + "\" " - + quoteName(onlyFilename(owner_->absFileName())), + 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 commit -m \"" + msg + "\" " + + quoteName(onlyFilename(owner_->absFileName())) + + " > " + tmpf.toFilesystemEncoding(), FileName(owner_->filePath())); + + string log; + string res = scanLogFile(tmpf, log); + 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(); + return "SVN: " + log; } @@ -461,11 +490,50 @@ 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, string & status) +{ + ifstream ifs(f.toFilesystemEncoding().c_str()); + string line; + + while (ifs) { + getline(ifs, line); + lyxerr << line << "\n"; + if (!line.empty()) status += line + "; "; + if (prefixIs(line, "C ") || contains(line, "Commit failed")) { + ifs.close(); + return line; + } + } + ifs.close(); + return string(); +} -void SVN::checkOut() + +string SVN::checkOut() { - doVCCommand("svn update " + quoteName(onlyFilename(owner_->absFileName())), + 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 update " + quoteName(onlyFilename(owner_->absFileName())) + + " > " + tmpf.toFilesystemEncoding(), FileName(owner_->filePath())); + + string log; + string res = scanLogFile(tmpf, log); + 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(); + return "SVN: " + log; }