diff options
Diffstat (limited to 'src/edit.c')
-rw-r--r-- | src/edit.c | 94 |
1 files changed, 90 insertions, 4 deletions
@@ -1,11 +1,21 @@ +/* edit.c - the edit action --------------------------------------------*- C -*- + * + * This file is part of ck, the config keeper + * + * ----------------------------------------------------------------------------- + * + * Copyright (C) 2018 Anastasis Grammenos + * GPLv3 (see LICENCE for the full notice) + * + * -------------------------------------------------------------------------- */ #include <libgen.h> -#include "actions.h" #include "dblayer.h" -#include "queries.h" #include "ckerrlog.h" -int edit_get_prime_config_from_program(DB *db, char *pName, char *ret, int *secret) { +ERRLOG(edit); + +static int edit_get_prime_config_from_program(DB *db, char *pName, char *ret, int *secret) { int pid = get_program_id(db, pName); /* error */ if (pid == -2) { @@ -29,7 +39,7 @@ int edit_get_prime_config_from_program(DB *db, char *pName, char *ret, int *secr return -1; } -int edit_get_config(DB *db, const char *pName, char *ret, const char *cName, int *sec) { +static int edit_get_config(DB *db, const char *pName, char *ret, const char *cName, int *sec) { int pid = get_program_id(db, pName); /* error */ if (pid == -2) { @@ -89,3 +99,79 @@ int edit_get_config(DB *db, const char *pName, char *ret, const char *cName, int } return -1; } + +int run_EDIT(UserOpt *opt, Conf *conf) { + DB db; + if (open_DB(&db, opt)) { + return -1; + } + + list_rewind(opt->args); + 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."); + print_suggested_configs(&db, pName); + goto error; + } + } + } + /* 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); + print_suggested_configs(&db, pName); + goto error; + } + } + close_DB(&db); + str_join_dirname_with_basename(confPath, secret ? conf->scrt_dir : conf->vc_dir, confName); + + char *editor = getenv("EDITOR"); + char command[STR_L] = ""; + if (str_is_empty(editor)) { + if (system("which nano > /dev/null 2>&1") != 0) { + ERR("Nano not found. Please set $EDITOR to your desired editor."); + return -1; + } + strcpy(command, "nano"); + } else { + strcpy(command, editor); + } + + + strcat(command, " "); + strcat(command, confPath); + + HELP("editing...\n%s", command); + system(command); + return 0; + error: + close_DB(&db); + return -1; +} + +void print_EDIT_help() { + HELP("ck edit PROGRAM_NAME [CONFIG_BASENAME]"); +} + |