// // aegis - project change supervisor // Copyright (C) 1999, 2001-2008, 2011, 2012 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 // // If you change the logic in this function, make sure you also change // project_file_shallow_check to match, see libaegis/project/file/shallow_chk.c // void project_file_shallow(project *pp, string_ty *file_name, long cn) { change::pointer pcp; fstate_src_ty *src1_data; fstate_src_ty *src2_data; // // Will never be zero, because already magic zero encoded. // trace(("project_file_shallow(pp = %p, file_name = \"%s\", cn=%ld)\n{\n", pp, file_name->str_text, cn)); assert(cn); // // If there is no parent project, // nothing more needs to be done. // if (pp->is_a_trunk()) { trace(("shallowing \"%s\" no grandparent\n", file_name->str_text)); trace(("}\n")); return; } // // Look for the file in the project. // If it is there, nothing more needs to be done. // pcp = pp->change_get(); src1_data = pcp->file_find(nstring(file_name), view_path_first); if (src1_data) { trace(("shallowing \"%s\" already in %s\n", file_name->str_text, project_name_get(pp).c_str())); trace(("}\n")); return; } // // The file is not part of the immediate project, see if // we can find it in one of the grand*parent projects. // If it is not there, nothing more needs to be done. // src2_data = pp->file_find(file_name, view_path_simple); if (!src2_data) { trace(("shallowing \"%s\" not in %s ancestor\n", file_name->str_text, project_name_get(pp).c_str())); trace(("}\n")); return; } // // Create a new file in the project, and mark it "about to be // copied". That way we can throw it away again, if the // review fails or the integration fails. // trace(("shallowing \"%s\"\n", file_name->str_text)); src1_data = pcp->file_new(src2_data); src1_data->action = file_action_transparent; src1_data->about_to_be_copied_by = cn; // // The value here is bogus (can't use the old one, it refers to // the wrong branch). The values only lasts long enough to be // replaced (ipass) or removed (ifail). // if (src2_data->deleted_by) src1_data->deleted_by = cn; // // As a branch advances, the edit field tracks the // history, but the edit_origin field is the number when // the file was first created or copied into the branch. // By definition, a file in a change is out of date when // it's edit_origin field does not equal the edit field // of its project. // // In order to merge branches, this must be done as a // cross branch merge in a change to that branch; the // edit_origin_new field of the change is copied // into the edit_origin field of the branch. // // branch's edit // The head revision of the branch. // branch's edit_origin // The version originally copied. // assert(src2_data->edit); if (src1_data->edit) history_version_type.free(src1_data->edit); if (src2_data->edit) src1_data->edit = history_version_copy(src2_data->edit); else { src1_data->edit = (history_version_ty *)history_version_type.alloc(); src1_data->edit->revision = str_from_c("bogus"); } if (src1_data->edit_origin) history_version_type.free(src1_data->edit_origin); src1_data->edit_origin = history_version_copy(src1_data->edit); // // pull the testing correlations across // if (src2_data->test && src2_data->test->length) { size_t j; src1_data->test = (fstate_src_test_list_ty *)fstate_src_test_list_type.alloc(); for (j = 0; j < src2_data->test->length; ++j) { string_ty **addr_p; meta_type *type_p = 0; addr_p = (string_ty **) fstate_src_test_list_type.list_parse(src1_data->test, &type_p); assert(type_p = &string_type); *addr_p = str_copy(src2_data->test->list[j]); } } // // Note: locked_by is deliberatey dropped, // because it refers to a different branch. // trace(("}\n")); } // vim: set ts=8 sw=4 et :