//
// aegis - project change supervisor
// Copyright (C) 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 // for assert
#include
#include
fstate_src_ty *
change_file_find_uuid(change::pointer cp, string_ty *uuid,
view_path_ty view_path)
{
//
// See if we can do a fast lookup first.
//
assert(uuid);
assert(cp);
if (view_path == view_path_first)
{
//
// Make sure fstate has been read in and the symbol tables used
// to speed up lookups have been initialised.
//
change_fstate_get(cp);
assert(cp->fstate_uuid_stp);
if (cp->fstate_uuid_stp)
{
fstate_src_ty *src =
(fstate_src_ty *)symtab_query(cp->fstate_uuid_stp, uuid);
if (src)
{
assert(src->action != file_action_remove || !src->move);
}
return src;
}
}
//
// Do it the slow way.
//
// FIXME: why not keep and index for each view path type?
//
for (size_t j = 0; ; ++j)
{
fstate_src_ty *src;
src = change_file_nth(cp, j, view_path);
if (!src)
return 0;
if (src->uuid && str_equal(uuid, src->uuid))
{
//
// When a file is renamed, it appears in the change's file
// list twice: once for the remove and again for the create.
// Both entires have the same UUID. Most of the time the
// user is expecting the create side (with the new name) not
// the remove side.
//
if (src->action != file_action_remove || !src->move)
return src;
}
}
}