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 }