github.com/driusan/dgit@v0.0.0-20221118233547-f39f0c15edbb/git/retrieve.go (about)

     1  package git
     2  
     3  import (
     4  	"bufio"
     5  	"fmt"
     6  	"io"
     7  	"os"
     8  	"strconv"
     9  	"strings"
    10  )
    11  
    12  type PktLine string
    13  
    14  func PktLineEncode(line []byte) (PktLine, error) {
    15  	if len(line) > 65535 {
    16  		return "", fmt.Errorf("Line too long to encode in PktLine format")
    17  	}
    18  	return PktLine(fmt.Sprintf("%.4x%s\n", len(line)+5, line)), nil
    19  }
    20  
    21  func PktLineEncodeNoNl(line []byte) (PktLine, error) {
    22  	if len(line) > 65535 {
    23  		return "", fmt.Errorf("Line too long to encode in PktLine format")
    24  	}
    25  	return PktLine(fmt.Sprintf("%.4x%s", len(line)+4, line)), nil
    26  }
    27  func (p PktLine) String() string {
    28  	return string(p)
    29  }
    30  
    31  var loadLine = func(r io.Reader) string {
    32  	size := make([]byte, 4)
    33  	n, err := r.Read(size)
    34  	if n != 4 || err != nil {
    35  		return ""
    36  	}
    37  	val, err := strconv.ParseUint(string(size), 16, 64)
    38  	if err != nil {
    39  		return ""
    40  	}
    41  	if val == 0 {
    42  		return ""
    43  	}
    44  	line := make([]byte, val-4)
    45  	n, err = io.ReadFull(r, line)
    46  	if uint64(n) != val-4 || err != nil {
    47  		panic(fmt.Sprintf("Unexpected line size: %d not %d: %s", n, val, line))
    48  	}
    49  	return string(line)
    50  
    51  }
    52  
    53  func readLine(prompt string) string {
    54  	getInput := bufio.NewReader(os.Stdin)
    55  	var val string
    56  	var err error
    57  	for {
    58  		fmt.Fprintf(os.Stderr, prompt)
    59  		val, err = getInput.ReadString('\n')
    60  		if err != nil {
    61  			return ""
    62  		}
    63  
    64  		val = strings.TrimSpace(val)
    65  		if val != "" {
    66  			return val
    67  		}
    68  	}
    69  }