// // aegis - project change supervisor // Copyright (C) 2005-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 #include #include #include #include #include #include #include #include enum { arglex_token_checkin = ARGLEX2_MAX, arglex_token_checkout, arglex_token_history, arglex_token_query }; static arglex_table_ty argtab[] = { { "-CHeck_In", arglex_token_checkin }, { "-COMmit", arglex_token_checkin }, { "-CHeck_Out", arglex_token_checkout }, { "-HIstory", arglex_token_history }, { "-Query", arglex_token_query }, ARGLEX_END_MARKER }; static void usage() { const char *prog = progname_get(); fprintf(stderr, "Usage: %s -checkin -hist -f \n", prog); fprintf(stderr, " %s -checkout -hist -o \n", prog); fprintf(stderr, " %s -query -hist \n", prog); fprintf(stderr, " %s -list -hist \n", prog); quit(1); } static void aesvt_help() { help(0, usage); } static const char * get_string(int tname) { const char *result = ""; switch (arglex_token) { case arglex_token_string: case arglex_token_number: result = arglex_value.alv_string; arglex(); break; default: option_needs_string(tname, usage); // NOTREACHED } return result; } static const char * get_file_name(int tname) { const char *result = ""; switch (arglex_token) { case arglex_token_string: case arglex_token_number: result = arglex_value.alv_string; arglex(); break; case arglex_token_stdio: result = "-"; arglex(); break; default: option_needs_file(tname, usage); // NOTREACHED } return result; } int main(int argc, char **argv) { os_become_init_mortal(); arglex2_init3(argc, argv, argtab); env_initialize(); resource_limits_init(); language_init(); switch (arglex()) { case arglex_token_help: aesvt_help(); quit(0); case arglex_token_version: version(); quit(0); } enum action_t { action_unset, action_listing, action_checkin, action_checkout, action_head_revision }; nstring edit; nstring file_name; nstring history_name; action_t action = action_unset; bool verbose = false; rfc822 meta_data; compression_algorithm_t compression = compression_algorithm_not_set; while (arglex_token != arglex_token_eoln) { switch (arglex_token) { case arglex_token_edit: case arglex_token_version: arglex(); edit = get_string(arglex_token_edit); continue; case arglex_token_file: case arglex_token_output: arglex(); file_name = get_file_name(arglex_token_file); continue; case arglex_token_history: arglex(); history_name = get_file_name(arglex_token_history); continue; case arglex_token_checkin: action = action_checkin; break; case arglex_token_list: action = action_listing; break; case arglex_token_checkout: action = action_checkout; break; case arglex_token_query: action = action_head_revision; break; case arglex_token_verbose: verbose = true; break; case arglex_token_string: // The rest of the arguments should be name=value pairs for checkin. switch (action) { default: usage(); // NOTREACHED case action_unset: action = action_checkin; // fall through... case action_checkin: const char *arg = arglex_value.alv_string; const char *ep = strchr(arg, '='); if (!ep) bad_argument(usage); nstring name(arg, ep - arg); nstring value(ep + 1); meta_data.set(name, value); break; } break; case arglex_token_compression_algorithm: if (arglex() != arglex_token_string) { option_needs_string(arglex_token_compression_algorithm, usage); // NOTREACHED } else { if (compression != compression_algorithm_not_set) { duplicate_option_by_name ( arglex_token_compression_algorithm, usage ); } compression = compression_algorithm_by_name(arglex_value.alv_string); } break; default: bad_argument(usage); // NOTREACHED } arglex(); } if (history_name.empty()) { sub_context_ty sc; sc.fatal_intl(i18n("no history file name specified")); // NOTREACHED } // // Create an instance of the tool. // simple_version_tool archive(history_name, compression); // // Perform the appropriate action, based on the command line options // given. // if (action == action_unset) { // Try to guess. if (!edit.empty()) action = action_checkout; } os_become_orig(); switch (action) { case action_head_revision: { if (!edit.empty() || !file_name.empty()) usage(); rfc822_functor_print_version doodle; archive.list(doodle); } break; case action_checkin: if (!edit.empty()) usage(); if (file_name.empty()) { sub_context_ty sc; sc.error_intl(i18n("no input file")); usage(); } archive.checkin(file_name, meta_data); break; case action_listing: { if (!edit.empty() || !file_name.empty()) usage(); rfc822_functor_list_meta doodle; archive.list(doodle); } break; case action_checkout: if (file_name.empty()) { sub_context_ty sc; sc.error_intl(i18n("no output file")); usage(); } archive.checkout(file_name, edit); break; case action_unset: #ifndef DEBUG default: #endif { sub_context_ty sc; sc.error_intl(i18n("no action specified")); usage(); } // NOTREACHED } os_become_undo(); quit(0); return 0; }