// // aegis - project change supervisor // Copyright (C) 2007, 2008, 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 enum del_pref { del_pref_unset, del_pref_keep_not, del_pref_interactive, del_pref_keep }; static del_pref cmd_line_pref = del_pref_unset; void user_ty::delete_file_argument(void (*usage)(void)) { if (cmd_line_pref != del_pref_unset) { mutually_exclusive_options3 ( arglex_token_keep_not, arglex_token_interactive, arglex_token_keep, usage ); } switch (arglex_token) { default: assert(0); case arglex_token_keep: cmd_line_pref = del_pref_keep; break; case arglex_token_interactive: cmd_line_pref = del_pref_interactive; break; case arglex_token_keep_not: cmd_line_pref = del_pref_keep_not; break; } } static bool ask(const nstring &filename, bool isdir) { struct table_ty { const char *name; del_pref set; bool result; }; // // The order of items in the table needs to be considered // carefully. The "unset" items must come before the "set" // items; particularly those with similar names. Do not sort // this table alphabetically. // static table_ty table[] = { { "No", del_pref_unset, false, }, { "False", del_pref_unset, false, }, { "Never", del_pref_keep, false, }, { "None", del_pref_keep, false, }, { "Yes", del_pref_unset, true, }, { "True", del_pref_unset, true, }, { "All", del_pref_keep_not, true, }, { "Always", del_pref_keep_not, true, }, }; table_ty *tp; char buffer[100]; char *bp; int c; for (;;) { printf ( "Delete the %s %s? ", filename.quote_c().c_str(), (isdir ? "directory and everything below it" : "file") ); fflush(stdout); bp = buffer; for (;;) { c = getchar(); if (c == '\n' || c == EOF) break; if (bp < ENDOF(buffer) - 1) *bp++ = c; } *bp = 0; for (tp = table; tp < ENDOF(table); ++tp) { if (arglex_compare(tp->name, buffer, 0)) { if (tp->set != del_pref_unset) cmd_line_pref = tp->set; return tp->result; } } printf("Please answer 'yes', 'no', 'all' or 'none'.\n"); } } bool user_ty::delete_file_query(const nstring &filename, bool isdir, int default_preference) { // // if the preference was not set on the command line, // read it fron the user config file // trace(("user_ty::delete_file_query(this = %p, filename = %s, " "isdir = %d, dflt = %d)\n{\n", this, filename.quote_c().c_str(), isdir, default_preference)); if (cmd_line_pref == del_pref_unset) { trace(("mark\n")); if (default_preference > 0) { // delete, keep not cmd_line_pref = del_pref_keep_not; } else if (default_preference == 0) { // delete not, keep cmd_line_pref = del_pref_keep; } else { uconf_ty *ucp = uconf_get(); switch (ucp->delete_file_preference) { default: cmd_line_pref = del_pref_keep_not; break; case uconf_delete_file_preference_interactive: cmd_line_pref = del_pref_interactive; break; case uconf_delete_file_preference_keep: cmd_line_pref = del_pref_keep; break; } } } // // if the preference is to ask but we are in the background, // delete the files without asking. // if ( cmd_line_pref == del_pref_interactive && (!isatty(0) || os_background()) ) { trace(("mark\n")); cmd_line_pref = del_pref_keep_not; } // // figure the result // bool result = true; switch (cmd_line_pref) { case del_pref_unset: case del_pref_keep_not: break; case del_pref_interactive: result = ask(filename, isdir); break; case del_pref_keep: result = false; break; } trace(("return %d;\n", result)); trace(("}\n")); return result; } // vim: set ts=8 sw=4 et :