- /*
- * Copyright 1995, 1996 Perforce Software. All rights reserved.
- *
- * This file is part of Perforce - the FAST SCM System.
- */
- #ifndef __CLIENTMERGE__
- #define __CLIENTMERGE__
- /*
- * ClientMerge - client side merge controller
- *
- * ClientMerge
- *
- * A ClientMerge object handles the client-side merge process,
- * taking the server-generated merge stream and writing out the
- * base, yours, theirs, and merge files. A ClientMerge also has
- * both a command line resolve implementation as well as hooks
- * to allow other resolve implementations.
- *
- * ClientMerge is almost purely virtual, allowing for varying
- * implementations that deal with the varying server-generated
- * merge streams (basically 2 and 3 way merges).
- *
- * Half of ClientMerge's methods are for handling the server merge
- * stream; the other half are for the user interface.
- *
- * Virtual member functions - Server merge stream handling
- *
- * ClientMerge::SetNames() - provides the user-recognisable names
- * for the base, theirs, and yours.
- *
- * ClientMerge::SetShowAll() - turns on verbose merging.
- *
- * ClientMerge::Open() - state name of client file and prepare to
- * process merge pipe.
- *
- * ClientMerge::Write() - write a block of the merge pipe. See
- * diffmerge.h for the meaning of bits.
- *
- * ClientMerge::Close() - close file(s) at end of merge pipe.
- *
- * ClientMerge::Select() - move user-selected result into place
- *
- * ClientMerge::Chmod() - set permissions on the target file;
- * generally, set to rw before and ro after.
- *
- * Virtual member functions - User interface hooks
- *
- * ClientMerge::AutoResolve() - take a guess at which version
- * (theirs, yours, result) should be the result of the
- * merge, using the chunk counts as hints.
- *
- * ClientMerge::Resolve() - let the user select which version
- * should be the result of the merge.
- *
- * ClientMerge::DetectResolve() - determine which version by
- * comparing result vs theirs/yours/merged.
- *
- * ClientMerge::IsAcceptable() - returns 1 if the result file
- * has no merge markers (generated by the merge stream
- * handler) left in it.
- *
- * ClientMerge::GetBaseFile()
- * ClientMerge::GetYourFile()
- * ClientMerge::GetTheirFile()
- * ClientMerge::GetResultFile()
- * Return a FileSys * to the desired file. 2 way merges
- * return 0 for Base/Result files: only Yours/Theirs is
- * available.
- *
- * ClientMerge::GetYourChunks()
- * ClientMerge::GetTheirChunks()
- * ClientMerge::GetBothChunks()
- * ClientMerge::GetConflictChunks()
- * Returns the number of chunks in the merge stream.
- * 2 way merges return 0 for all.
- *
- * The actual caller of the ClientMerge class is in clientservice.cc.
- * It uses the stream handling functions to produce 2 or 4 files on
- * the client (yours/theirs, yours/theirs/base/result), and then calls
- *
- * MergeType ClientUser::Resolve( ClientMerge *merger )
- *
- * The default ClientUser::Resolve() merely calls merger->Resolve()
- * to carry out the command-line resolve interaction, but a subclassed
- * ClientUser::Resolve() can use the other merger methods to gain
- * access to the files and performs its own resolve.
- */
- enum MergeType {
- CMT_BINARY, // binary merge
- CMT_3WAY, // 3-way text
- CMT_2WAY // 2-way text
- } ;
- enum MergeStatus {
- CMS_QUIT, // user wants to quit
- CMS_SKIP, // skip the integration record
- CMS_MERGED, // accepted merged theirs and yours
- CMS_EDIT, // accepted edited merge
- CMS_THEIRS, // accepted theirs
- CMS_YOURS // accepted yours,
- } ;
- enum MergeForce {
- CMF_AUTO, // don't force // -am
- CMF_SAFE, // accept only non-conflicts // -as
- CMF_FORCE // accept anything // -af
- } ;
- class ClientUser;
- class ClientMerge : public LastChance {
- public:
- static ClientMerge *Create(
- ClientUser *ui,
- FileSysType type,
- FileSysType resType,
- MergeType m );
- virtual ~ClientMerge();
- // User interface: AutoResolve is called if any of the -a flags
- // are passed to 'p4 resolve'. Resolve() is used otherwise. The
- // Resolve()'s often call AutoResolve() to provide the user with
- // a default selection.
- virtual MergeStatus AutoResolve( MergeForce forceMerge ) = 0;
- virtual MergeStatus Resolve( Error *e ) = 0;
- virtual MergeStatus DetectResolve() const = 0;
- virtual int IsAcceptable() const = 0;
- virtual FileSys *GetBaseFile() const = 0;
- virtual FileSys *GetYourFile() const = 0;
- virtual FileSys *GetTheirFile() const = 0;
- virtual FileSys *GetResultFile() const = 0;
- virtual int GetYourChunks() const = 0;
- virtual int GetTheirChunks() const = 0;
- virtual int GetBothChunks() const = 0;
- virtual int GetConflictChunks() const = 0;
- virtual const StrPtr *GetMergeDigest() const { return NULL; }
- virtual const StrPtr *GetYourDigest() const { return NULL; }
- virtual const StrPtr *GetTheirDigest() const { return NULL; }
- // Server merge stream handling
- virtual void SetNames( StrPtr *, StrPtr *, StrPtr * ) {};
- virtual void CopyDigest( StrPtr *, Error * ) {};
- virtual void SetShowAll() {};
- virtual void SetDiffFlags( const StrPtr * ) {};
- virtual void Open( StrPtr *name, Error *e, CharSetCvt * = 0,
- int charset = 0 ) = 0;
- virtual void Write( StrPtr *buf, StrPtr *bits, Error *e ) = 0;
- virtual void Close( Error *e ) = 0;
- virtual void Select( MergeStatus stat, Error *e ) = 0;
- virtual void Chmod( const char *perms, Error *e ) = 0;
- // Chmod must use 'const char' as the type not 'char'
- // The following will cause compile time errors for using 'char'
- virtual int Chmod( char *perms, Error *e )
- { Chmod( (const char *)perms, e ); return 0; };
- protected:
- ClientUser *ui;
- static const char *const confirm; // confirm overwrite
- int Verify( const Error *message, Error *e );
- } ;
- # endif /* __CLIENTMERGE__ */
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 7893 | Johan Nilsson | OFFLINE CHANGELIST 10 - SUBMITTED ON 2011/03/23 11:18:27 Upgrade project files to VS2010... and switching to msbuild for the entire project. Retargeted everything to .NET4 Client Profile for the time being, due to VS2010 C++ limitations (can't target anything other than 4.0 without complicating the setup too much). Shouldn't be too hard to retarget later if push comes to shove. Added VS2010 P4API stuff directly inside this project also to make things easier to get up and running for the moment. Removed old static P4API libraries. ____________________________________________________________ OFFLINE CHANGELIST 9 - SUBMITTED ON 2011/03/22 07:35:31 Converted to VS2010 « |
14 years ago |