baseline

yet another open-source distributed versioning control system
Log | Files | Refs

commit 7ea3563926e47c2d63f21b839205f50244f729ac
parent 9249505d9bdb3ba01c87b6f82af2f6a81ea56eb3
Author: Mohamed Aslan <maslan@sce.carleton.ca>
Date:   Sun, 25 May 2014 16:31:13 -0400

some work done and bug fixes for branches support

Diffstat:
Mcmd-branch.c | 130++++++++++++++++++++++++++++++++++----------------------------------------------
Mcmd-commit.c | 2+-
Mdircache-simple.c | 21+++++++++++++++------
Mdircache.h | 1+
Mobjdb-fs.c | 22++++++++++++++++++----
Msession.c | 3+++
Msession.h | 1+
7 files changed, 94 insertions(+), 86 deletions(-)

diff --git a/cmd-branch.c b/cmd-branch.c @@ -26,90 +26,70 @@ #include "defaults.h" #include "config.h" -#include "objdb.h" -#include "dircache.h" +#include "session.h" #include "cmd.h" -extern int objdb_baseline_get_ops(struct objdb_ops **); -extern int dircache_simple_get_ops(struct dircache_ops **); - -int cmd_branch(int, char **); - -/* - * creates a new branch. - */ -static int -create(const char *branch_name) { - char *baseline_path; - int retval; - struct objdb_ops *objdb; - struct objdb_ctx *db_ctx; - objdb_baseline_get_ops(&objdb); - /* FIXME: get repository path correctly */ - asprintf(&baseline_path, "%s", BASELINE_DIR); - /* FIXME: check if repository initialized */ - if (objdb->open != NULL) - objdb->open(&db_ctx, "db", baseline_path); - if (objdb->init != NULL) /* TO BE REMOVED */ - objdb->init(db_ctx); - retval = objdb->branch_create(db_ctx, branch_name); - if (objdb->close != NULL) - objdb->close(db_ctx); - free(baseline_path); - free(objdb); - return retval; -} - -static int -update(const char *branch_name, const char *head_objid) -{ - - return EXIT_SUCCESS; -} - -static int -ls() -{ - char *baseline_path; - int retval; - struct objdb_ops *objdb; - struct objdb_ctx *db_ctx; - objdb_baseline_get_ops(&objdb); - /* FIXME: get repository path correctly */ - asprintf(&baseline_path, "%s", BASELINE_DIR); - /* FIXME: check if repository initialized */ - if (objdb->open != NULL) - objdb->open(&db_ctx, "db", baseline_path); - if (objdb->init != NULL) /* TO BE REMOVED */ - objdb->init(db_ctx); - retval = objdb->branch_ls(db_ctx); - if (objdb->close != NULL) - objdb->close(db_ctx); - free(baseline_path); - free(objdb); - return retval; -} int cmd_branch(int argc, char **argv) { - /* - * branch command can be used to: - * 1. list all branches - * 2. create a new branch - */ + char *branch = NULL; + char *head = NULL; + enum { + O_LISTCUR, + O_LISTALL, + O_CREATE, + O_SWITCH + } op = O_LISTCUR; + int ch, error = 0; + struct session s; - if (argc == 1) { /* no args */ - /* list all branches */ - ls(); + baseline_session_begin(&s, 0); + + /* parse command line options */ + while ((ch = getopt(argc, argv, "ac:s:")) != -1) { + switch (ch) { + case 'a': + op = O_LISTALL; + break; + case 'c': + op = O_CREATE; + branch = strdup(optarg); + break; + case 's': + op = O_SWITCH; + default: + error = 1; + break; + } } - else if (argc == 2) { /* 1 arg */ - /* create a new branch */ - if (create(argv[1]) == EXIT_FAILURE) - errx(EXIT_FAILURE, "failed to create branch \'%s\'", argv[1]); + argc -= optind; + argv += optind; + + if (error) { + return EXIT_FAILURE; } - else{ - errx(EXIT_FAILURE, "wrong number of parameters for command \'branch\'"); + + switch (op) { + case O_LISTCUR: + if (s.db_ops->branch_get_head(s.db_ctx, s.branch, &head) == EXIT_FAILURE) + errx(EXIT_FAILURE, "error, failed to find branch head."); + printf("current branch: %s\nhead: %s\n", s.branch, head); + free(head); + break; + case O_LISTALL: + if (s.db_ops->branch_ls(s.db_ctx) == EXIT_FAILURE) + errx(EXIT_FAILURE, "error, failed to list branches."); + break; + case O_CREATE: + /* create a new branch */ + if (s.db_ops->branch_create(s.db_ctx, branch) == EXIT_FAILURE) + errx(EXIT_FAILURE, "error, failed to create branch \'%s\'.", branch); + break; + case O_SWITCH: + break; } + + baseline_session_end(&s); return EXIT_SUCCESS; } diff --git a/cmd-commit.c b/cmd-commit.c @@ -120,7 +120,7 @@ cmd_commit(int argc, char **argv) switch (ch) { case 'm': flag_msg = 1; - asprintf(&commit_msg, "%s", optarg); + commit_msg = strdup(optarg); break; default: flag_error = 1; diff --git a/dircache-simple.c b/dircache-simple.c @@ -35,6 +35,7 @@ static int simple_init(struct dircache_ctx *); static int simple_insert(struct dircache_ctx *, const char *); static int simple_checkout(struct dircache_ctx *, const char *); static int simple_commit(struct dircache_ctx *, const char *); +static int simple_get_branch(struct dircache_ctx *, char **); static struct dircache_ops simple_ops = { .name = "simple", @@ -46,6 +47,7 @@ static struct dircache_ops simple_ops = { .remove = NULL, .commit = simple_commit, .checkout = simple_checkout, + .get_branch = simple_get_branch, .fsck = NULL, .compress = NULL, .dedup = NULL @@ -305,7 +307,7 @@ simple_gen_commit(const char *dir_id, const char *msg_file, char **commit_file) } static int -simple_get_current_branch(char **branch_name) +simple_get_branch(struct dircache_ctx *dc_ctx, char **branch_name) { size_t size = 0; FILE *branch_fp; @@ -355,7 +357,6 @@ simple_commit(struct dircache_ctx *dc_ctx, const char *msgfile) path[len-1] = 0; --len; } - printf("DIR: %s\n", path); dc_ctx->db_ops->dir_begin(dc_ctx->db_ctx, &handle); paths[0] = (char *)path; paths[1] = NULL; @@ -367,14 +368,21 @@ simple_commit(struct dircache_ctx *dc_ctx, const char *msgfile) continue; } if (entry->fts_info & FTS_F) { +#ifdef DEBUG printf("\t FILE: %s\n", entry->fts_path); +#endif if ((fp = fopen(entry->fts_path, "r")) == NULL) return EXIT_FAILURE; fscanf(fp, "%c %s %o", &type, tmp_objid, &mode); - if (type == 'F') + if (type == 'F') { dc_ctx->db_ops->dir_insert_object(dc_ctx->db_ctx, handle, tmp_objid, entry->fts_name, T_FILE, mode); - else if (type == 'D') + printf("[+] F %06o\t%s\n", mode, entry->fts_name); + } + else if (type == 'D') { dc_ctx->db_ops->dir_insert_object(dc_ctx->db_ctx, handle, tmp_objid, entry->fts_name, T_DIR, mode); + /* FIXME: dir mode are copied from dircache, hence not preserved */ + printf("[+] D %06o\t%s\n", mode, entry->fts_name); + } fclose(fp); unlink(entry->fts_path); } @@ -412,9 +420,9 @@ simple_commit(struct dircache_ctx *dc_ctx, const char *msgfile) return EXIT_FAILURE; if (dc_ctx->db_ops->insert_from_file(dc_ctx->db_ctx, T_COMMIT, path, &objid) == EXIT_FAILURE) return EXIT_FAILURE; - printf("COMMIT ID: %s\n", objid); + printf("commit id: %s\n", objid); unlink(path); - simple_get_current_branch(&branch); + simple_get_branch(dc_ctx, &branch); dc_ctx->db_ops->branch_set_head(dc_ctx->db_ctx, branch, objid); free(path); free(objid); @@ -435,3 +443,4 @@ simple_checkout(struct dircache_ctx *dc_ctx, const char *branch_name) return EXIT_SUCCESS; } + diff --git a/dircache.h b/dircache.h @@ -36,6 +36,7 @@ struct dircache_ops { int (*remove)(struct dircache_ctx *, const char *); int (*commit)(struct dircache_ctx *, const char *); int (*checkout)(struct dircache_ctx *, const char *); + int (*get_branch)(struct dircache_ctx *, char **); int (*fsck)(struct dircache_ctx *); int (*compress)(struct dircache_ctx *); int (*dedup)(struct dircache_ctx *); diff --git a/objdb-fs.c b/objdb-fs.c @@ -343,7 +343,9 @@ objdb_bl_branch_create(struct objdb_ctx *ctx, const char *branch_name) { char *db_dir_name = NULL; char *branch_path = NULL; + char *branch_head = NULL; int retval = EXIT_SUCCESS; + FILE *fp; if (branch_name == NULL) return EXIT_FAILURE; @@ -353,10 +355,21 @@ objdb_bl_branch_create(struct objdb_ctx *ctx, const char *branch_name) #ifdef DEBUG printf("creating branch %s\n", branch_path); #endif - if (mkdir(branch_path, S_IRUSR | S_IWUSR | S_IXUSR) == -1) + if (mkdir(branch_path, S_IRUSR | S_IWUSR | S_IXUSR) == -1) { retval = EXIT_FAILURE; + goto ret; + } + /* create head */ + asprintf(&branch_head, "%s/head", branch_path); + if ((fp = fopen(branch_head, "w")) == NULL) { + retval = EXIT_FAILURE; + goto ret; + } + fclose(fp); +ret: free(db_dir_name); free(branch_path); + free(branch_head); return retval; } @@ -429,8 +442,9 @@ objdb_bl_branch_get_head(struct objdb_ctx *ctx, const char *branch_name, char ** goto ret; } if (getline(head_objid, &size, head_fp) == -1) { - retval = EXIT_FAILURE; - goto ret; + /* assuming the head file is empty */ + /* FIXME: check for errors */ + *head_objid = NULL; } fclose(head_fp); ret: @@ -458,7 +472,7 @@ objdb_bl_branch_ls(struct objdb_ctx *ctx) if (entry->fts_level == FTS_ROOTLEVEL) continue; if (entry->fts_info & FTS_D) { - printf("%s\n", entry->fts_name); + printf("* %s\n", entry->fts_name); } else { if (entry->fts_level >= 1) diff --git a/session.c b/session.c @@ -58,6 +58,9 @@ baseline_session_begin(struct session *s, u_int8_t options) errx(EXIT_FAILURE, "failed to load configurations."); free(config); + /* get current branch */ + s->dc_ops->get_branch(s->dc_ctx, (char **)&(s->branch)); + return EXIT_SUCCESS; } diff --git a/session.h b/session.h @@ -35,6 +35,7 @@ struct session { const char *repo_rootdir; const char *repo_baselinedir; const char cwd[PATH_MAX+1]; + const char *branch; }; int baseline_session_begin(struct session *, u_int8_t);