@@ -7,8 +7,10 @@ import (
77 "path/filepath"
88 "strings"
99
10+ "github.com/containers/fetchit/pkg/engine/utils"
1011 "github.com/go-git/go-git/v5/plumbing"
1112 "github.com/go-git/go-git/v5/plumbing/object"
13+ "k8s.io/klog/v2"
1214)
1315
1416type CommonMethod struct {
@@ -70,6 +72,11 @@ func getDirectory(target *Target) string {
7072 return filepath .Base (trimDir )
7173}
7274
75+ type empty struct {
76+ }
77+
78+ var BadCommitList map [string ]map [string ]map [plumbing.Hash ]empty = make (map [string ]map [string ]map [plumbing.Hash ]empty )
79+
7380func currentToLatest (ctx , conn context.Context , m Method , target * Target , tag * []string ) error {
7481 directory := getDirectory (target )
7582 if target .disconnected {
@@ -79,6 +86,7 @@ func currentToLatest(ctx, conn context.Context, m Method, target *Target, tag *[
7986 localDevicePull (directory , target .device , "" , false )
8087 }
8188 }
89+
8290 latest , err := getLatest (target )
8391 if err != nil {
8492 return fmt .Errorf ("Failed to get latest commit: %v" , err )
@@ -89,10 +97,38 @@ func currentToLatest(ctx, conn context.Context, m Method, target *Target, tag *[
8997 return fmt .Errorf ("Failed to get current commit: %v" , err )
9098 }
9199
100+ if target .trackBadCommits {
101+ if _ , ok := BadCommitList [directory ]; ! ok {
102+ BadCommitList [directory ] = make (map [string ]map [plumbing.Hash ]empty )
103+ }
104+
105+ if _ , ok := BadCommitList [directory ][m .GetKind ()]; ! ok {
106+ BadCommitList [directory ][m .GetKind ()] = make (map [plumbing.Hash ]empty )
107+ }
108+
109+ if _ , ok := BadCommitList [directory ][m .GetKind ()][latest ]; ok {
110+ klog .Infof ("No changes applied to target %s this run, %s currently at %s" , directory , m .GetKind (), current )
111+ return nil
112+ }
113+ }
114+
92115 if latest != current {
93- if err := m .Apply (ctx , conn , current , latest , tag ); err != nil {
94- return fmt .Errorf ("Failed to apply changes: %v" , err )
116+ if err = m .Apply (ctx , conn , current , latest , tag ); err != nil {
117+ // Roll back automatically
118+ klog .Errorf ("Failed to apply changes, rolling back to %v: %v" , current , err )
119+ if err = checkout (target , current ); err != nil {
120+ return utils .WrapErr (err , "Failed to checkout %s" , current )
121+ }
122+ if err = m .Apply (ctx , conn , latest , current , tag ); err != nil {
123+ // Roll back failed
124+ return fmt .Errorf ("Roll back failed, state between %s and %s: %v" , current , latest , err )
125+ }
126+ if target .trackBadCommits {
127+ BadCommitList [directory ][m .GetKind ()][latest ] = empty {}
128+ }
129+ return fmt .Errorf ("Rolled back to %v: %v" , current , err )
95130 }
131+
96132 updateCurrent (ctx , target , latest , m .GetKind (), m .GetName ())
97133 logger .Infof ("Moved %s from %s to %s for git target %s" , m .GetName (), current .String ()[:hashReportLen ], latest , target .url )
98134 } else {
0 commit comments