//
// aegis - project change supervisor
// Copyright (C) 2001-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_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.
*/
project_file_roll_forward(project_ty *pp, time_t limit, int detailed);
/**
* The set method is used to recapitilate
* the project's history, constructing information about the state
* of all files as it goes. The project_file_roll_forward_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_ty *pp, time_t limit, int detailed);
/**
* The project_file_roll_forward_get function 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(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 project_file_roll_forward_get function is used to obtain the
* events for a given file, once project_file_roll_forward has been
* called to construct the information.
*
* \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 project_file_roll_forward_get function is used to obtain the
* events for a given file, once project_file_roll_forward has been
* called to construct the information.
*
* \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 project_file_roll_forward_get_older function is used to get the
* last-but-one file event, 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.
*/
file_event *get_older(const nstring &filename);
/**
* The project_file_roll_forward_get_older function is used to get the
* last-but-one file event, 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() 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() 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_ty *pp, time_t limit, int 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