@@ -72,25 +72,36 @@ func (b *base) Process(ctx context.Context, builder build.Builder, workDir strin
7272 var (
7373 idx atomic.Int64
7474 mu sync.Mutex
75- eg errgroup.Group
75+ eg * errgroup.Group
7676 descriptors []ocispec.Descriptor
7777 )
7878
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+
7989 // Set default concurrency limit to 1 if not specified.
8090 if baseOpts .concurrency > 0 {
8191 eg .SetLimit (baseOpts .concurrency )
8292 } else {
8393 eg .SetLimit (1 )
8494 }
8595
86- total := int64 (len (matchedPaths ))
87- sm := ysmrr .NewSpinnerManager ()
88- sm .Start ()
89-
9096 for _ , path := range matchedPaths {
97+ if ctx .Err () != nil {
98+ break
99+ }
100+
91101 eg .Go (func () error {
92102 relPath , err := filepath .Rel (absWorkDir , path )
93103 if err != nil {
104+ cancel ()
94105 return err
95106 }
96107
@@ -100,6 +111,7 @@ func (b *base) Process(ctx context.Context, builder build.Builder, workDir strin
100111 desc , err := builder .BuildLayer (ctx , b .mediaType , workDir , path )
101112 if err != nil {
102113 sp .ErrorWithMessagef ("Failed to build blob %s: %v" , relPath , err )
114+ cancel ()
103115 return err
104116 }
105117
@@ -117,8 +129,6 @@ func (b *base) Process(ctx context.Context, builder build.Builder, workDir strin
117129 return nil , err
118130 }
119131
120- sm .Stop ()
121-
122132 sort .Slice (descriptors , func (i int , j int ) bool {
123133 // Sort by filepath by default.
124134 var pathI , pathJ string
0 commit comments