diff --git a/commit.go b/commit.go index 00b81e3..93abd86 100644 --- a/commit.go +++ b/commit.go @@ -8,6 +8,7 @@ import ( "fmt" "strconv" "sync" + "time" cid "github.com/ipfs/go-cid" node "github.com/ipfs/go-ipld-format" @@ -41,10 +42,14 @@ type PersonInfo struct { } func (pi *PersonInfo) MarshalJSON() ([]byte, error) { - return json.Marshal(map[string]string{ + date, err := pi.date() + if err != nil { + return nil, err + } + return json.Marshal(map[string]interface{}{ "name": pi.Name, "email": pi.Email, - "date": pi.Date + " " + pi.Timezone, + "date": *date, }) } @@ -77,12 +82,31 @@ func (pi *PersonInfo) resolve(p []string) (interface{}, []string, error) { case "email": return pi.Email, p[1:], nil case "date": - return pi.Date + " " + pi.Timezone, p[1:], nil + date, err := pi.date() + if err != nil { + return nil, nil, err + } + return date.Format(time.RFC3339), p[1:], nil default: return nil, nil, errors.New("no such link") } } +func (pi *PersonInfo) date() (*time.Time, error) { + sec, err := strconv.ParseInt(pi.Date, 10, 64) + if err != nil { + return nil, err + } + zoneOffset, err := strconv.Atoi(pi.Timezone) + if err != nil { + return nil, err + } + hr, mm := zoneOffset/100, zoneOffset%100 + location := time.FixedZone("UTC", hr*60*60+mm*60) + date := time.Unix(sec, 0).In(location) + return &date, nil +} + type MergeTag struct { Object cid.Cid `json:"object"` Type string `json:"type"` diff --git a/git_test.go b/git_test.go index 98a4c85..0ecf27c 100644 --- a/git_test.go +++ b/git_test.go @@ -342,12 +342,30 @@ func TestParsePersonInfo(t *testing.T) { } assert(t, pi.String() == "Someone ") + + pi, err = parsePersonInfo([]byte("prefix Łukasz Magiera 1546187652 +0100")) + piJSON, err := pi.MarshalJSON() + date, _, err := pi.resolve([]string{"date"}) + assert(t, string(piJSON) == `{"date":"2018-12-30T17:34:12+01:00","email":"magik6k@users.noreply.github.com","name":"Łukasz Magiera"}`) + assert(t, date == "2018-12-30T17:34:12+01:00") + + pi, err = parsePersonInfo([]byte("prefix Sameer 1545162499 -0500")) + piJSON, err = pi.MarshalJSON() + assert(t, string(piJSON) == `{"date":"2018-12-18T14:48:19-05:00","email":"sameer@users.noreply.github.com","name":"Sameer"}`) + + pi, err = parsePersonInfo([]byte("prefix Łukasz Magiera 1546187652 +0122")) + piJSON, err = pi.MarshalJSON() + assert(t, string(piJSON) == `{"date":"2018-12-30T17:56:12+01:22","email":"magik6k@users.noreply.github.com","name":"Łukasz Magiera"}`) + + pi, err = parsePersonInfo([]byte("prefix Sameer 1545162499 -0545")) + piJSON, err = pi.MarshalJSON() + assert(t, string(piJSON) == `{"date":"2018-12-18T14:03:19-05:45","email":"sameer@users.noreply.github.com","name":"Sameer"}`) } func assert(t *testing.T, ok bool) { if !ok { fmt.Printf("\n") - t.Fatal("Assertion failed") + panic("Assertion failed") } }