/* * Copyright 2026 Oleg Borodin * * This work is published and licensed under a Creative Commons * Attribution-NonCommercial-NoDerivatives 4.0 International License. * * Distribution of this work is permitted, but commercial use and * modifications are strictly prohibited. */ package repocli import ( "context" "errors" "io" ) func Copy(ctx context.Context, writer io.Writer, reader io.Reader) (int64, error) { var err error var size int64 var halt bool buffer := make([]byte, 1024*4) for { select { case <-ctx.Done(): err = errors.New("Break copy by context") break default: } rsize, err := reader.Read(buffer) if err == io.EOF { err = nil halt = true } if err != nil { return size, err } wsize, err := writer.Write(buffer[0:rsize]) size += int64(wsize) if err != nil { return size, err } if halt { break } } return size, err }