X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLyXVC.cpp;h=fb6e8224266e7e6a81b9019b897b219b079e727e;hb=3d4076b598deb18660e50ec9c327efc3b15f15d0;hp=1306a1d87cf6f2c21ac1b90c75d6f924e05e48ce;hpb=b2137a65ded0afffb396118ab2404598101e9d33;p=lyx.git diff --git a/src/LyXVC.cpp b/src/LyXVC.cpp index 1306a1d87c..fb6e822426 100644 --- a/src/LyXVC.cpp +++ b/src/LyXVC.cpp @@ -45,25 +45,41 @@ LyXVC::~LyXVC() {} +bool LyXVC::fileInVC(FileName const & fn) +{ + if (!RCS::findFile(fn).empty()) + return true; + if (!CVS::findFile(fn).empty()) + return true; + if (!SVN::findFile(fn).empty()) + return true; + if (!GIT::findFile(fn).empty()) + return true; + return false; +} + + bool LyXVC::file_found_hook(FileName const & fn) { FileName found_file; // Check if file is under RCS if (!(found_file = RCS::findFile(fn)).empty()) { - vcs.reset(new RCS(found_file)); - vcs->owner(owner_); + vcs.reset(new RCS(found_file, owner_)); return true; } // Check if file is under CVS if (!(found_file = CVS::findFile(fn)).empty()) { - vcs.reset(new CVS(found_file, fn)); - vcs->owner(owner_); + vcs.reset(new CVS(found_file, owner_)); return true; } // Check if file is under SVN if (!(found_file = SVN::findFile(fn)).empty()) { - vcs.reset(new SVN(found_file, fn)); - vcs->owner(owner_); + vcs.reset(new SVN(found_file, owner_)); + return true; + } + // Check if file is under GIT + if (!(found_file = GIT::findFile(fn)).empty()) { + vcs.reset(new GIT(found_file, owner_)); return true; } @@ -78,9 +94,11 @@ bool LyXVC::file_not_found_hook(FileName const & fn) // Check if file is under RCS. // This happens if we are trying to load non existent // file on disk, but existent in ,v version. - // Seems there is no reasonable scenario for adding implementation - // of retrieve for cvs or svn. - if (!RCS::findFile(fn).empty()) { + bool foundRCS = !RCS::findFile(fn).empty(); + bool foundCVS = foundRCS ? false : !CVS::findFile(fn).empty(); + bool foundSVN = (foundRCS || foundCVS) ? false : !SVN::findFile(fn).empty(); + bool foundGIT = (foundRCS || foundCVS || foundSVN) ? false : !GIT::findFile(fn).empty(); + if (foundRCS || foundCVS || foundSVN || foundGIT) { docstring const file = makeDisplayPath(fn.absFileName(), 20); docstring const text = bformat(_("Do you want to retrieve the document" @@ -89,11 +107,19 @@ bool LyXVC::file_not_found_hook(FileName const & fn) text, 0, 1, _("&Retrieve"), _("&Cancel")); if (ret == 0) { - // How can we know _how_ to do the checkout? - // With the current VC support it has to be an RCS - // file since CVS and SVN do not have special ,v files. - RCS::retrieve(fn); - return true; + // Since the retrieve commands are implemented using + // more general update commands we need to ensure that + // we do not change an existing file by accident. + if (fn.exists()) + return false; + if (foundRCS) + return RCS::retrieve(fn); + else if (foundCVS) + return CVS::retrieve(fn); + else if (foundSVN) + return SVN::retrieve(fn); + else + return GIT::retrieve(fn); } } return false; @@ -123,24 +149,28 @@ bool LyXVC::registrer() //check in the root directory of the document FileName const cvs_entries(onlyPath(filename.absFileName()) + "/CVS/Entries"); FileName const svn_entries(onlyPath(filename.absFileName()) + "/.svn/entries"); + FileName const git_index(onlyPath(filename.absFileName()) + "/.git/index"); + + if (git_index.isReadableFile()) { + LYXERR(Debug::LYXVC, "LyXVC: registering " + << to_utf8(filename.displayName()) << " with GIT"); + vcs.reset(new GIT(git_index, owner_)); - if (svn_entries.isReadableFile()) { + } else if (svn_entries.isReadableFile()) { LYXERR(Debug::LYXVC, "LyXVC: registering " << to_utf8(filename.displayName()) << " with SVN"); - vcs.reset(new SVN(cvs_entries, filename)); + vcs.reset(new SVN(svn_entries, owner_)); } else if (cvs_entries.isReadableFile()) { LYXERR(Debug::LYXVC, "LyXVC: registering " << to_utf8(filename.displayName()) << " with CVS"); - vcs.reset(new CVS(cvs_entries, filename)); + vcs.reset(new CVS(cvs_entries, owner_)); } else { LYXERR(Debug::LYXVC, "LyXVC: registering " << to_utf8(filename.displayName()) << " with RCS"); - vcs.reset(new RCS(FileName())); + vcs.reset(new RCS(FileName(), owner_)); } - - vcs->owner(owner_); } LYXERR(Debug::LYXVC, "LyXVC: registrer"); @@ -149,6 +179,7 @@ bool LyXVC::registrer() _("(no initial description)")); if (!ok) { LYXERR(Debug::LYXVC, "LyXVC: user cancelled"); + vcs.reset(0); return false; } if (response.empty()) @@ -158,30 +189,71 @@ bool LyXVC::registrer() } -string LyXVC::checkIn() +string LyXVC::rename(FileName const & fn) +{ + LYXERR(Debug::LYXVC, "LyXVC: rename"); + if (!vcs || fileInVC(fn)) + return string(); + docstring response; + bool ok = Alert::askForText(response, _("LyX VC: Log message"), + _("(no log message)")); + if (!ok) { + LYXERR(Debug::LYXVC, "LyXVC: user cancelled"); + return string(); + } + if (response.empty()) + response = _("(no log message)"); + string ret = vcs->rename(fn, to_utf8(response)); + return ret; +} + + +string LyXVC::copy(FileName const & fn) +{ + LYXERR(Debug::LYXVC, "LyXVC: copy"); + if (!vcs || fileInVC(fn)) + return string(); + docstring response; + bool ok = Alert::askForText(response, _("LyX VC: Log message"), + _("(no log message)")); + if (!ok) { + LYXERR(Debug::LYXVC, "LyXVC: user cancelled"); + return string(); + } + if (response.empty()) + response = _("(no log message)"); + string ret = vcs->copy(fn, to_utf8(response)); + return ret; +} + + +LyXVC::CommandResult LyXVC::checkIn(string & log) { LYXERR(Debug::LYXVC, "LyXVC: checkIn"); + if (!vcs) + return ErrorBefore; docstring empty(_("(no log message)")); docstring response; - string log; - bool ok = Alert::askForText(response, _("LyX VC: Log Message")); + bool ok = true; + if (vcs->isCheckInWithConfirmation()) + ok = Alert::askForText(response, _("LyX VC: Log Message")); if (ok) { if (response.empty()) response = empty; - log = vcs->checkIn(to_utf8(response)); - - // Reserve empty string for cancel button - if (log.empty()) - log = to_utf8(empty); + //shell collisions + response = subst(response, from_ascii("\""), from_ascii("\\\"")); + return vcs->checkIn(to_utf8(response), log); } else { LYXERR(Debug::LYXVC, "LyXVC: user cancelled"); + return Cancelled; } - return log; } string LyXVC::checkOut() { + if (!vcs) + return string(); //RCS allows checkOut only in ReadOnly mode if (vcs->toggleReadOnlyEnabled() && !owner_->isReadonly()) return string(); @@ -194,6 +266,8 @@ string LyXVC::checkOut() string LyXVC::repoUpdate() { LYXERR(Debug::LYXVC, "LyXVC: repoUpdate"); + if (!vcs) + return string(); return vcs->repoUpdate(); } @@ -201,49 +275,61 @@ string LyXVC::repoUpdate() string LyXVC::lockingToggle() { LYXERR(Debug::LYXVC, "LyXVC: toggle locking property"); + if (!vcs) + return string(); return vcs->lockingToggle(); } -void LyXVC::revert() +bool LyXVC::revert() { LYXERR(Debug::LYXVC, "LyXVC: revert"); + if (!vcs) + return false; docstring const file = owner_->fileName().displayName(20); docstring text = bformat(_("Reverting to the stored version of the " "document %1$s will lose all current changes.\n\n" "Do you want to revert to the older version?"), file); - int const ret = Alert::prompt(_("Revert to stored version of document?"), - text, 0, 1, _("&Revert"), _("&Cancel")); + int ret = 0; + if (vcs->isRevertWithConfirmation()) + ret = Alert::prompt(_("Revert to stored version of document?"), + text, 0, 1, _("&Revert"), _("&Cancel")); - if (ret == 0) - vcs->revert(); + return ret == 0 && vcs->revert(); } void LyXVC::undoLast() { + if (!vcs) + return; vcs->undoLast(); } -void LyXVC::toggleReadOnly() +string LyXVC::toggleReadOnly() { + if (!vcs) + return string(); if (!vcs->toggleReadOnlyEnabled()) - return; + return string(); switch (vcs->status()) { case VCS::UNLOCKED: LYXERR(Debug::LYXVC, "LyXVC: toggle to locked"); - checkOut(); - break; - case VCS::LOCKED: + return checkOut(); + case VCS::LOCKED: { LYXERR(Debug::LYXVC, "LyXVC: toggle to unlocked"); - checkIn(); - break; + string log; + if (checkIn(log) != VCSuccess) + return string(); + return log; + } case VCS::NOLOCKING: break; } + return string(); } @@ -257,12 +343,16 @@ bool LyXVC::inUse() const string const LyXVC::versionString() const { + if (!vcs) + return string(); return vcs->versionString(); } bool LyXVC::locking() const { + if (!vcs) + return false; return vcs->status() != VCS::NOLOCKING; } @@ -292,6 +382,22 @@ string LyXVC::revisionInfo(RevisionInfo const info) const } +bool LyXVC::renameEnabled() const +{ + if (!inUse()) + return false; + return vcs->renameEnabled(); +} + + +bool LyXVC::copyEnabled() const +{ + if (!inUse()) + return false; + return vcs->copyEnabled(); +} + + bool LyXVC::checkOutEnabled() const { return vcs && vcs->checkOutEnabled(); @@ -304,6 +410,12 @@ bool LyXVC::checkInEnabled() const } +bool LyXVC::isCheckInWithConfirmation() const +{ + return vcs && vcs->isCheckInWithConfirmation(); +} + + bool LyXVC::lockingToggleEnabled() const { return vcs && vcs->lockingToggleEnabled();