/* project-tree.h:
*
* vim:smartindent ts=8:sts=2:sta:et:ai:shiftwidth=2
****************************************************************
* Copyright (C) 2003 Tom Lord
*
* See the file "COPYING" for further information about
* the copyright and warranty status of this work.
*/
#ifndef INCLUDE__LIBARCH__PROJECT_TREE_H
#define INCLUDE__LIBARCH__PROJECT_TREE_H
#include "hackerlab/machine/types.h"
#include "hackerlab/mem/talloc.h"
#include "libawk/relational.h"
#include "libawk/associative.h"
#include "libarch/patch-id.h"
#include "libarch/patch-logs.h"
#include "libarch/inventory-entry.h"
#define ARCH_PROJECT_TREE_ANCESTRY_FILE "{arch}/+ancestry"
enum arch_tree_state
{
arch_tree_in_ok_state = 0,
arch_tree_in_resolve_conflicts,
arch_tree_in_commit_definite,
arch_tree_in_mid_commit,
};
enum arch_id_tagging_method
{
arch_names_id_tagging,
arch_implicit_id_tagging,
arch_tagline_id_tagging,
arch_explicit_id_tagging,
arch_unspecified_id_tagging, /* used in make/apply_changeset auto detect. */
};
/* forward decls */
enum arch_inventory_category;
typedef struct arch_archive arch_archive_t;
typedef struct arch_project_tree arch_project_tree_t;
#include "libarch/invent.h"
typedef struct arch_project_tree_vtable_
{
void (*init) (arch_project_tree_t *tree);
enum arch_id_tagging_method (*id_tagging_method) (arch_project_tree_t * tree, enum arch_inventory_category * cat_var, int strict);
inventory_entry_t * (*path_id) (arch_project_tree_t * tree,
int * errn,
t_uchar const * const path,
struct stat * known_lstat);
void (*changeset_inventory_traveral) (arch_project_tree_t * tree, struct arch_inventory_options * options, inv_callback callback, void * closure);
void (*mutated) (arch_project_tree_t * tree);
int *** (*vtable_end) (char const * const * const *); /* never used, makes compile fail when new methods are added but not in
a vtable. should always be last */
} arch_project_tree_vtable;
extern int *** arch_project_tree_vtable_end (char const * const * const *); /* never used, makes compile fail when new methods are added but not in
a vtable */
struct arch_project_tree
{
arch_project_tree_vtable *vtable;
t_uchar * root;
t_uchar * archive;
t_uchar * fqversion;
t_uchar * fqrevision;
rel_table ancestry;
t_uchar * version; /* deprecated */
t_uchar * revision; /* deprecated */
assoc_table local_ancestry; /* untrusted local log data */
arch_patch_log_dir_t *patch_logs; /* patch logs data */
/* these are not applicable to all trees,
* but until the object structure firms, its easier ot put them here
*/
/* force unignored files to be tagged */
int untagged_is_source;
/* tree method for getting file tags */
enum arch_id_tagging_method tag_method;
/* cached tags (tla tree specific */
assoc_table id_tagging_shortcut;
/* something */
assoc_table explicit_skips;
};
extern void arch_init_tree (t_uchar const * const tree_root);
extern t_uchar * arch_tree_root (enum arch_tree_state * state, t_uchar const * const input_dir, int accurate);
extern t_uchar * arch_tree_root_ext (void * context, enum arch_tree_state * state, t_uchar const * const input_dir, int accurate, arch_project_tree_t **object_out, int exact);
extern int arch_project_tree_dir_is_root (void * context, t_uchar const * dir, arch_project_tree_t **out);
extern t_uchar * arch_tree_ctl_dir (t_uchar const * tree_root);
extern void arch_set_tree_version (t_uchar const * tree_root, arch_patch_id * patch_id);
extern t_uchar * arch_tree_version (t_uchar const * tree_root);
extern t_uchar * arch_try_tree_version (t_uchar * cmd);
extern t_uchar * arch_try_tree_version_dir (t_uchar * cmd, arch_project_tree_t * tree);
extern void arch_start_tree_commit (arch_project_tree_t * tree, t_uchar * log);
extern void arch_finish_tree_commit (arch_project_tree_t * tree, t_uchar * archive, t_uchar * revision, t_uchar * changelog_loc);
extern void arch_abort_tree_commit (arch_project_tree_t * tree, t_uchar * archive, t_uchar * revision);
extern void arch_project_tree_init (arch_project_tree_t *tree);
extern arch_project_tree_t * arch_project_tree_new (void * context, t_uchar const * tree_root);
extern arch_project_tree_t * arch_project_tree_new_exact (void * context, t_uchar const * tree_root);
extern arch_project_tree_t * arch_project_tree_new_ext (void * context, t_uchar const * tree_root, int null_ok, int exact);
extern void arch_project_tree_finalise (arch_project_tree_t *tree);
#define arch_project_tree_delete(tree) talloc_free ((tree))
extern t_uchar * arch_project_tree_file_contents(struct arch_project_tree *tree, t_uchar const *rel_path);
extern int arch_project_tree_file_exists(struct arch_project_tree *tree, t_uchar const *rel_path);
extern rel_table arch_project_tree_ancestry (struct arch_project_tree *tree);
extern int arch_project_tree_has_patch (arch_project_tree_t *tree, t_uchar const *patch_id);
extern t_uchar * arch_project_tree_patch_filename (arch_project_tree_t *tree, t_uchar const *patch_id);
extern inventory_entry_t * arch_project_tree_path_inventory (arch_project_tree_t * tree, t_uchar const * const path, struct stat * known_lstat);
extern void arch_project_tree_changeset_inventory_traversal (arch_project_tree_t * tree, struct arch_inventory_options * options, inv_callback callback, void * closure);
extern void arch_project_tree_mutated (arch_project_tree_t * tree);
/* this s here due to layering not being fully reorganised */
extern t_uchar * arch_highest_patch_level_before (arch_project_tree_t * tree, t_uchar const *fqrevision_before);
extern t_uchar * arch_project_tree_patch_log (arch_project_tree_t * tree, t_uchar const * fqrevision);
extern t_uchar * arch_project_tree_rel_path_from_user_input (arch_project_tree_t * tree, t_uchar const * const filename);
extern t_uchar * arch_project_tree_rel_path_from_abs (arch_project_tree_t * tree, t_uchar const * const abs_path);
extern void arch_project_tree_check_name (arch_project_tree_t * tree, arch_archive_t ** arch, t_uchar ** namespace, t_uchar const * const name);
extern void arch_project_tree_check_commitable_name (arch_project_tree_t * tree, arch_archive_t ** arch, t_uchar ** namespace, t_uchar const * const name);
/* private to tla-project-tree.c, to move later RBC 20050321 */
extern inventory_entry_t * tla_path_id (arch_project_tree_t * tree, int * errn, t_uchar const * const path, struct stat * known_lstat);
#endif /* INCLUDE__LIBARCH__PROJECT_TREE_H */
/* tag: Tom Lord Sat Jan 5 15:26:10 2002 (project-tree.h)
*/
syntax highlighted by Code2HTML, v. 0.9.1