Download raw body.
Display GMT offset from got cat
On Wed, Feb 16, 2022 at 10:44:07AM -0500, Josh Rickmar wrote: > I understand that we prefer to use and display UTC for got commit, got > log, tog, etc. but it seems that got cat should not lie about the GMT > offset of commits created by Git. > > Some additional background: I'd like to eventually add tag signing > using SSH keys to Got, and was trying to manually verify the output of > 'got cat' using signed tags created by Git. These signatures were > failing to verify due to the GMT offset not being printed correctly. > With this fixed, I am able to manually verify GPG and SSH signatures > after removing the messagelen from the output of got cat. > > ----------------------------------------------- > commit f049cc2be5ab990f4fac3b5fbb7f3f3ee6ae5bf1 (cat_tz) > from: Josh Rickmar <jrick@zettaport.com> > date: Wed Feb 16 15:42:23 2022 UTC > > display GMT offset in cat command > > diff 03f44f51f7e8df35c47add87eb518b0a363d537b 2f99b84397ef3ff37ecae72d204264ca7dc206d3 > blob - 7d8663fbddd35a7c2dca7773ddeda8f1c7abffa4 > blob + 28723c7c52add5592515f140c9b53f57382ba049 > --- got/got.c > +++ got/got.c > @@ -11466,6 +11466,23 @@ cat_tree(struct got_object_id *id, struct got_reposito > return err; > } > > +static void > +format_gmtoff(char *buf, size_t sz, time_t gmtoff) > +{ > + long long h, m; > + char sign = '+'; > + > + if (gmtoff < 0) { > + sign = '-'; > + gmtoff = -gmtoff; > + } > + > + buf[0] = sign; this assignment is a leftover from some earlier work. > + h = (long long)gmtoff / 3600; > + m = ((long long)gmtoff - h*3600) / 60; > + snprintf(buf, sz, "%c%02lld%02lld", sign, h, m); > +} > + > static const struct got_error * > cat_commit(struct got_object_id *id, struct got_repository *repo, FILE *outfile) > { > @@ -11475,6 +11492,7 @@ cat_commit(struct got_object_id *id, struct got_reposi > struct got_object_qid *pid; > char *id_str = NULL; > const char *logmsg = NULL; > + char gmtoff[6]; > > err = got_object_open_as_commit(&commit, repo, id); > if (err) > @@ -11496,13 +11514,19 @@ cat_commit(struct got_object_id *id, struct got_reposi > fprintf(outfile, "%s%s\n", GOT_COMMIT_LABEL_PARENT, pid_str); > free(pid_str); > } > - fprintf(outfile, "%s%s %lld +0000\n", GOT_COMMIT_LABEL_AUTHOR, > + format_gmtoff(gmtoff, sizeof(gmtoff), > + got_object_commit_get_author_gmtoff(commit)); > + fprintf(outfile, "%s%s %lld %s\n", GOT_COMMIT_LABEL_AUTHOR, > got_object_commit_get_author(commit), > - (long long)got_object_commit_get_author_time(commit)); > + (long long)got_object_commit_get_author_time(commit), > + gmtoff); > > - fprintf(outfile, "%s%s %lld +0000\n", GOT_COMMIT_LABEL_COMMITTER, > + format_gmtoff(gmtoff, sizeof(gmtoff), > + got_object_commit_get_committer_gmtoff(commit)); > + fprintf(outfile, "%s%s %lld %s\n", GOT_COMMIT_LABEL_COMMITTER, > got_object_commit_get_author(commit), > - (long long)got_object_commit_get_committer_time(commit)); > + (long long)got_object_commit_get_committer_time(commit), > + gmtoff); > > logmsg = got_object_commit_get_logmsg_raw(commit); > fprintf(outfile, "messagelen %zd\n", strlen(logmsg)); > @@ -11520,6 +11544,7 @@ cat_tag(struct got_object_id *id, struct got_repositor > struct got_tag_object *tag; > char *id_str = NULL; > const char *tagmsg = NULL; > + char gmtoff[6]; > > err = got_object_open_as_tag(&tag, repo, id); > if (err) > @@ -11555,9 +11580,12 @@ cat_tag(struct got_object_id *id, struct got_repositor > fprintf(outfile, "%s%s\n", GOT_TAG_LABEL_TAG, > got_object_tag_get_name(tag)); > > - fprintf(outfile, "%s%s %lld +0000\n", GOT_TAG_LABEL_TAGGER, > + format_gmtoff(gmtoff, sizeof(gmtoff), > + got_object_tag_get_tagger_gmtoff(tag)); > + fprintf(outfile, "%s%s %lld %s\n", GOT_TAG_LABEL_TAGGER, > got_object_tag_get_tagger(tag), > - (long long)got_object_tag_get_tagger_time(tag)); > + (long long)got_object_tag_get_tagger_time(tag), > + gmtoff); > > tagmsg = got_object_tag_get_message(tag); > fprintf(outfile, "messagelen %zd\n", strlen(tagmsg)); > blob - 0c5c8ea1db1ca05c383570fdf3d063cbf5825f73 > blob + 332aac7daf0b874612728683bc951e0b30605f86 > --- regress/cmdline/cat.sh > +++ regress/cmdline/cat.sh > @@ -20,6 +20,7 @@ test_cat_basic() { > local testroot=`test_init cat_basic` > local commit_id=`git_show_head $testroot/repo` > local author_time=`git_show_author_time $testroot/repo` > + local gmtoff=`date +%z` > local alpha_id=`got tree -r $testroot/repo -i | grep 'alpha$' | cut -d' ' -f 1` > local gamma_id=`got tree -r $testroot/repo -i | grep 'gamma/$' | cut -d' ' -f 1` > local delta_id=`got tree -r $testroot/repo -i gamma | grep 'delta$' | cut -d' ' -f 1` > @@ -51,8 +52,8 @@ test_cat_basic() { > git_show_tree $testroot/repo >> $testroot/stdout.expected > echo >> $testroot/stdout.expected > echo "numparents 0" >> $testroot/stdout.expected > - echo "author $GOT_AUTHOR $author_time +0000" >> $testroot/stdout.expected > - echo "committer $GOT_AUTHOR $author_time +0000" \ > + echo "author $GOT_AUTHOR $author_time $gmtoff" >> $testroot/stdout.expected > + echo "committer $GOT_AUTHOR $author_time $gmtoff" \ > >> $testroot/stdout.expected > echo "messagelen 22" >> $testroot/stdout.expected > printf "\nadding the test tree\n" >> $testroot/stdout.expected > @@ -234,6 +235,7 @@ test_cat_submodule_of_same_repo() { > local testroot=`test_init cat_submodule_of_same_repo` > local commit_id0=`git_show_head $testroot/repo` > local author_time=`git_show_author_time $testroot/repo` > + local gmtoff=`date +%z` > > (cd $testroot && git clone -q repo repo2 >/dev/null) > (cd $testroot/repo && git submodule -q add ../repo2) > @@ -243,8 +245,8 @@ test_cat_submodule_of_same_repo() { > # because a commit with the same ID exists in the outer repository > got cat -r $testroot/repo $commit_id0 | grep ^tree > $testroot/stdout.expected > echo "numparents 0" >> $testroot/stdout.expected > - echo "author $GOT_AUTHOR $author_time +0000" >> $testroot/stdout.expected > - echo "committer $GOT_AUTHOR $author_time +0000" \ > + echo "author $GOT_AUTHOR $author_time $gmtoff" >> $testroot/stdout.expected > + echo "committer $GOT_AUTHOR $author_time $gmtoff" \ > >> $testroot/stdout.expected > echo "messagelen 22" >> $testroot/stdout.expected > printf "\nadding the test tree\n" >> $testroot/stdout.expected >
Display GMT offset from got cat