//
// aegis - project change supervisor
// Copyright (C) 1999, 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
// .
//
#include
#include
#include
#include
#include
#include
#include
void
project_ty::list_inner(string_list_ty &wlr)
{
trace(("project_ty::list_inner(this = %08lX, wlr = %08lX)\n{\n",
(long)this, (long)&wlr));
//
// add the cannonical name of this project to the list
//
wlr.push_back(name_get());
//
// check each change
// add it to the list if it is a branch
//
change::pointer cp = this->change_get();
long *lp = 0;
size_t len = 0;
change_branch_sub_branch_list_get(cp, &lp, &len);
for (size_t k = 0; k < len; ++k)
{
long cn = lp[k];
trace(("cn = %ld\n", cn));
change::pointer cp2 = change_alloc(this, cn);
change_bind_existing(cp2);
// active only
if (change_is_a_branch(cp2))
{
project_ty *pp2 = bind_branch(cp2);
pp2->list_inner(wlr);
project_free(pp2);
}
else
change_free(cp2);
}
// do NOT free "lp"
// do NOT free "cp"
trace(("}\n"));
}
void
project_list_get(string_list_ty *wlp)
{
//
// get the top-level project list
//
trace(("project_list_get()\n{\n"));
wlp->clear();
string_list_ty toplevel;
gonzo_project_list(&toplevel);
trace(("mark\n"));
//
// chase down each one, looking for branches
//
for (size_t j = 0; j < toplevel.nstrings; ++j)
{
trace(("j = %d/%d\n", (int)j, (int)toplevel.nstrings));
string_ty *name = toplevel.string[j];
trace(("name = \"%s\"\n", name->str_text));
project_ty *pp = project_alloc(name);
trace(("mark\n"));
pp->bind_existing();
trace(("mark\n"));
//
// watch out for permissions
// (returns errno of attempt to read project state)
//
int err = project_is_readable(pp);
trace(("err = %d\n", err));
//
// Recurse into readable branch trees.
//
if (err == 0)
{
trace(("libaegis/project/list.cc\n"));
pp->list_inner(*wlp);
trace(("libaegis/project/list.cc\n"));
}
else
wlp->push_back(project_name_get(pp));
trace(("libaegis/project/list.cc\n"));
project_free(pp);
trace(("libaegis/project/list.cc\n"));
}
//
// sort the list of names
// (C locale)
//
// Project names look a lot like versions strings (indeed,
// the tail ends *are* version strings) so sort them as such.
//
trace(("mark\n"));
wlp->sort_version();
trace(("}\n"));
}