commit 45d799e2247f32829160ec48664dbccfae98150f from: Stefan Sperling date: Sun Dec 23 11:10:27 2018 UTC make commit objects opaque in the library's API commit - 56765ebba6f171b02b9c44abb6013d5d62ced841 commit + 45d799e2247f32829160ec48664dbccfae98150f blob - 7cd07bd20aca71218aee61ff7af64ff3311955a5 blob + 9ca1e6c6f71588c3806a731999ac91937c63c1f2 --- got/got.c +++ got/got.c @@ -305,11 +305,12 @@ print_patch(struct got_commit_object *commit, struct g struct got_object_qid *qid; char *id_str1 = NULL, *id_str2; - err = got_object_open_as_tree(&tree2, repo, commit->tree_id); + err = got_object_open_as_tree(&tree2, repo, + got_object_commit_get_tree_id(commit)); if (err) return err; - qid = SIMPLEQ_FIRST(&commit->parent_ids); + qid = SIMPLEQ_FIRST(got_object_commit_get_parent_ids(commit)); if (qid != NULL) { struct got_commit_object *pcommit; @@ -317,7 +318,8 @@ print_patch(struct got_commit_object *commit, struct g if (err) return err; - err = got_object_open_as_tree(&tree1, repo, pcommit->tree_id); + err = got_object_open_as_tree(&tree1, repo, + got_object_commit_get_tree_id(pcommit)); got_object_commit_close(pcommit); if (err) return err; @@ -359,6 +361,8 @@ print_commit(struct got_commit_object *commit, struct const struct got_error *err = NULL; char *id_str, *datestr, *logmsg0, *logmsg, *line; char datebuf[26]; + time_t committer_time; + const char *author, *committer; err = got_object_id_str(&id_str, id); if (err) @@ -367,15 +371,20 @@ print_commit(struct got_commit_object *commit, struct printf("-----------------------------------------------\n"); printf("commit %s\n", id_str); free(id_str); - printf("from: %s\n", commit->author); - datestr = get_datestr(&commit->committer_time, datebuf); + printf("from: %s\n", got_object_commit_get_author(commit)); + committer_time = got_object_commit_get_committer_time(commit); + datestr = get_datestr(&committer_time, datebuf); printf("date: %s UTC\n", datestr); - if (strcmp(commit->author, commit->committer) != 0) - printf("via: %s\n", commit->committer); - if (commit->nparents > 1) { + author = got_object_commit_get_author(commit); + committer = got_object_commit_get_committer(commit); + if (strcmp(author, committer) != 0) + printf("via: %s\n", committer); + if (got_object_commit_get_nparents(commit) > 1) { + const struct got_object_id_queue *parent_ids; struct got_object_qid *qid; int n = 1; - SIMPLEQ_FOREACH(qid, &commit->parent_ids, entry) { + parent_ids = got_object_commit_get_parent_ids(commit); + SIMPLEQ_FOREACH(qid, parent_ids, entry) { err = got_object_id_str(&id_str, qid->id); if (err) return err; @@ -384,7 +393,7 @@ print_commit(struct got_commit_object *commit, struct } } - logmsg0 = strdup(commit->logmsg); + logmsg0 = strdup(got_object_commit_get_logmsg(commit)); if (logmsg0 == NULL) return got_error_from_errno(); blob - 4381cdf163f126acf727fe4d81e16d5f4c0ae0d7 blob + af264e30e6836ade853bbfe34bd4abbb3a8e26b6 --- include/got_object.h +++ include/got_object.h @@ -19,6 +19,7 @@ struct got_object_id; struct got_blob_object; struct got_tree_object; struct got_tag_object; +struct got_commit_object; struct got_tree_entry { SIMPLEQ_ENTRY(got_tree_entry) entry; @@ -45,21 +46,6 @@ const struct got_error *got_object_qid_alloc(struct go struct got_object_id *); void got_object_qid_free(struct got_object_qid *); -struct got_commit_object { - struct got_object_id *tree_id; - unsigned int nparents; - struct got_object_id_queue parent_ids; - char *author; - time_t author_time; /* UTC */ - time_t author_gmtoff; - char *committer; - time_t committer_time; /* UTC */ - time_t committer_gmtoff; - char *logmsg; - - int refcnt; /* for internal use only */ -}; - /* A generic object. Used as a handle which holds an ID and an object type. */ struct got_object; #define GOT_OBJ_TYPE_COMMIT 1 @@ -149,6 +135,37 @@ const struct got_error *got_object_commit_open(struct /* Dispose of a commit object. */ void got_object_commit_close(struct got_commit_object *); +/* Obtain the ID of the tree created in a commit. */ +struct got_object_id *got_object_commit_get_tree_id(struct got_commit_object *); + +/* Obtain the number of parent commits of a commit. */ +int got_object_commit_get_nparents(struct got_commit_object *); + +/* Obtain the list of parent commits of a commit. */ +const struct got_object_id_queue *got_object_commit_get_parent_ids( + struct got_commit_object *); + +/* Get the author's name and email address. */ +const char *got_object_commit_get_author(struct got_commit_object *); + +/* Get an author's commit timestamp. */ +time_t got_object_commit_get_author_time(struct got_commit_object *); + +/* Get an author's timezone offset. */ +time_t got_object_commit_get_author_gmtoff(struct got_commit_object *); + +/* Get the committer's name and email address. */ +const char *got_object_commit_get_committer(struct got_commit_object *); + +/* Get an committer's commit timestamp. */ +time_t got_object_commit_get_committer_time(struct got_commit_object *); + +/* Get an committer's timezone offset. */ +time_t got_object_commit_get_committer_gmtoff(struct got_commit_object *); + +/* Get the commit log message. */ +const char *got_object_commit_get_logmsg(struct got_commit_object *); + /* * Attempt to open a tree object in a repository. * The provided object must be of type GOT_OBJ_TYPE_TREE. blob - 314a74068288ba542806c56894a9a52fd608399d blob + 9af8a526beb32027acfb0c3d1027c8e543a961be --- lib/diff.c +++ lib/diff.c @@ -602,7 +602,8 @@ got_diff_objects_as_commits(struct got_object *obj1, s err = got_object_commit_open(&commit1, repo, obj1); if (err) goto done; - err = got_object_open(&tree_obj1, repo, commit1->tree_id); + err = got_object_open(&tree_obj1, repo, + got_object_commit_get_tree_id(commit1)); if (err) goto done; } @@ -610,7 +611,8 @@ got_diff_objects_as_commits(struct got_object *obj1, s err = got_object_commit_open(&commit2, repo, obj2); if (err) goto done; - err = got_object_open(&tree_obj2, repo, commit2->tree_id); + err = got_object_open(&tree_obj2, repo, + got_object_commit_get_tree_id(commit2)); if (err) goto done; blob - c2619193e47de7f03830953b4c47623aafbbd7fb blob + 7bcbdfd39b328a04433e376dbf7471f0e48c4482 --- lib/got_lib_object.h +++ lib/got_lib_object.h @@ -35,6 +35,20 @@ struct got_object { int refcnt; /* > 0 if open and/or cached */ }; +struct got_commit_object { + struct got_object_id *tree_id; + unsigned int nparents; + struct got_object_id_queue parent_ids; + char *author; + time_t author_time; /* UTC */ + time_t author_gmtoff; + char *committer; + time_t committer_time; /* UTC */ + time_t committer_gmtoff; + char *logmsg; + int refcnt; /* > 0 if open and/or cached */ +}; + struct got_tree_object { struct got_tree_entries entries; int refcnt; blob - 433a6598256a2714af7dc3ab5859a6231a30150d blob + edf8f8d3f1e2d5afcc0926bb3d6edead7609e66b --- lib/object_parse.c +++ lib/object_parse.c @@ -273,8 +273,67 @@ got_object_commit_close(struct got_commit_object *comm free(commit->committer); free(commit->logmsg); free(commit); +} + +struct got_object_id * +got_object_commit_get_tree_id(struct got_commit_object *commit) +{ + return commit->tree_id; +} + +int +got_object_commit_get_nparents(struct got_commit_object *commit) +{ + return commit->nparents; } +const struct got_object_id_queue * +got_object_commit_get_parent_ids(struct got_commit_object *commit) +{ + return &commit->parent_ids; +} + +const char * +got_object_commit_get_author(struct got_commit_object *commit) +{ + return commit->author; +} + +time_t +got_object_commit_get_author_time(struct got_commit_object *commit) +{ + return commit->author_time; +} + +time_t got_object_commit_get_author_gmtoff(struct got_commit_object *commit) +{ + return commit->author_gmtoff; +} + +const char * +got_object_commit_get_committer(struct got_commit_object *commit) +{ + return commit->committer; +} + +time_t +got_object_commit_get_committer_time(struct got_commit_object *commit) +{ + return commit->committer_time; +} + +time_t +got_object_commit_get_committer_gmtoff(struct got_commit_object *commit) +{ + return commit->committer_gmtoff; +} + +const char * +got_object_commit_get_logmsg(struct got_commit_object *commit) +{ + return commit->logmsg; +} + const struct got_error * got_object_parse_commit(struct got_commit_object **commit, char *buf, size_t len) { blob - faf7e0d4c42ae9b366451dd0c514260ed7b37585 blob + 18bc93be414b53dfc38357b8bfab53aa7227ee28 --- regress/repository/repository_test.c +++ regress/repository/repository_test.c @@ -63,11 +63,13 @@ static const struct got_error * print_parent_commits(struct got_commit_object *commit, struct got_repository *repo) { + const struct got_object_id_queue *parent_ids; struct got_object_qid *qid; const struct got_error *err = NULL; struct got_object *obj; - SIMPLEQ_FOREACH(qid, &commit->parent_ids, entry) { + parent_ids = got_object_commit_get_parent_ids(commit); + SIMPLEQ_FOREACH(qid, parent_ids, entry) { err = got_object_open(&obj, repo, qid->id); if (err != NULL) return err; @@ -148,6 +150,7 @@ static const struct got_error * print_commit_object(struct got_object *obj, struct got_repository *repo) { struct got_commit_object *commit; + const struct got_object_id_queue *parent_ids; struct got_object_qid *qid; char *buf; const struct got_error *err; @@ -157,24 +160,27 @@ print_commit_object(struct got_object *obj, struct got if (err) return err; - err = got_object_id_str(&buf, commit->tree_id); + err = got_object_id_str(&buf, got_object_commit_get_tree_id(commit)); if (err) return err; test_printf("tree: %s\n", buf); free(buf); - test_printf("parent%s: ", (commit->nparents == 1) ? "" : "s"); - SIMPLEQ_FOREACH(qid, &commit->parent_ids, entry) { + test_printf("parent%s: ", + (got_object_commit_get_nparents(commit) == 1) ? "" : "s"); + parent_ids = got_object_commit_get_parent_ids(commit); + SIMPLEQ_FOREACH(qid, parent_ids, entry) { err = got_object_id_str(&buf, qid->id); if (err) return err; test_printf("%s\n", buf); free(buf); } - test_printf("author: %s\n", commit->author); - test_printf("committer: %s\n", commit->committer); - test_printf("log: %s\n", commit->logmsg); + test_printf("author: %s\n", got_object_commit_get_author(commit)); + test_printf("committer: %s\n", got_object_commit_get_committer(commit)); + test_printf("log: %s\n", got_object_commit_get_logmsg(commit)); - err = got_object_open(&treeobj, repo, commit->tree_id); + err = got_object_open(&treeobj, repo, + got_object_commit_get_tree_id(commit)); if (err != NULL) return err; if (got_object_get_type(treeobj) == GOT_OBJ_TYPE_TREE) { blob - b0d09c8faf17ad7edf5ea5b89ac54e6fab5b77d6 blob + 90bfd8951f9142131facc3e9770db2c4479da161 --- tog/tog.c +++ tog/tog.c @@ -875,8 +875,10 @@ draw_commit(struct tog_view *view, struct got_commit_o static const size_t author_display_cols = 16; const int avail = view->ncols; struct tm tm; + time_t committer_time; - if (localtime_r(&commit->committer_time, &tm) == NULL) + committer_time = got_object_commit_get_committer_time(commit); + if (localtime_r(&committer_time, &tm) == NULL) return got_error_from_errno(); if (strftime(datebuf, sizeof(datebuf), "%g/%m/%d ", &tm) >= sizeof(datebuf)) @@ -891,7 +893,7 @@ draw_commit(struct tog_view *view, struct got_commit_o if (col > avail) goto done; - author0 = strdup(commit->author); + author0 = strdup(got_object_commit_get_author(commit)); if (author0 == NULL) { err = got_error_from_errno(); goto done; @@ -919,7 +921,7 @@ draw_commit(struct tog_view *view, struct got_commit_o if (col > avail) goto done; - logmsg0 = strdup(commit->logmsg); + logmsg0 = strdup(got_object_commit_get_logmsg(commit)); if (logmsg0 == NULL) { err = got_error_from_errno(); goto done; @@ -1231,7 +1233,7 @@ open_diff_view_for_commit(struct tog_view **new_view, if (err) return err; - parent_id = SIMPLEQ_FIRST(&commit->parent_ids); + parent_id = SIMPLEQ_FIRST(got_object_commit_get_parent_ids(commit)); if (parent_id) { err = got_object_open(&obj1, repo, parent_id->id); if (err) @@ -1263,7 +1265,8 @@ browse_commit(struct tog_view **new_view, int begin_x, struct got_tree_object *tree; struct tog_view *tree_view; - err = got_object_open_as_tree(&tree, repo, entry->commit->tree_id); + err = got_object_open_as_tree(&tree, repo, + got_object_commit_get_tree_id(entry->commit)); if (err) return err; @@ -1830,6 +1833,8 @@ write_commit_info(struct got_object *obj, struct got_r char *id_str; char datebuf[26]; struct got_commit_object *commit = NULL; + time_t committer_time; + const char *author, *committer; err = got_object_id_str(&id_str, got_object_get_id(obj)); if (err) @@ -1841,21 +1846,26 @@ write_commit_info(struct got_object *obj, struct got_r err = got_error_from_errno(); goto done; } - if (fprintf(outfile, "from: %s\n", commit->author) < 0) { + if (fprintf(outfile, "from: %s\n", + got_object_commit_get_author(commit)) < 0) { err = got_error_from_errno(); goto done; } + committer_time = got_object_commit_get_committer_time(commit); if (fprintf(outfile, "date: %s UTC\n", - get_datestr(&commit->committer_time, datebuf)) < 0) { + get_datestr(&committer_time, datebuf)) < 0) { err = got_error_from_errno(); goto done; } - if (strcmp(commit->author, commit->committer) != 0 && - fprintf(outfile, "via: %s\n", commit->committer) < 0) { + author = got_object_commit_get_author(commit); + committer = got_object_commit_get_committer(commit); + if (strcmp(author, committer) != 0 && + fprintf(outfile, "via: %s\n", committer) < 0) { err = got_error_from_errno(); goto done; } - if (fprintf(outfile, "%s\n", commit->logmsg) < 0) { + if (fprintf(outfile, "%s\n", + got_object_commit_get_logmsg(commit)) < 0) { err = got_error_from_errno(); goto done; } @@ -1902,6 +1912,7 @@ create_diff(struct tog_diff_view_state *s) s->diff_context, s->repo, f); break; case GOT_OBJ_TYPE_COMMIT: { + const struct got_object_id_queue *parent_ids; struct got_object_qid *pid; struct got_commit_object *commit2; @@ -1909,7 +1920,8 @@ create_diff(struct tog_diff_view_state *s) if (err) break; /* Show commit info if we're diffing to a parent commit. */ - SIMPLEQ_FOREACH(pid, &commit2->parent_ids, entry) { + parent_ids = got_object_commit_get_parent_ids(commit2); + SIMPLEQ_FOREACH(pid, parent_ids, entry) { struct got_object_id *id1 = got_object_get_id(obj1); if (got_object_id_cmp(id1, pid->id) == 0) { write_commit_info(obj2, s->repo, f); @@ -2400,7 +2412,7 @@ open_selected_commit(struct got_object **pobj, struct if (err) goto done; - pid = SIMPLEQ_FIRST(&commit->parent_ids); + pid = SIMPLEQ_FIRST(got_object_commit_get_parent_ids(commit)); if (pid) { err = got_object_open(pobj, repo, pid->id); if (err) @@ -3468,7 +3480,8 @@ cmd_tree(int argc, char *argv[]) if (error != NULL) goto done; - error = got_object_open_as_tree(&tree, repo, commit->tree_id); + error = got_object_open_as_tree(&tree, repo, + got_object_commit_get_tree_id(commit)); if (error != NULL) goto done;