X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FVCBackend.cpp;h=5bbc1746b417ae0dd2720dbb4c575a4d8076e637;hb=b8550d11e836e857967a31250e6ca248b2d43f82;hp=d2c3c1a6f2f3b2987276997293811a188ffef7e6;hpb=773d4a8253bf69491489c5e7ccda0649b3bc35b9;p=lyx.git diff --git a/src/VCBackend.cpp b/src/VCBackend.cpp index d2c3c1a6f2..5bbc1746b4 100644 --- a/src/VCBackend.cpp +++ b/src/VCBackend.cpp @@ -4,6 +4,7 @@ * Licence details can be found in the file COPYING. * * \author Lars Gullik Bjønnes + * \author Pavel Sanda * * Full author contact details are available in file CREDITS. */ @@ -18,6 +19,7 @@ #include "frontends/alert.h" #include "frontends/Application.h" +#include "support/convert.h" #include "support/debug.h" #include "support/filetools.h" #include "support/gettext.h" @@ -240,7 +242,7 @@ bool RCS::lockingToggleEnabled() void RCS::revert() { - doVCCommand("co -f -u" + version() + " " + doVCCommand("co -f -u" + version_ + " " + quoteName(onlyFilename(owner_->absFileName())), FileName(owner_->filePath())); // We ignore changes and just reload! @@ -251,7 +253,7 @@ void RCS::revert() void RCS::undoLast() { LYXERR(Debug::LYXVC, "LyXVC: undoLast"); - doVCCommand("rcs -o" + version() + " " + doVCCommand("rcs -o" + version_ + " " + quoteName(onlyFilename(owner_->absFileName())), FileName(owner_->filePath())); } @@ -288,6 +290,55 @@ string RCS::revisionInfo(LyXVC::RevisionInfo const info) } +bool RCS::prepareFileRevision(string const &revis, string & f) +{ + string rev = revis; + + if (isStrInt(rev)) { + int back = convert(rev); + if (back > 0) + return false; + 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); + } + } + + FileName tmpf = FileName::tempName("lyxvcrev"); + if (tmpf.empty()) { + LYXERR(Debug::LYXVC, "Could not generate logfile " << tmpf); + return N_("Error: Could not generate logfile."); + } + + doVCCommand("co -p" + rev + " " + + quoteName(onlyFilename(owner_->absFileName())) + + " > " + quoteName(tmpf.toFilesystemEncoding()), + FileName(owner_->filePath())); + if (tmpf.isFileEmpty()) + return false; + + f = tmpf.absFilename(); + return true; +} + + +bool RCS::prepareFileRevisionEnabled() +{ + return true; +} + + ///////////////////////////////////////////////////////////////////// // // CVS @@ -361,7 +412,7 @@ void CVS::scanMaster() locker_ = "Unlocked"; vcstatus = UNLOCKED; } else { - // Here we should also to some more checking + // Here we should also do some more checking // to see if there are conflicts or not. locker_ = "Locked"; vcstatus = LOCKED; @@ -483,12 +534,26 @@ bool CVS::toggleReadOnlyEnabled() } -string CVS::revisionInfo(LyXVC::RevisionInfo const) +string CVS::revisionInfo(LyXVC::RevisionInfo const info) { + if (info == LyXVC::File) + return version_; return string(); } +bool CVS::prepareFileRevision(string const &, string &) +{ + return false; +} + + +bool CVS::prepareFileRevisionEnabled() +{ + return false; +} + + ///////////////////////////////////////////////////////////////////// // // SVN @@ -533,16 +598,13 @@ FileName const SVN::findFile(FileName const & file) void SVN::scanMaster() { - locker_.clear(); // vcstatus code is somewhat superflous, until we want // to implement read-only toggle for svn. vcstatus = NOLOCKING; if (checkLockMode()) { if (isLocked()) { - locker_ = "Locked"; vcstatus = LOCKED; } else { - locker_ = "Unlocked"; vcstatus = UNLOCKED; } } @@ -681,13 +743,13 @@ void SVN::fileLock(bool lock, FileName const & tmpf, string &status) if (!isLocked() && lock) frontend::Alert::error(_("Revision control error."), - _("Error when acquiring write lock.\n" - "Most probably another user is editing\n" + _("Error while acquiring write lock.\n" + "Another user is most probably editing\n" "the current document now!\n" "Also check the access to the repository.")); if (isLocked() && !lock) frontend::Alert::error(_("Revision control error."), - _("Error when releasing write lock.\n" + _("Error while releasing write lock.\n" "Check the access to the repository.")); } @@ -705,7 +767,7 @@ string SVN::checkOut() FileName(owner_->filePath())); string log; - string res = scanLogFile(tmpf, log); + string const res = scanLogFile(tmpf, log); if (!res.empty()) frontend::Alert::error(_("Revision control error."), bformat(_("Error when updating from repository.\n" @@ -738,8 +800,8 @@ string SVN::repoUpdate() } doVCCommand("svn diff " + quoteName(owner_->filePath()) - + " > " + quoteName(tmpf.toFilesystemEncoding()), - FileName(owner_->filePath())); + + " > " + quoteName(tmpf.toFilesystemEncoding()), + FileName(owner_->filePath())); docstring res = tmpf.fileContents("UTF-8"); if (!res.empty()) { LYXERR(Debug::LYXVC, "Diff detected:\n" << res); @@ -860,41 +922,54 @@ bool SVN::undoLastEnabled() string SVN::revisionInfo(LyXVC::RevisionInfo const info) { + if (info == LyXVC::Tree) { + if (rev_tree_cache_.empty()) + if (!getTreeRevisionInfo()) + rev_tree_cache_ = "?"; + if (rev_tree_cache_ == "?") + return string(); + + return rev_tree_cache_; + } + + // fill the rest of the attributes for a single file + if (rev_file_cache_.empty()) + if (!getFileRevisionInfo()) + rev_file_cache_ = "?"; + switch (info) { case LyXVC::File: - if (rev_file_cache_.empty()) - rev_file_cache_ = getFileRevisionInfo(); - if (rev_file_cache_.empty()) - rev_file_cache_ = "?"; if (rev_file_cache_ == "?") return string(); - return rev_file_cache_; + case LyXVC::Author: + return rev_author_cache_; + case LyXVC::Date: + return rev_date_cache_; + case LyXVC::Time: + return rev_time_cache_; + default: ; - case LyXVC::Tree: - if (rev_tree_cache_.empty()) - rev_tree_cache_ = getTreeRevisionInfo(); - if (rev_tree_cache_.empty()) - rev_tree_cache_ = "?"; - if (rev_tree_cache_ == "?") - return string(); - - return rev_tree_cache_; } + return string(); } -std::string SVN::getFileRevisionInfo() +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."); + } doVCCommand("svn info --xml " + quoteName(onlyFilename(owner_->absFileName())) + " > " + quoteName(tmpf.toFilesystemEncoding()), FileName(owner_->filePath())); if (tmpf.empty()) - return string(); + return false; ifstream ifs(tmpf.toFilesystemEncoding().c_str()); string line; @@ -911,24 +986,42 @@ std::string SVN::getFileRevisionInfo() string l1 = subst(line, "revision=\"", ""); string l2 = trim(subst(l1, "\">", "")); if (isStrInt(l2)) - rev = l2; + rev_file_cache_ = rev = l2; + } + if (c && prefixIs(line, "") && suffixIs(line, "")) { + string l1 = subst(line, "", ""); + string l2 = subst(l1, "", ""); + rev_author_cache_ = l2; + } + if (c && prefixIs(line, "") && suffixIs(line, "")) { + string l1 = subst(line, "", ""); + string l2 = subst(l1, "", ""); + l2 = split(l2, l1, 'T'); + rev_date_cache_ = l1; + l2 = split(l2, l1, '.'); + rev_time_cache_ = l1; } } + ifs.close(); tmpf.erase(); - return rev; + return !rev.empty(); } -std::string SVN::getTreeRevisionInfo() +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."); + } doVCCommand("svnversion -n . > " + quoteName(tmpf.toFilesystemEncoding()), FileName(owner_->filePath())); if (tmpf.empty()) - return string(); + return false; // only first line in case something bad happens. ifstream ifs(tmpf.toFilesystemEncoding().c_str()); @@ -936,7 +1029,9 @@ std::string SVN::getTreeRevisionInfo() getline(ifs, line); ifs.close(); tmpf.erase(); - return line; + + rev_tree_cache_ = line; + return !line.empty(); } @@ -948,6 +1043,49 @@ void SVN::getLog(FileName const & tmpf) } +bool SVN::prepareFileRevision(string const & revis, string & f) +{ + if (!isStrInt(revis)) + return false; + + int rev = convert(revis); + if (rev <= 0) + if (!getFileRevisionInfo()) + return false; + if (rev == 0) + rev = convert(rev_file_cache_); + // go back for minus rev + else if (rev < 0) { + rev = rev + convert(rev_file_cache_); + if (rev < 1) + return false; + } + + FileName tmpf = FileName::tempName("lyxvcrev"); + if (tmpf.empty()) { + LYXERR(Debug::LYXVC, "Could not generate logfile " << tmpf); + return N_("Error: Could not generate logfile."); + } + + doVCCommand("svn cat -r " + convert(rev) + " " + + quoteName(onlyFilename(owner_->absFileName())) + + " > " + quoteName(tmpf.toFilesystemEncoding()), + FileName(owner_->filePath())); + if (tmpf.isFileEmpty()) + return false; + + f = tmpf.absFilename(); + return true; +} + + +bool SVN::prepareFileRevisionEnabled() +{ + return true; +} + + + bool SVN::toggleReadOnlyEnabled() { return false;