11package transfer
22
33import (
4+ "context"
45 "fmt"
56
67 "github.com/mandelsoft/goutils/errors"
@@ -23,14 +24,23 @@ type WalkingState = common.WalkingState[*struct{}, interface{}]
2324type TransportClosure = common.NameVersionInfo [* struct {}]
2425
2526func TransferVersion (printer common.Printer , closure TransportClosure , src ocmcpi.ComponentVersionAccess , tgt ocmcpi.Repository , handler TransferHandler ) error {
27+ return TransferVersionWithContext (common .WithPrinter (context .Background (), common .AssurePrinter (printer )), closure , src , tgt , handler )
28+ }
29+
30+ func TransferVersionWithContext (ctx context.Context , closure TransportClosure , src ocmcpi.ComponentVersionAccess , tgt ocmcpi.Repository , handler TransferHandler ) error {
2631 if closure == nil {
2732 closure = TransportClosure {}
2833 }
2934 state := WalkingState {Closure : closure }
30- return transferVersion (common . AssurePrinter ( printer ) , Logger (src ), state , src , tgt , handler )
35+ return transferVersion (ctx , Logger (src ), state , src , tgt , handler )
3136}
3237
33- func transferVersion (printer common.Printer , log logging.Logger , state WalkingState , src ocmcpi.ComponentVersionAccess , tgt ocmcpi.Repository , handler TransferHandler ) (rerr error ) {
38+ func transferVersion (ctx context.Context , log logging.Logger , state WalkingState , src ocmcpi.ComponentVersionAccess , tgt ocmcpi.Repository , handler TransferHandler ) (rerr error ) {
39+ printer := common .GetPrinter (ctx )
40+ if err := common .IsContextCanceled (ctx ); err != nil {
41+ printer .Printf ("transfer cancelled by caller\n " )
42+ return err
43+ }
3444 nv := common .VersionedElementKey (src )
3545 log = log .WithValues ("history" , state .History .String (), "version" , nv )
3646 if ok , err := state .Add (ocm .KIND_COMPONENTVERSION , nv ); ! ok {
@@ -155,7 +165,6 @@ func transferVersion(printer common.Printer, log logging.Logger, state WalkingSt
155165 return errors .Wrapf (err , "%s: creating target version" , state .History )
156166 }
157167
158- subp := printer .AddGap (" " )
159168 list := errors .ErrListf ("component references for %s" , nv )
160169 log .Info (" transferring references" )
161170 for _ , r := range d .References {
@@ -164,7 +173,7 @@ func transferVersion(printer common.Printer, log logging.Logger, state WalkingSt
164173 return errors .Wrapf (err , "%s: nested component %s[%s:%s]" , state .History , r .GetName (), r .ComponentName , r .GetVersion ())
165174 }
166175 if cv != nil {
167- list .Add (transferVersion (subp , log .WithValues ("ref" , r .Name ), state , cv , tgt , shdlr ))
176+ list .Add (transferVersion (common . AddPrinterGap ( ctx , " " ) , log .WithValues ("ref" , r .Name ), state , cv , tgt , shdlr ))
168177 list .Addf (nil , cv .Close (), "closing reference %s" , r .Name )
169178 }
170179 }
@@ -196,7 +205,7 @@ func transferVersion(printer common.Printer, log logging.Logger, state WalkingSt
196205 // corrupted content in target.
197206 // If no copy is done, merge must keep the access methods in target!!!
198207 if ! doMerge || doCopy {
199- err = copyVersion (printer , log , state .History , src , t , n , handler )
208+ err = copyVersion (ctx , printer , log , state .History , src , t , n , handler )
200209 if err != nil {
201210 return err
202211 }
@@ -212,11 +221,15 @@ func transferVersion(printer common.Printer, log logging.Logger, state WalkingSt
212221}
213222
214223func CopyVersion (printer common.Printer , log logging.Logger , hist common.History , src ocm.ComponentVersionAccess , t ocm.ComponentVersionAccess , handler TransferHandler ) (rerr error ) {
215- return copyVersion (common .AssurePrinter (printer ), log , hist , src , t , src .GetDescriptor ().Copy (), handler )
224+ return copyVersion (context .Background (), common .AssurePrinter (printer ), log , hist , src , t , src .GetDescriptor ().Copy (), handler )
225+ }
226+
227+ func CopyVersionWithContext (cctx context.Context , log logging.Logger , hist common.History , src ocm.ComponentVersionAccess , t ocm.ComponentVersionAccess , handler TransferHandler ) (rerr error ) {
228+ return copyVersion (cctx , common .GetPrinter (cctx ), log , hist , src , t , src .GetDescriptor ().Copy (), handler )
216229}
217230
218231// copyVersion (purely internal) expects an already prepared target comp desc for t given as prep.
219- func copyVersion (printer common.Printer , log logging.Logger , hist common.History , src ocm.ComponentVersionAccess , t ocm.ComponentVersionAccess , prep * compdesc.ComponentDescriptor , handler TransferHandler ) (rerr error ) {
232+ func copyVersion (cctx context. Context , printer common.Printer , log logging.Logger , hist common.History , src ocm.ComponentVersionAccess , t ocm.ComponentVersionAccess , prep * compdesc.ComponentDescriptor , handler TransferHandler ) (rerr error ) {
220233 var finalize finalizer.Finalizer
221234
222235 defer errors .PropagateError (& rerr , finalize .Finalize )
@@ -232,6 +245,11 @@ func copyVersion(printer common.Printer, log logging.Logger, hist common.History
232245 for i , r := range src .GetResources () {
233246 var m ocmcpi.AccessMethod
234247
248+ if err := common .IsContextCanceled (cctx ); err != nil {
249+ printer .Printf ("cancelled by caller\n " )
250+ return err
251+ }
252+
235253 nested := finalize .Nested ()
236254
237255 a , err := r .Access ()
@@ -295,6 +313,11 @@ func copyVersion(printer common.Printer, log logging.Logger, hist common.History
295313 for i , r := range src .GetSources () {
296314 var m ocmcpi.AccessMethod
297315
316+ if err := common .IsContextCanceled (cctx ); err != nil {
317+ printer .Printf ("cancelled by caller\n " )
318+ return err
319+ }
320+
298321 a , err := r .Access ()
299322 if err == nil {
300323 m , err = a .AccessMethod (src )
0 commit comments