// // aegis - project change supervisor // Copyright (C) 2004, 2005 Walter Franzini // Copyright (C) 2007, 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 change_functor_inventory_builder::~change_functor_inventory_builder() { if (pp) project_free(pp); stp = 0; } change_functor_inventory_builder::change_functor_inventory_builder(bool arg1, bool arg2, bool arg3, project_ty *arg4, symtab *arg5) : change_functor(arg1, arg2), inou(arg3), stp(arg5), pp(project_copy(arg4)) { } void change_functor_inventory_builder::operator()(change::pointer cp) { cstate_ty *cstate_data = cp->cstate_get(); assert(cstate_data); time_t cp_ipass_when = change_when_get(cp, cstate_history_what_integrate_pass); trace_time(cp_ipass_when); if (cstate_data->uuid) { // // We do not override a UUID which is already present. It comes // from the original-UUID attribute so it is more recent than // the change the UUID belongs to. Thus is should be a better // merge point to select, it should generate smaller (logical) // conflicts. // change::pointer cp2 = stp->query(cstate_data->uuid); if (cp2) { time_t cp2_ipass_when = change_when_get(cp2, cstate_history_what_integrate_pass); trace_time(cp2_ipass_when); if (cp_ipass_when > cp2_ipass_when) { stp->assign(cstate_data->uuid, change_copy(cp)); change_free(cp2); } } else stp->assign(cstate_data->uuid, change_copy(cp)); } if (inou) return; if (!cstate_data->attribute) return; for (size_t j = 0; j < cstate_data->attribute->length; ++j) { attributes_ty *ap = cstate_data->attribute->list[j]; if ( ap->name && 0 == strcasecmp(ap->name->str_text, ORIGINAL_UUID) && ap->value && // users can edit, we will check universal_unique_identifier_valid(ap->value) ) { change::pointer cp2 = stp->query(ap->value); if (cp2) { time_t cp2_ipass_when = change_when_get(cp2, cstate_history_what_integrate_pass); trace_time(cp2_ipass_when); if (cp_ipass_when > cp2_ipass_when) { stp->assign(ap->value, change_copy(cp)); change_free(cp2); continue; } } stp->assign(ap->value, change_copy(cp)); } } }