aboutsummaryrefslogblamecommitdiffstats
path: root/src/actions.c
blob: f07d1ae6ebc3d3a30bf371539bf7e9afc4e728ac (plain) (tree)
1
2
3
4
5
6
7
8
9
10
                                                                                


                                             





                                                                                


                   
                    
                         
                    
                   
                   

                                         
               
                       
                                                                      
                                            
             

                                     
             
   
                            


                               
                        
           


                                        
                       
                       
                                        
                                                                     
     
               
   
                                              



                            
                                                          
               
                           
                                                              
               
   
                          

                                           
               
   
                               
                  
                             
                   

                  
             
   
                
           


                                        













                                                                     
                                                              

                                                   
                                                              










                                                  
           

 
                                        
                                 




                                                                     
             

   
                         
                       
                                  

                         
                                                                                               




                                                                                                 
               
     


                         
                                                                  



                 

                         
     








                                                          
           

 
                                        
               




                                        
             
   
 
                                      
                                                 
 


                         
             


                       
                                                 



                                      
               
                                                             


                          
             
               

                         
             










                                 
                
                       
           

 


                                                   
                                          


                                              
                       
                                  
                                
                


                         

                                            
                                           
                             













                                                  

 
                                        
                                 
           
 
/* actions.c - ck actions ----------------------------------------------*- C -*-
 *
 * This file is part of ck, the config keeper
 *
 * -----------------------------------------------------------------------------
 *
 * Copyright (C) 2018  Anastasis Grammenos
 * GPLv3 (see LICENCE for the full notice)
 *
 * -------------------------------------------------------------------------- */
#include <limits.h>
#include <stdlib.h>

#include "actions.h"
#include "actionhelper.h"
#include "dblayer.h"
#include "ckutil.h"
#include "cklist.h"

int run_INIT(UserOpt * opt, Conf *conf) {
  UNUSED(conf);
  if (db_exists(opt)) {
    printf("Current configuration file location: %s\n", opt->confDir);
    PRINT_ERR("ck is already initialized.");
    return 1;
  }
  if (init_create_config_file(opt)) {
    return 1;
  }
  DB db = init_make_DB(opt);
  if (db.error == SQL_NO_ERR) {
    init_make_tables(&db);
  }
  sqlite3_close(db.ptr);
  return 0;
}

int run_ADD(UserOpt * opt, Conf *conf) {
  DB db = open_DB(opt);
  if (db.ptr == NULL) {
    if (db.error == SQL_ERR_NO_TABLES) {
      PRINT_ERR("The database file is currupted. Run ck init anew.");
    }
    goto error;
  }
  AddOpt addOpt = add_make_options(opt->args);
  switch (addOpt.err) {
  case ADD_NO_ERR:
    break;
  case ADD_ERR_WRONG_CONFIG:
    PRINT_ERR("The config file specified doesn't exist.");
    goto error;
  case ADD_ERR_WRONG_FLAGS:
    PRINT_ERR("Flags are: -s for secret and -p for primary.");
    goto error;
  }
  add_print_opts(&addOpt);
  /* Try adding the new config to the DB */
  if (add_transaction_try(&db, &addOpt)) {
    goto error;
  }
  add_make_link(&addOpt, conf);
  char err[STR_M];
  if (add_err_message(err)) {
    PRINT_ERR(err);
  error:
    close_DB(&db);
    return 1;
  }
  close_DB(&db);
  return 0;
}

int run_DEL(UserOpt * opt, Conf *conf) {
  printf("Running del\n");
  DB db = open_DB(opt);
  if (db.ptr == NULL) {
    if (db.error == SQL_ERR_NO_TABLES) {
      PRINT_ERR("The database file is currupted. Run ck init anew.");
    }
    goto error;
  }

  DelOpt delOpt = del_make_options(opt->args);
  switch(delOpt.err) {
  case DEL_NO_ERR:
    if (delOpt.isConf) {
      printf("deleting conf %s\n", delOpt.path);
      // del_transaction_try(&db, delOpt.path, delOpt.isConf);
    } else {
      printf("Deleting program %s\n", delOpt.prog);
      // del_transaction_try(&db, delOpt.path, delOpt.isConf);
    }
    close_DB(&db);
    return 0;
  case DEL_ERR_WRONG_ARGS:
    printf("wrong del args\n");
    break;
  case DEL_ERR_WRONG_PATH:
    printf("path %s doesnt exist\n", delOpt.path);
  }
 error:
  close_DB(&db);
  return 1;
}

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) {
      PRINT_ERR("The database file is currupted. Run ck init anew.");
    }
    return 1;
  }

  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;
    }
  } 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;
    }
  }
  close_DB(&db);
    
  char *editor = getenv("EDITOR");
  char command[STR_L];
  strcpy(command, str_is_empty(editor) ? "nano" : editor);
  strcat(command, " ");
  strcat(command, confPath);
  system(command);
  return 0;
}

int run_LIST(UserOpt *opt, Conf *conf) {
  UNUSED(conf);
  DB db = open_DB(opt);
  if (db.ptr == NULL) {
    if (db.error == SQL_ERR_NO_TABLES) {
      printf("no tables\n");
    }
    return 1;
  }

  cklist *list_type = list_make_new();
  ListOpt listOpt = list_make_options(opt->args);

  if (listOpt.err) {
    close_DB(&db);
    list_free(list_type);
    return 1;
  }
  switch(listOpt._lt) {
  case LT_PATH:
    list_get_paths(&db, list_type, listOpt.attr);
    break;
  case LT_PROGRAM:
    list_get_programs(&db, list_type);
    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;
  case LT_NONE:
    close_DB(&db);
    list_free(list_type);
    return 1;
  }
  switch(listOpt._lst) {
  case LST_PLAIN:
    list_print(list_type);
    break;
  case LST_LISP:
    list_print_lisp(list_type);
    break;
  case LST_PYTHON:
    list_print_python(list_type);
  }
  close_DB(&db);
  list_free(list_type);
  return 0;
}

FILE *popen(const char *command, const char *mode);
int pclose(FILE *stream);

int run_SEARCH(UserOpt *opt, Conf *conf) {
  if (system("which grep > /dev/null") != 0) {
    return 2;
  }
  DB db = open_DB(opt);
  cklist *paths = list_make_new();
  list_get_paths(&db, paths, 0);
  close_DB(&db);
  if (list_size(paths)) {
    do {
      FILE *cmd;
      char result[STR_L] = "";
      char command[STR_L] = "grep -H -n \"";
      strcat(command, list_get(opt->args));
      strcat(command, "\" ");
      strcat(command, list_get(paths));
      cmd = popen(command, "r");
      if (cmd == NULL) {
        list_free(paths);
        return 1;
      }
      while (fgets(result, sizeof(result), cmd)) {
        printf("%s", result);
      }
      pclose(cmd);
    } while(list_next(paths));
  }
  list_free(paths);
  return 0;
}

int run_HELP(UserOpt *opt, Conf *conf) {
  printf("Running %s\n", "help");
  return 1;
}