github.com/jaylevin/jenkins-library@v1.230.4/pkg/piperutils/ioUtils.go (about)

     1  package piperutils
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  
     7  	"github.com/pkg/errors"
     8  )
     9  
    10  // CopyData transfers the bytes from src to dst without doing close handling implicitly.
    11  func CopyData(dst io.Writer, src io.Reader) (int64, error) {
    12  	tmp := make([]byte, 256)
    13  	bytesRead := int64(0)
    14  	bytesWritten := int64(0)
    15  	done := false
    16  
    17  	for {
    18  		nr, err := src.Read(tmp)
    19  		bytesRead += int64(nr)
    20  		if err != nil {
    21  			if err != io.EOF {
    22  				return bytesRead, errors.Wrap(err, "read error")
    23  			}
    24  			done = true
    25  		}
    26  		nw, err := dst.Write(tmp[:nr])
    27  		bytesWritten += int64(nw)
    28  		if err != nil {
    29  			return bytesWritten, errors.Wrap(err, "write error")
    30  		}
    31  		if done {
    32  			break
    33  		}
    34  	}
    35  	if bytesRead != bytesWritten {
    36  		return bytesRead, errors.New(fmt.Sprintf("transfer error: read %v bytes but wrote %v bytes", bytesRead, bytesWritten))
    37  	}
    38  	return bytesWritten, nil
    39  }