X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=fileutils.go;h=218b800156d086093dea82767ee351a3c0b289de;hb=8d410a547fec59ede811f71157b1b11d14a7b6c6;hp=b1b9ef95714edea8321e5832341f4d005a19f3fa;hpb=0d804c602fbc55f58d04fa9657950f3a6aac6d81;p=gocheese.git diff --git a/fileutils.go b/fileutils.go index b1b9ef9..218b800 100644 --- a/fileutils.go +++ b/fileutils.go @@ -1,6 +1,6 @@ /* GoCheese -- Python private package repository and caching proxy -Copyright (C) 2019-2020 Sergey Matveev +Copyright (C) 2019-2021 Sergey Matveev This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,12 +18,16 @@ along with this program. If not, see . package main import ( + "log" + "net/http" "os" "path/filepath" "strconv" "time" ) +var NoSync = os.Getenv("GOCHEESE_NO_SYNC") == "1" + func TempFile(dir string) (*os.File, error) { // Assume that probability of suffix collision is negligible suffix := strconv.FormatInt(time.Now().UnixNano()+int64(os.Getpid()), 16) @@ -32,6 +36,9 @@ func TempFile(dir string) (*os.File, error) { } func DirSync(dirPath string) error { + if NoSync { + return nil + } fd, err := os.Open(dirPath) if err != nil { return err @@ -44,7 +51,7 @@ func DirSync(dirPath string) error { return fd.Close() } -func WriteFileSync(dirPath, filePath string, data []byte) error { +func WriteFileSync(dirPath, filePath string, data []byte, mtime time.Time) error { dst, err := TempFile(dirPath) if err != nil { return err @@ -54,14 +61,32 @@ func WriteFileSync(dirPath, filePath string, data []byte) error { dst.Close() return err } - if err = dst.Sync(); err != nil { - os.Remove(dst.Name()) - dst.Close() - return err + if !NoSync { + if err = dst.Sync(); err != nil { + os.Remove(dst.Name()) + dst.Close() + return err + } } dst.Close() + if err = os.Chtimes(dst.Name(), mtime, mtime); err != nil { + return err + } if err = os.Rename(dst.Name(), filePath); err != nil { return err } return DirSync(dirPath) } + +func mkdirForPkg(w http.ResponseWriter, r *http.Request, pkgName string) bool { + path := filepath.Join(Root, pkgName) + if _, err := os.Stat(path); os.IsNotExist(err) { + if err = os.Mkdir(path, os.FileMode(0777)); err != nil { + log.Println("error", r.RemoteAddr, "mkdir", pkgName, err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return false + } + log.Println(r.RemoteAddr, "mkdir", pkgName) + } + return true +}