From 8b862f8b87b9f6d55c46100861e5ed0dfd26fb69 Mon Sep 17 00:00:00 2001 From: lisk77 Date: Tue, 19 Aug 2025 23:20:28 +0200 Subject: [PATCH] feat(cli): added init command to create a merk repository in the local directory --- src/main.c | 47 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/src/main.c b/src/main.c index 2483906..71a38b5 100644 --- a/src/main.c +++ b/src/main.c @@ -1,15 +1,17 @@ -#include "action_list.h" -#include "file.h" -#include "myers.h" -#include "utilities.h" -// main.c #include #include #include #include +#include +#include + +#include "action_list.h" +#include "file.h" +#include "myers.h" +#include "utilities.h" static void usage(int exitcode) { - printf("usage: merk []\n\n diff Displays the difference between the given two files\n"); + printf("usage: merk []\n\n init Initializes a repository in the current directory\n diff Displays the difference between the given two files\n"); exit(exitcode); } @@ -20,19 +22,45 @@ int main(int argc, char **argv) { const char* subcmd = argv[1]; - if (strcmp(subcmd, "diff") != 0) { + if (strcmp(subcmd, "diff") != 0 && strcmp(subcmd, "init") != 0) { fprintf(stderr, "ERROR: Unknown subcommand: '%s'\n", subcmd); usage(2); } - if (strcmp(subcmd, "diff") == 0) { + // Initializes a merk repository in the current directory + if (strcmp(subcmd, "init") == 0) { + if (argc != 2) { + printf("ERROR: too many agruments given!\n"); + printf("Usage: merk init"); + exit(1); + } + + if (mkdir(".merk", 0700) == 0) { + printf("Initialized merk repository\n"); + } + + if (errno == EEXIST) { + struct stat st; + if (stat(".merk", &st) == 0 && S_ISDIR(st.st_mode)) { + printf("This directory is already a merk repository\n"); + return 0; + } + } + + mkdir(".merk/files", 0700); + mkdir(".merk/trees", 0700); + mkdir(".merk/branches", 0700); + } + + // Prints out a visual representation of the diff of the files provided + else if (strcmp(subcmd, "diff") == 0) { if (argc != 4) { printf("ERROR: too many/too little arguments given!\n"); printf("Usage: merk diff "); exit(1); } - File* file1; + File* file1; switch (get_path_type(argv[2])) { case PT_FILE: file1 = new_file(argv[2]); break; case PT_DIR: file1 = NULL; printf("ERROR: first path is a directory and no file!"); break; @@ -40,6 +68,7 @@ int main(int argc, char **argv) { default: file1 = NULL; printf("ERROR: unknown first path!"); } if (!file1) exit(1); + File* file2; switch (get_path_type(argv[3])) { case PT_FILE: file2 = new_file(argv[3]); break;