X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FVCBackend.cpp;h=28ed40c5e23568074a02e9b26d7e76dc77c248fe;hb=55a3dd7b346d29a52ba305a4558e9e380ef50f47;hp=efb223c8095215e7b63a6f0ae3e3a78c1c8b53aa;hpb=69dd56d6c4d85432c58cbafd5a6346df5c3d5c75;p=lyx.git diff --git a/src/VCBackend.cpp b/src/VCBackend.cpp index efb223c809..28ed40c5e2 100644 --- a/src/VCBackend.cpp +++ b/src/VCBackend.cpp @@ -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(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(cur) + back; + if (want <= 0) + return false; + + rev = base + "." + convert(want); + } + } + + revis = rev; + return true; +} + + ///////////////////////////////////////////////////////////////////// // // RCS @@ -195,9 +229,30 @@ bool RCS::checkInEnabled() return owner_ && !owner_->isReadonly(); } + bool RCS::isCheckInWithConfirmation() { - //FIXME diff + // FIXME one day common getDiff for all backends + // docstring diff; + // if (getDiff(file, diff) && diff.empty()) + // return false; + + FileName tmpf = FileName::tempName("lyxvcout"); + if (tmpf.empty()) { + LYXERR(Debug::LYXVC, "Could not generate logfile " << tmpf); + return true; + } + + doVCCommandCall("rcsdiff " + quoteName(owner_->absFileName()) + + " > " + quoteName(tmpf.toFilesystemEncoding()), + FileName(owner_->filePath())); + + docstring diff = tmpf.fileContents("UTF-8"); + tmpf.erase(); + + if (diff.empty()) + return false; + return true; } @@ -246,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; } @@ -295,47 +352,83 @@ bool RCS::toggleReadOnlyEnabled() return false; } + string RCS::revisionInfo(LyXVC::RevisionInfo const info) { if (info == LyXVC::File) return version_; + // fill the rest of the attributes for a single file + if (rev_date_cache_.empty()) + if (!getRevisionInfo()) + return string(); + + switch (info) { + case LyXVC::Author: + return rev_author_cache_; + case LyXVC::Date: + return rev_date_cache_; + case LyXVC::Time: + return rev_time_cache_; + default: ; + } + return string(); } -bool RCS::prepareFileRevision(string const &revis, string & f) +bool RCS::getRevisionInfo() { - string rev = revis; + FileName tmpf = FileName::tempName("lyxvcout"); + if (tmpf.empty()) { + LYXERR(Debug::LYXVC, "Could not generate logfile " << tmpf); + return false; + } + doVCCommand("rlog -r " + quoteName(onlyFileName(owner_->absFileName())) + + " > " + quoteName(tmpf.toFilesystemEncoding()), + FileName(owner_->filePath())); - if (isStrInt(rev)) { - int back = convert(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(cur) + back; - if (want <= 0) - return false; + if (tmpf.empty()) + return false; - rev = base + "." + convert(want); + ifstream ifs(tmpf.toFilesystemEncoding().c_str()); + string line; + + // we reached to the entry, i.e. after initial log message + bool entry=false; + // line with critical info, e.g: + //"date: 2011/07/02 11:02:54; author: sanda; state: Exp; lines: +17 -2" + string result; + + while (ifs) { + getline(ifs, line); + LYXERR(Debug::LYXVC, line); + if (entry && prefixIs(line, "date:")) { + result = line; + break; } + if (prefixIs(line, "revision")) + entry = true; } + if (result.empty()) + return false; + + rev_date_cache_ = token(result, ' ', 1); + rev_time_cache_ = rtrim(token(result, ' ', 2), ";"); + rev_author_cache_ = trim(token(token(result, ';', 1), ':', 1)); + + return !rev_author_cache_.empty(); +} + +bool RCS::prepareFileRevision(string const &revis, string & f) +{ + 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 N_("Error: Could not generate logfile."); + return false; } doVCCommand("co -p" + rev + " " @@ -746,8 +839,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 ) { @@ -810,7 +903,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. @@ -818,7 +911,7 @@ void CVS::revert() switch (status) { case UpToDate: if (vcstatus != NOLOCKING) - unedit(); + return 0 == unedit(); break; case NeedsMerge: case NeedsCheckout: @@ -835,7 +928,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); @@ -843,9 +936,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; } @@ -898,15 +992,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; } @@ -972,7 +1083,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..."); @@ -1052,7 +1163,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; } @@ -1256,15 +1384,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; } @@ -1331,7 +1461,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())) @@ -1384,7 +1514,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()), @@ -1435,7 +1565,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 + " "