commit 6e790f45d64975dc0b774d672fa3577dfcfafdc9 from: Stefan Sperling date: Sun Jun 10 22:50:26 2018 UTC move parse_commit_time() to object.c and make public API commit - 3fe1abad43f057903efb7980e29ce93af766891e commit + 6e790f45d64975dc0b774d672fa3577dfcfafdc9 blob - 54d808ec2c08ac0e57c12400068fb20edd2302b2 blob + 6a104bbde53b6ab5aa419027b762dc8b49c7426a --- include/got_object.h +++ include/got_object.h @@ -122,6 +122,14 @@ const struct got_error *got_object_commit_open(struct /* Dispose of a commit object. */ void got_object_commit_close(struct got_commit_object *); +/* Get the commit's committer timestamp (in UTC). */ +const struct got_error *got_object_commit_get_committer_time(time_t *, + struct got_commit_object *); + +/* Get the commit's author timestamp (in UTC). */ +const struct got_error *got_object_commit_get_committer_time(time_t *, + 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 - 7dd5b8be427df3a57ec980255b2022c804e2f12d blob + 5d6edcfd4343961cb8e7b00e4596e9d0fff68613 --- lib/commit_graph.c +++ lib/commit_graph.c @@ -132,43 +132,6 @@ static int is_root_node(struct got_commit_graph_node *node) { return node->commit->nparents == 0; -} - -static const struct got_error * -parse_commit_time(int64_t *time, struct got_commit_object *commit) -{ - const struct got_error *err = NULL; - const char *errstr; - char *committer, *space; - - *time = 0; - - committer = strdup(commit->committer); - if (committer == NULL) - return got_error_from_errno(); - - /* Strip off trailing timezone indicator. */ - space = strrchr(committer, ' '); - if (space == NULL) { - err = got_error(GOT_ERR_BAD_OBJ_DATA); - goto done; - } - *space = '\0'; - - /* Timestamp is separated from committer name + email by space. */ - space = strrchr(committer, ' '); - if (space == NULL) { - err = got_error(GOT_ERR_BAD_OBJ_DATA); - goto done; - } - - *time = strtonum(space + 1, 0, INT64_MAX, &errstr); - if (errstr) - err = got_error(GOT_ERR_BAD_OBJ_DATA); - -done: - free(committer); - return err; } static const struct got_error * @@ -178,10 +141,11 @@ compare_commits(int *cmp, struct got_commit_object *c1 const struct got_error *err; int64_t t1, t2; - err = parse_commit_time(&t1, c1); + err = got_object_commit_get_committer_time(&t1, c1); if (err) return err; - err = parse_commit_time(&t2, c2); + err = got_object_commit_get_committer_time(&t2, c2); + if (err) return err; blob - fd3ef97d777386e079ab697ef1959196c6ac765e blob + 679abeccb798c260183c7938c2b076e5824d5197 --- lib/object.c +++ lib/object.c @@ -580,7 +580,58 @@ done: } return err; } + +static const struct got_error * +parse_commit_time(time_t *time, const char *author_str) +{ + const struct got_error *err = NULL; + const char *errstr; + char *committer, *space; + *time = 0; + + committer = strdup(author_str); + if (committer == NULL) + return got_error_from_errno(); + + /* Strip off trailing timezone indicator. */ + space = strrchr(committer, ' '); + if (space == NULL) { + err = got_error(GOT_ERR_BAD_OBJ_DATA); + goto done; + } + *space = '\0'; + + /* Timestamp is separated from committer name + email by space. */ + space = strrchr(committer, ' '); + if (space == NULL) { + err = got_error(GOT_ERR_BAD_OBJ_DATA); + goto done; + } + + *time = strtonum(space + 1, 0, INT64_MAX, &errstr); + if (errstr) + err = got_error(GOT_ERR_BAD_OBJ_DATA); + +done: + free(committer); + return err; +} + +const struct got_error * +got_object_commit_get_committer_time(time_t *time, + struct got_commit_object *commit) +{ + return parse_commit_time(time, commit->committer); +} + +const struct got_error * +got_object_commit_get_author_time(time_t *time, + struct got_commit_object *commit) +{ + return parse_commit_time(time, commit->committer); +} + static void tree_entry_close(struct got_tree_entry *te) {