X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FVCBackend.h;h=a9bdb84a3353ade2fd01b21b10d15e19d0ad3b30;hb=f3711d8a651445a61e1a759ac7493a9c5c7800e2;hp=a32a69800e658b643cc2e8fd3f93052b25f79f0f;hpb=138b23fac84930cdbfada0067c61480989041113;p=lyx.git diff --git a/src/VCBackend.h b/src/VCBackend.h index a32a69800e..a9bdb84a33 100644 --- a/src/VCBackend.h +++ b/src/VCBackend.h @@ -4,7 +4,8 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author Lars Gullik Bjønnes + * \author Lars Gullik Bjønnes + * \author Pavel Sanda * * Full author contact details are available in file CREDITS. */ @@ -16,6 +17,8 @@ #include +#include "LyXVC.h" + namespace lyx { @@ -27,21 +30,36 @@ public: /// the status of the managed file enum VCStatus { UNLOCKED, - LOCKED + LOCKED, + NOLOCKING }; virtual ~VCS() {} /// 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 out for editing - virtual void checkOut() = 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, returns log + virtual std::string checkOut() = 0; + // can be this operation processed in the current RCS? + virtual bool checkOutEnabled() = 0; + /// synchronize with repository, returns log + virtual std::string repoUpdate() = 0; + // can be this operation processed in the current RCS? + virtual bool repoUpdateEnabled() = 0; + // toggle locking property of the file + virtual std::string lockingToggle() = 0; + // can be this operation processed in the current RCS? + virtual bool lockingToggleEnabled() = 0; /// revert current edits virtual void revert() = 0; /// FIXME virtual void undoLast() = 0; + // can be this operation processed in the current RCS? + virtual bool undoLastEnabled() = 0; /** * getLog - read the revision log into the given file * @param fname file name to read into @@ -49,29 +67,35 @@ public: virtual void getLog(support::FileName const &) = 0; /// return the current version description virtual std::string const versionString() const = 0; - /// return the current version - std::string const & version() const { - return version_; - } - /// return the user who has locked the file - std::string const & locker() const { return locker_; } /// set the owning buffer void owner(Buffer * b) { owner_ = b; } /// return the owning buffer Buffer * owner() const { return owner_; } /// return the lock status of this file VCStatus status() const { return vcstatus; } + /// do we need special handling for read-only toggling? + /// (also used for check-out operation) + virtual bool toggleReadOnlyEnabled() = 0; + /// Return revision info specified by the argument. + virtual std::string revisionInfo(LyXVC::RevisionInfo const info) = 0; + + virtual bool prepareFileRevision(std::string const & rev, std::string & f) = 0; + + virtual bool prepareFileRevisionEnabled() = 0; + protected: /// parse information from the version file virtual void scanMaster() = 0; + // GUI container for doVCCommandCall + int doVCCommand(std::string const & cmd, support::FileName const & path); /** - * doVCCommand - call out to the version control utility + * doVCCommandCall - call out to the version control utility * @param cmd the command to execute * @param path the path from which to execute * @return exit status */ - static int doVCCommand(std::string const & cmd, support::FileName const & path); + static int doVCCommandCall(std::string const & cmd, support::FileName const & path); /** * The master VC file. For RCS this is *,v or RCS/ *,v. master should @@ -82,14 +106,6 @@ protected: /// The status of the VC controlled file. VCStatus vcstatus; - /** - * The version of the VC file. I am not sure if this can be a - * string or if it must be a float/int. - */ - std::string version_; - - /// The user currently keeping the lock on the VC file. - std::string locker_; /// The buffer using this VC Buffer * owner_; }; @@ -103,28 +119,58 @@ public: RCS(support::FileName const & m); /// return the revision file for the given file, if found - static support::FileName const find_file(support::FileName const & file); + static support::FileName const findFile(support::FileName const & file); static void retrieve(support::FileName const & file); 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 std::string checkOut(); + + virtual bool checkOutEnabled(); + + virtual std::string repoUpdate(); - virtual void checkOut(); + virtual bool repoUpdateEnabled(); + + virtual std::string lockingToggle(); + + virtual bool lockingToggleEnabled(); virtual void revert(); virtual void undoLast(); + virtual bool undoLastEnabled(); + virtual void getLog(support::FileName const &); virtual std::string const versionString() const { return "RCS: " + version_; } + virtual bool toggleReadOnlyEnabled(); + + virtual std::string revisionInfo(LyXVC::RevisionInfo const info); + + virtual bool prepareFileRevision(std::string const & rev, std::string & f); + + virtual bool prepareFileRevisionEnabled(); + protected: virtual void scanMaster(); +private: + /** + * The version of the VC file. I am not sure if this can be a + * string or if it must be a float/int. + */ + std::string version_; + /// The user currently keeping the lock on the VC file (or "Unlocked"). + std::string locker_; }; @@ -136,29 +182,140 @@ public: CVS(support::FileName const & m, support::FileName const & f); /// return the revision file for the given file, if found - static support::FileName const find_file(support::FileName const & file); + static support::FileName const findFile(support::FileName const & file); 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 std::string checkOut(); - virtual void checkOut(); + virtual bool checkOutEnabled(); + + virtual std::string repoUpdate(); + + virtual bool repoUpdateEnabled(); + + virtual std::string lockingToggle(); + + virtual bool lockingToggleEnabled(); virtual void revert(); virtual void undoLast(); + virtual bool undoLastEnabled(); + virtual void getLog(support::FileName const &); virtual std::string const versionString() const { return "CVS: " + version_; } + virtual bool toggleReadOnlyEnabled(); + + virtual std::string revisionInfo(LyXVC::RevisionInfo const info); + + virtual bool prepareFileRevision(std::string const & rev, std::string & f); + + virtual bool prepareFileRevisionEnabled(); + +protected: + virtual void scanMaster(); + +private: + support::FileName file_; + // revision number from scanMaster + std::string version_; + /// The user currently keeping the lock on the VC file. + std::string locker_; +}; + + +/// +class SVN : public VCS { +public: + /// + explicit + SVN(support::FileName const & m, support::FileName const & f); + + /// return the revision file for the given file, if found + static support::FileName const findFile(support::FileName const & file); + + virtual void registrer(std::string const & msg); + + virtual std::string checkIn(std::string const & msg); + + virtual bool checkInEnabled(); + + virtual std::string checkOut(); + + virtual bool checkOutEnabled(); + + virtual std::string repoUpdate(); + + virtual bool repoUpdateEnabled(); + + virtual std::string lockingToggle(); + + virtual bool lockingToggleEnabled(); + + virtual void revert(); + + virtual void undoLast(); + + virtual bool undoLastEnabled(); + + virtual void getLog(support::FileName const &); + + virtual std::string const versionString() const { + return "SVN: " + rev_file_cache_; + } + + virtual bool toggleReadOnlyEnabled(); + + virtual std::string revisionInfo(LyXVC::RevisionInfo const info); + + virtual bool prepareFileRevision(std::string const & rev, std::string & f); + + virtual bool prepareFileRevisionEnabled(); + protected: virtual void scanMaster(); + /// Check for messages in svn output. Returns error. + std::string scanLogFile(support::FileName const & f, std::string & status); + /// checks locking policy and setup locked_mode_ + bool checkLockMode(); + /// is the loaded file locked? + bool isLocked() const; + /// acquire/release write lock for the current file + void fileLock(bool lock, support::FileName const & tmpf, std::string & status); private: support::FileName file_; + /// is the loaded file under locking policy? + bool locked_mode_; + /** + * Real code for obtaining file revision info. Fills all file-related caches + * and returns true if successfull. + * "?" is stored in rev_file_cache_ as a signal if request for obtaining info + * was already unsuccessful. + */ + bool getFileRevisionInfo(); + /// cache for file revision number, "?" if already unsuccessful, isNumber==true + std::string rev_file_cache_; + /// cache for author of last commit + std::string rev_author_cache_; + /// cache for date of last commit + std::string rev_date_cache_; + /// cache for time of last commit + std::string rev_time_cache_; + /// fills rev_tree_cache_, returns true if successfull. + bool getTreeRevisionInfo(); + /// cache for tree revision number, "?" if already unsuccessful + std::string rev_tree_cache_; }; } // namespace lyx