Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

prop --clear: clear entire dir as described in usage #121

Merged
merged 3 commits into from
Mar 22, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 32 additions & 9 deletions app/prop.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,13 @@ const char *zsv_property_usage_msg[] = {
"Usage: " APPNAME " <filepath> [options]",
" where filepath is the path to the input CSV file, or",
" when using --auto: input CSV file or - for stdin",
" when using --clean: directory to clean from (. for current directory)",
" when using --clean: directory to clean from (use '.' for current directory)",
" and options may be one or more of:",
" -d,--header-row-span <value>: set/unset/auto-detect header depth (see below)",
" -R,--skip-head <value> : set/unset/auto-detect initial rows to skip (see below)",
" --list-files : list all property sets associted with the given file", // output a list of all cache files
" --clear : delete all properties of given files",
" --clear : delete all properties of the specified file",
// TO DO: --clear-file relative-path
" --clean : delete all files / dirs in the property cache of the given directory",
" that do not have a corresponding file in that directory",
" --dry : dry run, outputs files/dirs to remove. only for use with --clean",
Expand Down Expand Up @@ -80,6 +81,8 @@ static int zsv_property_usage(FILE *target) {

static int show_all_properties(const unsigned char *filepath) {
int err = 0;
// to do: show all files, not just prop file

if(!zsv_file_readable((const char *)filepath, &err, NULL)) {
perror((const char *)filepath);
return err;
Expand Down Expand Up @@ -512,7 +515,8 @@ enum zsv_prop_mode {
zsv_prop_mode_clean = 'K',
zsv_prop_mode_export = 'e',
zsv_prop_mode_import = 'i',
zsv_prop_mode_copy = 'c'
zsv_prop_mode_copy = 'c',
zsv_prop_mode_clear = 'l'
};

static enum zsv_prop_mode zsv_prop_get_mode(const char *opt) {
Expand All @@ -521,6 +525,7 @@ static enum zsv_prop_mode zsv_prop_get_mode(const char *opt) {
if(!strcmp(opt, "--copy")) return zsv_prop_mode_copy;
if(!strcmp(opt, "--export")) return zsv_prop_mode_export;
if(!strcmp(opt, "--import")) return zsv_prop_mode_import;
if(!strcmp(opt, "--clear")) return zsv_prop_mode_clear;
return zsv_prop_mode_default;
}

Expand Down Expand Up @@ -870,6 +875,8 @@ static int zsv_prop_execute_clean(const char *dirpath, unsigned char dry, unsign
if(!dirpath_len)
return 0;

// TO DO: if NO_STDIN, require --force, else prompt user

char *cache_parent;
if(!strcmp(dirpath, "."))
cache_parent = strdup(ZSV_CACHE_DIR);
Expand Down Expand Up @@ -1201,9 +1208,6 @@ int ZSV_MAIN_NO_OPTIONS_FUNC(ZSV_COMMAND)(int m_argc, const char *m_argv[]) {
if(m_argc == 2)
return show_all_properties(filepath);

if(m_argc == 3 && !strcmp("--clear", m_argv[2]))
return zsv_cache_remove(filepath, zsv_cache_type_property);

enum zsv_prop_mode mode = zsv_prop_mode_default;
unsigned char dry = 0;
const char *mode_arg = NULL; // e.g. "--export"
Expand All @@ -1229,9 +1233,7 @@ int ZSV_MAIN_NO_OPTIONS_FUNC(ZSV_COMMAND)(int m_argc, const char *m_argv[]) {
err = fprintf(stderr, "Option %s requires a value\n", opt);
}
}
} else if(!strcmp(opt, "--clear"))
err = fprintf(stderr, "--clear cannot be used in conjunction with any other options\n");
else if(!strcmp(opt, "--auto")) {
} else if(!strcmp(opt, "--auto")) {
if(opts.d != ZSV_PROP_ARG_NONE && opts.R != ZSV_PROP_ARG_NONE)
err = fprintf(stderr, "--auto specified, but all other properties also specified");
else {
Expand All @@ -1252,6 +1254,27 @@ int ZSV_MAIN_NO_OPTIONS_FUNC(ZSV_COMMAND)(int m_argc, const char *m_argv[]) {
}
}

if(mode == zsv_prop_mode_clear) { // m_argc == 3 && !strcmp("--clear", m_argv[2])) {
if(!(filepath && *filepath))
err = fprintf(stderr, "--clear: please specify an input file\n");
else {
struct prop_opts opts2 = { 0 };
opts2.d = ZSV_PROP_ARG_NONE;
opts2.R = ZSV_PROP_ARG_NONE;
if(memcmp(&opts, &opts2, sizeof(opts)))
err = fprintf(stderr, "--clear cannot be used in conjunction with any other options\n");
else {
unsigned char *cache_path = zsv_cache_path(filepath, NULL, 0);
if(!cache_path)
err = ENOMEM;
else if(zsv_dir_exists((const char *)cache_path))
err = zsv_remove_dir_recursive(cache_path);
free(cache_path);
}
}
return err;
}

// check if option combination is invalid
if(!err) {
char have_auto = opts.d == ZSV_PROP_ARG_AUTO || opts.R == ZSV_PROP_ARG_AUTO;
Expand Down
3 changes: 3 additions & 0 deletions app/test/prop/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,10 @@ test: test-1 test-2 test-3 test-4 test-5 test-6 test-7 test-8 test-copy test-cle

test-1:
@${TEST_INIT}
@${PREFIX} ${EXE} dummy.csv -R 2 ${SUFFIX}
@touch .zsv/data/dummy.csv/hello.json
@${PREFIX} ${EXE} dummy.csv --clear ${SUFFIX}
@ls .zsv/data/dummy.csv/hello.json 2>/dev/null && ${TEST_FAIL} || ${TEST_PASS}
@${CHECK} [ "`${EXE} dummy.csv`" == "{}" ] && ${TEST_PASS} || ${TEST_FAIL}

test-2:
Expand Down