//
// aegis - project change supervisor
// Copyright (C) 2004-2006, 2008 Peter Miller
// Copyright (C) 2006, 2007 Walter Franzini
//
// 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 // for assert
#include
#include
#include
#include
fstate_src_ty *
project_file_find(project_ty *pp, fstate_src_ty *c_src_data,
view_path_ty vp)
{
fstate_src_ty *p_src_data;
string_ty *name;
trace(("project_file_find_by_meta(pp = %08lX, c_src = %08lX, vp = %s)\n{\n",
(long)pp, (long)c_src_data, view_path_ename(vp)));
trace
((
"change: %s %s \"%s\" %s %s\n", file_usage_ename(c_src_data->usage),
file_action_ename(c_src_data->action),
c_src_data->file_name->str_text,
(c_src_data->edit_origin ?
c_src_data->edit_origin->revision->str_text : ""),
(c_src_data->edit ?
c_src_data->edit->revision->str_text : "")
));
//
// Try to find the file by its UUID.
//
// For backwards compatibility reasons (UUIDs were introduced in
// 4.17) there could be a rename chain (pointing at UUID-less
// entries) to be taken into account.
//
if (c_src_data->uuid)
{
itab_ty *found = itab_alloc();
p_src_data = pp->file_find_by_uuid(c_src_data->uuid, vp);
while (p_src_data && !itab_query(found, (itab_key_ty)p_src_data))
{
if (p_src_data->action != file_action_remove || !p_src_data->move)
{
trace
((
"project: %s %s \"%s\" %s %s\n",
file_usage_ename(p_src_data->usage),
file_action_ename(p_src_data->action),
p_src_data->file_name->str_text,
(p_src_data->edit_origin ?
p_src_data->edit_origin->revision->str_text : ""),
(p_src_data->edit ?
p_src_data->edit->revision->str_text : "")
));
itab_free(found);
trace(("return %08lX;\n", (long)p_src_data));
trace(("}\n"));
return p_src_data;
}
name = p_src_data->move;
p_src_data = project_file_find(pp, name, vp);
itab_assign(found, (itab_key_ty)p_src_data, p_src_data);
}
itab_free(found);
}
//
// Look for the file by name, tracking renames as they happen.
//
if (c_src_data->action == file_action_create && c_src_data->move)
name = c_src_data->move;
else
name = c_src_data->file_name;
itab_ty *found = itab_alloc();
for (;;)
{
p_src_data = project_file_find(pp, name, vp);
if (!p_src_data)
{
itab_free(found);
trace(("return NULL;\n"));
trace(("}\n"));
return 0;
}
//
// A loop has been detected go away.
//
if (itab_query(found, (itab_key_ty)p_src_data))
{
itab_free(found);
trace(("return NULL;\n"));
trace(("}\n"));
return 0;
}
itab_assign(found, (itab_key_ty)p_src_data, p_src_data);
if (p_src_data->action != file_action_remove || !p_src_data->move)
{
trace
((
"project: %s %s \"%s\" %s %s\n",
file_usage_ename(p_src_data->usage),
file_action_ename(p_src_data->action),
p_src_data->file_name->str_text,
(p_src_data->edit_origin ?
p_src_data->edit_origin->revision->str_text : ""),
(p_src_data->edit ?
p_src_data->edit->revision->str_text : "")
));
itab_free(found);
trace(("return %08lX;\n", (long)p_src_data));
trace(("}\n"));
return p_src_data;
}
name = p_src_data->move;
}
}