Skip to content

Commit d7254b6

Browse files
authored
Improve error messages in Git repository opening to make debugging easier (#286)
Signed-off-by: liamfallon <liam.fallon@est.tech>
1 parent e6b22dd commit d7254b6

2 files changed

Lines changed: 23 additions & 22 deletions

File tree

pkg/externalrepo/git/git.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -143,27 +143,27 @@ func OpenRepository(ctx context.Context, name, namespace string, spec *configapi
143143

144144
r, err := initEmptyRepository(dir)
145145
if err != nil {
146-
return nil, fmt.Errorf("error cloning git repository %q: %w", spec.Repo, err)
146+
return nil, pkgerrors.Wrapf(err, "error cloning git repository %+v, could not initialize empty repository", spec.Repo)
147147
}
148148

149149
repo = r
150150
} else if !fi.IsDir() {
151151
// Internal error - corrupted cache. We will cleanup on the way out.
152-
return nil, fmt.Errorf("cannot clone git repository %q: %w", spec.Repo, err)
152+
return nil, pkgerrors.Wrapf(err, "error cloning git repository %+v, local cache location %q is not a directory", spec.Repo, dir)
153153
} else {
154154
cleanup = "" // Existing directory; do not delete it.
155155

156156
r, err := openRepository(dir)
157157
if err != nil {
158-
return nil, err
158+
return nil, pkgerrors.Wrapf(err, "error cloning git repository %+v, open of repository failed in gogit", spec.Repo)
159159
}
160160

161161
repo = r
162162
}
163163

164164
// Create Remote
165165
if err := initializeOrigin(repo, spec.Repo); err != nil {
166-
return nil, fmt.Errorf("error cloning git repository %q, cannot create remote: %v", spec.Repo, err)
166+
return nil, pkgerrors.Wrapf(err, "error cloning git repository %+v, cannot create remote", spec.Repo)
167167
}
168168

169169
// NOTE: the spec.git.branch field in the Repository CRD (OpenAPI schema) is defined with
@@ -175,7 +175,7 @@ func OpenRepository(ctx context.Context, name, namespace string, spec *configapi
175175
}
176176

177177
if err := util.ValidateDirectoryName(string(branch), false); err != nil {
178-
return nil, fmt.Errorf("branch name %s invalid: %v", branch, err)
178+
return nil, pkgerrors.Wrapf(err, "error cloning git repository %+v, branch name %q invalid", spec.Repo, branch)
179179
}
180180

181181
repository := &gitRepository{
@@ -203,11 +203,11 @@ func OpenRepository(ctx context.Context, name, namespace string, spec *configapi
203203
}
204204

205205
if err := repository.fetchRemoteRepositoryWithRetry(ctx); err != nil {
206-
return nil, err
206+
return nil, pkgerrors.Wrapf(err, "error cloning git repository %+v, fetch of remote repository failed", spec.Repo)
207207
}
208208

209209
if err := repository.verifyRepository(ctx, &opts); err != nil {
210-
return nil, err
210+
return nil, pkgerrors.Wrapf(err, "error cloning git repository %+v, fetch of remote repository failed", spec.Repo)
211211
}
212212

213213
cleanup = "" // Success. Keep the git directory.
@@ -654,19 +654,19 @@ func (r *gitRepository) fetchRemoteRepositoryWithRetry(ctx context.Context) erro
654654
if retryNumber >= 0 {
655655
err := r.fetchRemoteRepository(ctx)
656656
if err != nil {
657-
klog.Errorf("Fetching Remote Repository %s failed - try number %d", r.Key().Name, retryNumber)
657+
klog.Errorf("Fetching Remote Repository %+v failed - try number %d", r.Key(), retryNumber)
658658
time.Sleep(1 * time.Second)
659-
return err
659+
return pkgerrors.Wrapf(err, "fetch of remote repository %+v with retry failed on try number %d", r.Key(), retryNumber)
660660
}
661661
if retryNumber > 1 {
662-
klog.Infof("Successfully Fetched Remote Repository %s after %d retries", r.Key(), retryNumber)
662+
klog.Infof("Successfully Fetched Remote Repository %+v after %d retries", r.Key(), retryNumber)
663663
}
664664
return nil
665665
}
666666
return nil
667667
},
668668
); err != nil {
669-
return err
669+
return pkgerrors.Wrapf(err, "fetch of remote repository %+v with retry failed", r.Key())
670670
}
671671
return nil
672672
}

pkg/externalrepo/git/gogit.go

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"github.com/go-git/go-git/v5/plumbing/cache"
2323
"github.com/go-git/go-git/v5/plumbing/object"
2424
"github.com/go-git/go-git/v5/storage/filesystem"
25+
pkgerrors "github.com/pkg/errors"
2526
)
2627

2728
// This file contains helpers for interacting with gogit.
@@ -30,23 +31,23 @@ func initEmptyRepository(path string) (*git.Repository, error) {
3031
isBare := true // Porch only uses bare repositories
3132
repo, err := git.PlainInit(path, isBare)
3233
if err != nil {
33-
return nil, err
34+
return nil, pkgerrors.Wrapf(err, "gogit: repo plain init failed on path %q", path)
3435
}
3536
if err := initializeDefaultBranches(repo); err != nil {
36-
return nil, err
37+
return nil, pkgerrors.Wrapf(err, "gogit: default branch initialize failed on repo for path %q", path)
3738
}
3839
return repo, nil
3940
}
4041

4142
func initializeDefaultBranches(repo *git.Repository) error {
4243
// Adjust default references
4344
if err := repo.Storer.RemoveReference(plumbing.Master); err != nil {
44-
return err
45+
return pkgerrors.Wrapf(err, "gogit: failed to remove reference %+v on repo %+v", plumbing.Master, repo)
4546
}
4647
// gogit points HEAD at a wrong branch; point it at main
4748
main := plumbing.NewSymbolicReference(plumbing.HEAD, DefaultMainReferenceName)
4849
if err := repo.Storer.SetReference(main); err != nil {
49-
return err
50+
return pkgerrors.Wrapf(err, "gogit: failed to set reference %+v on repo %+v", main, repo)
5051
}
5152
return nil
5253
}
@@ -60,7 +61,7 @@ func openRepository(path string) (*git.Repository, error) {
6061
func initializeOrigin(repo *git.Repository, address string) error {
6162
cfg, err := repo.Config()
6263
if err != nil {
63-
return err
64+
return pkgerrors.Wrapf(err, "gogit: failed to get configuration for repo %+v", repo)
6465
}
6566

6667
cfg.Remotes[OriginName] = &config.RemoteConfig{
@@ -70,7 +71,7 @@ func initializeOrigin(repo *git.Repository, address string) error {
7071
}
7172

7273
if err := repo.SetConfig(cfg); err != nil {
73-
return err
74+
return pkgerrors.Wrapf(err, "gogit: failed to set configuration for repo %+v", repo)
7475
}
7576

7677
return nil
@@ -79,15 +80,15 @@ func initializeOrigin(repo *git.Repository, address string) error {
7980
func storeCommit(repo *git.Repository, commit *object.Commit) (plumbing.Hash, error) {
8081
eo := repo.Storer.NewEncodedObject()
8182
if err := commit.Encode(eo); err != nil {
82-
return plumbing.Hash{}, err
83+
return plumbing.Hash{}, pkgerrors.Wrapf(err, "gogit: failed to store commit %+v on repo %+v", commit, repo)
8384
}
8485
return repo.Storer.SetEncodedObject(eo)
8586
}
8687

8788
func storeTree(repo *git.Repository, tree *object.Tree) (plumbing.Hash, error) {
8889
eo := repo.Storer.NewEncodedObject()
8990
if err := tree.Encode(eo); err != nil {
90-
return plumbing.Hash{}, err
91+
return plumbing.Hash{}, pkgerrors.Wrapf(err, "gogit: failed to store tree %+v on repo %+v", tree, repo)
9192
}
9293
return repo.Storer.SetEncodedObject(eo)
9394
}
@@ -100,16 +101,16 @@ func storeBlob(repo *git.Repository, value string) (plumbing.Hash, error) {
100101

101102
w, err := eo.Writer()
102103
if err != nil {
103-
return plumbing.Hash{}, err
104+
return plumbing.Hash{}, pkgerrors.Wrapf(err, "gogit: failed to get writer for repo %+v", repo)
104105
}
105106

106107
if _, err := w.Write(data); err != nil {
107108
w.Close()
108-
return plumbing.Hash{}, err
109+
return plumbing.Hash{}, pkgerrors.Wrapf(err, "gogit: failed to write blob %+v to repo %+v", value, repo)
109110
}
110111

111112
if err := w.Close(); err != nil {
112-
return plumbing.Hash{}, err
113+
return plumbing.Hash{}, pkgerrors.Wrapf(err, "gogit: failed to close repo %+v", repo)
113114
}
114115

115116
return repo.Storer.SetEncodedObject(eo)

0 commit comments

Comments
 (0)