// // aegis - project change supervisor // Copyright (C) 2002-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 #include #include #include #include #include #include string_ty * project_file_version_path(project_ty *pp, fstate_src_ty *src, int *unlink_p) { fstate_src_ty *old_src; project_ty *ppp; change::pointer cp; string_ty *filename; history_version_ty *ed; fstate_src_ty *reconstruct; trace(("project_file_version_path(pp = %08lX, src = %08lX, " "unlink_p = %08lX)\n{\n", (long)pp, (long)src, (long)unlink_p)); assert(src); assert(src->file_name); trace(("fn \"%s\"\n", src->file_name->str_text)); assert(src->edit || src->edit_origin); ed = src->edit ? src->edit : src->edit_origin; assert(ed->revision); trace(("rev \"%s\"\n", ed->revision->str_text)); if (unlink_p) *unlink_p = 0; for (ppp = pp; ppp; ppp = (ppp->is_a_trunk() ? 0 : ppp->parent_get())) { cp = ppp->change_get(); if (cp->is_completed()) continue; old_src = change_file_find(cp, src->file_name, view_path_first); if (!old_src) continue; switch (old_src->action) { case file_action_remove: case file_action_transparent: continue; case file_action_create: case file_action_modify: case file_action_insulate: #ifndef DEBUG default: #endif // should be file_action_remove assert(!old_src->deleted_by); if (old_src->deleted_by) continue; // should be file_action_transparent assert(!old_src->about_to_be_created_by); if (old_src->about_to_be_created_by) continue; // should be file_action_transparent assert(!old_src->about_to_be_copied_by); if (old_src->about_to_be_copied_by) continue; break; } assert(old_src->edit); assert(old_src->edit->revision); if (str_equal(old_src->edit->revision, ed->revision)) { filename = change_file_path(cp, src->file_name); // // The following check is needed to make aegis work even // when filename does'not exists. // os_become_orig(); int file_exists = os_exists(filename); os_become_undo(); assert(file_exists); if (!file_exists) break; trace(("return \"%s\";\n", filename->str_text)); trace(("}\n")); return filename; } } filename = os_edit_filename(0); os_become_orig(); undo_unlink_errok(filename); os_become_undo(); if (unlink_p) *unlink_p = 1; reconstruct = (fstate_src_ty *)fstate_src_type.alloc(); reconstruct->file_name = str_copy(src->file_name); reconstruct->edit = history_version_copy(ed); change_file_copy_basic_attributes(reconstruct, src); cp = pp->change_get(); change_run_history_get_command ( cp, reconstruct, filename, user_ty::create() ); history_version_type.free(reconstruct); trace(("return \"%s\";\n", filename->str_text)); trace(("}\n")); return filename; }