Implement simple release command.
h3rald h3rald@h3rald.com
Wed, 10 Jun 2026 16:05:43 +0200
2 files changed,
69 insertions(+),
14 deletions(-)
M
src/conver.c
→
src/conver.c
@@ -12,14 +12,15 @@ # include <errno.h>
# include <sys/stat.h> #endif -void print_result(conver_result_t result) +int print_result(conver_result_t result) { if (result == 0) { fprintf(stdout, "-> %s\n", conver_errors[result]); - return; + return result; } fprintf(stderr, "ERROR: %s\n", conver_errors[result]); + return result; } int fs_dir_exists(const char *path) {@@ -156,37 +157,43 @@ }
//// Commands -void command_init() +int command_init() { int write_all = 0; + int result = 0; if (!fs_dir_exists(CONVER_DIR)) { write_all = 1; - fs_dir_create(CONVER_DIR, 1); + result = fs_dir_create(CONVER_DIR, 1); + if (result != CONVER_OK) { + print_result(result); + return result; + } } if (write_all || !fs_file_exists(CONVER_DRAFT_FILE)) { printf("Creating %s...\n", CONVER_DRAFT_FILE); - print_result(fs_file_create(CONVER_DRAFT_FILE)); + result += print_result(fs_file_create(CONVER_DRAFT_FILE)); } if (write_all || !fs_file_exists(CONVER_RELEASE_FILE)) { printf("Creating %s...\n", CONVER_RELEASE_FILE); - print_result(fs_file_create(CONVER_RELEASE_FILE)); + result += print_result(fs_file_create(CONVER_RELEASE_FILE)); } if (write_all || !fs_file_exists(CONVER_LEGACY_FILE)) { printf("Creating %s...\n", CONVER_LEGACY_FILE); - print_result(fs_file_create(CONVER_LEGACY_FILE)); + result += print_result(fs_file_create(CONVER_LEGACY_FILE)); } if (write_all || !fs_file_exists(CONVER_HISTORY_FILE)) { printf("Creating %s...\n", CONVER_HISTORY_FILE); - print_result(fs_file_create(CONVER_HISTORY_FILE)); + result += print_result(fs_file_create(CONVER_HISTORY_FILE)); } + return result; } -void command_draft() +int command_draft() { char score[16]; uint16_t version;@@ -287,15 +294,56 @@ }
printf("Saving new draft version: %04X\n", version); char version_string[5]; snprintf(version_string, sizeof(version_string), "%04X", version); - print_result(fs_write(CONVER_DRAFT_FILE, version_string)); + int result = fs_write(CONVER_DRAFT_FILE, version_string); + print_result(result); + memset(version_string, 0, sizeof(version_string)); + memset(score, 0, sizeof(score)); + memset(size,0,sizeof(size)); + memset(breaking,0,sizeof(breaking)); + memset(enhancement,0,sizeof(enhancement)); + return result; +} +int command_release() +{ + char *draft_string; + size_t draft_len = 0; + int result = fs_read(CONVER_DRAFT_FILE, &draft_string, &draft_len); + if (result != CONVER_OK) { + return print_result(result); + } + if (strlen(draft_string) != 4) { + return print_result(CONVER_ERR_NO_DRAFT); + } + uint16_t draft = strtoul(draft_string, NULL, 16); + if (!draft) { + return print_result(CONVER_ERR_NO_DRAFT); + } + time_t raw_time = time(NULL); + struct tm *local_time = localtime(&raw_time); + char date[11]; + char comment[255]; + strftime(date, sizeof(date), "%Y-%m-%d", local_time); + printf("> Enter a brief comment/note for this release (max 255 chars): "); + fgets(comment, sizeof(comment), stdin); + char release[275]; + snprintf(release, sizeof(release), "%s: +%04X # %s", date, draft, comment); + result = fs_append(CONVER_HISTORY_FILE, release); + if (result != CONVER_OK) { + return print_result(result); + } + result = fs_write(CONVER_RELEASE_FILE, draft_string); + if (result != CONVER_OK) { + return print_result(result); + } + printf(release); + return 0; } //// Main int main(int argc, char *argv[]) { - if (argc > 1) { for (int i = 1; i < argc; i++)@@ -308,11 +356,15 @@ return 0;
} if ((strcmp(arg, "init") == 0)) { - command_init(); + return command_init(); } if ((strcmp(arg, "draft") == 0)) { - command_draft(); + return command_draft(); + } + if ((strcmp(arg, "release") == 0)) + { + return command_release(); } } }
M
src/conver.h
→
src/conver.h
@@ -15,6 +15,7 @@ #include <stdlib.h>
#include <stdint.h> #include <string.h> #include <ctype.h> +#include <time.h> typedef enum {@@ -26,9 +27,10 @@ CONVER_ERR_ALLOC = 4,
CONVER_ERR_STAT = 5, CONVER_ERR_MKDIR = 6, CONVER_ERR_INVALID_VALUE = 7, + CONVER_ERR_NO_DRAFT = 8, } conver_result_t; -char * conver_errors[8] = { +char * conver_errors[9] = { "Success", "Unable to open file.", "Unable to write file",@@ -37,6 +39,7 @@ "Unable to allocate memory for file",
"Unable to get file/directory information", "Unable to create directory", "Invalid value", + "No draft version configured. Please run: conver draft", }; #endif // CONVER_H