@ -18,6 +18,7 @@ package bootstrap
import (
"context"
"errors"
"fmt"
"io"
"os"
@ -117,6 +118,10 @@ func (b *PlainGitBootstrapper) ReconcileComponents(ctx context.Context, manifest
b . logger . Actionf ( "cloning branch %q from Git repository %q" , b . branch , b . url )
var cloned bool
if err = retry ( 1 , 2 * time . Second , func ( ) ( err error ) {
if err = b . cleanGitRepoDir ( ) ; err != nil {
b . logger . Warningf ( " failed to clean directory for git repo: %w" , err )
return
}
_ , err = b . gitClient . Clone ( ctx , b . url , repository . CloneOptions {
CheckoutStrategy : repository . CheckoutStrategy {
Branch : b . branch ,
@ -258,11 +263,18 @@ func (b *PlainGitBootstrapper) ReconcileSyncConfig(ctx context.Context, options
b . logger . Actionf ( "cloning branch %q from Git repository %q" , b . branch , b . url )
var cloned bool
if err = retry ( 1 , 2 * time . Second , func ( ) ( err error ) {
if err = b . cleanGitRepoDir ( ) ; err != nil {
b . logger . Warningf ( " failed to clean directory for git repo: %w" , err )
return
}
_ , err = b . gitClient . Clone ( ctx , b . url , repository . CloneOptions {
CheckoutStrategy : repository . CheckoutStrategy {
Branch : b . branch ,
} ,
} )
if err != nil {
b . logger . Warningf ( " clone failure: %s" , err )
}
if err == nil {
cloned = true
}
@ -342,11 +354,18 @@ func (b *PlainGitBootstrapper) ReconcileSyncConfig(ctx context.Context, options
return fmt . Errorf ( "failed to recreate tmp dir: %w" , err )
}
if err = retry ( 1 , 2 * time . Second , func ( ) ( err error ) {
if err = b . cleanGitRepoDir ( ) ; err != nil {
b . logger . Warningf ( " failed to clean directory for git repo: %w" , err )
return
}
_ , err = b . gitClient . Clone ( ctx , b . url , repository . CloneOptions {
CheckoutStrategy : repository . CheckoutStrategy {
Branch : b . branch ,
} ,
} )
if err != nil {
b . logger . Warningf ( " clone failure: %s" , err )
}
return
} ) ; err != nil {
return fmt . Errorf ( "failed to clone repository: %w" , err )
@ -424,6 +443,21 @@ func (b *PlainGitBootstrapper) ReportComponentsHealth(ctx context.Context, insta
return nil
}
// cleanGitRepoDir cleans the directory meant for the Git repo.
func ( b * PlainGitBootstrapper ) cleanGitRepoDir ( ) error {
dirs , err := os . ReadDir ( b . gitClient . Path ( ) )
if err != nil {
return err
}
var errs [ ] error
for _ , dir := range dirs {
if err := os . RemoveAll ( filepath . Join ( b . gitClient . Path ( ) , dir . Name ( ) ) ) ; err != nil {
errs = append ( errs , err )
}
}
return errors . Join ( errs ... )
}
func getOpenPgpEntity ( keyRing openpgp . EntityList , passphrase , keyID string ) ( * openpgp . Entity , error ) {
if len ( keyRing ) == 0 {
return nil , fmt . Errorf ( "empty GPG key ring" )