diff --git a/pkg/packet/packet.go b/pkg/packet/packet.go index 2def2c90..74c7e36a 100644 --- a/pkg/packet/packet.go +++ b/pkg/packet/packet.go @@ -11,6 +11,7 @@ import ( "context" "encoding/base64" "encoding/json" + "errors" "fmt" "io" "os" @@ -364,6 +365,19 @@ func (*ResponsePacketType) GetResponseDone() bool { return true } +func (p *ResponsePacketType) Err() error { + if p == nil { + return fmt.Errorf("no response received") + } + if !p.Success { + if p.Error != "" { + return errors.New(p.Error) + } + return fmt.Errorf("rpc failed") + } + return nil +} + func MakeErrorResponsePacket(reqId string, err error) *ResponsePacketType { return &ResponsePacketType{Type: ResponsePacketStr, RespId: reqId, Error: err.Error()} } diff --git a/pkg/server/server.go b/pkg/server/server.go index 9cb8713f..4f2f367c 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -57,7 +57,7 @@ func (m *MServer) runCompGen(compPk *packet.CompGenPacketType) { m.Sender.SendErrorResponse(reqId, fmt.Errorf("invalid compgen type '%s'", compPk.CompType)) return } - compGenCmdStr := fmt.Sprintf("cd %s; compgen -A %s -- %s | head -n %d", shellescape.Quote(compPk.Cwd), shellescape.Quote(compPk.CompType), shellescape.Quote(compPk.Prefix), packet.MaxCompGenValues) + compGenCmdStr := fmt.Sprintf("cd %s; compgen -A %s -- %s | head -n %d", shellescape.Quote(compPk.Cwd), shellescape.Quote(compPk.CompType), shellescape.Quote(compPk.Prefix), packet.MaxCompGenValues+1) ecmd := exec.Command("bash", "-c", compGenCmdStr) outputBytes, err := ecmd.Output() if err != nil { @@ -69,7 +69,12 @@ func (m *MServer) runCompGen(compPk *packet.CompGenPacketType) { if len(parts) > 0 && parts[len(parts)-1] == "" { parts = parts[0 : len(parts)-1] } - m.Sender.SendResponse(reqId, map[string]interface{}{"comps": parts}) + hasMore := false + if len(parts) > packet.MaxCompGenValues { + hasMore = true + parts = parts[0:packet.MaxCompGenValues] + } + m.Sender.SendResponse(reqId, map[string]interface{}{"comps": parts, "hasmore": hasMore}) return }