diff --git a/upload/upload.go b/upload/upload.go index a40b75d..dd8521d 100644 --- a/upload/upload.go +++ b/upload/upload.go @@ -113,6 +113,7 @@ func (h *Handler) extractTarGzUpload(fileData io.Reader, site, branch string) er siteBranchPath := filepath.Join(site, "@"+branch) siteBranchOldPath := filepath.Join(site, "old@"+branch) + siteBranchWorkPath := filepath.Join(site, "work@"+branch) // try the new "old@[...]" and old "@[...].old" paths err = h.storageFs.RemoveAll(siteBranchPath + ".old") @@ -124,16 +125,11 @@ func (h *Handler) extractTarGzUpload(fileData io.Reader, site, branch string) er return fmt.Errorf("failed to remove old site branch %s: %w", siteBranchPath, err) } - err = h.storageFs.Rename(siteBranchPath, siteBranchOldPath) - if err != nil && !errors.Is(err, fs.ErrNotExist) { - return fmt.Errorf("failed to save an old copy of the site: %w", err) - } - - err = h.storageFs.MkdirAll(siteBranchPath, fs.ModePerm) + err = h.storageFs.MkdirAll(siteBranchWorkPath, fs.ModePerm) if err != nil { return fmt.Errorf("failed to make site directory: %w", err) } - branchFs := afero.NewBasePathFs(h.storageFs, siteBranchPath) + branchFs := afero.NewBasePathFs(h.storageFs, siteBranchWorkPath) // decompress gzip wrapper gzipReader, err := gzip.NewReader(fileData) @@ -169,6 +165,18 @@ func (h *Handler) extractTarGzUpload(fileData io.Reader, site, branch string) er } } + // TODO(melon): I would love to use unix.Renameat2 but due to afero this will not work + + err = h.storageFs.Rename(siteBranchPath, siteBranchOldPath) + if err != nil && !errors.Is(err, fs.ErrNotExist) { + return fmt.Errorf("failed to save an old copy of the site: %w", err) + } + + err = h.storageFs.Rename(siteBranchWorkPath, siteBranchPath) + if err != nil && !errors.Is(err, fs.ErrNotExist) { + return fmt.Errorf("failed to save an old copy of the site: %w", err) + } + n := time.Now().UTC() err = h.db.AddBranch(context.Background(), database.AddBranchParams{ diff --git a/upload/upload_test.go b/upload/upload_test.go index abaeb42..04f4173 100644 --- a/upload/upload_test.go +++ b/upload/upload_test.go @@ -53,6 +53,9 @@ func assertUploadedFile(t *testing.T, fs afero.Fs, branch string) { assert.False(t, stat.IsDir()) assert.Equal(t, int64(13), stat.Size()) + stat, err = fs.Stat("example.com/work@" + branch + "/test.txt") + assert.Error(t, err) + // check contents o, err := fs.Open("example.com/@" + branch + "/test.txt") assert.NoError(t, err)