//
// aegis - project change supervisor
// Copyright (C) 2001, 2002, 2004-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
// .
//
#include
#include
#include
#include
#include
#include
#include
void
format_delete(format_ty *fp)
{
assert(fp);
assert(fp->vptr);
if (fp->vptr->destructor)
fp->vptr->destructor(fp);
fp->vptr = 0; // paranoia
mem_free(fp);
}
struct context_ty
{
format_ty *fp;
string_ty *base;
format_search_list_ty *fslp;
};
static void
searcher(void *arg, dir_walk_message_ty msg, string_ty *filename,
const struct stat *)
{
static string_ty *the_config_file;
if (!the_config_file)
the_config_file = str_from_c("config");
if (msg == dir_walk_file)
{
context_ty *context;
format_ty *fp;
context = (context_ty *)arg;
fp = context->fp;
if (fp->vptr->is_a_candidate(fp, filename))
{
string_ty *relative;
string_ty *sanitized;
format_search_ty *fsp;
format_version_ty *fvp;
relative = os_below_dir(context->base, filename);
sanitized = format_sanitize(fp, relative, 1);
str_free(relative);
if (str_equal(sanitized, the_config_file))
fvp = 0;
else
fvp = fp->vptr->read_versions(fp, filename, sanitized);
fsp = format_search_new();
fsp->filename_physical = str_copy(filename);
fsp->filename_logical = sanitized;
fsp->root = fvp;
format_search_list_append(context->fslp, fsp);
}
}
}
format_search_list_ty *
format_search(format_ty *fp, string_ty *base)
{
context_ty context;
context.fp = fp;
context.base = base;
context.fslp = format_search_list_new();
assert(fp->vptr);
assert(fp->vptr->is_a_candidate);
assert(fp->vptr->sanitize);
assert(fp->vptr->read_versions);
dir_walk(base, searcher, &context);
return context.fslp;
}
string_ty *
format_history_put(format_ty *fp)
{
assert(fp);
assert(fp->vptr);
assert(fp->vptr->history_put);
return fp->vptr->history_put(fp);
}
string_ty *
format_history_get(format_ty *fp)
{
assert(fp);
assert(fp->vptr);
assert(fp->vptr->history_get);
return fp->vptr->history_get(fp);
}
string_ty *
format_history_query(format_ty *fp)
{
assert(fp);
assert(fp->vptr);
assert(fp->vptr->history_query);
return fp->vptr->history_query(fp);
}
string_ty *
format_diff(format_ty *fp)
{
assert(fp);
assert(fp->vptr);
assert(fp->vptr->diff);
return fp->vptr->diff(fp);
}
string_ty *
format_merge(format_ty *fp)
{
assert(fp);
assert(fp->vptr);
assert(fp->vptr->merge);
return fp->vptr->merge(fp);
}
void
format_unlock(format_ty *fp, string_ty *filename)
{
assert(fp);
assert(fp->vptr);
assert(fp->vptr->unlock);
fp->vptr->unlock(fp, filename);
}
string_ty *
format_sanitize(format_ty *fp, string_ty *filename, int last_part)
{
assert(fp);
assert(fp->vptr);
assert(fp->vptr->sanitize);
return fp->vptr->sanitize(fp, filename, last_part);
}