set mtime of output based on input content
1 file changed, 56 insertions(+), 15 deletions(-)
changed files
M internal/storage/files/writer.go → internal/storage/files/writer.go
@@ -7,7 +7,8 @@ "os" "path/filepath" "go.alanpearce.eu/website/internal/buffer" - "go.alanpearce.eu/website/internal/multibuf" + "go.alanpearce.eu/website/internal/content" + "go.alanpearce.eu/website/internal/multifile" "go.alanpearce.eu/x/log" "github.com/andybalholm/brotli"@@ -46,61 +47,101 @@ func (f *Files) OpenWrite(filename string) (io.WriteCloser, error) { return openFileWrite(f.join(filename)) } +func (f *Files) WritePost(post *content.Post, content *buffer.Buffer) error { + fd, err := f.write(post.URL, content) + if err != nil { + return err + } + err = fd.Close() + if err != nil { + return err + } + + if mf, isMultifile := fd.(*multifile.MultiFile); isMultifile { + err = mf.Chtimes(post.Date) + } else { + err = os.Chtimes(fd.Name(), post.Date, post.Date) + } + if err != nil { + return errors.WithMessage(err, "could not set file times") + } + + return nil +} + func (f *Files) Write(pathname string, content *buffer.Buffer) error { + fd, err := f.write(pathname, content) + if err != nil { + return err + } + fd.Close() + + return nil +} + +func (f *Files) write(pathname string, content *buffer.Buffer) (multifile.FileLike, error) { filename := pathNameToFileName(pathname) err := f.Mkdirp(filepath.Dir(filename)) if err != nil { - return errors.WithMessage(err, "could not create directory") + return nil, errors.WithMessage(err, "could not create directory") } fd, err := f.OpenFileAndVariants(filename) if err != nil { - return errors.WithMessagef(err, "could not open output file") + return nil, errors.WithMessagef(err, "could not open output file") } - defer fd.Close() _, err = fd.Write(content.Bytes()) if err != nil { - return errors.WithMessage(err, "could not write output file") + return nil, errors.WithMessage(err, "could not write output file") } - return nil + return fd, nil } func openFileWrite(filename string) (*os.File, error) { return os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) } -func openFileGz(filename string) (*gzip.Writer, error) { +func openFileGz(filename string) (*multifile.CompressWriter, error) { filenameGz := filename + ".gz" f, err := openFileWrite(filenameGz) + if err != nil { + return nil, err + } + w, err := gzip.NewWriterLevel(f, gzipLevel) if err != nil { return nil, err } - return gzip.NewWriterLevel(f, gzipLevel) + return multifile.NewCompressWriter(f, w), err } -func openFileBrotli(filename string) (*brotli.Writer, error) { +func openFileBrotli(filename string) (*multifile.CompressWriter, error) { filenameBrotli := filename + ".br" f, err := openFileWrite(filenameBrotli) if err != nil { return nil, err } - return brotli.NewWriterLevel(f, brotliLevel), nil + return multifile.NewCompressWriter(f, brotli.NewWriterLevel(f, brotliLevel)), nil } -func openFileZstd(filename string) (*zstd.Encoder, error) { +func openFileZstd(filename string) (*multifile.CompressWriter, error) { f, err := openFileWrite(filename + ".zstd") if err != nil { return nil, err } - return zstd.NewWriter(f) + w, err := zstd.NewWriter(f) + if err != nil { + return nil, err + } + + return multifile.NewCompressWriter(f, w), nil } -func multiOpenFile(filename string) (*multibuf.WriteCloser, error) { +func multiOpenFile(filename string) (*multifile.MultiFile, error) { r, err := openFileWrite(filename) if err != nil { return nil, err@@ -118,10 +159,10 @@ if err != nil { return nil, err } - return multibuf.NewWriteCloser(r, gz, br, zst), nil + return multifile.NewMultiFile(r, gz, br, zst), nil } -func (f *Files) OpenFileAndVariants(filename string) (io.WriteCloser, error) { +func (f *Files) OpenFileAndVariants(filename string) (multifile.FileLike, error) { if f.options.Compress { return multiOpenFile(f.join(filename)) }