Skip to content

Allow users to display local time in profile #27748

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@
/web_src/fomantic/build/** linguist-generated
/web_src/fomantic/_site/globals/site.variables linguist-language=Less
/web_src/js/vendor/** -text -eol linguist-vendored
/options/timezones.csv.gz linguist-generated
Dockerfile.* linguist-language=Dockerfile
5 changes: 5 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,7 @@ help:
@echo " - fmt format the Go code"
@echo " - generate-license update license files"
@echo " - generate-gitignore update gitignore files"
@echo " - update-timezones updates the timezones"
@echo " - generate-manpage generate manpage"
@echo " - generate-swagger generate the swagger spec from code comments"
@echo " - swagger-validate check if the swagger spec is valid"
Expand Down Expand Up @@ -979,5 +980,9 @@ docker:
docker build --disable-content-trust=false -t $(DOCKER_REF) .
# support also build args docker build --build-arg GITEA_VERSION=v1.2.3 --build-arg TAGS="bindata sqlite sqlite_unlock_notify" .

.PHONY: update-timezones
update-timezones:
$(GO) run build/update-timezones.go

# This endif closes the if at the top of the file
endif
153 changes: 153 additions & 0 deletions build/update-timezones.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
// Copyright 2023 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT

//go:build ignore

package main

import (
"archive/zip"
"compress/gzip"
"encoding/csv"
"io"
"log"
"net/http"
"os"
"slices"
"strconv"
"time"

"code.gitea.io/gitea/modules/util"
)

type TimezoneInfo struct {
Name string
TimeStart int64
Offset int64
}

func (timeZone *TimezoneInfo) Write(csvWriter *csv.Writer) {
csvWriter.Write([]string{timeZone.Name, strconv.FormatInt(timeZone.TimeStart, 10), strconv.FormatInt(timeZone.Offset, 10)})
}

func writeTimezones(csvWriter *csv.Writer, timezoneList []*TimezoneInfo) {
// We don't want data for timezones that are more than 5 years old
startTime := time.Now().UTC().AddDate(-5, 0, 0).Unix()

// We don't want data for timezones that are more than 30 years in the future
endTime := time.Now().UTC().AddDate(30, 0, 0).Unix()

hasWritten := false

for {
if len(timezoneList) == 0 {
return
}

if !hasWritten && len(timezoneList) == 1 {
// If we only have one element left, but nothing written, we need to write it
timezoneList[0].Write(csvWriter)
return
}

if timezoneList[0].TimeStart >= startTime && timezoneList[0].TimeStart <= endTime {
timezoneList[0].Write(csvWriter)
hasWritten = true
}

// Remove the first elemnt from the slice
timezoneList = slices.Delete(timezoneList, 0, 1)
}
}

func main() {
const (
url = "https://timezonedb.com/files/TimeZoneDB.csv.zip"
dest = "options/timezones.csv.gz"
prefix = "timezone-archive"
filename = "time_zone.csv"
)

file, err := os.CreateTemp(os.TempDir(), prefix)
if err != nil {
log.Fatalf("Failed to create temp file. %s", err)
}

defer util.Remove(file.Name())

req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Fatalf("Failed to download archive. %s", err)
}

resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatalf("Failed to download archive. %s", err)
}

defer resp.Body.Close()

if _, err := io.Copy(file, resp.Body); err != nil {
log.Fatalf("Failed to copy archive to file. %s", err)
}

file.Close()

zf, err := zip.OpenReader(file.Name())
if err != nil {
log.Fatalf("Failed to open archive. %s", err)
}
defer zf.Close()

fi, err := zf.Open(filename)
if err != nil {
log.Fatalf("Failed to open file in archive. %s", err)
}
defer fi.Close()

fo, err := os.Create(dest)
if err != nil {
log.Fatalf("Failed to create file. %s", err)
}
defer fo.Close()

zo := gzip.NewWriter(fo)
defer zo.Close()

const nameColumn = 0
const timeStartColumn = 3
const offsetColumn = 4

csvReader := csv.NewReader(fi)
data, err := csvReader.ReadAll()
if err != nil {
log.Fatalf("Failed to create CSV Reader. %s", err)
}

csvWriter := csv.NewWriter(zo)
defer csvWriter.Flush()

timezoneList := make([]*TimezoneInfo, 0)
currentName := ""

for _, row := range data {
if currentName != "" && currentName != row[nameColumn] {
writeTimezones(csvWriter, timezoneList)
timezoneList = make([]*TimezoneInfo, 0)
}

currentName = row[nameColumn]

timeStart, err := strconv.ParseInt(row[timeStartColumn], 10, 64)
if err != nil {
log.Fatalf("Convert %s to int64: %s", row[timeStartColumn], err)
}

offset, err := strconv.ParseInt(row[offsetColumn], 10, 64)
if err != nil {
log.Fatalf("Convert %s to int64: %s", row[offsetColumn], err)
}

timezoneList = append(timezoneList, &TimezoneInfo{Name: row[nameColumn], TimeStart: timeStart, Offset: offset})
}
}
Loading