X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=list.go;h=f38eab35f83b2f1d8bfde9a995ba1aa313a70bce;hb=acc3fc03b1039c0f6a863e290e282f179794faa9;hp=48a9d71498fc7cbaebe315bd76cba7d76b1871d2;hpb=60bbf40bfc8b720f176faef55b5403986db86f8c;p=gocheese.git diff --git a/list.go b/list.go index 48a9d71..f38eab3 100644 --- a/list.go +++ b/list.go @@ -19,8 +19,10 @@ package main import ( "bytes" + _ "embed" "encoding/hex" "errors" + "fmt" "html/template" "io/fs" "io/ioutil" @@ -29,39 +31,21 @@ import ( "os" "path/filepath" "sort" + "strconv" "strings" "time" ) // https://warehouse.pypa.io/api-reference/legacy.html var ( - HTMLRootTmpl = template.Must(template.New("root").Parse(` - - - - Links for root - - {{$Refresh := .RefreshURLPath}}{{range .Packages}} - {{.}}
-{{- end}} - - -`)) - HTMLReleasesTmpl = template.Must(template.New("list").Parse(` - - - - Links for {{.PkgName}} - - {{$Refresh := .RefreshURLPath}}{{$PkgName := .PkgName}}{{range .Releases}} - {{.Filename}}
-{{- end}} - - -`)) - KnownExts = []string{".tar.bz2", ".tar.gz", ".whl", ".zip", ".egg", + //go:embed root.tmpl + HTMLRootTmplRaw string + HTMLRootTmpl = template.Must(template.New("root").Parse(HTMLRootTmplRaw)) + + //go:embed list.tmpl + HTMLReleasesTmplRaw string + HTMLReleasesTmpl = template.Must(template.New("list").Parse(HTMLReleasesTmplRaw)) + KnownExts = []string{".tar.bz2", ".tar.gz", ".whl", ".zip", ".egg", ".exe", ".dmg", ".msi", ".rpm", ".deb", ".tgz"} ) @@ -137,7 +121,7 @@ func filenameToVersion(fn string) string { return cols[0] } -func listDir(pkgName string, doSize bool) (int, []*PkgReleaseInfo, error) { +func listDir(pkgName string, doSize bool) (int64, []*PkgReleaseInfo, error) { dirPath := filepath.Join(Root, pkgName) entries, err := os.ReadDir(dirPath) if err != nil { @@ -206,7 +190,15 @@ func listDir(pkgName string, doSize bool) (int, []*PkgReleaseInfo, error) { releases = append(releases, release) } sort.Sort(PkgReleaseInfoByName(releases)) - return len(entries), releases, nil + fi, err := os.Stat(dirPath) + if err != nil { + return 0, nil, err + } + serial := fi.ModTime().Unix() + if fi, err = os.Stat(filepath.Join(dirPath, MDFile)); err == nil { + serial += fi.ModTime().Unix() + } + return serial, releases, nil } func serveListDir( @@ -224,7 +216,7 @@ func serveListDir( !refreshDir(w, r, pkgName, "", false) { return } - _, releases, err := listDir(pkgName, false) + serial, releases, err := listDir(pkgName, false) if err != nil { log.Println("error", r.RemoteAddr, "list", pkgName, err) http.Error(w, err.Error(), http.StatusInternalServerError) @@ -258,5 +250,7 @@ func serveListDir( http.Error(w, err.Error(), http.StatusInternalServerError) return } + w.Header().Set("X-PyPI-Last-Serial", strconv.FormatInt(serial, 10)) w.Write(buf.Bytes()) + w.Write([]byte(fmt.Sprintf("\n", serial))) }