// // aegis - project change supervisor // Copyright (C) 2004-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 LIBAEGIS_CHANGE_IDENTIFI_SUB_H #define LIBAEGIS_CHANGE_IDENTIFI_SUB_H #include #include #include class change_functor; // forward struct fstate_src_ty; // forward class nstring_list; // forward class project_file_roll_forward; // forward struct project_ty; // forward struct user_ty; // forward /** * The change_identifier_subset class is used to represent a change * and its context, as identified by all the diffent command line * options used to specify a change set. It only operates on the * change portion of the identification; the project portion is a * separate class and instance. */ class change_identifier_subset { public: /** * The destructor. * It isn't virtual; thou shalt not derive from this class. */ ~change_identifier_subset(); /** * The constructor. */ change_identifier_subset(project_identifier_subset &arg); /** * The set method is used to determine if this chaneg ID has been * set yet (via any one of several command line options). */ bool set() const; /** * The command_line_parse method is used to parse command line * options (via the arglex() fucntion) to set the change ID. The * current token is expected to be meaningful for identifying a * change. The position will be advanced past all relevant tokens. * * It understands all of the following command line options: * -BaseLine * [ -Change] number * -Development_Directory * -BRanch number * -TRunk * -GrandParent * -DELta number * -DELta name * -DELta_Date when * [ -Project ] string * * \note * There is no need to pass all of these command line options to * this function for processing. Only pass those options which * make sense. If is often the case that threr are actually * *two* changes being identified, and they will split the * arguments between them. */ void command_line_parse(void (*usage)(void)); /** * The command_line_check method is used to verify that sensable * command line options have been specified, once the parse has * completed. */ void command_line_check(void (*usage)(void)); /** * The set_baseline method is used to specify that the baseline is * the change being identified. */ void set_baseline() { baseline = true; } /** * The get_baseline method is used to determine whether the * --baseline option has been specified. */ bool get_baseline() { return baseline; } /** * The get_devdir method is used to determine of the * --Development-Directory option has been given, or is implied. */ bool get_devdir(); /** * The set_project method is used after the * command_line_check method has been called. It is used to bind * to the appropriate project for the change identified. */ void set_project(); /** * The set_change method is used after the set_project * method has been called. It is used to bind to the appropriate * change. */ void set_change(); /** * The get_file_revision is used to determine the path to the given * file at the time specified by the change ID. It must be called * after the set_change method has been called. * * @param filename * The name of the file in question * @param bad_state * What to do if the change is in an inappropriate state for * this operation. */ file_revision get_file_revision(const nstring &filename, change_functor &bad_state); /** * The get_file_revision is used to determine the path to * the given file at the time specified by the change ID. It must * be called after the set_change method has been called. * * @param src * The file meta data (revions, if set, will be ignored) * @param bad_state * What to do if the change is in an inappropriate state for * this operation. */ file_revision get_file_revision(fstate_src_ty *src, change_functor &bad_state); /** * The get_project_files method is used to obtain a list of the * project's file, taking --delta options into account if specified. * * \param results * The string list to which the file names are appended. * * \note * You can't specify a view path, it defaults to view_path_simple. */ void get_project_file_names(nstring_list &results); /** * The get_project_file method is used to obtain the details about * a named file, taking any --delta* options into account. * * \param file_name * The name of the file of interest. * \returns * pointer to file details, or NULL of the file does not exist. */ fstate_src_ty *get_project_file(const nstring &file_name); /** * The set_project_name method is used to set the name of the * project to be accessed. */ void set_project_name(string_ty *); /** * The get_change_version_string methof is used to get the version * string for the change. */ nstring get_change_version_string(); /** * The get_pp method is used to get the project pointer for the * change identified. */ project_ty *get_pp() { return pid.get_pp(); } /** * The get_up method is used to get the user pointer for the * change identified. */ user_ty::pointer get_up() { return pid.get_up(); } /** * The set_user_by_name method is used to set the user name by * name. This is useful for the small set of command which accept * a user name on the command line. * * @param login * The login name of the user. */ void set_user_by_name(nstring &login) { pid.set_user_by_name(login); } /** * The get_cp method is used to get the change pointer for the * change identified. */ change::pointer get_cp(); /** * The get_change_number method is used to obtain the change * number for the identified change. * * \note * There is no need to call magic_zero_decode(). */ long get_change_number(); /** * The error_if_no_explicit_change_number is used to emit a * fatal_intl error if no change number was specified on the * command line. */ void error_if_no_explicit_change_number(); /** * The get_historian method is used to obtain the location of the * historical file reconstructor. * * \note * This function is a failure of the API to conceal this. * Eventually it would be nice if all the users of this could * be refactored to hide it again. */ project_file_roll_forward *get_historian(); /** * The invalidate_meta_data method is used to discard cached * information about the change. This is usually necessary when a * sub-command is run and that subcommand would update the change * meta-data. */ void invalidate_meta_data(); private: /** * The pid instance variable is used to remember which project goes * with this change. */ project_identifier_subset_branch pid; enum { NO_TIME_SET = -1 }; /** * The baseline instance variable is used to remember wether or not * the --baseline command line option has been specified. */ bool baseline; /** * The devdir instance variable is used to remember wether or not * the --devdir command line option has been specified. */ bool devdir; /** * The change_number instance variable is used to remember any * --change command line option specified. This could be implicit. */ long change_number; /** * The delta_date instance variable is used to remember any * --delta-date command line option specified. This could be * implicit. */ long delta_date; /** * The delta_name instance variable is used to remember any * --delta-name command line option specified. */ nstring delta_name; /** * The delta_number instance variable is used to remember any * --delta command line option specified. This could be implicit. */ long delta_number; /** * The cp instance variable is used to remember which change we are * bound to. */ change::pointer cp; /** * The historian_p instance variable is used to remember the * location of the historical file reconstructor. Shall only be * accessed by the get_historian method. */ project_file_roll_forward *historian_p; /** * The need_historical_perspective method is used to determine * whether or not access to project files should be direct (false) * or via the historian (false). */ bool need_historical_perspective() const; /** * The default constructor. Do not use. */ change_identifier_subset(); /** * The copy constructor. Do not use. */ change_identifier_subset(const change_identifier_subset &); /** * The assignment operator. Do not use. */ change_identifier_subset &operator=(const change_identifier_subset &); }; #endif // LIBAEGIS_CHANGE_IDENTIFI_SUB_H