//
// 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 // for assert
#include
#include
#include
static void
cstate_to_fstate(change::pointer cp)
{
trace(("cstate_to_fstate(cp = %08lX)\n{\n", (long)cp));
assert(cp->reference_count >= 1);
assert(cp->cstate_data);
assert(cp->cstate_data->src);
assert(!cp->fstate_data);
cp->fstate_data = (fstate_ty *)fstate_type.alloc();
cp->fstate_data->src = (fstate_src_list_ty *)fstate_src_list_type.alloc();
cp->fstate_is_a_new_file = 1;
cp->fstate_stp = symtab_alloc(5);
cp->fstate_uuid_stp = symtab_alloc(5);
//
// copy the file records from cstate to fstate
//
for (size_t j = 0; j < cp->cstate_data->src->length; ++j)
{
cstate_src_ty *src1;
fstate_src_ty *src2;
fstate_src_ty **addr_p;
meta_type *type_p;
src1 = cp->cstate_data->src->list[j];
if
(
!(src1->mask & cstate_src_action_mask)
||
!(src1->mask & cstate_src_usage_mask)
||
!src1->file_name
||
(
cp->cstate_data->state == cstate_state_completed
&&
!src1->edit_number
)
)
{
sub_context_ty *scp;
assert(src1->errpos);
scp = sub_context_new();
sub_var_set_string(scp, "File_Name", src1->errpos);
sub_var_set_charstar(scp, "FieLD_Name", "src");
change_fatal
(
cp,
scp,
i18n("$filename: corrupted \"$field_name\" field")
);
// NOTREACHED
sub_context_delete(scp);
}
src2 = (fstate_src_ty *)fstate_src_type.alloc();
src2->errpos = str_copy(src1->errpos);
addr_p = (fstate_src_ty **)
fstate_src_list_type.list_parse(cp->fstate_data->src, &type_p);
assert(type_p == &fstate_src_type);
*addr_p = src2;
//
// copy all of the attributes across
//
src2->action = src1->action;
src2->mask |= fstate_src_action_mask;
src2->usage = src1->usage;
src2->mask |= fstate_src_usage_mask;
src2->file_name = str_copy(src1->file_name);
if (src1->edit_number)
{
src2->edit = (history_version_ty *)history_version_type.alloc();
src2->edit->errpos = str_copy(src1->errpos);
src2->edit->revision = str_copy(src1->edit_number);
src2->edit->encoding = history_version_encoding_none;
src2->edit_origin =
(history_version_ty *)history_version_type.alloc();
src2->edit_origin->errpos = str_copy(src1->errpos);
src2->edit_origin->revision = str_copy(src1->edit_number);
src2->edit_origin->encoding = history_version_encoding_none;
}
if (src1->move)
src2->move = str_copy(src1->move);
//
// index to track also
//
symtab_assign(cp->fstate_stp, src2->file_name, src2);
if (src2->uuid && (!src2->move || src2->action != file_action_remove))
symtab_assign(cp->fstate_uuid_stp, src2->uuid, src2);
}
//
// now release the src field of the cstate file
//
cstate_src_list_type.free(cp->cstate_data->src);
cp->cstate_data->src = 0;
trace(("}\n"));
}
cstate_ty *
change::cstate_get()
{
trace(("change::cstate_get(this = %08lX)\n{\n", (long)this));
assert(reference_count >= 1);
change_lock_sync(this);
if (!cstate_data)
{
string_ty *fn = change_cstate_filename_get(this);
change_become(this);
cstate_data = cstate_read_file(fn);
change_become_undo(this);
if (!cstate_data->brief_description)
{
assert(cstate_data->errpos);
sub_context_ty sc;
sc.var_set_string("File_Name", cstate_data->errpos);
sc.var_set_charstar("FieLD_Name", "brief_description");
change_fatal
(
this,
&sc,
i18n("$filename: corrupted \"$field_name\" field")
);
// NOTREACHED
}
if (!cstate_data->description)
{
assert(cstate_data->errpos);
sub_context_ty sc;
sc.var_set_string("File_Name", cstate_data->errpos);
sc.var_set_charstar("FieLD_Name", "description");
change_fatal
(
this,
&sc,
i18n("$filename: corrupted \"$field_name\" field")
);
// NOTREACHED
}
if (!(cstate_data->mask & cstate_state_mask))
{
assert(cstate_data->errpos);
sub_context_ty sc;
sc.var_set_string("File_Name", cstate_data->errpos);
sc.var_set_charstar("FieLD_Name", "state");
change_fatal
(
this,
&sc,
i18n("$filename: corrupted \"$field_name\" field")
);
// NOTREACHED
}
if
(
cstate_data->state >= cstate_state_being_developed
&&
cstate_data->state <= cstate_state_being_integrated
&&
!cstate_data->development_directory
)
{
assert(cstate_data->errpos);
sub_context_ty sc;
sc.var_set_string("File_Name", cstate_data->errpos);
sc.var_set_charstar("FieLD_Name", "development_directory");
change_fatal
(
this,
&sc,
i18n("$filename: contains no \"$field_name\" field")
);
// NOTREACHED
}
if
(
cstate_data->state == cstate_state_being_integrated
&&
!cstate_data->integration_directory
)
{
assert(cstate_data->errpos);
sub_context_ty sc;
sc.var_set_string("File_Name", cstate_data->errpos);
sc.var_set_charstar("FieLD_Name", "integration_directory");
change_fatal
(
this,
&sc,
i18n("$filename: contains no \"$field_name\" field")
);
// NOTREACHED
}
if
(
cstate_data->state == cstate_state_completed
&&
!cstate_data->delta_number
)
{
assert(cstate_data->errpos);
sub_context_ty sc;
sc.var_set_string("File_Name", cstate_data->errpos);
sc.var_set_charstar("FieLD_Name", "delta_number");
change_fatal
(
this,
&sc,
i18n("$filename: contains no \"$field_name\" field")
);
// NOTREACHED
}
if (cstate_data->src)
{
//
// convert from old format to new fstate format
//
assert(!fstate_data);
cstate_to_fstate(this);
}
change_cstate_improve(cstate_data);
}
trace(("return %08lX;\n", (long)cstate_data));
trace(("}\n"));
return cstate_data;
}