//
// aegis - project change supervisor
// Copyright (C) 2005-2008 Peter Miller
// Copyright (C) 2006 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
#include
#include // for assert
#include
#include
#include
#include
#include
bool
change_file_unchanged(change::pointer cp, fstate_src_ty *src_data,
user_ty::pointer up)
{
//
// The policy only applies to simple change sets, not to branches.
//
if (change_was_a_branch(cp))
return false;
//
// Leave cross branch merges alone, even if they
// don't change anything. The information is
// about the merge, not the file contents.
//
if (src_data->edit_origin_new)
{
assert(src_data->edit_origin_new->revision);
return false;
}
//
// Only modified files are of interest.
//
switch (src_data->action)
{
case file_action_modify:
case file_action_insulate:
break;
case file_action_create:
if (src_data->move)
break;
return false;
case file_action_remove:
case file_action_transparent:
return false;
}
switch (src_data->usage)
{
case file_usage_build:
return false;
case file_usage_config:
case file_usage_source:
case file_usage_test:
case file_usage_manual_test:
break;
}
//
// The file could have vanished from under us,
// so make sure this is sensable.
//
fstate_src_ty *psrc_data =
project_file_find(cp->pp, src_data, view_path_extreme);
if (!psrc_data)
return false;
//
// Get the path of the project file to be compared against.
//
int blf_unlink = 0;
nstring blf(project_file_path(cp->pp, psrc_data->file_name));
assert(!blf.empty());
up->become_begin();
int blf_exists = os_exists(blf);
up->become_end();
assert(blf_exists);
if (!blf_exists)
{
blf = nstring(project_file_version_path(cp->pp, src_data, &blf_unlink));
assert(!blf.empty());
}
//
// Get the path of the change file to be compared against.
//
nstring cfp(change_file_path(cp, src_data->file_name));
assert(cfp);
if (!cfp)
return false;
//
// If any of the file's attributes have changed, the file is
// different, too.
//
if (!str_equal(src_data->file_name, psrc_data->file_name))
return false;
if (src_data->usage != psrc_data->usage)
return false;
if
(
(src_data->attribute ? src_data->attribute->length : 0)
!=
(psrc_data->attribute ? psrc_data->attribute->length : 0)
)
return false;
if (src_data->attribute && src_data->attribute->length)
{
assert(psrc_data->attribute);
for (size_t j = 0; j < src_data->attribute->length; ++j)
{
attributes_ty *p1 = src_data->attribute->list[j];
attributes_ty *p2 = psrc_data->attribute->list[j];
if (p1 && p2)
{
if (p1->name && p2->name && !str_equal(p1->name, p2->name))
return false;
if (p1->value && p2->value && !str_equal(p1->value, p2->value))
return false;
}
}
}
//
// Perform the comparison.
//
up->become_begin();
bool different = files_are_different(cfp, blf);
up->become_end();
if (blf_unlink)
{
os_become_orig();
os_unlink(blf);
os_become_undo();
}
return !different;
}