@@ -1515,7 +1515,7 @@ func produceFromList(tasks chan<- object.Object, src, dst object.ObjectStorage,
15151515 if err := produceSingleObject (tasks , src , dst , key , config ); err == nil {
15161516 listedPrefix .Increment ()
15171517 continue
1518- } else if errors .Is (err , ignoreDir ) {
1518+ } else if errors .Is (err , errDirSuffix ) {
15191519 key += "/"
15201520 } else if os .IsNotExist (err ) {
15211521 atomic .AddInt64 (& ignoreFiles , 1 )
@@ -1553,32 +1553,39 @@ func produceFromList(tasks chan<- object.Object, src, dst object.ObjectStorage,
15531553 return nil
15541554}
15551555
1556- var ignoreDir = errors .New ("ignore dir" )
1556+ var errDirSuffix = errors .New ("dir miss suffix '/' " )
15571557var ignoreFiles int64
15581558
15591559func produceSingleObject (tasks chan <- object.Object , src , dst object.ObjectStorage , key string , config * Config ) error {
15601560 obj , err := src .Head (ctx , key )
1561- if err == nil && (! obj .IsDir () || obj .IsSymlink () && config .Links || obj .IsDir () && config .Dirs && strings .HasSuffix (key , "/" )) {
1562- var srckeys = make (chan object.Object , 1 )
1563- srckeys <- obj
1564- close (srckeys )
1565- if dobj , e := dst .Head (ctx , key ); e == nil || os .IsNotExist (e ) {
1566- var dstkeys = make (chan object.Object , 1 )
1567- if dobj != nil {
1568- dstkeys <- dobj
1569- }
1570- close (dstkeys )
1571- logger .Debugf ("produce single key %s" , key )
1572- _ = produce (tasks , srckeys , dstkeys , config )
1561+ if err != nil {
1562+ logger .Warnf ("head %s from %s: %s" , key , src , err )
1563+ return err
1564+ }
1565+ if obj .IsDir () {
1566+ // only `files-from` will hit this case
1567+ if ! strings .HasSuffix (key , "/" ) {
1568+ return errDirSuffix
1569+ }
1570+ if ! config .Dirs {
15731571 return nil
1574- } else {
1575- logger .Warnf ("head %s from %s: %s" , key , dst , e )
1576- err = e
15771572 }
1578- } else if err != nil {
1579- logger .Warnf ("head %s from %s: %s" , key , src , err )
1573+ }
1574+ var srckeys = make (chan object.Object , 1 )
1575+ srckeys <- obj
1576+ close (srckeys )
1577+ if dobj , e := dst .Head (ctx , key ); e == nil || os .IsNotExist (e ) {
1578+ var dstkeys = make (chan object.Object , 1 )
1579+ if dobj != nil {
1580+ dstkeys <- dobj
1581+ }
1582+ close (dstkeys )
1583+ logger .Debugf ("produce single key %s" , key )
1584+ _ = produce (tasks , srckeys , dstkeys , config )
1585+ return nil
15801586 } else {
1581- err = ignoreDir
1587+ logger .Warnf ("head %s from %s: %s" , key , dst , e )
1588+ err = e
15821589 }
15831590 return err
15841591}
0 commit comments