all repos — conver-tool @ 8acf0b3eb894338c22c741a661f6d315f00cc738

A command line tool to manage ConVer projects.

Implement simple release command.
h3rald h3rald@h3rald.com
Wed, 10 Jun 2026 16:05:43 +0200
commit

8acf0b3eb894338c22c741a661f6d315f00cc738

parent

88208a9fb9f62a38f593d809762e9b2903966ab2

2 files changed, 69 insertions(+), 14 deletions(-)

jump to
M src/conver.csrc/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.hsrc/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