Skip to content

Commit 220b84a

Browse files
authored
Merge pull request #30 from github/vdye/child-process-tracing
Logging Part 3: child process tracing
2 parents 2bee23e + a609c0b commit 220b84a

22 files changed

+579
-279
lines changed

cmd/git-bundle-server/cron.go

-60
This file was deleted.

cmd/git-bundle-server/init.go

+5-17
Original file line numberDiff line numberDiff line change
@@ -43,33 +43,20 @@ func (i *initCmd) Run(ctx context.Context, args []string) error {
4343

4444
repoProvider := utils.GetDependency[core.RepositoryProvider](ctx, i.container)
4545
bundleProvider := utils.GetDependency[bundles.BundleProvider](ctx, i.container)
46+
gitHelper := utils.GetDependency[git.GitHelper](ctx, i.container)
4647

4748
repo, err := repoProvider.CreateRepository(ctx, *route)
4849
if err != nil {
4950
return i.logger.Error(ctx, err)
5051
}
5152

5253
fmt.Printf("Cloning repository from %s\n", *url)
53-
gitErr := git.GitCommand("clone", "--bare", *url, repo.RepoDir)
54-
55-
if gitErr != nil {
56-
return i.logger.Errorf(ctx, "failed to clone repository: %w", gitErr)
57-
}
58-
59-
gitErr = git.GitCommand("-C", repo.RepoDir, "config", "remote.origin.fetch", "+refs/heads/*:refs/heads/*")
60-
if gitErr != nil {
61-
return i.logger.Errorf(ctx, "failed to configure refspec: %w", gitErr)
62-
}
63-
64-
gitErr = git.GitCommand("-C", repo.RepoDir, "fetch", "origin")
65-
if gitErr != nil {
66-
return i.logger.Errorf(ctx, "failed to fetch latest refs: %w", gitErr)
67-
}
54+
gitHelper.CloneBareRepo(ctx, *url, repo.RepoDir)
6855

6956
bundle := bundleProvider.CreateInitialBundle(ctx, repo)
7057
fmt.Printf("Constructing base bundle file at %s\n", bundle.Filename)
7158

72-
written, gitErr := git.CreateBundle(repo.RepoDir, bundle.Filename)
59+
written, gitErr := gitHelper.CreateBundle(ctx, repo.RepoDir, bundle.Filename)
7360
if gitErr != nil {
7461
return i.logger.Errorf(ctx, "failed to create bundle: %w", gitErr)
7562
}
@@ -83,7 +70,8 @@ func (i *initCmd) Run(ctx context.Context, args []string) error {
8370
return i.logger.Errorf(ctx, "failed to write bundle list: %w", listErr)
8471
}
8572

86-
SetCronSchedule()
73+
cron := utils.GetDependency[utils.CronHelper](ctx, i.container)
74+
cron.SetCronSchedule(ctx)
8775

8876
return nil
8977
}

cmd/git-bundle-server/start.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ func (s *startCmd) Run(ctx context.Context, args []string) error {
5151
}
5252

5353
// Make sure we have the global schedule running.
54-
SetCronSchedule()
54+
cron := utils.GetDependency[utils.CronHelper](ctx, s.container)
55+
cron.SetCronSchedule(ctx)
5556

5657
return nil
5758
}

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

+3-31
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,8 @@ package main
22

33
import (
44
"context"
5-
"errors"
65
"flag"
76
"fmt"
8-
"os"
9-
"os/exec"
107
"path/filepath"
118

129
"github.com/github/git-bundle-server/cmd/utils"
@@ -38,35 +35,10 @@ func (webServerCmd) Description() string {
3835

3936
func (w *webServerCmd) getDaemonConfig(ctx context.Context) (*daemon.DaemonConfig, error) {
4037
// Find git-bundle-web-server
41-
// First, search for it on the path
42-
programPath, err := exec.LookPath("git-bundle-web-server")
38+
fileSystem := utils.GetDependency[common.FileSystem](ctx, w.container)
39+
programPath, err := fileSystem.GetLocalExecutable("git-bundle-web-server")
4340
if err != nil {
44-
if errors.Is(err, exec.ErrDot) {
45-
// Result is a relative path
46-
programPath, err = filepath.Abs(programPath)
47-
if err != nil {
48-
return nil, w.logger.Errorf(ctx, "could not get absolute path to program: %w", err)
49-
}
50-
} else {
51-
// Fall back on looking for it in the same directory as the currently-running executable
52-
exePath, err := os.Executable()
53-
if err != nil {
54-
return nil, w.logger.Errorf(ctx, "failed to get path to current executable: %w", err)
55-
}
56-
exeDir := filepath.Dir(exePath)
57-
if err != nil {
58-
return nil, w.logger.Errorf(ctx, "failed to get parent dir of current executable: %w", err)
59-
}
60-
61-
programPath = filepath.Join(exeDir, "git-bundle-web-server")
62-
fileSystem := utils.GetDependency[common.FileSystem](ctx, w.container)
63-
programExists, err := fileSystem.FileExists(programPath)
64-
if err != nil {
65-
return nil, w.logger.Errorf(ctx, "could not determine whether path to 'git-bundle-web-server' exists: %w", err)
66-
} else if !programExists {
67-
return nil, w.logger.Errorf(ctx, "could not find path to 'git-bundle-web-server'")
68-
}
69-
}
41+
return nil, w.logger.Error(ctx, err)
7042
}
7143

7244
return &daemon.DaemonConfig{

cmd/utils/container-helpers.go

+30-4
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ import (
44
"context"
55

66
"github.com/github/git-bundle-server/internal/bundles"
7+
"github.com/github/git-bundle-server/internal/cmd"
78
"github.com/github/git-bundle-server/internal/common"
89
"github.com/github/git-bundle-server/internal/core"
910
"github.com/github/git-bundle-server/internal/daemon"
11+
"github.com/github/git-bundle-server/internal/git"
1012
"github.com/github/git-bundle-server/internal/log"
1113
)
1214

@@ -15,8 +17,8 @@ func BuildGitBundleServerContainer(logger log.TraceLogger) *DependencyContainer
1517
registerDependency(container, func(ctx context.Context) common.UserProvider {
1618
return common.NewUserProvider()
1719
})
18-
registerDependency(container, func(ctx context.Context) common.CommandExecutor {
19-
return common.NewCommandExecutor()
20+
registerDependency(container, func(ctx context.Context) cmd.CommandExecutor {
21+
return cmd.NewCommandExecutor(logger)
2022
})
2123
registerDependency(container, func(ctx context.Context) common.FileSystem {
2224
return common.NewFileSystem()
@@ -29,13 +31,37 @@ func BuildGitBundleServerContainer(logger log.TraceLogger) *DependencyContainer
2931
)
3032
})
3133
registerDependency(container, func(ctx context.Context) bundles.BundleProvider {
32-
return bundles.NewBundleProvider(logger)
34+
return bundles.NewBundleProvider(
35+
logger,
36+
GetDependency[git.GitHelper](ctx, container),
37+
)
38+
})
39+
registerDependency(container, func(ctx context.Context) core.CronScheduler {
40+
return core.NewCronScheduler(
41+
logger,
42+
GetDependency[common.UserProvider](ctx, container),
43+
GetDependency[cmd.CommandExecutor](ctx, container),
44+
GetDependency[common.FileSystem](ctx, container),
45+
)
46+
})
47+
registerDependency(container, func(ctx context.Context) CronHelper {
48+
return NewCronHelper(
49+
logger,
50+
GetDependency[common.FileSystem](ctx, container),
51+
GetDependency[core.CronScheduler](ctx, container),
52+
)
53+
})
54+
registerDependency(container, func(ctx context.Context) git.GitHelper {
55+
return git.NewGitHelper(
56+
logger,
57+
GetDependency[cmd.CommandExecutor](ctx, container),
58+
)
3359
})
3460
registerDependency(container, func(ctx context.Context) daemon.DaemonProvider {
3561
t, err := daemon.NewDaemonProvider(
3662
logger,
3763
GetDependency[common.UserProvider](ctx, container),
38-
GetDependency[common.CommandExecutor](ctx, container),
64+
GetDependency[cmd.CommandExecutor](ctx, container),
3965
GetDependency[common.FileSystem](ctx, container),
4066
)
4167
if err != nil {

cmd/utils/cron.go

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package utils
2+
3+
import (
4+
"context"
5+
6+
"github.com/github/git-bundle-server/internal/common"
7+
"github.com/github/git-bundle-server/internal/core"
8+
"github.com/github/git-bundle-server/internal/log"
9+
)
10+
11+
type CronHelper interface {
12+
SetCronSchedule(ctx context.Context) error
13+
}
14+
15+
type cronHelper struct {
16+
logger log.TraceLogger
17+
fileSystem common.FileSystem
18+
scheduler core.CronScheduler
19+
}
20+
21+
func NewCronHelper(
22+
l log.TraceLogger,
23+
fs common.FileSystem,
24+
s core.CronScheduler,
25+
) CronHelper {
26+
return &cronHelper{
27+
logger: l,
28+
fileSystem: fs,
29+
scheduler: s,
30+
}
31+
}
32+
33+
func (c *cronHelper) SetCronSchedule(ctx context.Context) error {
34+
pathToExec, err := c.fileSystem.GetLocalExecutable("git-bundle-server")
35+
if err != nil {
36+
return c.logger.Errorf(ctx, "failed to get executable: %w", err)
37+
}
38+
39+
err = c.scheduler.AddJob(ctx, core.CronDaily, pathToExec, []string{"update-all"})
40+
if err != nil {
41+
return c.logger.Errorf(ctx, "failed to set cron schedule: %w", err)
42+
}
43+
44+
return nil
45+
}

internal/bundles/bundles.go

+10-5
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,17 @@ type BundleProvider interface {
6565
}
6666

6767
type bundleProvider struct {
68-
logger log.TraceLogger
68+
logger log.TraceLogger
69+
gitHelper git.GitHelper
6970
}
7071

71-
func NewBundleProvider(logger log.TraceLogger) BundleProvider {
72+
func NewBundleProvider(
73+
l log.TraceLogger,
74+
g git.GitHelper,
75+
) BundleProvider {
7276
return &bundleProvider{
73-
logger: logger,
77+
logger: l,
78+
gitHelper: g,
7479
}
7580
}
7681

@@ -301,7 +306,7 @@ func (b *bundleProvider) CreateIncrementalBundle(ctx context.Context, repo *core
301306
return nil, err
302307
}
303308

304-
written, err := git.CreateIncrementalBundle(repo.RepoDir, bundle.Filename, lines)
309+
written, err := b.gitHelper.CreateIncrementalBundle(ctx, repo.RepoDir, bundle.Filename, lines)
305310
if err != nil {
306311
return nil, fmt.Errorf("failed to create incremental bundle: %w", err)
307312
}
@@ -366,7 +371,7 @@ func (b *bundleProvider) CollapseList(ctx context.Context, repo *core.Repository
366371
URI: fmt.Sprintf("./base-%d.bundle", maxTimestamp),
367372
}
368373

369-
err := git.CreateBundleFromRefs(repo.RepoDir, bundle.Filename, refs)
374+
err := b.gitHelper.CreateBundleFromRefs(ctx, repo.RepoDir, bundle.Filename, refs)
370375
if err != nil {
371376
return err
372377
}

0 commit comments

Comments
 (0)