Skip to content

Commit 7e62efe

Browse files
committed
log: add error logging
Add logging for errors returned 'fmt.Errorf()' errors as well as the errors passed to or created by 'TraceLogger.Fatal()'/'TraceLogger.Fatalf()'. Replace all use of 'fmt.Errorf()' or direct error returns with 'TraceLogger.Errorf()' or 'TraceLogger.Error()', which return 'error' instances to stay consistent with what they're replacing. These errors are logged under the "error" trace2 event. We want to capture the error as low in the call stack as possible (to more precisely indicate the cause), but also not log a new "error" event for every 'fmt.Errorf()' replaced. To do that, have the error wrappers return a custom type 'loggedError', and only log the error event if the 'err' or none of the 'Errorf()' arguments are of the 'loggedError' type. Signed-off-by: Victoria Dye <[email protected]>
1 parent e85f2b5 commit 7e62efe

File tree

12 files changed

+124
-79
lines changed

12 files changed

+124
-79
lines changed

cmd/git-bundle-server/delete.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,22 +36,22 @@ func (d *deleteCmd) Run(ctx context.Context, args []string) error {
3636

3737
repo, err := core.CreateRepository(*route)
3838
if err != nil {
39-
return err
39+
return d.logger.Error(ctx, err)
4040
}
4141

4242
err = core.RemoveRoute(*route)
4343
if err != nil {
44-
return err
44+
return d.logger.Error(ctx, err)
4545
}
4646

4747
err = os.RemoveAll(repo.WebDir)
4848
if err != nil {
49-
return err
49+
return d.logger.Error(ctx, err)
5050
}
5151

5252
err = os.RemoveAll(repo.RepoDir)
5353
if err != nil {
54-
return err
54+
return d.logger.Error(ctx, err)
5555
}
5656

5757
return nil

cmd/git-bundle-server/init.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,41 +40,41 @@ func (i *initCmd) Run(ctx context.Context, args []string) error {
4040

4141
repo, err := core.CreateRepository(*route)
4242
if err != nil {
43-
return err
43+
return i.logger.Error(ctx, err)
4444
}
4545

4646
fmt.Printf("Cloning repository from %s\n", *url)
4747
gitErr := git.GitCommand("clone", "--bare", *url, repo.RepoDir)
4848

4949
if gitErr != nil {
50-
return fmt.Errorf("failed to clone repository: %w", gitErr)
50+
return i.logger.Errorf(ctx, "failed to clone repository: %w", gitErr)
5151
}
5252

5353
gitErr = git.GitCommand("-C", repo.RepoDir, "config", "remote.origin.fetch", "+refs/heads/*:refs/heads/*")
5454
if gitErr != nil {
55-
return fmt.Errorf("failed to configure refspec: %w", gitErr)
55+
return i.logger.Errorf(ctx, "failed to configure refspec: %w", gitErr)
5656
}
5757

5858
gitErr = git.GitCommand("-C", repo.RepoDir, "fetch", "origin")
5959
if gitErr != nil {
60-
return fmt.Errorf("failed to fetch latest refs: %w", gitErr)
60+
return i.logger.Errorf(ctx, "failed to fetch latest refs: %w", gitErr)
6161
}
6262

6363
bundle := bundles.CreateInitialBundle(repo)
6464
fmt.Printf("Constructing base bundle file at %s\n", bundle.Filename)
6565

6666
written, gitErr := git.CreateBundle(repo.RepoDir, bundle.Filename)
6767
if gitErr != nil {
68-
return fmt.Errorf("failed to create bundle: %w", gitErr)
68+
return i.logger.Errorf(ctx, "failed to create bundle: %w", gitErr)
6969
}
7070
if !written {
71-
return fmt.Errorf("refused to write empty bundle. Is the repo empty?")
71+
return i.logger.Errorf(ctx, "refused to write empty bundle. Is the repo empty?")
7272
}
7373

7474
list := bundles.CreateSingletonList(bundle)
7575
listErr := bundles.WriteBundleList(list, repo)
7676
if listErr != nil {
77-
return fmt.Errorf("failed to write bundle list: %w", listErr)
77+
return i.logger.Errorf(ctx, "failed to write bundle list: %w", listErr)
7878
}
7979

8080
SetCronSchedule()

cmd/git-bundle-server/start.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package main
22

33
import (
44
"context"
5-
"fmt"
65
"os"
76

87
"github.com/github/git-bundle-server/internal/argparse"
@@ -38,12 +37,12 @@ func (s *startCmd) Run(ctx context.Context, args []string) error {
3837
// CreateRepository registers the route.
3938
repo, err := core.CreateRepository(*route)
4039
if err != nil {
41-
return err
40+
return s.logger.Error(ctx, err)
4241
}
4342

4443
_, err = os.ReadDir(repo.RepoDir)
4544
if err != nil {
46-
return fmt.Errorf("route '%s' appears to have been deleted; use 'init' instead", *route)
45+
return s.logger.Errorf(ctx, "route '%s' appears to have been deleted; use 'init' instead", *route)
4746
}
4847

4948
// Make sure we have the global schedule running.

cmd/git-bundle-server/stop.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,10 @@ func (s *stopCmd) Run(ctx context.Context, args []string) error {
3333
route := parser.PositionalString("route", "the route for which bundles should stop being generated")
3434
parser.Parse(ctx, args)
3535

36-
return core.RemoveRoute(*route)
36+
err := core.RemoveRoute(*route)
37+
if err != nil {
38+
s.logger.Error(ctx, err)
39+
}
40+
41+
return nil
3742
}

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

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package main
22

33
import (
44
"context"
5-
"fmt"
65
"os"
76
"os/exec"
87

@@ -34,7 +33,7 @@ For every configured route, run 'git-bundle-server update <options> <route>'.`
3433
func (u *updateAllCmd) Run(ctx context.Context, args []string) error {
3534
user, err := common.NewUserProvider().CurrentUser()
3635
if err != nil {
37-
return err
36+
return u.logger.Error(ctx, err)
3837
}
3938
fs := common.NewFileSystem()
4039

@@ -43,12 +42,12 @@ func (u *updateAllCmd) Run(ctx context.Context, args []string) error {
4342

4443
exe, err := os.Executable()
4544
if err != nil {
46-
return fmt.Errorf("failed to get path to execuable: %w", err)
45+
return u.logger.Errorf(ctx, "failed to get path to execuable: %w", err)
4746
}
4847

4948
repos, err := core.GetRepositories(user, fs)
5049
if err != nil {
51-
return err
50+
return u.logger.Error(ctx, err)
5251
}
5352

5453
subargs := []string{"update", ""}
@@ -62,12 +61,12 @@ func (u *updateAllCmd) Run(ctx context.Context, args []string) error {
6261

6362
err := cmd.Start()
6463
if err != nil {
65-
return fmt.Errorf("git command failed to start: %w", err)
64+
return u.logger.Errorf(ctx, "git command failed to start: %w", err)
6665
}
6766

6867
err = cmd.Wait()
6968
if err != nil {
70-
return fmt.Errorf("git command returned a failure: %w", err)
69+
return u.logger.Errorf(ctx, "git command returned a failure: %w", err)
7170
}
7271
}
7372

cmd/git-bundle-server/update.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,18 @@ func (u *updateCmd) Run(ctx context.Context, args []string) error {
3838

3939
repo, err := core.CreateRepository(*route)
4040
if err != nil {
41-
return err
41+
return u.logger.Error(ctx, err)
4242
}
4343

4444
list, err := bundles.GetBundleList(repo)
4545
if err != nil {
46-
return fmt.Errorf("failed to load bundle list: %w", err)
46+
return u.logger.Errorf(ctx, "failed to load bundle list: %w", err)
4747
}
4848

4949
fmt.Printf("Creating new incremental bundle\n")
5050
bundle, err := bundles.CreateIncrementalBundle(repo, list)
5151
if err != nil {
52-
return err
52+
return u.logger.Error(ctx, err)
5353
}
5454

5555
// Nothing new!
@@ -62,13 +62,13 @@ func (u *updateCmd) Run(ctx context.Context, args []string) error {
6262
fmt.Printf("Collapsing bundle list\n")
6363
err = bundles.CollapseList(repo, list)
6464
if err != nil {
65-
return err
65+
return u.logger.Error(ctx, err)
6666
}
6767

6868
fmt.Printf("Writing updated bundle list\n")
6969
listErr := bundles.WriteBundleList(list, repo)
7070
if listErr != nil {
71-
return fmt.Errorf("failed to write bundle list: %w", listErr)
71+
return u.logger.Errorf(ctx, "failed to write bundle list: %w", listErr)
7272
}
7373

7474
return nil

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

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func (webServerCmd) Description() string {
4141
return `Manage the web server hosting bundle content`
4242
}
4343

44-
func (w *webServerCmd) getDaemonConfig() (*daemon.DaemonConfig, error) {
44+
func (w *webServerCmd) getDaemonConfig(ctx context.Context) (*daemon.DaemonConfig, error) {
4545
// Find git-bundle-web-server
4646
// First, search for it on the path
4747
programPath, err := exec.LookPath("git-bundle-web-server")
@@ -50,25 +50,25 @@ func (w *webServerCmd) getDaemonConfig() (*daemon.DaemonConfig, error) {
5050
// Result is a relative path
5151
programPath, err = filepath.Abs(programPath)
5252
if err != nil {
53-
return nil, fmt.Errorf("could not get absolute path to program: %w", err)
53+
return nil, w.logger.Errorf(ctx, "could not get absolute path to program: %w", err)
5454
}
5555
} else {
5656
// Fall back on looking for it in the same directory as the currently-running executable
5757
exePath, err := os.Executable()
5858
if err != nil {
59-
return nil, fmt.Errorf("failed to get path to current executable: %w", err)
59+
return nil, w.logger.Errorf(ctx, "failed to get path to current executable: %w", err)
6060
}
6161
exeDir := filepath.Dir(exePath)
6262
if err != nil {
63-
return nil, fmt.Errorf("failed to get parent dir of current executable: %w", err)
63+
return nil, w.logger.Errorf(ctx, "failed to get parent dir of current executable: %w", err)
6464
}
6565

6666
programPath = filepath.Join(exeDir, "git-bundle-web-server")
6767
programExists, err := w.fileSystem.FileExists(programPath)
6868
if err != nil {
69-
return nil, fmt.Errorf("could not determine whether path to 'git-bundle-web-server' exists: %w", err)
69+
return nil, w.logger.Errorf(ctx, "could not determine whether path to 'git-bundle-web-server' exists: %w", err)
7070
} else if !programExists {
71-
return nil, fmt.Errorf("could not find path to 'git-bundle-web-server'")
71+
return nil, w.logger.Errorf(ctx, "could not find path to 'git-bundle-web-server'")
7272
}
7373
}
7474
}
@@ -99,12 +99,12 @@ func (w *webServerCmd) startServer(ctx context.Context, args []string) error {
9999

100100
d, err := daemon.NewDaemonProvider(w.logger, w.user, w.cmdExec, w.fileSystem)
101101
if err != nil {
102-
return err
102+
return w.logger.Error(ctx, err)
103103
}
104104

105-
config, err := w.getDaemonConfig()
105+
config, err := w.getDaemonConfig(ctx)
106106
if err != nil {
107-
return err
107+
return w.logger.Error(ctx, err)
108108
}
109109

110110
// Configure flags
@@ -131,17 +131,17 @@ func (w *webServerCmd) startServer(ctx context.Context, args []string) error {
131131
})
132132
if loopErr != nil {
133133
// Error happened in 'Visit'
134-
return loopErr
134+
return w.logger.Error(ctx, loopErr)
135135
}
136136

137137
err = d.Create(ctx, config, *force)
138138
if err != nil {
139-
return err
139+
return w.logger.Error(ctx, err)
140140
}
141141

142142
err = d.Start(ctx, config.Label)
143143
if err != nil {
144-
return err
144+
return w.logger.Error(ctx, err)
145145
}
146146

147147
return nil
@@ -155,23 +155,23 @@ func (w *webServerCmd) stopServer(ctx context.Context, args []string) error {
155155

156156
d, err := daemon.NewDaemonProvider(w.logger, w.user, w.cmdExec, w.fileSystem)
157157
if err != nil {
158-
return err
158+
return w.logger.Error(ctx, err)
159159
}
160160

161-
config, err := w.getDaemonConfig()
161+
config, err := w.getDaemonConfig(ctx)
162162
if err != nil {
163-
return err
163+
return w.logger.Error(ctx, err)
164164
}
165165

166166
err = d.Stop(ctx, config.Label)
167167
if err != nil {
168-
return err
168+
return w.logger.Error(ctx, err)
169169
}
170170

171171
if *remove {
172172
err = d.Remove(ctx, config.Label)
173173
if err != nil {
174-
return err
174+
return w.logger.Error(ctx, err)
175175
}
176176
}
177177

internal/argparse/argparse.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ func (a *argParser) Parse(ctx context.Context, args []string) {
145145
if err != nil {
146146
// The error was already printed (via a.FlagSet.Usage()), so we
147147
// just need to exit
148+
a.logger.Error(ctx, err)
148149
a.logger.Exit(ctx, usageExitCode)
149150
}
150151

@@ -221,5 +222,6 @@ func (a *argParser) Usage(ctx context.Context, errFmt string, args ...any) {
221222
fmt.Fprintf(a.FlagSet.Output(), errFmt+"\n", args...)
222223
a.FlagSet.Usage()
223224

225+
a.logger.Errorf(ctx, errFmt, args...)
224226
a.logger.Exit(ctx, usageExitCode)
225227
}

0 commit comments

Comments
 (0)