// // aegis - project change supervisor // Copyright (C) 2001-2008, 2011, 2012 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_PROJECT_FILE_ROLL_FORWARD_H #define LIBAEGIS_PROJECT_FILE_ROLL_FORWARD_H #include #include #include #include #include #include class nstring_list; // forward struct cstate_src_ty; // forward class file_event; class project_file_roll_forward { public: /** * The destructor. */ virtual ~project_file_roll_forward(); /** * The default constructor. */ project_file_roll_forward(); /** * See the set() method for documentation. * * @param pp * The project to apply the listing to. * All parent branches will be visited, too. * @param limit * The time limit for changes. Changes on or before this * time will be included. * @param detailed * If this is false, only the parent branches and the * project itself are visited. If this is true, all branches * completed within the limt will be visited. */ project_file_roll_forward(project *pp, time_t limit, bool detailed); /** * The set method is used to recapitilate the project's history, * constructing information about the state of all files as it * goes. The #get function is used to extract the results. * * @param pp * The project to apply the listing to. * All parent branches will be visited, too. * @param limit * The time limit for changes. Changes on or before this * time will be included. * @param detailed * If this is false, only the parent branches and the * project itself are visited. If this is true, all branches * completed within the limt will be visited. * * @note * This function is one really big memory leak. */ void set(project *pp, time_t limit, bool detailed); /** * The get method is used to obtain the events for a given file. * * @param src * The file description of the file to fetch the event * list. Will use the uuid if available (or, for backwards * compatibility) the file name. * @returns * Pointer to the event list for the named file, or NULL if the * file has never existed at the time (delta) specified. * @note * Do not free the change pointed to, as it may be referenced by * other files' histories. */ file_event_list::pointer get(fstate_src_ty *src); /** * The get method is used to obtain the events for a given file, * once project_file_roll_forward has been called to construct the * information. * * @param src * The file description of the file to fetch the event * list. Will use the uuid if available (or, for backwards * compatibility) the file name. * @returns * Pointer to the event list for the named file, or NULL if the * file has never existed at the time (delta) specified. * @note * Do not free the change pointed to, as it may be referenced by * other files' histories. */ file_event_list::pointer get(cstate_src_ty *src); /** * The get method is used to obtain the events for a given file. * * @param filename * The name of the file to fetch the event list * @returns * Pointer to the event list for the named file, or NULL if the * file has never existed at the time (delta) specified. * @note * Do not free the change pointed to, as it may be referenced by * other files' histories. */ file_event_list::pointer get(const nstring &filename); /** * The get function is used to obtain the events for a given file. * * @param filename * The name of the file to fetch the event list * @returns * Pointer to the event list for the named file, or NULL if the * file has never existed at the time (delta) specified. * @note * Do not free the change pointed to, as it may be referenced by * other files' histories. * @note * This method will be DEPRECATED one day. */ file_event_list::pointer get(string_ty *filename); /** * The get_last method is used to get the last file event, used by * most functions which deal with deltas. * * @param filename * The name of the file to fetch the last event * @returns * Pointer to the last event for the named file, or NULL if the * file has never existed at the time (delta) specified. */ file_event *get_last(const nstring &filename); /** * The get_last method is used to get the last file event, used by * most functions which deal with deltas. * * @param filename * The name of the file to fetch the last event * @returns * Pointer to the last event for the named file, or NULL if the * file has never existed at the time (delta) specified. * @note * This method will be DEPRECATED one day. */ file_event *get_last(string_ty *filename); /** * The get_last method is used to get the last file event, * using the file's meta data to identify it. * * @param src * The meta-data describing the file (any revision data, if * present, will be ignored) * @returns * Pointer to the last event for the named file, or NULL if the * file has never existed at the time (delta) specified. */ file_event *get_last(fstate_src_ty *src); /** * The get_last_dir method is used to examine possible #get_last * candidates, looking for those that may fall within the given * directory. * * @param dirname * The name of a directory to search for files. * @returns * The empty list of there are no candidates, or a list of one * or more files, if the directory contained some files. Also, * if it was a file and not a directory, a list of one filename * will be returned. */ nstring_list get_last_dir(const nstring &dirname); /** * The get_last_fuzzy method is used to find the filename closest * to the given filename. * * @param filename * the name of the file to look for. * @returns * the most similar file name, or the empty string if none are * sufficiently close. */ nstring get_last_fuzzy(const nstring &filename); /** * The get_older method is used to get the last-but-one file event, * used by e.g. aecp -rescind to roll back a change. * * @param filename * The name of the file to fetch the last event * @returns * Pointer to the last event for the named file, or NULL if the * file has never existed at the time (delta) specified. */ file_event *get_older(const nstring &filename); /** * The get_older function is used to get the last-but-one file * event, e.g. used by aecp -rescind to roll back a change. * * @param filename * The name of the file to fetch the last event * @returns * Pointer to the last event for the named file, or NULL if the * file has never existed at the time (delta) specified. * @note * This method will be DEPRECATED one day. */ file_event *get_older(string_ty *filename); /** * The keys method is used to get a list of filenames for which * file event lists are available. * * @param file_name_list * Where to put the list of file names. */ void keys(nstring_list &file_name_list); /** * The is_set method is used to determine if the #set method has * been invoked, directly or indirectly. * * @returns * bool: true if it has been set, false if not. */ bool is_set(void) const { return !uuid_to_felp.empty(); } /** * The get_last_change method is used to get the pointer to the * last change set in the reconstructed history. */ change::pointer get_last_change(void) const; private: /** * The get_by_uuid method is used by several of the simpler get * methods, once they have performed the uuid-or-filename transform. * * @param uuid * The UUID of the file, if it has one, otherwise the name of * the file. */ file_event_list::pointer get_by_uuid(string_ty *uuid); /** * The uuid_to_felp instance variable is used to remember the * mapping from UUIS to file history (for backwards compatibility, * index by filename if no UUID is available). */ symtab uuid_to_felp; /** * The filename_to_uuid method is used to map user perception of * filename (which can vary over time) to the file's UUID (which is * invariant). */ symtab filename_to_uuid; /** * The stp_time instance variable is used to remember the most * recent event for any file for the whole reconstruction. */ time_t stp_time; /** * The last_change instance variable is used to remember the last * change in the historical reconstruction. */ change::pointer last_change; /** * The recapitulate method is used to replay the changes of a * branch, indexing each file as it goes. It recurses into parent * branches. * * @param pp * The project to recapitulate. * @param limit * The lime linit; any events after this will be ignored. * @param detailed * If true, also recurse into child branches, this gives the * maximum amount of detail available, but usually of interests * to humans (listings) rather than for file content (aecp & co). * @returns * The latest time found in any event (<= limit). */ time_t recapitulate(project *pp, time_t limit, bool detailed); /** * The copy constructor. Do not use. */ project_file_roll_forward(const project_file_roll_forward &); /** * The assignment operator. Do not use. */ project_file_roll_forward &operator=(const project_file_roll_forward &); }; #endif // LIBAEGIS_PROJECT_FILE_ROLL_FORWARD_H // vim: set ts=8 sw=4 et :