From 65aec10162f612d98edf91cc66bf7e781868448b Mon Sep 17 00:00:00 2001 From: Jesse Hallam Date: Mon, 19 May 2025 17:58:59 -0300 Subject: [PATCH] MM-64336: simplify doc extractor (#31103) * MM-64336: simplify doc extractor Avoid creating a whole temporary directory when a single temporary file suffices. Fixes: https://mattermost.atlassian.net/browse/MM-64337 * clarify -* semantics --- .../platform/services/docextractor/archive.go | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/server/platform/services/docextractor/archive.go b/server/platform/services/docextractor/archive.go index 585fd29462..b99a828892 100644 --- a/server/platform/services/docextractor/archive.go +++ b/server/platform/services/docextractor/archive.go @@ -27,17 +27,25 @@ func (ae *archiveExtractor) Match(filename string) bool { return err == nil } +// getExtAlsoTarGz returns the extension of the given file name, special casing .tar.gz. +func getExtAlsoTarGz(name string) string { + if strings.HasSuffix(name, ".tar.gz") { + return ".tar.gz" + } + + return filepath.Ext(name) +} + func (ae *archiveExtractor) Extract(name string, r io.ReadSeeker) (string, error) { - dir, err := os.MkdirTemp(os.TempDir(), "archiver") + ext := getExtAlsoTarGz(name) + + // Create a temporary file, using `*` control the random component while preserving the extension. + f, err := os.CreateTemp("", "archiver-*"+ext) if err != nil { return "", fmt.Errorf("error creating temporary file: %v", err) } - defer os.RemoveAll(dir) + defer os.Remove(f.Name()) - f, err := os.Create(filepath.Join(dir, name)) - if err != nil { - return "", fmt.Errorf("error copying data into temporary file: %v", err) - } _, err = io.Copy(f, r) f.Close() if err != nil {