// // aegis - project change supervisor // Copyright (C) 2006-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 // for assert #include #include #include #include #include void repository::file_wrapper(change_identifier &cid, fstate_src_ty *src) { switch (src->action) { case file_action_create: if (!src->move) add_file_wrapper(cid, src); else rename_file_wrapper(cid, src); break; case file_action_transparent: case file_action_modify: modify_file_wrapper(cid, src); break; case file_action_remove: if (!src->move) remove_file_wrapper(cid, src); break; case file_action_insulate: #ifndef DEBUG default: #endif assert(0); break; } } void repository::add_file_wrapper(change_identifier &cid, fstate_src_ty *src) { // // If the file already exists in the repository, // we have to substitute a modify action instead. // nstring file_name(src->file_name); os_become_orig(); bool exists = os_exists(os_path_join(get_directory(), file_name)); os_become_undo(); if (exists) { modify_file_wrapper(cid, src); return; } // // Obtain the necessary version of the file. // int need_unlink = 0; nstring path(project_file_version_path(cid.get_pp(), src, &need_unlink)); // // Run the actual repository "add" command. // os_become_orig(); add_file(file_name, path); if (need_unlink) os_unlink_errok(path); os_become_undo(); } void repository::modify_file_wrapper(change_identifier &cid, fstate_src_ty *src) { // // If the file does not exist in the repository, // we have to substitute an add action instead. // nstring file_name(src->file_name); os_become_orig(); bool exists = os_exists(os_path_join(get_directory(), file_name)); os_become_undo(); if (!exists) { add_file_wrapper(cid, src); return; } // // Obtain the necessary version of the file. // int need_unlink = 0; nstring path(project_file_version_path(cid.get_pp(), src, &need_unlink)); // // Run the actual repository "modify" command. // os_become_orig(); modify_file(file_name, path); if (need_unlink) os_unlink_errok(path); os_become_undo(); } void repository::remove_file_wrapper(change_identifier &, fstate_src_ty *src) { // // If the file does not exist in the repository, // don't do anything. // nstring file_name(src->file_name); os_become_orig(); bool exists = os_exists(os_path_join(get_directory(), file_name)); os_become_undo(); if (!exists) return; // // Run the actual repository "remove" command. // os_become_orig(); remove_file(file_name); os_become_undo(); } void repository::rename_file_wrapper(change_identifier &cid, fstate_src_ty *src) { // // If the file does not exist in the repository, // don't do anything. // assert(src->action == file_action_create); nstring from_file_name(src->move); nstring to_file_name(src->file_name); os_become_orig(); bool from_exists = os_exists(os_path_join(get_directory(), from_file_name)); bool to_exists = os_exists(os_path_join(get_directory(), to_file_name)); os_become_undo(); if (from_exists) { if (to_exists) { os_become_orig(); remove_file(from_file_name); os_become_undo(); modify_file_wrapper(cid, src); return; } else { // // Obtain the necessary version of the file. // int need_unlink = 0; nstring path ( project_file_version_path(cid.get_pp(), src, &need_unlink) ); // // Run the actual repository "rename" command. // os_become_orig(); rename_file(from_file_name, to_file_name, path); os_become_undo(); } } else { // source does NOT exist! if (to_exists) { // No source, but destination exists modify_file_wrapper(cid, src); return; } else { // No source, no destination. add_file_wrapper(cid, src); } } }