From b2b39f2e9061647f762601ba1b0e1bf2e88a0c15 Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Wed, 6 Jan 2021 18:45:38 -0800 Subject: [PATCH 1/4] Initial, partial marionette implementation. --- cmd/marionette/log.go | 25 ++ cmd/marionette/main.go | 42 +++ cmd/marionette/server.go | 48 ++++ go.mod | 10 +- go.sum | 93 +++++- internal/marionette/gen.go | 6 + internal/marionette/gen.sh | 16 ++ internal/marionette/marionette.pb.go | 334 ++++++++++++++++++++++ internal/marionette/marionette.proto | 27 ++ internal/marionette/marionette_grpc.pb.go | 206 +++++++++++++ 10 files changed, 799 insertions(+), 8 deletions(-) create mode 100644 cmd/marionette/log.go create mode 100644 cmd/marionette/main.go create mode 100644 cmd/marionette/server.go create mode 100644 internal/marionette/gen.go create mode 100755 internal/marionette/gen.sh create mode 100644 internal/marionette/marionette.pb.go create mode 100644 internal/marionette/marionette.proto create mode 100644 internal/marionette/marionette_grpc.pb.go diff --git a/cmd/marionette/log.go b/cmd/marionette/log.go new file mode 100644 index 0000000000..4ebfbe2b25 --- /dev/null +++ b/cmd/marionette/log.go @@ -0,0 +1,25 @@ +package main + +import ( + "context" + "log" + "time" + + "google.golang.org/grpc" +) + +func logInterceptor() grpc.ServerOption { + return grpc.ChainUnaryInterceptor(func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { + before := time.Now() + resp, err := handler(ctx, req) + after := time.Now() + + status := "OK" + if err != nil { + status = "ERROR" + } + log.Printf("%s (%v) %s", info.FullMethod, after.Sub(before), status) + + return resp, err + }) +} diff --git a/cmd/marionette/main.go b/cmd/marionette/main.go new file mode 100644 index 0000000000..c4b2f4b052 --- /dev/null +++ b/cmd/marionette/main.go @@ -0,0 +1,42 @@ +package main + +import ( + "flag" + "log" + "net" + + "google.golang.org/grpc" + "google.golang.org/grpc/reflection" + + "github.com/sourcegraph/src-cli/internal/marionette" +) + +var ( + address string + network string + workspace string +) + +func init() { + flag.StringVar(&address, "address", ":50051", "address to bind to") + flag.StringVar(&network, "network", "tcp", "network to listen on") + flag.StringVar(&workspace, "workspace", "", "base path of the workspace") +} + +func main() { + flag.Parse() + + l, err := net.Listen(network, address) + if err != nil { + log.Fatalf("failed to listen: %v", err) + } + + s := grpc.NewServer(logInterceptor()) + marionette.RegisterMarionetteServer(s, &server{workspace: workspace}) + reflection.Register(s) + + log.Printf("listening on %s %s", network, address) + if err := s.Serve(l); err != nil { + log.Fatalf("failed to serve: %v", err) + } +} diff --git a/cmd/marionette/server.go b/cmd/marionette/server.go new file mode 100644 index 0000000000..4b4ffcb7f2 --- /dev/null +++ b/cmd/marionette/server.go @@ -0,0 +1,48 @@ +package main + +import ( + "context" + "os/exec" + + "github.com/golang/protobuf/ptypes/empty" + "github.com/sourcegraph/src-cli/internal/marionette" +) + +type server struct { + marionette.UnimplementedMarionetteServer + + workspace string +} + +var _ marionette.MarionetteServer = &server{} + +func (s *server) Prepare(ctx context.Context, req *empty.Empty) (*empty.Empty, error) { + if _, err := s.command(ctx, "git", "init").run(); err != nil { + return nil, err + } + if _, err := s.command(ctx, "git", "add", "--force", "--all").run(); err != nil { + return nil, err + } + if _, err := s.command(ctx, "git", "commit", "--quiet", "--all", "--allow-empty", "-m", "src-action-exec").run(); err != nil { + return nil, err + } + + return &empty.Empty{}, nil +} + +func (s *server) command(ctx context.Context, name string, arg ...string) command { + cmd := exec.CommandContext(ctx, name, arg...) + cmd.Dir = s.workspace + + return command{cmd} +} + +type command struct { + *exec.Cmd +} + +func (c command) run() ([]byte, error) { + // TODO: wrap execution errors in something we can marshal back to the + // client. + return c.CombinedOutput() +} diff --git a/go.mod b/go.mod index ebe9209de1..60849983f9 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/dustin/go-humanize v1.0.0 github.com/efritz/pentimento v0.0.0-20190429011147-ade47d831101 github.com/gobwas/glob v0.2.3 + github.com/golang/protobuf v1.4.3 github.com/google/go-cmp v0.5.2 github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.0 @@ -26,9 +27,14 @@ require ( github.com/sourcegraph/jsonx v0.0.0-20200629203448-1a936bd500cf github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect - golang.org/x/net v0.0.0-20200625001655-4c5254603344 + golang.org/x/net v0.0.0-20201224014010-6772e930b67b golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e - golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 + golang.org/x/sys v0.0.0-20210105210732-16f7687f5001 + golang.org/x/text v0.3.4 // indirect + google.golang.org/genproto v0.0.0-20210106152847-07624b53cd92 // indirect + google.golang.org/grpc v1.34.0 + google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.1 + google.golang.org/protobuf v1.25.0 gopkg.in/yaml.v2 v2.3.0 jaytaylor.com/html2text v0.0.0-20200412013138-3577fbdbcff7 ) diff --git a/go.sum b/go.sum index d569c1db34..b59ea09dca 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,10 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -8,13 +13,37 @@ github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/efritz/pentimento v0.0.0-20190429011147-ade47d831101 h1:RylpU+KNJJNEJIk3o8gZ70uPTlutxaYnikKNPko39LA= github.com/efritz/pentimento v0.0.0-20190429011147-ade47d831101/go.mod h1:5ALWO82UZwfAtNRUtwzsWimcrcuYzyieTyyXOXrP6EQ= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1 h1:/exdXoGamhu5ONeUJH0deniYLWYvQwW66yvlfiiKTu0= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= @@ -48,6 +77,7 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= github.com/sourcegraph/campaignutils v0.0.0-20201124055807-2f9cfa9317e2 h1:MJu/6WzWdPegzYnZLb04IS0u4VyUpPIAHQyWT5i2vR8= @@ -65,6 +95,8 @@ github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf/go.mod h1:RJID2RhlZKId02n github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -76,35 +108,82 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190424112056-4829fb13d2c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b h1:iFwSg7t5GZmB/Q5TjiEAsdoLDrdJRC1RiF2WhuV29Qw= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190428183149-804c0c7841b5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 h1:5/PjkGUjvEU5Gl6BxmvKRPpqo2uNMv4rcHBMwzk/st8= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210105210732-16f7687f5001 h1:/dSxr6gT0FNI1MO5WLJo8mTmItROeOKTkDn+7OwWBos= +golang.org/x/sys v0.0.0-20210105210732-16f7687f5001/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190428024724-550556f78a90/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200624163319-25775e59acb7/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20210106152847-07624b53cd92 h1:jOTk2Z6KYaWoptUFqZ167cS8peoUPjFEXrsqfVkkCGc= +google.golang.org/genproto v0.0.0-20210106152847-07624b53cd92/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.34.0 h1:raiipEjMOIC/TO2AvyTxP25XFdLxNIBwzDh3FM3XztI= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.1 h1:M8spwkmx0pHrPq+uMdl22w5CvJ/Y+oAJTIs9oGoCpOE= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.1/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -112,5 +191,7 @@ gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= jaytaylor.com/html2text v0.0.0-20200412013138-3577fbdbcff7 h1:mub0MmFLOn8XLikZOAhgLD1kXJq8jgftSrrv7m00xFo= jaytaylor.com/html2text v0.0.0-20200412013138-3577fbdbcff7/go.mod h1:OxvTsCwKosqQ1q7B+8FwXqg4rKZ/UG9dUW+g/VL2xH4= diff --git a/internal/marionette/gen.go b/internal/marionette/gen.go new file mode 100644 index 0000000000..65ab7b77bf --- /dev/null +++ b/internal/marionette/gen.go @@ -0,0 +1,6 @@ +package marionette + +//go:generate ./gen.sh + +// This keeps protoc-gen-go-grpc in the go.mod in spite of a go mod tidy. +import _ "google.golang.org/grpc/cmd/protoc-gen-go-grpc" diff --git a/internal/marionette/gen.sh b/internal/marionette/gen.sh new file mode 100755 index 0000000000..73d61f015b --- /dev/null +++ b/internal/marionette/gen.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +set -eux + +dir="$(mktemp -d)" +trap 'rm -rf "$dir"' EXIT + +go build -o "$dir/protoc-gen-go" google.golang.org/protobuf/cmd/protoc-gen-go +go build -o "$dir/protoc-gen-go-grpc" google.golang.org/grpc/cmd/protoc-gen-go-grpc + +PATH="$dir:$PATH" +export PATH +protoc \ + --go_out=. --go_opt=paths=source_relative \ + --go-grpc_out=. --go-grpc_opt=paths=source_relative \ + marionette.proto diff --git a/internal/marionette/marionette.pb.go b/internal/marionette/marionette.pb.go new file mode 100644 index 0000000000..c629346587 --- /dev/null +++ b/internal/marionette/marionette.pb.go @@ -0,0 +1,334 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.12.4 +// source: marionette.proto + +// TODO: figure out how to import and use google.rpc.Status. + +package marionette + +import ( + proto "github.com/golang/protobuf/proto" + empty "github.com/golang/protobuf/ptypes/empty" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type ChangesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Modified []string `protobuf:"bytes,1,rep,name=modified,proto3" json:"modified,omitempty"` + Added []string `protobuf:"bytes,2,rep,name=added,proto3" json:"added,omitempty"` + Deleted []string `protobuf:"bytes,3,rep,name=deleted,proto3" json:"deleted,omitempty"` + Renamed []string `protobuf:"bytes,4,rep,name=renamed,proto3" json:"renamed,omitempty"` +} + +func (x *ChangesResponse) Reset() { + *x = ChangesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_marionette_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ChangesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChangesResponse) ProtoMessage() {} + +func (x *ChangesResponse) ProtoReflect() protoreflect.Message { + mi := &file_marionette_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChangesResponse.ProtoReflect.Descriptor instead. +func (*ChangesResponse) Descriptor() ([]byte, []int) { + return file_marionette_proto_rawDescGZIP(), []int{0} +} + +func (x *ChangesResponse) GetModified() []string { + if x != nil { + return x.Modified + } + return nil +} + +func (x *ChangesResponse) GetAdded() []string { + if x != nil { + return x.Added + } + return nil +} + +func (x *ChangesResponse) GetDeleted() []string { + if x != nil { + return x.Deleted + } + return nil +} + +func (x *ChangesResponse) GetRenamed() []string { + if x != nil { + return x.Renamed + } + return nil +} + +type DiffResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Diff []byte `protobuf:"bytes,1,opt,name=diff,proto3" json:"diff,omitempty"` +} + +func (x *DiffResponse) Reset() { + *x = DiffResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_marionette_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DiffResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DiffResponse) ProtoMessage() {} + +func (x *DiffResponse) ProtoReflect() protoreflect.Message { + mi := &file_marionette_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DiffResponse.ProtoReflect.Descriptor instead. +func (*DiffResponse) Descriptor() ([]byte, []int) { + return file_marionette_proto_rawDescGZIP(), []int{1} +} + +func (x *DiffResponse) GetDiff() []byte { + if x != nil { + return x.Diff + } + return nil +} + +type UnzipRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` +} + +func (x *UnzipRequest) Reset() { + *x = UnzipRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_marionette_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UnzipRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UnzipRequest) ProtoMessage() {} + +func (x *UnzipRequest) ProtoReflect() protoreflect.Message { + mi := &file_marionette_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UnzipRequest.ProtoReflect.Descriptor instead. +func (*UnzipRequest) Descriptor() ([]byte, []int) { + return file_marionette_proto_rawDescGZIP(), []int{2} +} + +func (x *UnzipRequest) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +var File_marionette_proto protoreflect.FileDescriptor + +var file_marionette_proto_rawDesc = []byte{ + 0x0a, 0x10, 0x6d, 0x61, 0x72, 0x69, 0x6f, 0x6e, 0x65, 0x74, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x0a, 0x6d, 0x61, 0x72, 0x69, 0x6f, 0x6e, 0x65, 0x74, 0x74, 0x65, 0x1a, 0x1b, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, + 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x77, 0x0a, 0x0f, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x08, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x64, + 0x64, 0x65, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x61, 0x64, 0x64, 0x65, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x64, 0x22, 0x22, 0x0a, 0x0c, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x66, 0x66, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x64, 0x69, 0x66, 0x66, 0x22, 0x22, 0x0a, 0x0c, 0x55, 0x6e, 0x7a, 0x69, + 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x32, 0x84, 0x02, 0x0a, + 0x0a, 0x4d, 0x61, 0x72, 0x69, 0x6f, 0x6e, 0x65, 0x74, 0x74, 0x65, 0x12, 0x40, 0x0a, 0x07, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, + 0x2e, 0x6d, 0x61, 0x72, 0x69, 0x6f, 0x6e, 0x65, 0x74, 0x74, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, + 0x04, 0x44, 0x69, 0x66, 0x66, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x18, 0x2e, + 0x6d, 0x61, 0x72, 0x69, 0x6f, 0x6e, 0x65, 0x74, 0x74, 0x65, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x07, 0x50, 0x72, 0x65, + 0x70, 0x61, 0x72, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x05, 0x55, 0x6e, 0x7a, 0x69, 0x70, 0x12, + 0x18, 0x2e, 0x6d, 0x61, 0x72, 0x69, 0x6f, 0x6e, 0x65, 0x74, 0x74, 0x65, 0x2e, 0x55, 0x6e, 0x7a, + 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x00, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x73, 0x72, + 0x63, 0x2d, 0x63, 0x6c, 0x69, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x6d, + 0x61, 0x72, 0x69, 0x6f, 0x6e, 0x65, 0x74, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, +} + +var ( + file_marionette_proto_rawDescOnce sync.Once + file_marionette_proto_rawDescData = file_marionette_proto_rawDesc +) + +func file_marionette_proto_rawDescGZIP() []byte { + file_marionette_proto_rawDescOnce.Do(func() { + file_marionette_proto_rawDescData = protoimpl.X.CompressGZIP(file_marionette_proto_rawDescData) + }) + return file_marionette_proto_rawDescData +} + +var file_marionette_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_marionette_proto_goTypes = []interface{}{ + (*ChangesResponse)(nil), // 0: marionette.ChangesResponse + (*DiffResponse)(nil), // 1: marionette.DiffResponse + (*UnzipRequest)(nil), // 2: marionette.UnzipRequest + (*empty.Empty)(nil), // 3: google.protobuf.Empty +} +var file_marionette_proto_depIdxs = []int32{ + 3, // 0: marionette.Marionette.Changes:input_type -> google.protobuf.Empty + 3, // 1: marionette.Marionette.Diff:input_type -> google.protobuf.Empty + 3, // 2: marionette.Marionette.Prepare:input_type -> google.protobuf.Empty + 2, // 3: marionette.Marionette.Unzip:input_type -> marionette.UnzipRequest + 0, // 4: marionette.Marionette.Changes:output_type -> marionette.ChangesResponse + 1, // 5: marionette.Marionette.Diff:output_type -> marionette.DiffResponse + 3, // 6: marionette.Marionette.Prepare:output_type -> google.protobuf.Empty + 3, // 7: marionette.Marionette.Unzip:output_type -> google.protobuf.Empty + 4, // [4:8] is the sub-list for method output_type + 0, // [0:4] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_marionette_proto_init() } +func file_marionette_proto_init() { + if File_marionette_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_marionette_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChangesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_marionette_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DiffResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_marionette_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UnzipRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_marionette_proto_rawDesc, + NumEnums: 0, + NumMessages: 3, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_marionette_proto_goTypes, + DependencyIndexes: file_marionette_proto_depIdxs, + MessageInfos: file_marionette_proto_msgTypes, + }.Build() + File_marionette_proto = out.File + file_marionette_proto_rawDesc = nil + file_marionette_proto_goTypes = nil + file_marionette_proto_depIdxs = nil +} diff --git a/internal/marionette/marionette.proto b/internal/marionette/marionette.proto new file mode 100644 index 0000000000..2cd7e020ff --- /dev/null +++ b/internal/marionette/marionette.proto @@ -0,0 +1,27 @@ +syntax = "proto3"; + +option go_package = "github.com/sourcegraph/src-cli/internal/marionette"; + +import "google/protobuf/empty.proto"; + +// TODO: figure out how to import and use google.rpc.Status. + +package marionette; + +service Marionette { + rpc Changes(google.protobuf.Empty) returns (ChangesResponse) {} + rpc Diff(google.protobuf.Empty) returns (DiffResponse) {} + rpc Prepare(google.protobuf.Empty) returns (google.protobuf.Empty) {} + rpc Unzip(UnzipRequest) returns (google.protobuf.Empty) {} +} + +message ChangesResponse { + repeated string modified = 1; + repeated string added = 2; + repeated string deleted = 3; + repeated string renamed = 4; +} + +message DiffResponse { bytes diff = 1; } + +message UnzipRequest { string path = 1; } diff --git a/internal/marionette/marionette_grpc.pb.go b/internal/marionette/marionette_grpc.pb.go new file mode 100644 index 0000000000..f08b6ebb05 --- /dev/null +++ b/internal/marionette/marionette_grpc.pb.go @@ -0,0 +1,206 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package marionette + +import ( + context "context" + empty "github.com/golang/protobuf/ptypes/empty" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion7 + +// MarionetteClient is the client API for Marionette service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type MarionetteClient interface { + Changes(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*ChangesResponse, error) + Diff(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DiffResponse, error) + Prepare(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) + Unzip(ctx context.Context, in *UnzipRequest, opts ...grpc.CallOption) (*empty.Empty, error) +} + +type marionetteClient struct { + cc grpc.ClientConnInterface +} + +func NewMarionetteClient(cc grpc.ClientConnInterface) MarionetteClient { + return &marionetteClient{cc} +} + +func (c *marionetteClient) Changes(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*ChangesResponse, error) { + out := new(ChangesResponse) + err := c.cc.Invoke(ctx, "/marionette.Marionette/Changes", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *marionetteClient) Diff(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DiffResponse, error) { + out := new(DiffResponse) + err := c.cc.Invoke(ctx, "/marionette.Marionette/Diff", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *marionetteClient) Prepare(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) + err := c.cc.Invoke(ctx, "/marionette.Marionette/Prepare", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *marionetteClient) Unzip(ctx context.Context, in *UnzipRequest, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) + err := c.cc.Invoke(ctx, "/marionette.Marionette/Unzip", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// MarionetteServer is the server API for Marionette service. +// All implementations must embed UnimplementedMarionetteServer +// for forward compatibility +type MarionetteServer interface { + Changes(context.Context, *empty.Empty) (*ChangesResponse, error) + Diff(context.Context, *empty.Empty) (*DiffResponse, error) + Prepare(context.Context, *empty.Empty) (*empty.Empty, error) + Unzip(context.Context, *UnzipRequest) (*empty.Empty, error) + mustEmbedUnimplementedMarionetteServer() +} + +// UnimplementedMarionetteServer must be embedded to have forward compatible implementations. +type UnimplementedMarionetteServer struct { +} + +func (UnimplementedMarionetteServer) Changes(context.Context, *empty.Empty) (*ChangesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Changes not implemented") +} +func (UnimplementedMarionetteServer) Diff(context.Context, *empty.Empty) (*DiffResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Diff not implemented") +} +func (UnimplementedMarionetteServer) Prepare(context.Context, *empty.Empty) (*empty.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method Prepare not implemented") +} +func (UnimplementedMarionetteServer) Unzip(context.Context, *UnzipRequest) (*empty.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method Unzip not implemented") +} +func (UnimplementedMarionetteServer) mustEmbedUnimplementedMarionetteServer() {} + +// UnsafeMarionetteServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to MarionetteServer will +// result in compilation errors. +type UnsafeMarionetteServer interface { + mustEmbedUnimplementedMarionetteServer() +} + +func RegisterMarionetteServer(s grpc.ServiceRegistrar, srv MarionetteServer) { + s.RegisterService(&_Marionette_serviceDesc, srv) +} + +func _Marionette_Changes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(empty.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MarionetteServer).Changes(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/marionette.Marionette/Changes", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MarionetteServer).Changes(ctx, req.(*empty.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _Marionette_Diff_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(empty.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MarionetteServer).Diff(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/marionette.Marionette/Diff", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MarionetteServer).Diff(ctx, req.(*empty.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _Marionette_Prepare_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(empty.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MarionetteServer).Prepare(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/marionette.Marionette/Prepare", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MarionetteServer).Prepare(ctx, req.(*empty.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _Marionette_Unzip_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UnzipRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MarionetteServer).Unzip(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/marionette.Marionette/Unzip", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MarionetteServer).Unzip(ctx, req.(*UnzipRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Marionette_serviceDesc = grpc.ServiceDesc{ + ServiceName: "marionette.Marionette", + HandlerType: (*MarionetteServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Changes", + Handler: _Marionette_Changes_Handler, + }, + { + MethodName: "Diff", + Handler: _Marionette_Diff_Handler, + }, + { + MethodName: "Prepare", + Handler: _Marionette_Prepare_Handler, + }, + { + MethodName: "Unzip", + Handler: _Marionette_Unzip_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "marionette.proto", +} From ea2b236e2329b37208037a44c9d93aa36fe21524 Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Thu, 7 Jan 2021 21:59:42 -0800 Subject: [PATCH 2/4] WIP --- cmd/marionette/server.go | 76 +++++++++++ cmd/src/campaigns_common.go | 2 +- docker/marionette/Dockerfile | 12 ++ internal/campaigns/marionette_workspace.go | 151 +++++++++++++++++++++ internal/campaigns/service.go | 2 + internal/marionette/gen.go | 2 +- 6 files changed, 243 insertions(+), 2 deletions(-) create mode 100644 docker/marionette/Dockerfile create mode 100644 internal/campaigns/marionette_workspace.go diff --git a/cmd/marionette/server.go b/cmd/marionette/server.go index 4b4ffcb7f2..957392cb56 100644 --- a/cmd/marionette/server.go +++ b/cmd/marionette/server.go @@ -2,9 +2,12 @@ package main import ( "context" + "fmt" "os/exec" + "strings" "github.com/golang/protobuf/ptypes/empty" + "github.com/sourcegraph/src-cli/internal/campaigns" "github.com/sourcegraph/src-cli/internal/marionette" ) @@ -16,6 +19,38 @@ type server struct { var _ marionette.MarionetteServer = &server{} +func (s *server) Changes(ctx context.Context, req *empty.Empty) (*marionette.ChangesResponse, error) { + if _, err := s.command(ctx, "git", "add", "--all").run(); err != nil { + return nil, err + } + + out, err := s.command(ctx, "git", "status", "--porcelain").run() + if err != nil { + return nil, err + } + + changes, err := parseGitStatus(out) + if err != nil { + return nil, err + } + + return &marionette.ChangesResponse{ + Modified: changes.Modified, + Added: changes.Added, + Deleted: changes.Deleted, + Renamed: changes.Renamed, + }, nil +} + +func (s *server) Diff(ctx context.Context, req *empty.Empty) (*marionette.DiffResponse, error) { + out, err := s.command(ctx, "git", "diff", "--cached", "--no-prefix", "--binary").run() + if err != nil { + return nil, err + } + + return &marionette.DiffResponse{Diff: out}, nil +} + func (s *server) Prepare(ctx context.Context, req *empty.Empty) (*empty.Empty, error) { if _, err := s.command(ctx, "git", "init").run(); err != nil { return nil, err @@ -30,6 +65,14 @@ func (s *server) Prepare(ctx context.Context, req *empty.Empty) (*empty.Empty, e return &empty.Empty{}, nil } +func (s *server) Unzip(ctx context.Context, req *marionette.UnzipRequest) (*empty.Empty, error) { + if _, err := s.command(ctx, "unzip", req.Path).run(); err != nil { + return nil, err + } + + return &empty.Empty{}, nil +} + func (s *server) command(ctx context.Context, name string, arg ...string) command { cmd := exec.CommandContext(ctx, name, arg...) cmd.Dir = s.workspace @@ -46,3 +89,36 @@ func (c command) run() ([]byte, error) { // client. return c.CombinedOutput() } + +// TODO: don't duplicate. +func parseGitStatus(out []byte) (campaigns.StepChanges, error) { + result := campaigns.StepChanges{} + + stripped := strings.TrimSpace(string(out)) + if len(stripped) == 0 { + return result, nil + } + + for _, line := range strings.Split(stripped, "\n") { + if len(line) < 4 { + return result, fmt.Errorf("git status line has unrecognized format: %q", line) + } + + file := line[3:] + + switch line[0] { + case 'M': + result.Modified = append(result.Modified, file) + case 'A': + result.Added = append(result.Added, file) + case 'D': + result.Deleted = append(result.Deleted, file) + case 'R': + files := strings.Split(file, " -> ") + newFile := files[len(files)-1] + result.Renamed = append(result.Renamed, newFile) + } + } + + return result, nil +} diff --git a/cmd/src/campaigns_common.go b/cmd/src/campaigns_common.go index 64fd032d19..ea24c7e6cb 100644 --- a/cmd/src/campaigns_common.go +++ b/cmd/src/campaigns_common.go @@ -112,7 +112,7 @@ func newCampaignsApplyFlags(flagSet *flag.FlagSet, cacheDir, tempDir string) *ca } flagSet.StringVar( &caf.workspace, "workspace", defaultWorkspace, - `Workspace mode to use ("bind" or "volume")`, + `Workspace mode to use ("bind", "marionette", or "volume")`, ) flagSet.BoolVar(verbose, "v", false, "print verbose output") diff --git a/docker/marionette/Dockerfile b/docker/marionette/Dockerfile new file mode 100644 index 0000000000..f684f761fe --- /dev/null +++ b/docker/marionette/Dockerfile @@ -0,0 +1,12 @@ +FROM golang:1.15-alpine as builder + +RUN apk add --update protoc protobuf-dev + +COPY . /src +WORKDIR /src +RUN go generate ./... && go build ./cmd/marionette + +FROM sourcegraph/src-campaign-volume-workspace + +COPY --from=builder /src/marionette /usr/sbin/marionette +CMD ["/usr/sbin/marionette"] diff --git a/internal/campaigns/marionette_workspace.go b/internal/campaigns/marionette_workspace.go new file mode 100644 index 0000000000..3563b01c8b --- /dev/null +++ b/internal/campaigns/marionette_workspace.go @@ -0,0 +1,151 @@ +package campaigns + +import ( + "bytes" + "context" + "os/exec" + + "github.com/golang/protobuf/ptypes/empty" + "github.com/pkg/errors" + "github.com/sourcegraph/src-cli/internal/campaigns/graphql" + "github.com/sourcegraph/src-cli/internal/marionette" + "google.golang.org/grpc" +) + +const dockerMarionetteWorkspaceImage = "sourcegraph/src-marionette" + +type dockerMarionetteWorkspaceCreator struct{} + +var _ WorkspaceCreator = &dockerMarionetteWorkspaceCreator{} + +func (wc *dockerMarionetteWorkspaceCreator) Create(ctx context.Context, repo *graphql.Repository, zip string) (Workspace, error) { + volume, err := wc.createVolume(ctx) + if err != nil { + return nil, errors.Wrap(err, "creating Docker volume") + } + + w := &dockerMarionetteWorkspace{ + dir: "/work", + volume: volume, + } + + common, err := w.DockerRunOpts(ctx, w.dir) + if err != nil { + return nil, errors.Wrap(err, "generating run options") + } + + opts := append([]string{ + "run", + "-d", + "--rm", + "--workdir", w.dir, + "-p", "127.0.0.1::50051", + "--mount", "type=bind,source=" + zip + ",target=/tmp/zip", + }, common...) + opts = append( + opts, + dockerMarionetteWorkspaceImage, + "/usr/sbin/marionette", + "-workspace", w.dir, + "-network", "tcp", + "-address", ":50051", + ) + + out, err := exec.CommandContext(ctx, "docker", opts...).CombinedOutput() + if err != nil { + return nil, errors.Wrap(err, "running Marionette container") + } + w.container = string(bytes.TrimSpace(out)) + + // Figure out the port. + out, err = exec.CommandContext(ctx, "docker", "port", w.container, "50051").CombinedOutput() + if err != nil { + return nil, errors.Wrap(err, "getting Marionette port") + } + + // Connect. + conn, err := grpc.Dial(string(bytes.TrimSpace(out)), grpc.WithInsecure(), grpc.WithBlock()) + if err != nil { + return nil, errors.Wrap(err, "connecting to Marionette") + } + w.conn = conn + w.client = marionette.NewMarionetteClient(conn) + + // Unzip. + if _, err := w.client.Unzip(ctx, &marionette.UnzipRequest{ + Path: "/tmp/zip", + }); err != nil { + return nil, errors.Wrap(err, "unzipping archive") + } + + // Prepare. + if _, err := w.client.Prepare(ctx, &empty.Empty{}); err != nil { + return nil, errors.Wrap(err, "preparing workspace") + } + + return w, nil +} + +func (*dockerMarionetteWorkspaceCreator) DockerImages() []string { + return []string{dockerMarionetteWorkspaceImage} +} + +func (*dockerMarionetteWorkspaceCreator) createVolume(ctx context.Context) (string, error) { + out, err := exec.CommandContext(ctx, "docker", "volume", "create").CombinedOutput() + if err != nil { + return "", err + } + + return string(bytes.TrimSpace(out)), nil +} + +type dockerMarionetteWorkspace struct { + client marionette.MarionetteClient + conn *grpc.ClientConn + container string + dir string + volume string +} + +func (w *dockerMarionetteWorkspace) DockerRunOpts(ctx context.Context, target string) ([]string, error) { + return []string{ + "--mount", "type=volume,source=" + w.volume + ",target=" + target, + }, nil +} + +func (w *dockerMarionetteWorkspace) WorkDir() *string { + return nil +} + +func (w *dockerMarionetteWorkspace) Close(ctx context.Context) error { + w.conn.Close() + + if err := exec.CommandContext(ctx, "docker", "stop", w.container).Run(); err != nil { + return err + } + + return exec.CommandContext(ctx, "docker", "volume", "rm", w.volume).Run() +} + +func (w *dockerMarionetteWorkspace) Changes(ctx context.Context) (*StepChanges, error) { + c, err := w.client.Changes(ctx, &empty.Empty{}) + if err != nil { + return nil, err + } + + return &StepChanges{ + Modified: c.Modified, + Added: c.Added, + Deleted: c.Deleted, + Renamed: c.Renamed, + }, nil +} + +func (w *dockerMarionetteWorkspace) Diff(ctx context.Context) ([]byte, error) { + resp, err := w.client.Diff(ctx, &empty.Empty{}) + if err != nil { + return nil, err + } + + return resp.Diff, nil +} diff --git a/internal/campaigns/service.go b/internal/campaigns/service.go index 0514f59f99..98ccefa018 100644 --- a/internal/campaigns/service.go +++ b/internal/campaigns/service.go @@ -214,6 +214,8 @@ func (svc *Service) NewRepoFetcher(dir string, cleanArchives bool) RepoFetcher { func (svc *Service) NewWorkspaceCreator(dir string) WorkspaceCreator { if svc.workspace == "volume" { return &dockerVolumeWorkspaceCreator{} + } else if svc.workspace == "marionette" { + return &dockerMarionetteWorkspaceCreator{} } return &dockerBindWorkspaceCreator{dir: dir} } diff --git a/internal/marionette/gen.go b/internal/marionette/gen.go index 65ab7b77bf..d6f5984c8b 100644 --- a/internal/marionette/gen.go +++ b/internal/marionette/gen.go @@ -3,4 +3,4 @@ package marionette //go:generate ./gen.sh // This keeps protoc-gen-go-grpc in the go.mod in spite of a go mod tidy. -import _ "google.golang.org/grpc/cmd/protoc-gen-go-grpc" +import _ "google.golang.org/grpc" From 20df8eb8ba6edf3aebc37765d72332e1f2e28316 Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Thu, 7 Jan 2021 22:04:25 -0800 Subject: [PATCH 3/4] WIP --- internal/campaigns/marionette_workspace.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/campaigns/marionette_workspace.go b/internal/campaigns/marionette_workspace.go index 3563b01c8b..75280f9172 100644 --- a/internal/campaigns/marionette_workspace.go +++ b/internal/campaigns/marionette_workspace.go @@ -64,7 +64,7 @@ func (wc *dockerMarionetteWorkspaceCreator) Create(ctx context.Context, repo *gr } // Connect. - conn, err := grpc.Dial(string(bytes.TrimSpace(out)), grpc.WithInsecure(), grpc.WithBlock()) + conn, err := grpc.Dial(string(bytes.TrimSpace(out)), grpc.WithInsecure(), grpc.WithBlock(), grpc.WithMaxMsgSize(2*1024*1024*1024)) if err != nil { return nil, errors.Wrap(err, "connecting to Marionette") } From a04a760e145cab11f2c9ea81ec95a58e8b5a4f80 Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Thu, 7 Jan 2021 22:06:53 -0800 Subject: [PATCH 4/4] WIP --- internal/campaigns/marionette_workspace.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/internal/campaigns/marionette_workspace.go b/internal/campaigns/marionette_workspace.go index 75280f9172..f1041a7458 100644 --- a/internal/campaigns/marionette_workspace.go +++ b/internal/campaigns/marionette_workspace.go @@ -64,7 +64,12 @@ func (wc *dockerMarionetteWorkspaceCreator) Create(ctx context.Context, repo *gr } // Connect. - conn, err := grpc.Dial(string(bytes.TrimSpace(out)), grpc.WithInsecure(), grpc.WithBlock(), grpc.WithMaxMsgSize(2*1024*1024*1024)) + conn, err := grpc.Dial( + string(bytes.TrimSpace(out)), + grpc.WithInsecure(), + grpc.WithBlock(), + grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(2*1024*1024*1024)), + ) if err != nil { return nil, errors.Wrap(err, "connecting to Marionette") }