// // aegis - project change supervisor // Copyright (C) 2006-2008 Peter Miller // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see // . // #ifndef AE_VC_CHECKIN_REPOSITORY_H #define AE_VC_CHECKIN_REPOSITORY_H #include class nstring; // forward class change_identifier; // forward class fstate_src_ty; // forward /** * The abstract repository base class is used to represent a generic * interface to the check-in facilities of a version control * repository. * * The repository may or may not have a change-set concepts, but it * will be treated as if it did. */ class repository { public: /** * The destructor. */ virtual ~repository(); /** * The default constructor. */ repository(); /** * The checkout method is used to set-up for the commit. All know * examples at this time require the creation of a work area to * apply the changes to. * * This method MUST be called before any of the following methods. * * @param module * This is the name of the module to be checked out. * @param directory * This is the absolute path of the directory to use to create * the temporary work area below. */ virtual void checkout(const nstring &module, const nstring &directory) = 0; /** * The get_directory method is used to obtain the absolute path of * the directory in which the checkout occurred. */ virtual nstring get_directory() const = 0; /** * The remove_file method is used to remove a file from the work * area, and instruct the repository that the file is deleted in * this change set. * * Some repositories require that the file be deleted from the work * area first, and some do not. Any repository specific actions * will be performed by this method. * * @param file_name * The name of the file (relative to the checkout directory, * relative to the Aegis baseline root) to be removed. */ virtual void remove_file(const nstring &file_name) = 0; /** * The remove_file_wrapper method is used to perform all of the * checks against the checked-out directory to keep the remote * repository in synch with the Aegis one. This may involve * rewriting the file actions. * * @param cid * The change identification * @param src * The file attributes */ void remove_file_wrapper(change_identifier &cid, fstate_src_ty *src); /** * The add_file method is used to add a file to the work area, and * instruct the repository that the file is added in this change * set. * * Some repositories require that the file be created in the work * area first, and some do not. Any repository specific actions * will be performed by this method. * * @param file_name * The name of the file (relative to the checkout directory, * relative to the Aegis baseline root) to be added. * @param content_path * The absolute path of the file contents to be copied into the * work area. */ virtual void add_file(const nstring &filename, const nstring &content_path) = 0; /** * The add_file_wrapper method is used to perform all of the checks * against the checked-out directory to keep the remote repository * in synch with the Aegis one. This may involve rewriting the * file actions. * * @param cid * The change identification * @param src * The file attributes */ void add_file_wrapper(change_identifier &cid, fstate_src_ty *src); /** * The modify_file method is used to modify a file to the work * area, and instruct the repository that the file is modified in * this change set. * * Some repositories require that the file be modified in the work * area first, and some do not. Any repository specific actions * will be performed by this method. * * @param file_name * The name of the file (relative to the checkout directory, * relative to the Aegis baseline root) to be added. * @param content_path * The absolute path of the file contents to be copied into the * work area. */ virtual void modify_file(const nstring &filename, const nstring &content_path) = 0; /** * The modify_file_wrapper method is used to perform all of the * checks against the checked-out directory to keep the remote * repository in synch with the Aegis one. This may involve * rewriting the file actions. * * @param cid * The change identification * @param src * The file attributes */ void modify_file_wrapper(change_identifier &cid, fstate_src_ty *src); /** * The rename_file method is used to rename a file in the work * area, and instruct the repository that the file is renamed in * this change set. * * Some repositories require that the file be renamed in the work * area first, and some do not. Any repository specific actions * will be performed by this method. * * The default implementation of this method is to call the * remove_file method and the add_file method, as a generic * action covering all repositories which do not support rename * explicitly. * * @param old_file_name * The name of the file (relative to the checkout directory, * relative to the Aegis baseline root) to be removed. * @param new_file_name * The name of the file (relative to the checkout directory, * relative to the Aegis baseline root) to be added. * @param content_path * The absolute path of the file contents to be copied into the * work area. */ virtual void rename_file(const nstring &old_filename, const nstring &new_file_name, const nstring &content_path); /** * The rename_file_wrapper method is used to perform all of the * checks against the checked-out directory to keep the remote * repository in synch with the Aegis one. This may involve * rewriting the file actions. * * @param cid * The change identification * @param src * The file attributes */ void rename_file_wrapper(change_identifier &cid, fstate_src_ty *src); /** * The file_attributes method is used to attached versioned * attributes to the file. * * The default implementation does nothing. * * @param cid * The change identification * @param src * The file attributes */ void file_attributes(change_identifier &cid, fstate_src_ty *src); /** * The file_wrapper method is used to perform all of the * checks against the checked-out directory to keep the remote * repository in synch with the Aegis one. This may involve * rewriting the file actions. * * This method calls one of the create_file_wrapper, * modify_file_wrapper, remove_filea_wrapper or rename_file_wrapper * methods, and also the file_attributes method. * * @param cid * The change identification * @param src * The file attributes */ void file_wrapper(change_identifier &cid, fstate_src_ty *src); /** * The commit method is used to commit all the changes in the * temorary work area into the repository. * * On success, the temporary work area will be completely removed. * * @param comment * The comment to be applied to the change set when it is * committed to the repository. This should only be bound to * individual files when the repository is completely unable * to attach comments to the change set (often, because the * repository doesn't actually *have* change sets). */ virtual void commit(const nstring &comment) = 0; /** * The factory class method is used to create a new repository * instance based on the type of the repository. * * @param type * The type of repository to be operated upon. * @returns * a pointer to a dynamically allocated instance of a * repository object. */ static repository *factory(const char *type); /** * The list class method is used to list all of the currently * supported repository types on the standard output. */ static void list(void); /** * The change_specific_attributes method is used to give * repositories the opportunity to use change attributes and * project attributes to influence the behaviour. * * While you can use any and all of the change and project state, * it is recommended that you limit yourself to the change * attributes and project specific attributes. * * The default implementation does nothing. */ virtual void change_specific_attributes(change::pointer cp); protected: /** * The is_binary class method is used to determine whether or not * a given file is binary. International text can contain many * things, but it can't contain NUL characters. The presence of * NUL characters indicates that a file is binary. * * @param path * The path of the file to test * @returns * bool; true if file is binary, false if it could be text */ static bool is_binary(const nstring &path); /** * The file_attribute method is used to attached versioned * attributes to a file. The default implementation does nothing. * * @param filename * The name of the file the attribute is to be attached to * @param attribute_name * The name of the file attribute * @param attribute_value * The value of the attribute */ virtual void file_attribute(const nstring &filename, const nstring &attribute_name, const nstring &attribute_value); private: /** * The copy constructor. Do not use. */ repository(const repository &); /** * The assignment operator. Do not use. */ repository &operator=(const repository &); }; #endif // AE_VC_CHECKIN_REPOSITORY_H