//
// aegis - project change supervisor
// Copyright (C) 1999, 2000, 2002-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 // for assert
#include
#include
#include
#include
string_ty *
change_file_source(change::pointer cp, string_ty *file_name)
{
string_ty *result;
cstate_ty *cstate_data;
fstate_src_ty *src;
//
// For changes which are not somewhere between `being developed'
// and `being integrated' look in the project only.
//
trace(("change_file_source(cp = %08lX, file_name = \"%s\")\n{\n",
(long)cp, file_name->str_text));
cstate_data = cp->cstate_get();
if
(
cstate_data->state == cstate_state_awaiting_development
||
cstate_data->state == cstate_state_completed
)
goto projfile;
//
// see if the file is in the change
//
src = change_file_find(cp, file_name, view_path_first);
if (src && !src->about_to_be_copied_by)
{
result = change_file_path(cp, file_name);
assert(result);
trace(("return \"%s\";\n", result->str_text));
trace(("}\n"));
return result;
}
//
// If the change is being integrated, and the file would be in
// the branch's baseline, then the path to it is in the
// integration directory.
//
if (cstate_data->state == cstate_state_being_integrated)
{
change::pointer pcp = cp->pp->change_get();
src = change_file_find(pcp, file_name, view_path_first);
if (src && !src->about_to_be_copied_by)
{
string_ty *id;
id = change_integration_directory_get(cp, 0);
result = os_path_cat(id, file_name);
assert(result);
trace(("return \"%s\";\n", result->str_text));
trace(("}\n"));
return result;
}
}
//
// see if the file is in the project
//
projfile:
if (project_file_find(cp->pp, file_name, view_path_simple))
{
result = project_file_path(cp->pp, file_name);
assert(result);
trace(("return \"%s\";\n", result->str_text));
trace(("}\n"));
return result;
}
//
// no such file
//
trace(("return NULL;\n"));
trace(("}\n"));
return 0;
}