1999-09-27 18:44:28 +00:00
|
|
|
// -*- C++ -*-
|
2003-08-23 00:17:00 +00:00
|
|
|
/**
|
2007-04-26 04:41:58 +00:00
|
|
|
* \file LyXVC.h
|
2003-08-23 00:17:00 +00:00
|
|
|
* This file is part of LyX, the document processor.
|
|
|
|
* Licence details can be found in the file COPYING.
|
|
|
|
*
|
2008-11-14 15:58:50 +00:00
|
|
|
* \author Lars Gullik Bjønnes
|
2003-08-23 00:17:00 +00:00
|
|
|
*
|
|
|
|
* Full author contact details are available in file CREDITS.
|
|
|
|
*/
|
1999-09-27 18:44:28 +00:00
|
|
|
|
1999-11-09 23:52:04 +00:00
|
|
|
#ifndef LYX_VC_H
|
|
|
|
#define LYX_VC_H
|
1999-09-27 18:44:28 +00:00
|
|
|
|
2016-06-02 22:49:36 +00:00
|
|
|
#include "support/unique_ptr.h"
|
2003-11-03 17:47:28 +00:00
|
|
|
|
2003-10-06 15:43:21 +00:00
|
|
|
#include <string>
|
|
|
|
|
1999-09-27 18:44:28 +00:00
|
|
|
|
2006-10-21 00:16:43 +00:00
|
|
|
namespace lyx {
|
|
|
|
|
2006-12-02 16:07:15 +00:00
|
|
|
namespace support { class FileName; }
|
2006-10-21 00:16:43 +00:00
|
|
|
|
1999-11-09 23:52:04 +00:00
|
|
|
class VCS;
|
1999-09-27 18:44:28 +00:00
|
|
|
class Buffer;
|
|
|
|
|
1999-11-09 23:52:04 +00:00
|
|
|
/** Version Control for LyX.
|
2010-11-21 18:07:04 +00:00
|
|
|
This is the class giving the version control features to LyX. It is
|
2008-07-22 08:59:47 +00:00
|
|
|
intended to support different kinds of version control.
|
1999-11-09 23:52:04 +00:00
|
|
|
The support in LyX is based loosely upon the version control in GNU Emacs,
|
2008-07-22 08:59:47 +00:00
|
|
|
but is not as extensive as that one. See Extended Manual for a simple
|
1999-11-09 23:52:04 +00:00
|
|
|
tutorial and manual for the use of the version control system in LyX.
|
2002-03-21 17:27:08 +00:00
|
|
|
|
1999-11-09 23:52:04 +00:00
|
|
|
LyXVC use this algorithm when it searches for VC files:
|
2008-07-22 08:59:47 +00:00
|
|
|
for RCS it searches for <filename>,v and RCS/<filename>,v similarly
|
|
|
|
CVS/Entries for cvs and .svn/entries. By doing this there doesn't need to be any
|
1999-11-09 23:52:04 +00:00
|
|
|
special support for VC in the lyx format, and this is especially good
|
|
|
|
when the lyx format will be a subset of LaTeX.
|
|
|
|
*/
|
1999-09-27 18:44:28 +00:00
|
|
|
class LyXVC {
|
|
|
|
public:
|
2013-02-04 20:40:28 +00:00
|
|
|
/// Return status of a command
|
|
|
|
enum CommandResult {
|
|
|
|
Cancelled, ///< command was cancelled
|
|
|
|
ErrorBefore, ///< error before executing command
|
|
|
|
ErrorCommand, ///< error while executing command
|
2013-03-18 19:42:20 +00:00
|
|
|
VCSuccess ///< command was executed successfully
|
2013-02-04 20:40:28 +00:00
|
|
|
};
|
1999-09-27 18:44:28 +00:00
|
|
|
///
|
|
|
|
LyXVC();
|
2016-09-06 09:17:10 +00:00
|
|
|
/// Name of the underlying VCS
|
|
|
|
std::string vcname() const;
|
2012-11-15 21:01:19 +00:00
|
|
|
/// Is \p fn under version control?
|
|
|
|
static bool fileInVC(support::FileName const & fn);
|
1999-09-27 18:44:28 +00:00
|
|
|
/** Not a good name perhaps. This function should be called whenever
|
2008-07-21 01:58:10 +00:00
|
|
|
LyX loads a file. This function then checks for a master VC file (for
|
2008-07-22 08:59:47 +00:00
|
|
|
RCS this is *,v or RCS/ *,v ; for CVS this is CVS/Entries and .svn/entries
|
|
|
|
for SVN) if this file or entry is found, the loaded file is assumed to be
|
2012-11-13 20:53:13 +00:00
|
|
|
under control by VC, and the appropiate actions is taken.
|
2008-07-21 01:58:10 +00:00
|
|
|
Returns true if the file is under control by a VCS.
|
1999-09-27 18:44:28 +00:00
|
|
|
*/
|
2006-12-02 16:07:15 +00:00
|
|
|
bool file_found_hook(support::FileName const & fn);
|
2002-03-21 17:27:08 +00:00
|
|
|
|
2012-11-15 21:01:19 +00:00
|
|
|
/** Is \p fn under version control?
|
2012-11-13 20:53:13 +00:00
|
|
|
This function should be run when a file is requested for loading,
|
1999-09-27 18:44:28 +00:00
|
|
|
but it does not exist. This function will then check for a VC master
|
|
|
|
file with the same name (see above function). If this exists the
|
|
|
|
user should be asked if he/her wants to checkout a version for
|
|
|
|
viewing/editing. Returns true if the file is under control by a VCS
|
|
|
|
and the user wants to view/edit it.
|
|
|
|
*/
|
2006-12-02 16:07:15 +00:00
|
|
|
static bool file_not_found_hook(support::FileName const & fn);
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
|
|
///
|
2007-10-20 17:35:27 +00:00
|
|
|
void setBuffer(Buffer *);
|
1999-09-27 18:44:28 +00:00
|
|
|
|
2012-11-13 20:53:13 +00:00
|
|
|
/// Register the document as a VC file.
|
2009-01-08 00:14:55 +00:00
|
|
|
bool registrer();
|
1999-09-27 18:44:28 +00:00
|
|
|
|
2010-01-07 17:15:26 +00:00
|
|
|
|
2010-01-07 17:27:58 +00:00
|
|
|
// std::string used as a return value in functions below are
|
2010-01-07 17:15:26 +00:00
|
|
|
// workaround to defer messages to be displayed in UI. If message()
|
|
|
|
// is used directly, message string is immediately overwritten
|
|
|
|
// by the next multiple messages on the top of the processed dispatch
|
|
|
|
// machinery.
|
|
|
|
|
2013-02-05 20:31:58 +00:00
|
|
|
///
|
|
|
|
std::string rename(support::FileName const &);
|
|
|
|
/// Does the current VC support this operation?
|
|
|
|
bool renameEnabled() const;
|
|
|
|
///
|
|
|
|
std::string copy(support::FileName const &);
|
|
|
|
/// Does the current VC support this operation?
|
|
|
|
bool copyEnabled() const;
|
|
|
|
|
2013-02-04 20:40:28 +00:00
|
|
|
/// Unlock and commit changes.
|
|
|
|
/// \p log is non-empty on success and may be empty on failure.
|
|
|
|
CommandResult checkIn(std::string & log);
|
2013-02-03 16:03:08 +00:00
|
|
|
/// Does the current VC support this operation?
|
2009-12-31 14:40:02 +00:00
|
|
|
bool checkInEnabled() const;
|
2013-02-05 20:31:58 +00:00
|
|
|
/// Should a log message be provided for next checkin?
|
|
|
|
bool isCheckInWithConfirmation() const;
|
1999-09-27 18:44:28 +00:00
|
|
|
|
2008-07-29 13:14:51 +00:00
|
|
|
/// Lock/update and prepare to edit document. Returns log.
|
|
|
|
std::string checkOut();
|
2013-02-03 16:03:08 +00:00
|
|
|
/// Does the current VC support this operation?
|
2009-12-31 14:40:02 +00:00
|
|
|
bool checkOutEnabled() const;
|
1999-09-27 18:44:28 +00:00
|
|
|
|
2009-10-06 23:20:52 +00:00
|
|
|
/// Synchronize the whole archive with repository
|
2009-10-14 19:18:06 +00:00
|
|
|
std::string repoUpdate();
|
2013-02-03 16:03:08 +00:00
|
|
|
/// Does the current VC support this operation?
|
2009-12-31 14:40:02 +00:00
|
|
|
bool repoUpdateEnabled() const;
|
2009-10-06 23:20:52 +00:00
|
|
|
|
2009-06-25 14:48:11 +00:00
|
|
|
/**
|
|
|
|
* Toggle locking property of the edited file,
|
|
|
|
* i.e. whether the file uses locking mechanism.
|
|
|
|
*/
|
|
|
|
std::string lockingToggle();
|
2009-12-31 14:40:02 +00:00
|
|
|
/// Does the current VC support this operation?
|
|
|
|
bool lockingToggleEnabled() const;
|
2009-06-25 14:48:11 +00:00
|
|
|
|
1999-09-27 18:44:28 +00:00
|
|
|
/// Revert to last version
|
2010-11-06 11:54:08 +00:00
|
|
|
bool revert();
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
|
|
/// Undo last check-in.
|
|
|
|
void undoLast();
|
2013-02-03 16:03:08 +00:00
|
|
|
/// Does the current VC support this operation?
|
2009-12-31 14:40:02 +00:00
|
|
|
bool undoLastEnabled() const;
|
2010-02-12 12:16:34 +00:00
|
|
|
/**
|
|
|
|
* Prepare revision rev of the file into newly created temporary file
|
|
|
|
* and save the filename into parameter f.
|
|
|
|
* Parameter rev can be either revision number or negative number
|
|
|
|
* which is interpreted as how many revision back from the current
|
|
|
|
* one do we want. rev=0 is reserved for the last (committed) revision.
|
2010-02-15 07:10:59 +00:00
|
|
|
* We need rev to be string, since in various VCS revision is not integer.
|
2010-09-07 12:12:31 +00:00
|
|
|
* If RCS addressed by a single number, it is automatically used
|
|
|
|
* as the last number in the whole revision specification (it applies
|
|
|
|
* for retrieving normal revisions (rev>0) or backtracking (rev<0).
|
2010-02-12 12:16:34 +00:00
|
|
|
*/
|
2010-02-15 07:10:59 +00:00
|
|
|
bool prepareFileRevision(std::string const & rev, std::string & f);
|
2013-02-03 16:03:08 +00:00
|
|
|
/// Does the current VC support this operation?
|
2010-02-12 12:16:34 +00:00
|
|
|
bool prepareFileRevisionEnabled();
|
1999-09-27 18:44:28 +00:00
|
|
|
|
2001-02-12 14:09:09 +00:00
|
|
|
/**
|
|
|
|
* Generate a log file and return the filename.
|
2007-11-28 09:01:49 +00:00
|
|
|
* It is the caller's responsibility to remove the
|
2001-02-12 14:09:09 +00:00
|
|
|
* file after use.
|
|
|
|
*/
|
2003-10-06 15:43:21 +00:00
|
|
|
const std::string getLogFile() const;
|
1999-09-27 18:44:28 +00:00
|
|
|
|
2010-01-02 22:58:59 +00:00
|
|
|
/**
|
|
|
|
* We do not support this generally. In RCS/SVN file read-only flag
|
2010-01-02 23:07:21 +00:00
|
|
|
* is often connected with locking state and one has to be careful to
|
2010-01-02 22:58:59 +00:00
|
|
|
* keep things in synchro once we would allow user to toggle
|
|
|
|
* read-only flags.
|
|
|
|
*/
|
2013-02-03 18:21:54 +00:00
|
|
|
std::string toggleReadOnly();
|
2002-03-21 17:27:08 +00:00
|
|
|
|
2008-07-22 08:59:47 +00:00
|
|
|
/// Is the document under administration by VCS?
|
2013-02-05 20:31:58 +00:00
|
|
|
/// returns false for unregistered documents in a path managed by VCS
|
2009-12-31 14:40:02 +00:00
|
|
|
bool inUse() const;
|
1999-09-27 18:44:28 +00:00
|
|
|
|
2010-02-12 06:30:41 +00:00
|
|
|
/// Returns the RCS + version number for messages
|
2003-10-06 15:43:21 +00:00
|
|
|
std::string const versionString() const;
|
1999-09-27 18:44:28 +00:00
|
|
|
|
2010-01-07 17:06:51 +00:00
|
|
|
/**
|
2010-02-12 07:21:11 +00:00
|
|
|
* Returns whether we use locking for the given file.
|
2010-01-07 17:06:51 +00:00
|
|
|
*/
|
2010-02-12 07:21:11 +00:00
|
|
|
bool locking() const;
|
1999-10-25 14:18:30 +00:00
|
|
|
|
2010-02-12 01:43:59 +00:00
|
|
|
// type of the revision information
|
|
|
|
enum RevisionInfo {
|
2010-04-17 13:24:32 +00:00
|
|
|
Unknown = 0,
|
2010-02-12 02:31:58 +00:00
|
|
|
File = 1,
|
2010-02-12 05:52:34 +00:00
|
|
|
Tree = 2,
|
|
|
|
Author = 3,
|
|
|
|
Date = 4,
|
|
|
|
Time = 5
|
2010-02-12 01:43:59 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return revision info specified by the argument.
|
|
|
|
* Its safe to call it regardless VCS is in usage or this
|
|
|
|
* info is (un)available. Returns empty string in such a case.
|
|
|
|
*/
|
2010-09-07 11:29:05 +00:00
|
|
|
std::string revisionInfo(RevisionInfo const info) const;
|
2010-02-12 01:43:59 +00:00
|
|
|
|
1999-09-27 18:44:28 +00:00
|
|
|
private:
|
|
|
|
///
|
1999-11-09 23:52:04 +00:00
|
|
|
Buffer * owner_;
|
2002-03-21 17:27:08 +00:00
|
|
|
|
1999-09-27 18:44:28 +00:00
|
|
|
///
|
2016-06-02 22:49:36 +00:00
|
|
|
unique_ptr<VCS> vcs;
|
1999-09-27 18:44:28 +00:00
|
|
|
};
|
|
|
|
|
2006-10-21 00:16:43 +00:00
|
|
|
|
|
|
|
} // namespace lyx
|
|
|
|
|
1999-09-27 18:44:28 +00:00
|
|
|
#endif
|