Skip to content

Commit 0391ae4

Browse files
committed
paths: use user.User value to get home dir
Continuing our efforts to make our code unit testable, add a user.User struct to the parameters for the methods in paths.go. This allows us to remove the rest of the dependencies on the real system in the GetRepositories() method. It requires some more work elsewhere in the codebase for all the places where the path methods are used. Signed-off-by: Derrick Stolee <[email protected]>
1 parent ff3848d commit 0391ae4

File tree

6 files changed

+55
-27
lines changed

6 files changed

+55
-27
lines changed

cmd/git-bundle-server/cron.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,16 @@ import (
55
"os"
66
"strings"
77

8+
"github.com/github/git-bundle-server/internal/common"
89
"github.com/github/git-bundle-server/internal/core"
910
)
1011

1112
func SetCronSchedule() error {
13+
user, err := common.NewUserProvider().CurrentUser()
14+
if err != nil {
15+
return err
16+
}
17+
1218
pathToExec, err := os.Executable()
1319
if err != nil {
1420
return fmt.Errorf("failed to get executable: %w", err)
@@ -33,7 +39,7 @@ func SetCronSchedule() error {
3339
}
3440

3541
scheduleBytes = append(scheduleBytes, []byte(dailySchedule)...)
36-
scheduleFile := core.CrontabFile()
42+
scheduleFile := core.CrontabFile(user)
3743

3844
err = os.WriteFile(scheduleFile, scheduleBytes, 0o600)
3945
if err != nil {

cmd/git-bundle-server/update-all.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ For every configured route, run 'git-bundle-server update <options> <route>'.`
2222
}
2323

2424
func (UpdateAll) Run(args []string) error {
25+
user, err := common.NewUserProvider().CurrentUser()
26+
if err != nil {
27+
return err
28+
}
2529
fs := common.NewFileSystem()
2630

2731
parser := argparse.NewArgParser("git-bundle-server update-all")
@@ -32,7 +36,7 @@ func (UpdateAll) Run(args []string) error {
3236
return fmt.Errorf("failed to get path to execuable: %w", err)
3337
}
3438

35-
repos, err := core.GetRepositories(fs)
39+
repos, err := core.GetRepositories(user, fs)
3640
if err != nil {
3741
return err
3842
}

cmd/git-bundle-web-server/main.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ func parseRoute(path string) (string, string, string, error) {
3535
}
3636

3737
func serve(w http.ResponseWriter, r *http.Request) {
38+
user, err := common.NewUserProvider().CurrentUser()
39+
if err != nil {
40+
return
41+
}
3842
fs := common.NewFileSystem()
3943
path := r.URL.Path
4044

@@ -47,7 +51,7 @@ func serve(w http.ResponseWriter, r *http.Request) {
4751

4852
route := owner + "/" + repo
4953

50-
repos, err := core.GetRepositories(fs)
54+
repos, err := core.GetRepositories(user, fs)
5155
if err != nil {
5256
w.WriteHeader(http.StatusInternalServerError)
5357
fmt.Printf("Failed to load routes\n")

internal/core/paths.go

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,21 @@
11
package core
22

3-
import "os"
3+
import (
4+
"os/user"
5+
)
46

5-
func bundleroot() string {
6-
dirname, err := os.UserHomeDir()
7-
if err != nil {
8-
// TODO: respond better. For now, try creating in "/var"
9-
dirname = "/var"
10-
}
11-
12-
return dirname + "/git-bundle-server/"
7+
func bundleroot(user *user.User) string {
8+
return user.HomeDir + "/git-bundle-server/"
139
}
1410

15-
func webroot() string {
16-
return bundleroot() + "www/"
11+
func webroot(user *user.User) string {
12+
return bundleroot(user) + "www/"
1713
}
1814

19-
func reporoot() string {
20-
return bundleroot() + "git/"
15+
func reporoot(user *user.User) string {
16+
return bundleroot(user) + "git/"
2117
}
2218

23-
func CrontabFile() string {
24-
return bundleroot() + "cron-schedule"
19+
func CrontabFile(user *user.User) string {
20+
return bundleroot(user) + "cron-schedule"
2521
}

internal/core/repo.go

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55
"log"
66
"os"
7+
"os/user"
78

89
"github.com/github/git-bundle-server/internal/common"
910
)
@@ -15,8 +16,12 @@ type Repository struct {
1516
}
1617

1718
func CreateRepository(route string) (*Repository, error) {
19+
user, err := common.NewUserProvider().CurrentUser()
20+
if err != nil {
21+
return nil, err
22+
}
1823
fs := common.NewFileSystem()
19-
repos, err := GetRepositories(fs)
24+
repos, err := GetRepositories(user, fs)
2025
if err != nil {
2126
return nil, fmt.Errorf("failed to parse routes file")
2227
}
@@ -26,8 +31,8 @@ func CreateRepository(route string) (*Repository, error) {
2631
return &repo, nil
2732
}
2833

29-
repodir := reporoot() + route
30-
web := webroot() + route
34+
repodir := reporoot(user) + route
35+
web := webroot(user) + route
3136

3237
mkdirErr := os.MkdirAll(web, os.ModePerm)
3338
if mkdirErr != nil {
@@ -51,8 +56,12 @@ func CreateRepository(route string) (*Repository, error) {
5156
}
5257

5358
func RemoveRoute(route string) error {
59+
user, err := common.NewUserProvider().CurrentUser()
60+
if err != nil {
61+
return err
62+
}
5463
fs := common.NewFileSystem()
55-
repos, err := GetRepositories(fs)
64+
repos, err := GetRepositories(user, fs)
5665
if err != nil {
5766
return fmt.Errorf("failed to parse routes file")
5867
}
@@ -68,7 +77,11 @@ func RemoveRoute(route string) error {
6877
}
6978

7079
func WriteRouteFile(repos map[string]Repository) error {
71-
dir := bundleroot()
80+
user, err := common.NewUserProvider().CurrentUser()
81+
if err != nil {
82+
return err
83+
}
84+
dir := bundleroot(user)
7285
routefile := dir + "/routes"
7386

7487
contents := ""
@@ -80,10 +93,10 @@ func WriteRouteFile(repos map[string]Repository) error {
8093
return os.WriteFile(routefile, []byte(contents), 0o600)
8194
}
8295

83-
func GetRepositories(fs common.FileSystem) (map[string]Repository, error) {
96+
func GetRepositories(user *user.User, fs common.FileSystem) (map[string]Repository, error) {
8497
repos := make(map[string]Repository)
8598

86-
dir := bundleroot()
99+
dir := bundleroot(user)
87100
routefile := dir + "/routes"
88101

89102
lines, err := fs.ReadFileLines(routefile)
@@ -97,8 +110,8 @@ func GetRepositories(fs common.FileSystem) (map[string]Repository, error) {
97110

98111
repo := Repository{
99112
Route: route,
100-
RepoDir: reporoot() + route,
101-
WebDir: webroot() + route,
113+
RepoDir: reporoot(user) + route,
114+
WebDir: webroot(user) + route,
102115
}
103116
repos[route] = repo
104117
}

internal/daemon/shared_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,3 +94,8 @@ func (m *mockFileSystem) ReadFileLines(filename string) ([]string, error) {
9494
fnArgs := m.Called(filename)
9595
return fnArgs.Get(0).([]string), fnArgs.Error(1)
9696
}
97+
98+
func (m *mockFileSystem) UserHomeDir() (string, error) {
99+
fnArgs := m.Called()
100+
return fnArgs.String(0), fnArgs.Error(1)
101+
}

0 commit comments

Comments
 (0)