// // aegis - project change supervisor // Copyright (C) 2007 Walter Franzini // Copyright (C) 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 #include #include #include #include #include #include change_functor_archive::~change_functor_archive() { } change_functor_archive::change_functor_archive(bool arg1, project_ty *arg2, const char *arg3, const char *arg4, const nstring_list &arg5, const nstring_list &arg6) : change_functor(arg1), exclude_change(arg6), fingerprint_suffix(arg4), include_change(arg5), pp(arg2), suffix(arg3) { } void change_functor_archive::operator()(change::pointer cp) { assert(cp->is_completed()); if (!cp->is_completed()) return; nstring uuid(cp->uuid_get()); if (uuid.empty()) return; assert(universal_unique_identifier_valid(uuid)); if (!universal_unique_identifier_valid(uuid)) return; nstring version(change_version_get(cp)); if (!include_change.empty()) { if (include_change.gmatch_candidate(version) <= 0) return; } if (!exclude_change.empty()) { if (exclude_change.gmatch_candidate(version) == 1) return; } // // 1) translate the change's UUID in a path name; // 2) if the file exists check the fingerprint and, if needed, // force regeneration. // 3) if the file does not exists, or the fingerprint mismatch, // create it and calculate the fingerprint; // nstring uuid_path = uuid_translate(uuid); nstring archive_name = uuid_path + suffix; trace_nstring(archive_name); nstring fp_file_name = uuid_path + fingerprint_suffix; trace_nstring(fp_file_name); nstring qp(project_name_get(cp->pp)); bool generate_flag = true; os_become_orig(); bool check = os_exists(fp_file_name) && os_exists(archive_name); os_become_undo(); if (check) { nstring stored_fp; os_become_orig(); input_file fp_file(fp_file_name); fp_file.one_line(stored_fp); nstring actual_fp(os_fingerprint(archive_name.get_ref())); os_become_undo(); generate_flag = (stored_fp != actual_fp); } if (generate_flag) { nstring cmd = nstring::format ( "aedist -send -p %s -change %ld -output %s " "-ndh -nmh -cte=none -comp-alg=gzip", qp.quote_shell().c_str(), cp->number, archive_name.c_str() ); os_become_orig(); nstring curdir(os_curdir()); os_unlink_errok(fp_file_name); os_unlink_errok(archive_name); os_mkdir_between(curdir, archive_name, 0755); os_execute(cmd, OS_EXEC_FLAG_SILENT, curdir); nstring current_fp(os_fingerprint(archive_name.get_ref())); output::pointer os = output_file::open(fp_file_name); os->fputs(current_fp); os->end_of_line(); os.reset(); os_become_undo(); } }