Aegis  4.25.D505
/home/archives/aegis/branch.4/branch.25/delta28933.505/libaegis/change.h
Go to the documentation of this file.
00001 //
00002 // aegis - project change supervisor
00003 // Copyright (C) 1995-2009, 2011, 2012 Peter Miller
00004 // Copyright (C) 2007, 2008 Walter Franzini
00005 //
00006 // This program is free software; you can redistribute it and/or modify
00007 // it under the terms of the GNU General Public License as published by
00008 // the Free Software Foundation; either version 3 of the License, or (at
00009 // your option) any later version.
00010 //
00011 // This program is distributed in the hope that it will be useful,
00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014 // General Public License for more details.
00015 //
00016 // You should have received a copy of the GNU General Public License
00017 // along with this program. If not, see <http://www.gnu.org/licenses/>.
00018 //
00019 
00020 #ifndef LIBAEGIS_CHANGE_H
00021 #define LIBAEGIS_CHANGE_H
00022 
00023 #include <libaegis/cstate.fmtgen.h>
00024 #include <libaegis/fstate.fmtgen.h>
00025 #include <libaegis/pconf.fmtgen.h>
00026 #include <libaegis/view_path.h>
00027 #include <libaegis/zero.h>
00028 
00029 class nstring_list; // forward
00030 
00031 //
00032 // Name of the project configuration file,
00033 // relative to the baseline/devdir root.
00034 //
00035 #define THE_CONFIG_FILE_OLD "config"
00036 #define THE_CONFIG_FILE_NEW "aegis.conf"
00037 
00038 #include <libaegis/user.h>
00039 
00040 //
00041 // Define a magic number to represent the trunk transaction
00042 // of the project.  It has an exceptional file name.
00043 //
00044 #define TRUNK_CHANGE_NUMBER ((long)((~(unsigned long)0) >> 1))
00045 
00046 #define TIME_NOT_SET (time_t)0
00047 #define UUID_NOT_SET (string_ty*)0
00048 
00049 struct string_list_ty; // forward
00050 struct sub_context_ty; // forward
00051 struct symtab_ty; // forward
00052 class project; // forward
00053 
00054 class change
00055 {
00056 public:
00063     typedef change *pointer;
00064 
00065     long                reference_count;
00066     project          *pp;
00067     long                number;
00068     cstate_ty           *cstate_data;
00069     string_ty           *cstate_filename;
00070     int                 cstate_is_a_new_file;
00071     fstate_ty           *fstate_data;
00072     symtab_ty           *fstate_stp;
00073     symtab_ty           *fstate_uuid_stp;
00074     string_ty           *fstate_filename;
00075     fstate_ty           *pfstate_data;
00076     symtab_ty           *pfstate_stp;
00077     symtab_ty           *pfstate_uuid_stp;
00078     string_ty           *pfstate_filename;
00079     int                 fstate_is_a_new_file;
00080     string_ty           *top_path_unresolved;
00081     string_ty           *top_path_resolved;
00082     string_ty           *development_directory_unresolved;
00083     string_ty           *development_directory_resolved;
00084     string_ty           *integration_directory_unresolved;
00085     string_ty           *integration_directory_resolved;
00086     string_ty           *logfile;
00087     pconf_ty            *pconf_data;
00088     long                lock_magic;
00089     int                 bogus;
00090     string_ty           *architecture_name;
00091     string_list_ty      *file_list[view_path_MAX];
00092     bool                project_specific_setenv_performed;
00093 
00094     // NOTE: methods are sorted alphabetically.  To have methods
00095     // grouped, make sure they change their suffix rather than their
00096     // prefix.  E.g. thingumy_get and thingumy_set rather than
00097     // get_thingumy and set_thingumy.
00098 
00099     // ----------  A  ------------------------------------------------------
00100 
00112     nstring attributes_get(const nstring &name);
00113 
00127     bool attributes_get_boolean(const nstring &name);
00128 
00129     // ----------  B  ------------------------------------------------------
00130 
00135     nstring brief_description_get(void);
00136 
00137     // ----------  C  ------------------------------------------------------
00138 
00144     nstring copyright_years_get_string(void);
00145 
00151     time_t completion_timestamp(void);
00152 
00161     string_ty *creator_name(void);
00162 
00171     string_ty *cstate_filename_get(void);
00172 
00177     cstate_ty *cstate_get(void);
00178 
00183     void cstate_write(void);
00184 
00185     // ----------  D  ------------------------------------------------------
00186 
00191     long delta_number_get(void);
00192 
00197     nstring description_get(void);
00198 
00208     string_ty *developer_name(void);
00209 
00215     user_ty::pointer developer_user_get(void);
00216 
00217     // ----------  E  ------------------------------------------------------
00218 
00219     // ----------  F  ------------------------------------------------------
00220 
00228     bool file_exists(const nstring &filename);
00229 
00239     fstate_src_ty *file_find(const nstring &filename, view_path_ty vp);
00240 
00251     fstate_src_ty *file_find(fstate_src_ty *src, view_path_ty vp);
00252 
00263     fstate_src_ty *file_find(cstate_src_ty *src, view_path_ty vp);
00264 
00273     fstate_src_ty *file_find(const nstring &filename);
00274 
00284     fstate_src_ty *file_find_fuzzy(const nstring &filename, view_path_ty vp);
00285 
00298     fstate_src_ty *file_find_uuid(string_ty *uuid, view_path_ty view_path);
00299 
00312     fstate_src_ty *file_find_uuid(const nstring &uuid, view_path_ty view_path);
00313 
00325     fstate_src_ty *file_new(string_ty *file_name);
00326 
00340     fstate_src_ty *file_new(fstate_src_ty *meta);
00341 
00352     string_ty *file_path(string_ty *file_name);
00353 
00364     nstring file_path(const nstring &file_name);
00365 
00376     string_ty *file_path(fstate_src_ty *src);
00377 
00388     string_ty *file_path_by_uuid(string_ty *uuid);
00389 
00400     nstring file_path_by_uuid(const nstring &uuid);
00401 
00420     bool file_promote(void);
00421 
00435     string_ty *file_resolve_name(user_ty::pointer up, string_ty *file_name);
00436 
00450     nstring file_resolve_name(user_ty::pointer up, const nstring &file_name);
00451 
00463     void file_resolve_names(user_ty::pointer up, string_list_ty &file_names);
00464 
00477     bool file_unchanged(fstate_src_ty *src_data, user_ty::pointer up);
00478 
00488     bool file_is_config(string_ty *name);
00489 
00497     bool download_files_accessable(void);
00498 
00499 private:
00508     void fimprove(fstate_ty *fstate_data);
00509 
00510 public:
00520     fstate_ty *fstate_get(void);
00521 
00522     // ----------  G  ------------------------------------------------------
00523 
00528     int gid_get() const;
00529 
00530     // ----------  H  ------------------------------------------------------
00531 
00532     // ----------  I  ------------------------------------------------------
00533 
00542     nstring integration_directory_get(bool resolve);
00543 
00553     string_ty *integrator_name(void);
00554 
00561     bool is_a_branch(void);
00562 
00568     bool is_awaiting_development(void);
00569 
00574     bool is_being_developed(void);
00575 
00584     bool is_being_integrated(void);
00585 
00590     bool is_completed(void);
00591 
00592     // ----------  J  ------------------------------------------------------
00593 
00594     // ----------  K  ------------------------------------------------------
00595 
00596     // ----------  L  ------------------------------------------------------
00597 
00598     // ----------  M  ------------------------------------------------------
00599 
00600     // ----------  N  ------------------------------------------------------
00601 
00602     // ----------  O  ------------------------------------------------------
00603 
00604     // ----------  P  ------------------------------------------------------
00605 
00619     nstring pconf_attributes_find(const nstring &name);
00620 
00636     bool pconf_attributes_get_boolean(const nstring &name, bool dflt = false);
00637 
00642     nstring pconf_copyright_owner_get(void);
00643 
00649     fstate_ty *pfstate_get(void);
00650 
00659     void project_specific_setenv_performed_set(void);
00660 
00670     bool project_specific_setenv_performed_get() const;
00671 
00672     // ----------  Q  ------------------------------------------------------
00673 
00674     // ----------  R  ------------------------------------------------------
00675 
00685     string_ty *reviewer_name(void);
00686 
00695     bool run_project_file_command_needed(void);
00696 
00707     void run_project_file_command(const user_ty::pointer &up);
00708 
00717     void run_project_file_command_done(void);
00718 
00728     void run_new_file_command(string_list_ty *slp, const user_ty::pointer &up);
00729 
00739     void run_new_file_undo_command(string_list_ty *slp,
00740         const user_ty::pointer &up);
00741 
00751     void run_new_test_command(string_list_ty *slp,
00752         const user_ty::pointer &up);
00753 
00763     void run_new_test_undo_command(string_list_ty *slp,
00764         const user_ty::pointer &up);
00765 
00775     void run_copy_file_command(string_list_ty *slp, const user_ty::pointer &up);
00776 
00786     void run_copy_file_undo_command(string_list_ty *slp,
00787         const user_ty::pointer &up);
00788 
00798     void run_remove_file_command(string_list_ty *slp,
00799         const user_ty::pointer &up);
00800 
00811     void run_remove_file_undo_command(string_list_ty *slp,
00812         const user_ty::pointer &up);
00813 
00824     void run_make_transparent_command(string_list_ty *slp,
00825         const user_ty::pointer &up);
00826 
00837     void run_make_transparent_undo_command(string_list_ty *slp,
00838         const user_ty::pointer &up);
00839 
00848     void run_forced_develop_begin_notify_command(const user_ty::pointer &up);
00849 
00855     void run_develop_end_notify_command(void);
00856 
00862     void run_develop_end_undo_notify_command(void);
00863 
00869     void run_review_begin_notify_command(void);
00870 
00876     void run_review_begin_undo_notify_command(void);
00877 
00883     void run_review_pass_notify_command(void);
00884 
00890     void run_review_pass_undo_notify_command(void);
00891 
00897     void run_review_fail_notify_command(void);
00898 
00904     void run_integrate_pass_notify_command(void);
00905 
00911     void run_integrate_fail_notify_command(void);
00912 
00922     void run_develop_begin_early_command(user_ty::pointer up);
00923 
00933     void run_develop_begin_command(user_ty::pointer up);
00934 
00935     // ----------  S  ------------------------------------------------------
00936 
00947     void search_path_get(string_list_ty *result, bool resolve);
00948 
00959     void search_path_get(nstring_list &result, bool resolve);
00960 
00961     // ----------  T  ------------------------------------------------------
00962 
00963     time_t time_limit_get(void);
00964 
00971     int umask_get() const;
00972 
00973     // ----------  U  ------------------------------------------------------
00974 
00982     nstring uuid_get(void);
00983 
00992     void uuid_get_list(nstring_list &uuids);
00993 
00994     // ----------  V  ------------------------------------------------------
00995 
01003     nstring version_debian_get(void);
01004 
01011     nstring version_rpm_get(void);
01012 
01019     nstring version_get(void);
01020 
01021     // ----------  W  ------------------------------------------------------
01022 
01029     bool was_a_branch(void);
01030 
01031     // ----------  X  ------------------------------------------------------
01032 
01033     // ----------  Y  ------------------------------------------------------
01034 
01035     // ----------  Z  ------------------------------------------------------
01036 
01037     // ---------------------------------------------------------------------
01038     // PLEASE keep the above method declarations in alphabetical order.
01039 
01040     //
01041     // If you add instance variables to this class, don't forget to update
01042     // change_alloc()     in libaegis/change/alloc.cc
01043     // change_free()      in libaegis/change/free.cc
01044     // change_lock_sync() in libaegis/change/lock_sync.cc
01045     //
01046 };
01047 
01048 change::pointer change_alloc(project *, long);
01049 void change_free(change::pointer );
01050 change::pointer change_copy(change::pointer );
01051 void change_bind_existing(change::pointer );
01052 int change_bind_existing_errok(change::pointer );
01053 void change_bind_new(change::pointer );
01054 change::pointer change_bogus(project *);
01055 
01056 cstate_history_ty *change_history_new(change::pointer , user_ty::pointer );
01057 
01058 void change_top_path_set(change::pointer , string_ty *);
01059 void change_top_path_set(change::pointer , const nstring &);
01060 void change_development_directory_set(change::pointer , string_ty *);
01061 void change_integration_directory_set(change::pointer , string_ty *);
01062 string_ty *change_top_path_get(change::pointer , int);
01063 string_ty *change_development_directory_get(change::pointer , int);
01064 string_ty *change_integration_directory_get(change::pointer , int);
01065 string_ty *change_logfile_basename(void);
01066 string_ty *change_logfile_get(change::pointer );
01067 void change_cstate_lock_prepare(change::pointer );
01068 void change_error(change::pointer , sub_context_ty *, const char *);
01069 void change_fatal(change::pointer , sub_context_ty *, const char *) NORETURN;
01070 void change_verbose(change::pointer , sub_context_ty *, const char *);
01071 
01078 void change_warning(change::pointer , sub_context_ty *, const char *);
01079 
01085 void change_warning_obsolete_field(change::pointer cp, string_ty *errpos,
01086     const char *old_field, const char *new_field);
01087 
01088 pconf_ty *change_pconf_get(change::pointer , int);
01089 
01090 // use cp->run_new_file_command instead
01091 void change_run_new_file_command(change::pointer cp, string_list_ty *slp,
01092     user_ty::pointer up) DEPRECATED;
01093 
01094 // use cp->run_new_file_undo_command instead
01095 void change_run_new_file_undo_command(change::pointer cp, string_list_ty *slp,
01096     user_ty::pointer up) DEPRECATED;
01097 
01098 // use cp->run_new_test_command instead
01099 void change_run_new_test_command(change::pointer cp, string_list_ty *slp,
01100     user_ty::pointer up) DEPRECATED;
01101 
01102 // use cp->run_new_test_undo_command instead
01103 void change_run_new_test_undo_command(change::pointer cp, string_list_ty *slp,
01104     user_ty::pointer up) DEPRECATED;
01105 
01106 // use cp->run_copy_file_command instead
01107 void change_run_copy_file_command(change::pointer cp, string_list_ty *slp,
01108     user_ty::pointer up) DEPRECATED;
01109 
01110 // use cp->run_copy_file_undo_command instead
01111 void change_run_copy_file_undo_command(change::pointer cp, string_list_ty *slp,
01112     user_ty::pointer up) DEPRECATED;
01113 
01114 // use cp->run_remove_file_command instead
01115 void change_run_remove_file_command(change::pointer cp, string_list_ty *slp,
01116     user_ty::pointer up) DEPRECATED;
01117 
01118 // use cp->run_remove_file_undo_command instead
01119 void change_run_remove_file_undo_command(change::pointer cp,
01120     string_list_ty *slp, user_ty::pointer up) DEPRECATED;
01121 
01122 // use cp->run_make_transparent_command instead
01123 void change_run_make_transparent_command(change::pointer cp,
01124     string_list_ty *slp, user_ty::pointer up) DEPRECATED;
01125 
01126 // use cp->run_make_transparent_undo_command instead
01127 void change_run_make_transparent_undo_command(change::pointer cp,
01128     string_list_ty *slp, user_ty::pointer up) DEPRECATED;
01129 
01130 // use vp->run_project_file_command_needed() instead
01131 int change_run_project_file_command_needed(change::pointer cp) DEPRECATED;
01132 
01133 // use cp->run_project_file_command(up) instead
01134 void change_run_project_file_command(change::pointer cp, user_ty::pointer up)
01135     DEPRECATED;
01136 
01137 // use cp->run_forced_develop_begin_notify_command instead
01138 void change_run_forced_develop_begin_notify_command(change::pointer cp,
01139     user_ty::pointer up) DEPRECATED;
01140 
01141 // use cp->run_develop_end_notify_command instead
01142 void change_run_develop_end_notify_command(change::pointer cp) DEPRECATED;
01143 
01144 // use cp->run_develop_end_undo_notify_command instead
01145 void change_run_develop_end_undo_notify_command(change::pointer cp) DEPRECATED;
01146 
01147 // use cp->run_review_begin_notify_command instead
01148 void change_run_review_begin_notify_command(change::pointer cp) DEPRECATED;
01149 
01150 // use cp->run_review_begin_undo_notify_command
01151 void change_run_review_begin_undo_notify_command(change::pointer cp) DEPRECATED;
01152 
01153 // use cp->run_review_pass_notify_command instead
01154 void change_run_review_pass_notify_command(change::pointer cp) DEPRECATED;
01155 
01156 // use cp->run_review_pass_undo_notify_command instead
01157 void change_run_review_pass_undo_notify_command(change::pointer cp) DEPRECATED;
01158 
01159 // use cp->run_review_fail_notify_command instead
01160 void change_run_review_fail_notify_command(change::pointer cp) DEPRECATED;
01161 
01162 // use cp->run_integrate_pass_notify_command instead
01163 void change_run_integrate_pass_notify_command(change::pointer cp) DEPRECATED;
01164 
01165 // use cp->run_integrate_fail_notify_command instead
01166 void change_run_integrate_fail_notify_command(change::pointer cp) DEPRECATED;
01167 
01168 void change_run_history_get_command(change::pointer cp, fstate_src_ty *src,
01169     string_ty *output_file, user_ty::pointer up);
01170 void change_run_history_create_command(change::pointer cp, fstate_src_ty *);
01171 void change_run_history_put_command(change::pointer cp, fstate_src_ty *);
01172 
01185 string_ty *change_run_history_query_command(change::pointer cp,
01186     fstate_src_ty *src);
01187 
01188 void change_run_history_label_command(change::pointer cp, fstate_src_ty *,
01189     string_ty *label);
01190 
01200 void change_run_history_transaction_begin_command(change::pointer cp);
01201 
01211 void change_run_history_transaction_end_command(change::pointer cp);
01212 
01222 void change_run_history_transaction_abort_command(change::pointer cp);
01223 
01224 void change_history_trashed_fingerprints(change::pointer , string_list_ty *);
01225 void change_run_diff_command(change::pointer cp, user_ty::pointer up,
01226     string_ty *original, string_ty *input, string_ty *output);
01227 void change_run_diff3_command(change::pointer cp, user_ty::pointer up,
01228     string_ty *original, string_ty *most_recent, string_ty *input,
01229     string_ty *output);
01230 void change_run_merge_command(change::pointer cp, user_ty::pointer up,
01231     string_ty *original, string_ty *most_recent, string_ty *input,
01232     string_ty *output);
01233 void change_run_patch_diff_command(change::pointer cp, user_ty::pointer up,
01234     string_ty *original, string_ty *input, string_ty *output,
01235     string_ty *index_name);
01236 void change_run_annotate_diff_command(change::pointer cp, user_ty::pointer up,
01237     string_ty *original, string_ty *input, string_ty *output,
01238     string_ty *index_name, const char *diff_option);
01239 int change_has_merge_command(change::pointer );
01240 void change_run_integrate_begin_command(change::pointer );
01241 void change_run_integrate_begin_undo_command(change::pointer );
01242 
01243 void change_run_develop_begin_command(change::pointer cp, user_ty::pointer up)
01244     DEPRECATED;
01245 
01246 void change_run_develop_begin_undo_command(change::pointer cp,
01247     user_ty::pointer up);
01248 int change_run_test_command(change::pointer cp, user_ty::pointer up,
01249     string_ty *, string_ty *, int, int,
01250     const nstring_list &variable_assignments);
01251 int change_run_development_test_command(change::pointer cp, user_ty::pointer up,
01252     string_ty *, string_ty *, int, int,
01253     const nstring_list &variable_assignments);
01254 void change_run_build_command(change::pointer );
01255 void change_run_build_time_adjust_notify_command(change::pointer );
01256 void change_run_development_build_command(change::pointer , user_ty::pointer ,
01257     string_list_ty *);
01258 
01272 void change_run_develop_end_policy_command(change::pointer cp,
01273     user_ty::pointer up);
01274 
01275 string_ty *change_file_whiteout(change::pointer , string_ty *);
01276 void change_file_whiteout_write(change::pointer cp, string_ty *path,
01277     user_ty::pointer up);
01278 void change_become(change::pointer );
01279 void change_become_undo(change::pointer cp);
01280 void change_developer_become(change::pointer );
01281 void change_developer_become_undo(change::pointer cp);
01282 
01283 void change_development_directory_clear(change::pointer );
01284 void change_integration_directory_clear(change::pointer );
01285 void change_architecture_clear(change::pointer );
01286 void change_architecture_add(change::pointer , string_ty *);
01287 void change_architecture_query(change::pointer );
01288 string_ty *change_architecture_name(change::pointer , int);
01289 string_ty *change_run_architecture_discriminator_command(change::pointer cp);
01290 cstate_architecture_times_ty *change_architecture_times_find(change::pointer ,
01291                                                              string_ty *);
01292 void change_build_time_set(change::pointer );
01293 
01303 void change_test_time_set(change::pointer cp, time_t when);
01304 
01316 void change_test_time_set(change::pointer cp, string_ty *variant, time_t when);
01317 
01328 void change_test_baseline_time_set(change::pointer cp, time_t when);
01329 
01341 void change_test_baseline_time_set(change::pointer cp, string_ty *variant,
01342     time_t when);
01343 
01356 void change_regression_test_time_set(change::pointer cp, time_t when,
01357     string_ty *arch_name = 0);
01358 
01359 void change_test_times_clear(change::pointer );
01360 void change_build_times_clear(change::pointer );
01361 void change_architecture_from_pconf(change::pointer );
01362 
01363 const char *change_outstanding_builds(change::pointer , time_t);
01364 const char *change_outstanding_tests(change::pointer , time_t);
01365 const char *change_outstanding_tests_baseline(change::pointer , time_t);
01366 const char *change_outstanding_tests_regression(change::pointer , time_t);
01367 
01368 int change_pathconf_name_max(change::pointer );
01369 string_ty *change_filename_check(change::pointer , string_ty *);
01370 
01371 void change_create_symlinks_to_baseline(change::pointer , user_ty::pointer ,
01372     const work_area_style_ty &);
01373 
01398 void change_maintain_symlinks_to_baseline(change::pointer cp,
01399     user_ty::pointer up, bool undoing = false);
01400 
01401 void change_remove_symlinks_to_baseline(change::pointer , user_ty::pointer ,
01402     const work_area_style_ty &);
01403 
01404 void change_rescind_test_exemption(change::pointer );
01405 
01416 string_ty *change_fstate_filename_get(change::pointer cp);
01417 
01429 string_ty *change_pfstate_filename_get(change::pointer cp);
01430 
01431 void change_rescind_test_exemption_undo(change::pointer );
01432 void change_force_regression_test_exemption(change::pointer );
01433 void change_force_regression_test_exemption_undo(change::pointer );
01434 
01435 void change_check_architectures(change::pointer );
01436 string_ty *change_new_test_filename_get(change::pointer , long, int);
01437 string_ty *change_development_directory_template(change::pointer ,
01438                                                  user_ty::pointer );
01439 string_ty *change_metrics_filename_pattern_get(change::pointer );
01440 
01445 void change_uuid_set(change::pointer cp);
01446 
01451 void change_uuid_clear(change::pointer cp);
01452 
01464 void change_reviewer_list(change::pointer cp, string_list_ty &result);
01465 
01477 bool change_reviewer_already(change::pointer cp, string_ty *login);
01478 
01490 bool change_reviewer_already(change::pointer cp, const nstring &login);
01491 
01503 time_t change_when_get(change::pointer cp, cstate_history_what_ty what);
01504 
01514 bool change_diff_required(change::pointer cp);
01515 
01528 bool change_build_required(change::pointer cp, bool conf_exists = true);
01529 
01530 // vim: set ts=8 sw=4 et :
01531 #endif // LIBAEGIS_CHANGE_H