| package common |
| |
| import ( |
| "context" |
| "fmt" |
| "io" |
| |
| "gopkg.in/src-d/go-git.v4/plumbing/protocol/packp" |
| "gopkg.in/src-d/go-git.v4/plumbing/transport" |
| "gopkg.in/src-d/go-git.v4/utils/ioutil" |
| ) |
| |
| // ServerCommand is used for a single server command execution. |
| type ServerCommand struct { |
| Stderr io.Writer |
| Stdout io.WriteCloser |
| Stdin io.Reader |
| } |
| |
| func ServeUploadPack(cmd ServerCommand, s transport.UploadPackSession) (err error) { |
| ioutil.CheckClose(cmd.Stdout, &err) |
| |
| ar, err := s.AdvertisedReferences() |
| if err != nil { |
| return err |
| } |
| |
| if err := ar.Encode(cmd.Stdout); err != nil { |
| return err |
| } |
| |
| req := packp.NewUploadPackRequest() |
| if err := req.Decode(cmd.Stdin); err != nil { |
| return err |
| } |
| |
| var resp *packp.UploadPackResponse |
| resp, err = s.UploadPack(context.TODO(), req) |
| if err != nil { |
| return err |
| } |
| |
| return resp.Encode(cmd.Stdout) |
| } |
| |
| func ServeReceivePack(cmd ServerCommand, s transport.ReceivePackSession) error { |
| ar, err := s.AdvertisedReferences() |
| if err != nil { |
| return fmt.Errorf("internal error in advertised references: %s", err) |
| } |
| |
| if err := ar.Encode(cmd.Stdout); err != nil { |
| return fmt.Errorf("error in advertised references encoding: %s", err) |
| } |
| |
| req := packp.NewReferenceUpdateRequest() |
| if err := req.Decode(cmd.Stdin); err != nil { |
| return fmt.Errorf("error decoding: %s", err) |
| } |
| |
| rs, err := s.ReceivePack(context.TODO(), req) |
| if rs != nil { |
| if err := rs.Encode(cmd.Stdout); err != nil { |
| return fmt.Errorf("error in encoding report status %s", err) |
| } |
| } |
| |
| if err != nil { |
| return fmt.Errorf("error in receive pack: %s", err) |
| } |
| |
| return nil |
| } |