// // aegis - project change supervisor // Copyright (C) 1995-2008 Peter Miller // Copyright (C) 2007, 2008 Walter Franzini // // 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_H #define LIBAEGIS_CHANGE_H #include #include #include #include #include class nstring_list; // forward // // Name of the project configuration file, // relative to the baseline/devdir root. // #define THE_CONFIG_FILE_OLD "config" #define THE_CONFIG_FILE_NEW "aegis.conf" #include // // Define a magic number to represent the trunk transaction // of the project. It has an exceptional file name. // #define TRUNK_CHANGE_NUMBER ((long)((~(unsigned long)0) >> 1)) #define TIME_NOT_SET (time_t)0 struct string_list_ty; // forward struct sub_context_ty; // forward struct symtab_ty; // forward class project_ty; // forward class change { public: /** * The pointer typedef is provided so that clients of this * interface may use change::pointer everywhere they need to point * at a change instance, and only this typedef needs to be edited * to use a variety of smart pointer instead. */ typedef change *pointer; long reference_count; project_ty *pp; long number; cstate_ty *cstate_data; string_ty *cstate_filename; int cstate_is_a_new_file; fstate_ty *fstate_data; symtab_ty *fstate_stp; symtab_ty *fstate_uuid_stp; string_ty *fstate_filename; fstate_ty *pfstate_data; symtab_ty *pfstate_stp; symtab_ty *pfstate_uuid_stp; string_ty *pfstate_filename; int fstate_is_a_new_file; string_ty *top_path_unresolved; string_ty *top_path_resolved; string_ty *development_directory_unresolved; string_ty *development_directory_resolved; string_ty *integration_directory_unresolved; string_ty *integration_directory_resolved; string_ty *logfile; pconf_ty *pconf_data; long lock_magic; int bogus; string_ty *architecture_name; string_list_ty *file_list[view_path_MAX]; bool project_specific_setenv_performed; // NOTE: methods are sorted alphabetically. To have methods // grouped, make sure they change their suffix rather than their // prefix. E.g. thingumy_get and thingumy_set rather than // get_thingumy and set_thingumy. /** * The attributes_get method is used to obtain the value of an * attribute of this change set. * * @param name * The name of the attribute. * Attribute names are not case sensitive. * @returns * the string value of the attribute, or the empty string * if not found. */ nstring attributes_get(const nstring &name); /** * The attributes_get_boolean method is used to obtain the * value of an attribute of this change set, as a true/false * attribute. * * @param name * The name of the attribute. * Attribute names are not case sensitive. * @returns * the boolean value of the attribute, or false if the * attribute is not found or is not interpretable as a * boolean. */ bool attributes_get_boolean(const nstring &name); /** * The cstate_get method may be used to obtain the cstate meta-data * of this change. */ cstate_ty *cstate_get(); /** * The file_new method is used to add a new file to a change set's * file manifest. No checking is poerformed, it is up to the caller * to ensure that the name is unique. * * @param file_name * The name of the file to be created. * @returns * A newly allocated file, with the name set, and everything * else blank. */ fstate_src_ty *file_new(string_ty *fn); /** * The file_new method is used to add a new file to a change * set's file manifest. No checking is poerformed, it is up to * the caller to ensure that the file name and UUID are unique. * Typically this is used when adding a project file to a change * set for modification or removal. * * @param meta * The meta-data of the file to be created. * @returns * A newly allocated file, with the name set, and everything * else blank. */ fstate_src_ty *file_new(fstate_src_ty *meta); /** * The gid_get method is used to obtain the Unix group id of the * change owner. */ int gid_get() const; /** * The is_awaiting_development method returns true if the given * change is in the awaiting development state, and false if it is * not. */ bool is_awaiting_development(); /** * The is_being_developed method returns true if the given change * is in the being developed state, and false if it is not. */ bool is_being_developed(); /** * The is_being_integrated method is used to determine whether or * not this is in the being integrated state. * * @returns * bool; true if this is in the being integrated state, and * false if it is not. */ bool is_being_integrated(); /** * The change_is_completed function returns true (non-zero) if this * change is in the completed state, and false (zero) if it is not. */ bool is_completed(); /** * The pconf_attributes_get method is used to obtain the * value of an attribute of the project, from the project * configuration file. It could be in this change, or it could * be in a baseline or an ancestor baseline. * * @param name * The name of the attribute. * Attribute names are not case sensitive. * @returns * the string value of the attribute, or the empty string * if not found. */ nstring pconf_attributes_find(const nstring &name); /** * The pconf_copyright_owner_get method is used to obtain the * name of the copyright holder of a project. */ nstring pconf_copyright_owner_get(); /** * The project_specific_setenv_performed_set method is used to * remember if the environment variable(s), specified as * project_specific attributes, has been already exported. * * @returns * Void. */ void project_specific_setenv_performed_set(); /** * The project_specific_setenv_performed_get method is used to * know if the environment variable(s), specified as * project_specific attributes, has been already exported. * * @returns * True if the variables has been already exported, false * otherwise. */ bool project_specific_setenv_performed_get() const; /** * The run_project_file_command_needed method may be used to * determine whether or not the project_file_command needstosed in * recent integration history. * * @returns * true if need to run it (see next method), false if not. */ bool run_project_file_command_needed(); /** * The run_project_file_command method is used to run the command * configured in the aegis.conf file's project_file_command field. * * @param up * The user to run the command as. * * @note * this method MUST be called outside the change set lock */ void run_project_file_command(const user_ty::pointer &up); /** * The run_project_file_command_done method is used to remember * that the project_file comman has been (is about to be) called * recently. * * @note * this method MUST be called INSIDE the change set lock */ void run_project_file_command_done(); /** * The run_new_file_command method is used to run the * new_file_command field of the aegis.conf file. * * @param slp * The list of new file names * @param up * Th euser to run the command as. */ void run_new_file_command(string_list_ty *slp, const user_ty::pointer &up); /** * The run_new_file_undo_command method is used to run the command * in the new_file_undo_command field of the aegis.conf file. * * @param slp * The list of filenames affected. * @param up * the user to run the program as */ void run_new_file_undo_command(string_list_ty *slp, const user_ty::pointer &up); /** * The run_new_test_command method is used to run the command in * the new_test_command field of the aegis.conf file. * * @param slp * The list of filenames affected. * @param up * the user to run the program as */ void run_new_test_command(string_list_ty *slp, const user_ty::pointer &up); /** * The run_new_test_undo_command method is used to run the command * in the new_test_undo_command field of the aegis.conf file. * * @param slp * The list of filenames affected. * @param up * the user to run the program as */ void run_new_test_undo_command(string_list_ty *slp, const user_ty::pointer &up); /** * The run_copy_file_command method is used to run the command in * the copy_file_command field of the aegis.conf file. * * @param slp * The list of filenames affected. * @param up * the user to run the program as */ void run_copy_file_command(string_list_ty *slp, const user_ty::pointer &up); /** * The run_copy_file_undo_command method is used to run the command * in the copy_file_undo_command field of the aegis.conf file. * * @param slp * The list of filenames affected. * @param up * the user to run the program as */ void run_copy_file_undo_command(string_list_ty *slp, const user_ty::pointer &up); /** * The run_remove_file_command method is used to run the command in * the remove_file_command field of the aegis.conf file. * * @param slp * The list of filenames affected. * @param up * the user to run the program as */ void run_remove_file_command(string_list_ty *slp, const user_ty::pointer &up); /** * The run_remove_file_undo_command method is used to run the * command in the remove_file_undo_command field of the aegis.conf * file. * * @param slp * The list of filenames affected. * @param up * the user to run the program as */ void run_remove_file_undo_command(string_list_ty *slp, const user_ty::pointer &up); /** * The run_make_transparent_command method is used to run the * command in the make_transparent_command field of the aegis.conf * file. * * @param slp * The list of filenames affected. * @param up * the user to run the program as */ void run_make_transparent_command(string_list_ty *slp, const user_ty::pointer &up); /** * The run_make_transparent_undo_comman method is used to run * the command in the make_transparent_undo_command field of the * aegis.conf file. * * @param slp * The list of filenames affected. * @param up * the user to run the program as */ void run_make_transparent_undo_command(string_list_ty *slp, const user_ty::pointer &up); /** * The run_forced_develop_begin_notify_command method is used to * run the command in the forced_develop_begin_notify_command field * of the aegis.conf file. * * @param up * the user to run the program as */ void run_forced_develop_begin_notify_command(const user_ty::pointer &up); /** * The run_develop_end_notify_command method is used to run * the command in the develop_end_notify_command field of the * aegis.conf file. */ void run_develop_end_notify_command(); /** * The run_develop_end_undo_notify_command method is used to run * the command in the develop_end_undo_notify_command field of the * aegis.conf file. */ void run_develop_end_undo_notify_command(); /** * The run_review_begin_notify_command method is used to run * the command in the review_begin_notify_command field of the * aegis.conf file. */ void run_review_begin_notify_command(); /** * The run_review_begin_undo_notify_command method is used to run * the command in the review_begin_undo_notify_command field of the * aegis.conf file. */ void run_review_begin_undo_notify_command(); /** * The run_review_pass_notify_command method is used to run * the command in the review_pass_notify_command field of the * aegis.conf file. */ void run_review_pass_notify_command(); /** * The run_review_pass_undo_notify_command method is used to run * the command in the review_pass_undo_notify_command field of the * aegis.conf file. */ void run_review_pass_undo_notify_command(); /** * The run_review_fail_notify_command method is used to run * the command in the review_fail_notify_command field of the * aegis.conf file. */ void run_review_fail_notify_command(); /** * The run_integrate_pass_notify_command method is used to run * the command in the integrate_pass_notify_command field of the * aegis.conf file. */ void run_integrate_pass_notify_command(); /** * The run_integrate_fail_notify_command method is used to run * the command in the integrate_fail_notify_command field of the * aegis.conf file. */ void run_integrate_fail_notify_command(); time_t time_limit_get(); /** * The uuid_get method is used to obtain the UUID of this change set. * * @returns * The uuid of the change set, or the empty string of this * change set doesn't have a UUID. */ nstring uuid_get(); /** * The uuid_get_list method is used to obtain all of the UUIDs * associated with this change set. This includes the change set's * UUID, if it has one, and all of the aoriginal-uuid attributes. * * @param uuids * Where to put all of the UUIDs associated with this change set. */ void uuid_get_list(nstring_list &uuids); /** * The developer_user_get method is used to obtain a user_ty * instance representing the (most recent) developer of this change * set. */ user_ty::pointer developer_user_get(); // // if you add to this structure, don't forget to update // change_alloc() in libaegis/change/alloc.cc // change_free() in libaegis/change/free.cc // change_lock_sync() in libaegis/change/lock_sync.cc // }; change::pointer change_alloc(project_ty *, long); void change_free(change::pointer ); change::pointer change_copy(change::pointer ); void change_bind_existing(change::pointer ); int change_bind_existing_errok(change::pointer ); void change_bind_new(change::pointer ); change::pointer change_bogus(project_ty *); inline DEPRECATED cstate_ty * change_cstate_get(change::pointer cp) { return cp->cstate_get(); } void change_cstate_write(change::pointer ); cstate_history_ty *change_history_new(change::pointer , user_ty::pointer ); string_ty *change_creator_name(change::pointer ); string_ty *change_developer_name(change::pointer ); string_ty *change_reviewer_name(change::pointer ); string_ty *change_integrator_name(change::pointer ); void change_top_path_set(change::pointer , string_ty *); void change_top_path_set(change::pointer , const nstring &); void change_development_directory_set(change::pointer , string_ty *); void change_integration_directory_set(change::pointer , string_ty *); string_ty *change_top_path_get(change::pointer , int); string_ty *change_development_directory_get(change::pointer , int); string_ty *change_integration_directory_get(change::pointer , int); string_ty *change_logfile_basename(void); string_ty *change_logfile_get(change::pointer ); void change_cstate_lock_prepare(change::pointer ); void change_error(change::pointer , sub_context_ty *, const char *); void change_fatal(change::pointer , sub_context_ty *, const char *) NORETURN; void change_verbose(change::pointer , sub_context_ty *, const char *); /** * The change_warning function is used to issue a warning message * specific to a change. The message will be substituted accouring * to aesub(5) and any additional substitutions provided in the * substitution context. */ void change_warning(change::pointer , sub_context_ty *, const char *); /** * The change_warning_obsolete_field function is used to warn about the * use of obsolete fields (in user suppied files, Aegis will take care * of quietly cleaning up the meta-data files all by itself). */ void change_warning_obsolete_field(change::pointer cp, string_ty *errpos, const char *old_field, const char *new_field); pconf_ty *change_pconf_get(change::pointer , int); // use cp->run_new_file_command instead void change_run_new_file_command(change::pointer cp, string_list_ty *slp, user_ty::pointer up) DEPRECATED; // use cp->run_new_file_undo_command instead void change_run_new_file_undo_command(change::pointer cp, string_list_ty *slp, user_ty::pointer up) DEPRECATED; // use cp->run_new_test_command instead void change_run_new_test_command(change::pointer cp, string_list_ty *slp, user_ty::pointer up) DEPRECATED; // use cp->run_new_test_undo_command instead void change_run_new_test_undo_command(change::pointer cp, string_list_ty *slp, user_ty::pointer up) DEPRECATED; // use cp->run_copy_file_command instead void change_run_copy_file_command(change::pointer cp, string_list_ty *slp, user_ty::pointer up) DEPRECATED; // use cp->run_copy_file_undo_command instead void change_run_copy_file_undo_command(change::pointer cp, string_list_ty *slp, user_ty::pointer up) DEPRECATED; // use cp->run_remove_file_command instead void change_run_remove_file_command(change::pointer cp, string_list_ty *slp, user_ty::pointer up) DEPRECATED; // use cp->run_remove_file_undo_command instead void change_run_remove_file_undo_command(change::pointer cp, string_list_ty *slp, user_ty::pointer up) DEPRECATED; // use cp->run_make_transparent_command instead void change_run_make_transparent_command(change::pointer cp, string_list_ty *slp, user_ty::pointer up) DEPRECATED; // use cp->run_make_transparent_undo_command instead void change_run_make_transparent_undo_command(change::pointer cp, string_list_ty *slp, user_ty::pointer up) DEPRECATED; // use vp->run_project_file_command_needed() instead int change_run_project_file_command_needed(change::pointer cp) DEPRECATED; // use cp->run_project_file_command(up) instead void change_run_project_file_command(change::pointer cp, user_ty::pointer up) DEPRECATED; // use cp->run_forced_develop_begin_notify_command instead void change_run_forced_develop_begin_notify_command(change::pointer cp, user_ty::pointer up) DEPRECATED; // use cp->run_develop_end_notify_command instead void change_run_develop_end_notify_command(change::pointer cp) DEPRECATED; // use cp->run_develop_end_undo_notify_command instead void change_run_develop_end_undo_notify_command(change::pointer cp) DEPRECATED; // use cp->run_review_begin_notify_command instead void change_run_review_begin_notify_command(change::pointer cp) DEPRECATED; // use cp->run_review_begin_undo_notify_command void change_run_review_begin_undo_notify_command(change::pointer cp) DEPRECATED; // use cp->run_review_pass_notify_command instead void change_run_review_pass_notify_command(change::pointer cp) DEPRECATED; // use cp->run_review_pass_undo_notify_command instead void change_run_review_pass_undo_notify_command(change::pointer cp) DEPRECATED; // use cp->run_review_fail_notify_command instead void change_run_review_fail_notify_command(change::pointer cp) DEPRECATED; // use cp->run_integrate_pass_notify_command instead void change_run_integrate_pass_notify_command(change::pointer cp) DEPRECATED; // use cp->run_integrate_fail_notify_command instead void change_run_integrate_fail_notify_command(change::pointer cp) DEPRECATED; void change_run_history_get_command(change::pointer cp, fstate_src_ty *src, string_ty *output_file, user_ty::pointer up); void change_run_history_create_command(change::pointer cp, fstate_src_ty *); void change_run_history_put_command(change::pointer cp, fstate_src_ty *); /** * The change_run_history_query_command function is used to obtain the * head revision number of the history of the given source file. * * @param cp * The change to operate within. * @param src * The source file meta-data of the file of interest. * @returns * Pointer to string containing the version. Use str_free() when * you are done with it. */ string_ty *change_run_history_query_command(change::pointer cp, fstate_src_ty *src); void change_run_history_label_command(change::pointer cp, fstate_src_ty *, string_ty *label); /** * The change_run_history_transaction_begin_command function is * used to run the history_transaction_begin_command in the project * configuration file. This is used by the aeipass(1) command before * any history put or create commands. * * @param cp * The change to operate within. */ void change_run_history_transaction_begin_command(change::pointer cp); /** * The change_run_history_transaction_end_command function is * used to run the history_transaction_end_command in the project * configuration file. This is used by the aeipass(1) command after * any history put or create commands. * * @param cp * The change to operate within. */ void change_run_history_transaction_end_command(change::pointer cp); /** * The change_run_history_transaction_abort_command function is * used to run the history_transaction_abort_command in the project * configuration file. This is used by the aeipass(1) command if * a history transaction needs to be aborted. * * @param cp * The change to operate within. */ void change_run_history_transaction_abort_command(change::pointer cp); void change_history_trashed_fingerprints(change::pointer , string_list_ty *); void change_run_diff_command(change::pointer cp, user_ty::pointer up, string_ty *original, string_ty *input, string_ty *output); void change_run_diff3_command(change::pointer cp, user_ty::pointer up, string_ty *original, string_ty *most_recent, string_ty *input, string_ty *output); void change_run_merge_command(change::pointer cp, user_ty::pointer up, string_ty *original, string_ty *most_recent, string_ty *input, string_ty *output); void change_run_patch_diff_command(change::pointer cp, user_ty::pointer up, string_ty *original, string_ty *input, string_ty *output, string_ty *index_name); void change_run_annotate_diff_command(change::pointer cp, user_ty::pointer up, string_ty *original, string_ty *input, string_ty *output, string_ty *index_name, const char *diff_option); int change_has_merge_command(change::pointer ); void change_run_integrate_begin_command(change::pointer ); void change_run_integrate_begin_undo_command(change::pointer ); void change_run_develop_begin_command(change::pointer , user_ty::pointer ); void change_run_develop_begin_undo_command(change::pointer cp, user_ty::pointer up); int change_run_test_command(change::pointer cp, user_ty::pointer up, string_ty *, string_ty *, int, int, const nstring_list &variable_assignments); int change_run_development_test_command(change::pointer cp, user_ty::pointer up, string_ty *, string_ty *, int, int, const nstring_list &variable_assignments); void change_run_build_command(change::pointer ); void change_run_build_time_adjust_notify_command(change::pointer ); void change_run_development_build_command(change::pointer , user_ty::pointer , string_list_ty *); /** * The change_run_develop_end_policy_command function is used to * run the develop_end_policy_command specified in the project * configuration file. * * @param cp * The change in question. * @param up * The developer of the change. * @note * This function does not return if the command exits with a * non-zero exit status. */ void change_run_develop_end_policy_command(change::pointer cp, user_ty::pointer up); string_ty *change_file_whiteout(change::pointer , string_ty *); void change_file_whiteout_write(change::pointer cp, string_ty *path, user_ty::pointer up); void change_become(change::pointer ); void change_become_undo(change::pointer cp); void change_developer_become(change::pointer ); void change_developer_become_undo(change::pointer cp); int change_umask(change::pointer ); void change_development_directory_clear(change::pointer ); void change_integration_directory_clear(change::pointer ); void change_architecture_clear(change::pointer ); void change_architecture_add(change::pointer , string_ty *); void change_architecture_query(change::pointer ); string_ty *change_architecture_name(change::pointer , int); string_ty *change_run_architecture_discriminator_command(change::pointer cp); cstate_architecture_times_ty *change_architecture_times_find(change::pointer , string_ty *); void change_build_time_set(change::pointer ); /** * The change_test_time_set function is used to set the test time for a * change. The architecture of the currently executing session is used. * * @param cp * The change in question. * @param when * The time the test was performed. */ void change_test_time_set(change::pointer cp, time_t when); /** * The change_test_time_set function is used to set the test time for a * change, for the given architecture variant. * * @param cp * The change in question. * @param variant * The name of the architecture of interest. * @param when * The time the test was performed. */ void change_test_time_set(change::pointer cp, string_ty *variant, time_t when); /** * The change_test_baseline_time_set function is used to set the * baseline test time for a change. The architecture of the currently * executing session is used. * * @param cp * The change in question. * @param when * The time the test was performed. */ void change_test_baseline_time_set(change::pointer cp, time_t when); /** * The change_test_baseline_time_set function is used to set the test * time for a change, for the given architecture variant. * * @param cp * The change in question. * @param variant * The name of the architecture of interest. * @param when * The time the test was performed. */ void change_test_baseline_time_set(change::pointer cp, string_ty *variant, time_t when); /** * The change_regression_test_time_set function is used to set (or * clear) the regression test time stamp of the chanegh set. * * @param cp * The change set in question. * @param when * The time the test was performed, or zero to clear the time. * @param arch_name * The name of the architecture, or the NULL pointer to mean "the * current one". */ void change_regression_test_time_set(change::pointer cp, time_t when, string_ty *arch_name = 0); void change_test_times_clear(change::pointer ); void change_build_times_clear(change::pointer ); void change_architecture_from_pconf(change::pointer ); const char *change_outstanding_builds(change::pointer , time_t); const char *change_outstanding_tests(change::pointer , time_t); const char *change_outstanding_tests_baseline(change::pointer , time_t); const char *change_outstanding_tests_regression(change::pointer , time_t); int change_pathconf_name_max(change::pointer ); string_ty *change_filename_check(change::pointer , string_ty *); void change_create_symlinks_to_baseline(change::pointer , user_ty::pointer , const work_area_style_ty &); /** * The change_maintain_symlinks_to_baseline is used to repair the * symbolic links (etc) as dictated by the development_directory_style * field of the project configuration file. * * The "symlink" in the name is an historical accident, it also * maintains the hard links and copies as well. * * @param cp * The change to operatte on * @param up * The user to operate as * @param undoing * True if this call is in response to and undo operation (aecpu, * aemtu) because they need special attention for file time stamps. * Defaults to false if not specified. * * \note * This function is NOT to be called by aeb, because it needs * different logic. * \note * This function may only be called when the change is in the * "being developed" state. */ void change_maintain_symlinks_to_baseline(change::pointer cp, user_ty::pointer up, bool undoing = false); void change_remove_symlinks_to_baseline(change::pointer , user_ty::pointer , const work_area_style_ty &); void change_rescind_test_exemption(change::pointer ); string_ty *change_cstate_filename_get(change::pointer ); /** * The change_fstate_filename_get function is used to obtain the * absolute path of the file which holds the change's file state. * * @param cp * The change being operated on. * @returns * a string. DO NOT str_free it when you are done with it, * it is cached. */ string_ty *change_fstate_filename_get(change::pointer cp); /** * The change_pfstate_filename_get function is used to obtain the * absolute path of the file which holds the delta's cache of the * project file state. * * @param cp * The change being operated on. * @returns * a string. DO NOT str_free it when you are done with it, * it is cached. */ string_ty *change_pfstate_filename_get(change::pointer cp); void change_rescind_test_exemption_undo(change::pointer ); void change_force_regression_test_exemption(change::pointer ); void change_force_regression_test_exemption_undo(change::pointer ); void change_check_architectures(change::pointer ); string_ty *change_new_test_filename_get(change::pointer , long, int); string_ty *change_development_directory_template(change::pointer , user_ty::pointer ); string_ty *change_metrics_filename_pattern_get(change::pointer ); /** * The change_is_awaiting_development function returns true if the * given change is in the awaiting development state, and false if it * is not. */ inline DEPRECATED bool change_is_awaiting_development(change::pointer cp) { return cp->is_awaiting_development(); } /** * The change_is_being_developed function returns true (non-zero) if * the given change is in the being developed state, and false (zero) * if it is not. */ inline DEPRECATED int change_is_being_developed(change::pointer cp) { return cp->is_being_developed(); } /** * The change_is_being_integrated function is used to determine whether * or not a change is in the being integrated state. * * @param cp * The change in question. * @returns * bool; true if the given change is in the being integarted state, * and false if it is not. */ inline DEPRECATED bool change_is_being_integrated(change::pointer cp) { return cp->is_being_integrated(); } /** * The change_is_completed function returns true (non-zero) if the given * change is in the completed state, and false (zero) if it is not. */ inline DEPRECATED int change_is_completed(change::pointer cp) { return cp->is_completed(); } /** * The change_delta_number_get function is used to get the delta number * of a change, or zero if the change is not yet completed. */ long change_delta_number_get(change::pointer ); /** * The change_brief_description_get function may be used to get the * brief_descriotion field of the change attributes. */ string_ty *change_brief_description_get(change::pointer ); /** * The change_uuid_set function is used to set a change's UUID, * if it has not been set already. */ void change_uuid_set(change::pointer cp); /** * The change_uuid_clear function is used to clear a change's UUID, * if it has been set in the past. */ void change_uuid_clear(change::pointer cp); /** * The change_reviewer_list function is used to get the list of * reviewers since the last develop_end. There can be more than one * if the review_policy_command filed of the project configuration is * being used. * * \param cp * The change to be consulted. * \param result * where to put the answers. */ void change_reviewer_list(change::pointer cp, string_list_ty &result); /** * The change_reviewer_already function is used to determine if a user * has already reviewed a change, since the last develop end. * * \param cp * The change to be consulted. * \param login * The login name of the user in question. * \returns * bool; true if the user has reviewed already, false if not. */ bool change_reviewer_already(change::pointer cp, string_ty *login); /** * The change_reviewer_already function is used to determine if a user * has already reviewed a change, since the last develop end. * * @param cp * The change to be consulted. * @param login * The login name of the user in question. * @returns * bool; true if the user has reviewed already, false if not. */ bool change_reviewer_already(change::pointer cp, const nstring &login); /** * The change_when_get function is used to obtain the last (most * recent) time for the given state transition. * * @param cp * The change in qiestion. * @param what * The state transition to look for. * @returns * time_t; the time of the event, or 0 if not found. */ time_t change_when_get(change::pointer cp, cstate_history_what_ty what); /** * The change_diff_required function is used to see of the project (and * this specific change set) need the diff command to be run. * * @param cp * The change in question. * @returns * bool; true if diff command needs to be run, false if not. */ bool change_diff_required(change::pointer cp); /** * The change_build_required function is used to see of the project (and * this specific change set) need the build command to be run. * * @param cp * The change in question. * @param conf_exists * true if the project configuration file must exist (causing fatal * error if it does not), or false if it doesn't matter. * @returns * bool; true if build command needs to be run, false if not. */ bool change_build_required(change::pointer cp, bool conf_exists = true); #endif // LIBAEGIS_CHANGE_H