@@ -72,25 +72,36 @@ func (b *base) Process(ctx context.Context, builder build.Builder, workDir strin
72
72
var (
73
73
idx atomic.Int64
74
74
mu sync.Mutex
75
- eg errgroup.Group
75
+ eg * errgroup.Group
76
76
descriptors []ocispec.Descriptor
77
77
)
78
78
79
+ total := int64 (len (matchedPaths ))
80
+ sm := ysmrr .NewSpinnerManager ()
81
+ sm .Start ()
82
+ defer sm .Stop ()
83
+
84
+ // Initialize errgroup with a context can be canceled.
85
+ ctx , cancel := context .WithCancel (ctx )
86
+ defer cancel ()
87
+ eg , ctx = errgroup .WithContext (ctx )
88
+
79
89
// Set default concurrency limit to 1 if not specified.
80
90
if baseOpts .concurrency > 0 {
81
91
eg .SetLimit (baseOpts .concurrency )
82
92
} else {
83
93
eg .SetLimit (1 )
84
94
}
85
95
86
- total := int64 (len (matchedPaths ))
87
- sm := ysmrr .NewSpinnerManager ()
88
- sm .Start ()
89
-
90
96
for _ , path := range matchedPaths {
97
+ if ctx .Err () != nil {
98
+ break
99
+ }
100
+
91
101
eg .Go (func () error {
92
102
relPath , err := filepath .Rel (absWorkDir , path )
93
103
if err != nil {
104
+ cancel ()
94
105
return err
95
106
}
96
107
@@ -100,6 +111,7 @@ func (b *base) Process(ctx context.Context, builder build.Builder, workDir strin
100
111
desc , err := builder .BuildLayer (ctx , b .mediaType , workDir , path )
101
112
if err != nil {
102
113
sp .ErrorWithMessagef ("Failed to build blob %s: %v" , relPath , err )
114
+ cancel ()
103
115
return err
104
116
}
105
117
@@ -117,8 +129,6 @@ func (b *base) Process(ctx context.Context, builder build.Builder, workDir strin
117
129
return nil , err
118
130
}
119
131
120
- sm .Stop ()
121
-
122
132
sort .Slice (descriptors , func (i int , j int ) bool {
123
133
// Sort by filepath by default.
124
134
var pathI , pathJ string
0 commit comments