@@ -10,6 +10,7 @@ import (
10
10
"errors"
11
11
"fmt"
12
12
"io"
13
+ stdioutil "io/ioutil"
13
14
"strings"
14
15
"time"
15
16
@@ -22,7 +23,6 @@ import (
22
23
23
24
const (
24
25
readErrorSecondsTimeout = 10
25
- errLinesBuffer = 1000
26
26
)
27
27
28
28
var (
@@ -96,7 +96,7 @@ type session struct {
96
96
advRefs * packp.AdvRefs
97
97
packRun bool
98
98
finished bool
99
- errLines chan string
99
+ firstErrLine chan string
100
100
}
101
101
102
102
func (c * client ) newSession (s string , ep transport.Endpoint , auth transport.AuthMethod ) (* session , error ) {
@@ -128,26 +128,29 @@ func (c *client) newSession(s string, ep transport.Endpoint, auth transport.Auth
128
128
Stdin : stdin ,
129
129
Stdout : stdout ,
130
130
Command : cmd ,
131
- errLines : c . listenErrors (stderr ),
131
+ firstErrLine : c . listenFirstError (stderr ),
132
132
isReceivePack : s == transport .ReceivePackServiceName ,
133
133
}, nil
134
134
}
135
135
136
- func (c * client ) listenErrors (r io.Reader ) chan string {
136
+ func (c * client ) listenFirstError (r io.Reader ) chan string {
137
137
if r == nil {
138
138
return nil
139
139
}
140
140
141
- errLines := make (chan string , errLinesBuffer )
141
+ errLine := make (chan string , 1 )
142
142
go func () {
143
143
s := bufio .NewScanner (r )
144
- for s .Scan () {
145
- line := string (s .Bytes ())
146
- errLines <- line
144
+ if s .Scan () {
145
+ errLine <- s .Text ()
146
+ } else {
147
+ close (errLine )
147
148
}
149
+
150
+ _ , _ = io .Copy (stdioutil .Discard , r )
148
151
}()
149
152
150
- return errLines
153
+ return errLine
151
154
}
152
155
153
156
// AdvertisedReferences retrieves the advertised references from the server.
@@ -296,13 +299,10 @@ func (s *session) finish() error {
296
299
return nil
297
300
}
298
301
299
- func (s * session ) Close () error {
300
- if err := s .finish (); err != nil {
301
- _ = s .Command .Close ()
302
- return err
303
- }
304
-
305
- return s .Command .Close ()
302
+ func (s * session ) Close () (err error ) {
303
+ defer ioutil .CheckClose (s .Command , & err )
304
+ err = s .finish ()
305
+ return
306
306
}
307
307
308
308
func (s * session ) checkNotFoundError () error {
@@ -312,7 +312,7 @@ func (s *session) checkNotFoundError() error {
312
312
select {
313
313
case <- t .C :
314
314
return ErrTimeoutExceeded
315
- case line , ok := <- s .errLines :
315
+ case line , ok := <- s .firstErrLine :
316
316
if ! ok {
317
317
return nil
318
318
}
0 commit comments