//
// aegis - project change supervisor
// Copyright (C) 2006-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
static repository *
new_repository_cvs()
{
return new repository_cvs();
}
static repository *
new_repository_subversion()
{
return new repository_subversion();
}
struct table_t
{
const char *type;
repository *(*alloc)(void);
const char *description;
bool hide;
};
static const table_t table[] =
{
{ "cvs", new_repository_cvs, "Concurrent Version System", false },
{ "svn", new_repository_subversion, "Subversion", false },
{ "subversion", new_repository_subversion, "svn", true },
};
void
repository::list()
{
for (const table_t *tp = table; tp < ENDOF(table); ++tp)
{
if (!tp->hide)
printf("%.7s\t%s\n", tp->type, tp->description);
}
}
repository *
repository::factory(const char *type)
{
const table_t *best = 0;
double best_weight = 0.6;
for (const table_t *tp = table; tp < ENDOF(table); ++tp)
{
double w = fstrcmp(type, tp->type);
if (w == 1)
return tp->alloc();
if (w > best_weight)
{
best = tp;
best_weight = w;
}
}
if (best)
{
fatal_raw
(
"repository type \"%s\" unknown, closest is \"%s\"",
type,
best->type
);
}
fatal_raw("repository type \"%s\" unknown", type);
return 0;
}