Skip to content
This repository was archived by the owner on Sep 30, 2024. It is now read-only.

Commit 3b85035

Browse files
authored
chore: download - ensure dir exists when writing to dst (#64460)
Closes DINF-182 Before `sg start otel` would fail if `.bin` did not exist. We now create the destination directory if it doesn't exist ## Test plan 1. `rm -rf .bin` 2. `sg start otel` and unit tests + CI ## Changelog * when downloading files, ensure the directory we download to exists
1 parent bcb2e16 commit 3b85035

File tree

3 files changed

+80
-2
lines changed

3 files changed

+80
-2
lines changed

internal/download/BUILD.bazel

+7
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
load("//dev:go_defs.bzl", "go_test")
12
load("@io_bazel_rules_go//go:def.bzl", "go_library")
23

34
go_library(
@@ -11,3 +12,9 @@ go_library(
1112
"//lib/errors",
1213
],
1314
)
15+
16+
go_test(
17+
name = "download_test",
18+
srcs = ["download_test.go"],
19+
embed = [":download"],
20+
)

internal/download/download.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"net/http"
99
"os"
1010
"os/exec"
11+
"path"
1112
"path/filepath"
1213

1314
"github.com/sourcegraph/sourcegraph/internal/fileutil"
@@ -137,10 +138,11 @@ func safeRename(src, dst string) error {
137138
if err != nil {
138139
return err
139140
}
140-
out, err := os.OpenFile(dst, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm)
141-
if err != nil {
141+
// create the target directory if it does not exist
142+
if err := os.MkdirAll(path.Dir(dst), 0755); err != nil {
142143
return err
143144
}
145+
out, err := os.OpenFile(dst, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm)
144146
if err != nil {
145147
closeErr := in.Close()
146148
return errors.Append(err, closeErr)

internal/download/download_test.go

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package download
2+
3+
import (
4+
"os"
5+
"path"
6+
"testing"
7+
)
8+
9+
func TestSafeRename(t *testing.T) {
10+
t.Run("general from local file to target dir", func(t *testing.T) {
11+
fd, err := os.Create("safe-1.txt")
12+
if err != nil {
13+
t.Fatal(err)
14+
}
15+
defer func() {
16+
os.Remove(fd.Name())
17+
}()
18+
19+
tmpDir, err := os.MkdirTemp("", "safe-rename")
20+
if err != nil {
21+
t.Fatal(err)
22+
}
23+
defer func() {
24+
os.RemoveAll(tmpDir)
25+
}()
26+
27+
dst := path.Join(tmpDir, "safe-2.txt")
28+
29+
if err := safeRename(fd.Name(), dst); err != nil {
30+
t.Errorf("failed to safeRename %q to %q", fd.Name(), dst)
31+
}
32+
33+
if exists, err := fileExists(dst); err != nil {
34+
t.Fatal(err)
35+
} else if !exists {
36+
t.Errorf("expected %q to exist after safeRename", dst)
37+
}
38+
})
39+
t.Run("destination dir does not exist and gets created", func(t *testing.T) {
40+
fd, err := os.Create("safe-1.txt")
41+
if err != nil {
42+
t.Fatal(err)
43+
}
44+
defer func() {
45+
os.Remove(fd.Name())
46+
}()
47+
48+
tmpDir, err := os.MkdirTemp("", "safe-rename")
49+
if err != nil {
50+
t.Fatal(err)
51+
}
52+
defer func() {
53+
os.RemoveAll(tmpDir)
54+
}()
55+
56+
dst := path.Join(tmpDir, "i-do-not-exist", "safe-2.txt")
57+
58+
if err := safeRename(fd.Name(), dst); err != nil {
59+
t.Errorf("failed to safeRename %q to %q", fd.Name(), dst)
60+
}
61+
62+
if exists, err := fileExists(dst); err != nil {
63+
t.Fatal(err)
64+
} else if !exists {
65+
t.Errorf("expected %q to exist after safeRename", dst)
66+
}
67+
})
68+
69+
}

0 commit comments

Comments
 (0)