diff --git a/src/LyXFunc.cpp b/src/LyXFunc.cpp index a869903c28..6e9aa55af5 100644 --- a/src/LyXFunc.cpp +++ b/src/LyXFunc.cpp @@ -1052,7 +1052,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd) break; if (lyx_view_->buffer()->lyxvc().inUse() && !lyx_view_->buffer()->isReadonly()) { - lyx_view_->buffer()->lyxvc().checkIn(); + setMessage(from_utf8(lyx_view_->buffer()->lyxvc().checkIn())); reloadBuffer(); } break; @@ -1062,7 +1062,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd) if (!ensureBufferClean(view())) break; if (lyx_view_->buffer()->lyxvc().inUse()) { - lyx_view_->buffer()->lyxvc().checkOut(); + setMessage(from_utf8(lyx_view_->buffer()->lyxvc().checkOut())); reloadBuffer(); } break; diff --git a/src/LyXVC.cpp b/src/LyXVC.cpp index 2b51b4291b..5b510ae0f3 100644 --- a/src/LyXVC.cpp +++ b/src/LyXVC.cpp @@ -142,28 +142,30 @@ void LyXVC::registrer() } -void LyXVC::checkIn() +string LyXVC::checkIn() { LYXERR(Debug::LYXVC, "LyXVC: checkIn"); docstring response; + string log; bool ok = Alert::askForText(response, _("LyX VC: Log Message")); if (ok) { if (response.empty()) response = _("(no log message)"); - vcs->checkIn(to_utf8(response)); + log = vcs->checkIn(to_utf8(response)); } else { LYXERR(Debug::LYXVC, "LyXVC: user cancelled"); } + return log; } -void LyXVC::checkOut() +string LyXVC::checkOut() { //RCS allows checkOut only in ReadOnly mode - if (vcs->toggleReadOnlyEnabled() && !owner_->isReadonly()) return; + if (vcs->toggleReadOnlyEnabled() && !owner_->isReadonly()) return string(); LYXERR(Debug::LYXVC, "LyXVC: checkOut"); - vcs->checkOut(); + return vcs->checkOut(); } diff --git a/src/LyXVC.h b/src/LyXVC.h index 86d7dcc370..79490ec891 100644 --- a/src/LyXVC.h +++ b/src/LyXVC.h @@ -67,13 +67,13 @@ public: /// Register the document as an VC file. void registrer(); - /// Unlock and commit changes. - void checkIn(); + /// Unlock and commit changes. Returns log. + std::string checkIn(); /// Does the current VC supports this operation? bool checkInEnabled(); - /// Lock and prepare to edit document. - void checkOut(); + /// Lock/update and prepare to edit document. Returns log. + std::string checkOut(); /// Does the current VC supports this operation? bool checkOutEnabled(); diff --git a/src/VCBackend.cpp b/src/VCBackend.cpp index 8dcef4332f..3c1185f92c 100644 --- a/src/VCBackend.cpp +++ b/src/VCBackend.cpp @@ -170,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() @@ -182,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"; } @@ -327,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"; } @@ -341,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(); } @@ -456,12 +460,12 @@ void SVN::registrer(string const & msg) } -void SVN::checkIn(string const & msg) +string SVN::checkIn(string const & msg) { FileName tmpf = FileName::tempName("lyxvcout"); if (tmpf.empty()){ LYXERR(Debug::LYXVC, "Could not generate logfile " << tmpf); - return; + return N_("Error: Could not generate logfile."); } doVCCommand("svn commit -m \"" + msg + "\" " @@ -469,13 +473,15 @@ void SVN::checkIn(string const & msg) + " 2> " + tmpf.toFilesystemEncoding(), FileName(owner_->filePath())); - string res = scanLogFile(tmpf); + 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; } @@ -487,7 +493,7 @@ bool SVN::checkInEnabled() // 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 SVN::scanLogFile(FileName const & f, string & status) { ifstream ifs(f.toFilesystemEncoding().c_str()); string line; @@ -495,28 +501,31 @@ string SVN::scanLogFile(FileName const & f) while (ifs) { getline(ifs, line); lyxerr << line << "\n"; - if (prefixIs(line, "C ")) - return line; - if (contains(line, "Commit failed")) + 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() { FileName tmpf = FileName::tempName("lyxvcout"); if (tmpf.empty()) { LYXERR(Debug::LYXVC, "Could not generate logfile " << tmpf); - return; + return N_("Error: Could not generate logfile."); } doVCCommand("svn update " + quoteName(onlyFilename(owner_->absFileName())) + " > " + tmpf.toFilesystemEncoding(), FileName(owner_->filePath())); - string res = scanLogFile(tmpf); + string log; + string res = scanLogFile(tmpf, log); if (!res.empty()) frontend::Alert::error(_("Revision control error."), bformat(_("Error when updating from repository.\n" @@ -524,6 +533,7 @@ void SVN::checkOut() "After pressing OK, LyX will try to reopen resolved document."), from_ascii(res))); tmpf.erase(); + return "SVN: " + log; } diff --git a/src/VCBackend.h b/src/VCBackend.h index 3f7b6ffa64..ab83535ad7 100644 --- a/src/VCBackend.h +++ b/src/VCBackend.h @@ -34,12 +34,12 @@ public: /// register a file for version control virtual void registrer(std::string const & msg) = 0; - /// check in the current revision - virtual void checkIn(std::string const & msg) = 0; + /// check in the current revision, returns log + virtual std::string checkIn(std::string const & msg) = 0; // can be this operation processed in the current RCS? virtual bool checkInEnabled() = 0; - /// check out for editing - virtual void checkOut() = 0; + /// check out for editing, returns log + virtual std::string checkOut() = 0; // can be this operation processed in the current RCS? virtual bool checkOutEnabled() = 0; /// revert current edits @@ -118,11 +118,11 @@ public: virtual void registrer(std::string const & msg); - virtual void checkIn(std::string const & msg); + virtual std::string checkIn(std::string const & msg); virtual bool checkInEnabled(); - virtual void checkOut(); + virtual std::string checkOut(); virtual bool checkOutEnabled(); @@ -157,11 +157,11 @@ public: virtual void registrer(std::string const & msg); - virtual void checkIn(std::string const & msg); + virtual std::string checkIn(std::string const & msg); virtual bool checkInEnabled(); - virtual void checkOut(); + virtual std::string checkOut(); virtual bool checkOutEnabled(); @@ -199,11 +199,11 @@ public: virtual void registrer(std::string const & msg); - virtual void checkIn(std::string const & msg); + virtual std::string checkIn(std::string const & msg); virtual bool checkInEnabled(); - virtual void checkOut(); + virtual std::string checkOut(); virtual bool checkOutEnabled(); @@ -223,8 +223,8 @@ public: protected: virtual void scanMaster(); - /// Check for error messages in svn output. - std::string scanLogFile(support::FileName const & f); + /// Check for messages in svn output. Returns error. + std::string scanLogFile(support::FileName const & f, std::string & status); private: support::FileName file_;