diff options
Diffstat (limited to 'src/actions.c')
-rw-r--r-- | src/actions.c | 102 |
1 files changed, 62 insertions, 40 deletions
diff --git a/src/actions.c b/src/actions.c index d5f9a29..4ff6816 100644 --- a/src/actions.c +++ b/src/actions.c @@ -102,7 +102,6 @@ int run_DEL(UserOpt * opt, Conf *conf) { } int run_EDIT(UserOpt *opt, Conf *conf) { - printf("Running %s\n", "edit"); DB db = open_DB(opt); if (db.ptr == NULL) { if (db.error == SQL_ERR_NO_TABLES) { @@ -112,31 +111,52 @@ int run_EDIT(UserOpt *opt, Conf *conf) { } list_rewind(opt->args); - char confPath[STR_M]; - if (list_size(opt->args) == 1) { - char confName[STR_M]; - int secret = 0; - if (edit_get_prime_config_from_program(&db, list_get(opt->args), confName, &secret) == 1) { - str_join_dirname_with_basename(confPath, secret ? conf->scrt_dir : conf->vc_dir, confName); - printf("%s\n", confPath); - } else { - PRINT_ERR("No primary config"); - close_DB(&db); - return 1; + char confPath[STR_L]; + char confName[STR_M]; + int secret = 0; + /* Since we are here, args have to be 1 or 2 */ + char *pName = list_get(opt->args); + if (!program_exists(&db, pName)) { + ERR("Program %s doesn't exist in the database.", pName); + goto error; + } + /* If there is no next argument */ + if (!list_next(opt->args)) { + /* If there is no primary config*/ + if (edit_get_prime_config_from_program(&db, pName, confName, &secret) == -1) { + /* If the program has only one config */ + if (get_config_number(&db, pName) == 1) { + if (edit_get_config(&db, pName, confName, NULL, &secret)) { + ERR("Coudln't find config file for %s", pName); + goto error; + } + } + /* If the program has many configs */ + else { + HELP("Ambiguous config. Please type the config name after the program."); + cklist *paths = list_make_new(); + edit_get_avaliable_paths(&db, paths, pName); + list_print(paths); + list_free(paths); + goto error; + } } - } else { - close_DB(&db); - char confName[STR_L]; - switch (edit_get_config_or_suggestions(opt->args, confName)) { - case ERC_OK: - return 0; - case ERC_ERR: - return 1; - case ERC_SUGGESTIONS: - return 1; + } + /* If there are more arguments */ + else { + char *cName = list_get(opt->args); + if (edit_get_config(&db, pName, confName, cName, &secret)) { + ERR("Program %s doesn't have a config named %s", pName, cName); + cklist *paths = list_make_new(); + edit_get_avaliable_paths(&db, paths, pName); + list_print(paths); + list_free(paths); + goto error; } } close_DB(&db); + str_join_dirname_with_basename(confPath, secret ? conf->scrt_dir : conf->vc_dir, confName); + HELP("Editing %s", confPath); char *editor = getenv("EDITOR"); char command[STR_L]; @@ -145,6 +165,9 @@ int run_EDIT(UserOpt *opt, Conf *conf) { strcat(command, confPath); system(command); return 0; + error: + close_DB(&db); + return 1; } int run_LIST(UserOpt *opt, Conf *conf) { @@ -157,45 +180,44 @@ int run_LIST(UserOpt *opt, Conf *conf) { return 1; } - cklist *list_type = list_make_new(); + cklist *the_list = list_make_new(); ListOpt listOpt = list_make_options(opt->args); if (listOpt.err) { - close_DB(&db); - list_free(list_type); - return 1; + goto error; } switch(listOpt._lt) { case LT_PATH: - list_get_paths(&db, list_type, listOpt.attr); + list_get_paths(&db, the_list, listOpt.attr); break; case LT_PROGRAM: - list_get_programs(&db, list_type); + list_get_programs(&db, the_list); break; case LT_TREE: - list_get_path_program_tree(&db, list_type, listOpt.attr); - list_print(list_type); - close_DB(&db); - list_free(list_type); - return 0; + list_get_path_program_tree(&db, the_list, listOpt.attr); + list_print(the_list); + goto close; case LT_NONE: - close_DB(&db); - list_free(list_type); - return 1; + goto error; } switch(listOpt._lst) { case LST_PLAIN: - list_print(list_type); + list_print(the_list); break; case LST_LISP: - list_print_lisp(list_type); + list_print_lisp(the_list); break; case LST_PYTHON: - list_print_python(list_type); + list_print_python(the_list); } + close: close_DB(&db); - list_free(list_type); + list_free(the_list); return 0; + error: + close_DB(&db); + list_free(the_list); + return 1; } FILE *popen(const char *command, const char *mode); |