]> git.lyx.org Git - lyx.git/blob - src/VCBackend.h
54dbc1775d00548b761356b9e8a1fb07b317a721
[lyx.git] / src / VCBackend.h
1 // -*- C++ -*-
2 /**
3  * \file VCBackend.h
4  * This file is part of LyX, the document processor.
5  * Licence details can be found in the file COPYING.
6  *
7  * \author Lars Gullik Bjønnes
8  * \author Pavel Sanda
9  *
10  * Full author contact details are available in file CREDITS.
11  */
12
13 #ifndef VC_BACKEND_H
14 #define VC_BACKEND_H
15
16 #include "support/FileName.h"
17
18 #include <string>
19
20 #include "LyXVC.h"
21
22
23 namespace lyx {
24
25 class Buffer;
26
27 /// A simple version control system interface
28 class VCS {
29 public:
30         /// the status of the managed file
31         enum VCStatus {
32                 UNLOCKED,
33                 LOCKED,
34                 NOLOCKING
35         };
36
37         virtual ~VCS() {}
38
39         /// register a file for version control
40         virtual void registrer(std::string const & msg) = 0;
41         /// check in the current revision, returns log
42         virtual std::string checkIn(std::string const & msg) = 0;
43         // can be this operation processed in the current RCS?
44         virtual bool checkInEnabled() = 0;
45         // should a log message provided for next checkin?
46         virtual bool isCheckInWithConfirmation() = 0;
47         /// check out for editing, returns log
48         virtual std::string checkOut() = 0;
49         // can be this operation processed in the current RCS?
50         virtual bool checkOutEnabled() = 0;
51         /// synchronize with repository, returns log
52         virtual std::string repoUpdate() = 0;
53         // can be this operation processed in the current RCS?
54         virtual bool repoUpdateEnabled() = 0;
55         // toggle locking property of the file
56         virtual std::string lockingToggle() = 0;
57         // can be this operation processed in the current RCS?
58         virtual bool lockingToggleEnabled() = 0;
59         /// revert current edits
60         virtual void revert() = 0;
61         // should a confirmation before revert requested?
62         virtual bool isRevertWithConfirmation() = 0;
63         /// FIXME
64         virtual void undoLast() = 0;
65         // can be this operation processed in the current RCS?
66         virtual bool undoLastEnabled() = 0;
67         /**
68          * getLog - read the revision log into the given file
69          * @param fname file name to read into
70          */
71         virtual void getLog(support::FileName const &) = 0;
72         /// return the current version description
73         virtual std::string const versionString() const = 0;
74         /// set the owning buffer
75         void owner(Buffer * b) { owner_ = b; }
76         /// return the owning buffer
77         Buffer * owner() const { return owner_; }
78         /// return the lock status of this file
79         VCStatus status() const { return vcstatus; }
80         /// do we need special handling for read-only toggling?
81         /// (also used for check-out operation)
82         virtual bool toggleReadOnlyEnabled() = 0;
83         /// Return revision info specified by the argument.
84         virtual std::string revisionInfo(LyXVC::RevisionInfo const info) = 0;
85
86         virtual bool prepareFileRevision(std::string const & rev, std::string & f) = 0;
87
88         virtual bool prepareFileRevisionEnabled() = 0;
89
90 protected:
91         /// parse information from the version file
92         virtual void scanMaster() = 0;
93
94         // GUI container for doVCCommandCall
95         int doVCCommand(std::string const & cmd, support::FileName const & path, bool reportError = true);
96         /**
97          * doVCCommandCall - call out to the version control utility
98          * @param cmd the command to execute
99          * @param path the path from which to execute
100          * @return exit status
101          */
102         static int doVCCommandCall(std::string const & cmd, support::FileName const & path);
103
104         /**
105          * The master VC file. For RCS this is *,v or RCS/ *,v. master should
106          * have full path.
107          */
108         support::FileName master_;
109
110         /// The status of the VC controlled file.
111         VCStatus vcstatus;
112
113         /// The buffer using this VC
114         Buffer * owner_;
115 };
116
117
118 ///
119 class RCS : public VCS {
120 public:
121
122         explicit
123         RCS(support::FileName const & m);
124
125         /// return the revision file for the given file, if found
126         static support::FileName const findFile(support::FileName const & file);
127
128         static void retrieve(support::FileName const & file);
129
130         virtual void registrer(std::string const & msg);
131
132         virtual std::string checkIn(std::string const & msg);
133
134         virtual bool checkInEnabled();
135
136         virtual bool isCheckInWithConfirmation();
137
138         virtual std::string checkOut();
139
140         virtual bool checkOutEnabled();
141
142         virtual std::string repoUpdate();
143
144         virtual bool repoUpdateEnabled();
145
146         virtual std::string lockingToggle();
147
148         virtual bool lockingToggleEnabled();
149
150         virtual void revert();
151
152         virtual bool isRevertWithConfirmation();
153
154         virtual void undoLast();
155
156         virtual bool undoLastEnabled();
157
158         virtual void getLog(support::FileName const &);
159
160         virtual std::string const versionString() const {
161                 return "RCS: " + version_;
162         }
163
164         virtual bool toggleReadOnlyEnabled();
165
166         virtual std::string revisionInfo(LyXVC::RevisionInfo const info);
167
168         virtual bool prepareFileRevision(std::string const & rev, std::string & f);
169
170         virtual bool prepareFileRevisionEnabled();
171
172 protected:
173         virtual void scanMaster();
174 private:
175         /**
176          * The version of the VC file. I am not sure if this can be a
177          * string or if it must be a float/int.
178          */
179         std::string version_;
180         /// The user currently keeping the lock on the VC file (or "Unlocked").
181         std::string locker_;
182 };
183
184
185 ///
186 class CVS : public VCS {
187 public:
188         ///
189         explicit
190         CVS(support::FileName const & m, support::FileName const & f);
191
192         /// return the revision file for the given file, if found
193         static support::FileName const findFile(support::FileName const & file);
194
195         virtual void registrer(std::string const & msg);
196
197         virtual std::string checkIn(std::string const & msg);
198
199         virtual bool checkInEnabled();
200
201         virtual bool isCheckInWithConfirmation();
202
203         virtual std::string checkOut();
204
205         virtual bool checkOutEnabled();
206
207         virtual std::string repoUpdate();
208
209         virtual bool repoUpdateEnabled();
210
211         virtual std::string lockingToggle();
212
213         virtual bool lockingToggleEnabled();
214
215         virtual bool isRevertWithConfirmation();
216
217         virtual void revert();
218
219         virtual void undoLast();
220
221         virtual bool undoLastEnabled();
222
223         virtual void getLog(support::FileName const &);
224
225         /// Check for messages in cvs output. 
226         /// Returns conflict line.
227         std::string scanLogFile(support::FileName const & f, std::string & status);
228
229         virtual std::string const versionString() const {
230                 return "CVS: " + version_;
231         }
232
233         virtual bool toggleReadOnlyEnabled();
234
235         virtual std::string revisionInfo(LyXVC::RevisionInfo const info);
236
237         virtual bool prepareFileRevision(std::string const & rev, std::string & f);
238
239         virtual bool prepareFileRevisionEnabled();
240
241 protected:
242         virtual void scanMaster();
243         /// the mode of operation for some VC commands
244         enum OperationMode {
245                 Directory = 0,
246                 File = 1
247         };
248         /// possible status values of file
249         enum CvsStatus {
250                 UpToDate = 0,
251                 LocallyModified = 1,
252                 LocallyAdded = 2,
253                 NeedsMerge = 3,
254                 NeedsCheckout = 4,
255                 NoCvsFile = 5,
256                 StatusError = 6
257         };
258
259 private:
260         support::FileName file_;
261         // revision number from scanMaster
262         std::string version_;
263
264         /**
265          * doVCCommandWithOutput
266          * - call out to the version control utility
267          * - it is able to collect output in a file
268          * @param cmd the command to execute
269          * @param path the path from which to execute
270          * @param output the path where to store output
271          * @param reportError display of low level error message dialog
272          * @return exit status
273          */
274         int doVCCommandWithOutput(std::string const & cmd,
275                         support::FileName const & path,
276                         support::FileName const & output,
277                         bool reportError = true);
278         static int doVCCommandCallWithOutput(std::string const & cmd,
279                         support::FileName const & path,
280                         support::FileName const & output);
281                                                 
282         /// return the quoted pathname if Directory or filename if File
283         virtual std::string const getTarget(OperationMode opmode) const;
284         /// collect the diff of file or directory against repository
285         /// result is placed in temporary file
286         void getDiff(OperationMode opmode, support::FileName const & tmpf);
287         /// make the file ready for editing:
288         /// save a copy in CVS/Base and change file permissions to rw if needed
289         virtual int edit();
290         /// revert the edit operation
291         virtual int unedit();
292         /// retrieve repository changes into working copy
293         virtual int update(OperationMode opmode, support::FileName const & tmpf);
294         /// check readonly state for file
295         /// assume true when file is writable
296         virtual bool isLocked() const;
297         /// query and parse the cvs status of file
298         virtual CvsStatus getStatus();
299         /// convert enum to string
300         virtual docstring toString(CvsStatus status) const;
301
302         /// cache the info values of current file revision
303         /// author, date and time of commit
304         std::string rev_author_cache_;
305         std::string rev_date_cache_;
306         std::string rev_time_cache_;
307         /// fills the cache values, returns true if successfull.
308         void getRevisionInfo();
309         bool have_rev_info_;
310 };
311
312
313 ///
314 class SVN : public VCS {
315 public:
316         ///
317         explicit
318         SVN(support::FileName const & m, support::FileName const & f);
319
320         /// return the revision file for the given file, if found
321         static support::FileName const findFile(support::FileName const & file);
322
323         virtual void registrer(std::string const & msg);
324
325         virtual std::string checkIn(std::string const & msg);
326
327         virtual bool checkInEnabled();
328
329         virtual bool isCheckInWithConfirmation();
330
331         virtual std::string checkOut();
332
333         virtual bool checkOutEnabled();
334
335         virtual std::string repoUpdate();
336
337         virtual bool repoUpdateEnabled();
338
339         virtual std::string lockingToggle();
340
341         virtual bool lockingToggleEnabled();
342
343         virtual void revert();
344
345         virtual bool isRevertWithConfirmation();
346
347         virtual void undoLast();
348
349         virtual bool undoLastEnabled();
350
351         virtual void getLog(support::FileName const &);
352
353         virtual std::string const versionString() const {
354                 return "SVN: " + rev_file_cache_;
355         }
356
357         virtual bool toggleReadOnlyEnabled();
358
359         virtual std::string revisionInfo(LyXVC::RevisionInfo const info);
360
361         virtual bool prepareFileRevision(std::string const & rev, std::string & f);
362
363         virtual bool prepareFileRevisionEnabled();
364
365 protected:
366         virtual void scanMaster();
367         /// Check for messages in svn output. Returns error.
368         std::string scanLogFile(support::FileName const & f, std::string & status);
369         /// checks locking policy and setup locked_mode_
370         bool checkLockMode();
371         /// is the loaded file locked?
372         bool isLocked() const;
373         /// acquire/release write lock for the current file
374         void fileLock(bool lock, support::FileName const & tmpf, std::string & status);
375
376 private:
377         support::FileName file_;
378         /// is the loaded file under locking policy?
379         bool locked_mode_;
380         /**
381          * Real code for obtaining file revision info. Fills all file-related caches
382          * and returns true if successfull.
383          * "?" is stored in rev_file_cache_ as a signal if request for obtaining info
384          * was already unsuccessful.
385          */
386         bool getFileRevisionInfo();
387         /// cache for file revision number, "?" if already unsuccessful, isNumber==true
388         std::string rev_file_cache_;
389         /// cache for author of last commit
390         std::string rev_author_cache_;
391         /// cache for date of last commit
392         std::string rev_date_cache_;
393         /// cache for time of last commit
394         std::string rev_time_cache_;
395         /// fills rev_tree_cache_, returns true if successfull.
396         bool getTreeRevisionInfo();
397         /// cache for tree revision number, "?" if already unsuccessful
398         std::string rev_tree_cache_;
399 };
400
401 } // namespace lyx
402
403 #endif // VCBACKEND_H