// // aegis - project change supervisor // Copyright (C) 2006-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 #include #include #include #include #include #include #include #include #include #include #include void lock_main() { // // Parse the command line arguments. // arglex(); project_identifier_subset_plain pid; const char *command_name = 0; while (arglex_token != arglex_token_eoln) { switch (arglex_token) { default: generic_argument(lock_usage); continue; case arglex_token_project: case arglex_token_trunk: pid.command_line_parse(lock_usage); continue; case arglex_token_string: if (command_name) lock_usage(); command_name = arglex_value.alv_string; break; } arglex(); } if (!command_name) { lock_usage(); } // // Locate the command. // // We do this by looking in the given project for the appropriately // named attribute. // pconf_ty *pconf_data = project_pconf_get(pid.get_pp()); nstring attribute_name = nstring::format("%s:%s", progname_get(), command_name); attributes_ty *ap = attributes_list_find ( pconf_data->project_specific, attribute_name.c_str() ); if (!ap) { sub_context_ty sc; sc.var_set_string("Name", attribute_name); project_fatal(pid.get_pp(), &sc, i18n("attribute $name unknown")); // NOTREACHED } sub_context_ty sc; string_ty *command = sc.substitute_p(pid.get_pp(), ap->value); // // Only project adminstrators are allowed to do this. // if (!project_administrator_query(pid.get_pp(), pid.get_up()->name())) { project_fatal(pid.get_pp(), 0, i18n("not an administrator")); } // // Take the lock and run the command. // project *trunk = pid.get_pp()->trunk_get(); trunk->lock_prepare_everything(); lock_take(); project_become(trunk); os_execute(command, 0, trunk->home_path_get()); project_become_undo(trunk); lock_release(); } // vim: set ts=8 sw=4 et :