Code cleanup

- Removed unused functions and variables
- Wrapped client formatted errors
- Updated deprecated packages
- Changed suggested code patterns
This commit is contained in:
tidwall 2021-07-08 06:46:08 -07:00
parent 6a55c8de8f
commit 58221adccb
40 changed files with 134 additions and 386 deletions

2
go.mod
View File

@ -28,8 +28,8 @@ require (
github.com/tidwall/rtree v1.2.7 github.com/tidwall/rtree v1.2.7
github.com/tidwall/sjson v1.1.6 github.com/tidwall/sjson v1.1.6
github.com/yuin/gopher-lua v0.0.0-20200816102855-ee81675732da github.com/yuin/gopher-lua v0.0.0-20200816102855-ee81675732da
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad
golang.org/x/net v0.0.0-20210119194325-5f4716e94777 golang.org/x/net v0.0.0-20210119194325-5f4716e94777
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1
google.golang.org/api v0.20.0 google.golang.org/api v0.20.0
google.golang.org/grpc v1.35.0 google.golang.org/grpc v1.35.0
layeh.com/gopher-json v0.0.0-20201124131017-552bb3c4c3bf layeh.com/gopher-json v0.0.0-20201124131017-552bb3c4c3bf

5
go.sum
View File

@ -235,9 +235,8 @@ golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM=
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY=
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@ -315,7 +314,6 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@ -328,7 +326,6 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=

View File

@ -79,9 +79,9 @@ func clipRing(ring []geometry.Point, bbox geometry.Rect) (
// Entering // Entering
resRing = append(resRing, intersect(bbox, edge, prev, p)) resRing = append(resRing, intersect(bbox, edge, prev, p))
resRing = append(resRing, p) resRing = append(resRing, p)
} else { } /* else {
// Staying outside // Stay outside
} } */
prev, prevInside = p, inside prev, prevInside = p, inside
} }
if len(resRing) > 0 && resRing[0] != resRing[len(resRing)-1] { if len(resRing) > 0 && resRing[0] != resRing[len(resRing)-1] {
@ -137,8 +137,9 @@ func intersect(bbox geometry.Rect, code uint8, start, end geometry.Point) (
X: bbox.Min.X, X: bbox.Min.X,
Y: start.Y + (end.Y-start.Y)*(bbox.Min.X-start.X)/(end.X-start.X), Y: start.Y + (end.Y-start.Y)*(bbox.Min.X-start.X)/(end.X-start.X),
} }
} else { // should not call intersect with the zero code } /* else {
} // should not call intersect with the zero code
} */
return return
} }

View File

@ -47,7 +47,7 @@ func TestClipPolygonSimple(t *testing.T) {
{X: 2, Y: 2}, {X: 2, Y: 2},
} }
holes := [][]geometry.Point{ holes := [][]geometry.Point{
[]geometry.Point{ {
{X: 1.9, Y: 1.9}, {X: 1.9, Y: 1.9},
{X: 1.2, Y: 1.9}, {X: 1.2, Y: 1.9},
{X: 1.45, Y: 1.65}, {X: 1.45, Y: 1.65},
@ -79,7 +79,7 @@ func TestClipPolygon2(t *testing.T) {
{X: 2, Y: 2}, {X: 2, Y: 2},
} }
holes := [][]geometry.Point{ holes := [][]geometry.Point{
[]geometry.Point{ {
{X: 1.9, Y: 1.9}, {X: 1.9, Y: 1.9},
{X: 1.2, Y: 1.9}, {X: 1.2, Y: 1.9},
{X: 1.45, Y: 1.65}, {X: 1.45, Y: 1.65},

View File

@ -58,8 +58,6 @@ type Collection struct {
nobjects int // non-geometry count nobjects int // non-geometry count
} }
var counter uint64
// New creates an empty collection // New creates an empty collection
func New() *Collection { func New() *Collection {
col := &Collection{ col := &Collection{

View File

@ -44,8 +44,7 @@ func TestCollectionNewCollection(t *testing.T) {
c := New() c := New()
for i := 0; i < numItems; i++ { for i := 0; i < numItems; i++ {
id := strconv.FormatInt(int64(i), 10) id := strconv.FormatInt(int64(i), 10)
var obj geojson.Object obj := PO(rand.Float64()*360-180, rand.Float64()*180-90)
obj = PO(rand.Float64()*360-180, rand.Float64()*180-90)
objs[id] = obj objs[id] = obj
c.Set(id, obj, nil, nil) c.Set(id, obj, nil, nil)
} }
@ -168,23 +167,23 @@ func TestCollectionSet(t *testing.T) {
expect(t, len(c.FieldMap()) == 0) expect(t, len(c.FieldMap()) == 0)
v, flds, updated, ok = c.SetField("3", "hello", 123) _, flds, updated, ok = c.SetField("3", "hello", 123)
expect(t, ok) expect(t, ok)
expect(t, reflect.DeepEqual(flds, []float64{123})) expect(t, reflect.DeepEqual(flds, []float64{123}))
expect(t, updated) expect(t, updated)
expect(t, c.FieldMap()["hello"] == 0) expect(t, c.FieldMap()["hello"] == 0)
v, flds, updated, ok = c.SetField("3", "hello", 1234) _, flds, updated, ok = c.SetField("3", "hello", 1234)
expect(t, ok) expect(t, ok)
expect(t, reflect.DeepEqual(flds, []float64{1234})) expect(t, reflect.DeepEqual(flds, []float64{1234}))
expect(t, updated) expect(t, updated)
v, flds, updated, ok = c.SetField("3", "hello", 1234) _, flds, updated, ok = c.SetField("3", "hello", 1234)
expect(t, ok) expect(t, ok)
expect(t, reflect.DeepEqual(flds, []float64{1234})) expect(t, reflect.DeepEqual(flds, []float64{1234}))
expect(t, !updated) expect(t, !updated)
v, flds, updateCount, ok = c.SetFields("3", _, flds, updateCount, ok = c.SetFields("3",
[]string{"planet", "world"}, []float64{55, 66}) []string{"planet", "world"}, []float64{55, 66})
expect(t, ok) expect(t, ok)
expect(t, reflect.DeepEqual(flds, []float64{1234, 55, 66})) expect(t, reflect.DeepEqual(flds, []float64{1234, 55, 66}))

View File

@ -26,7 +26,7 @@ func (conn *AMQPConn) Expired() bool {
conn.mu.Lock() conn.mu.Lock()
defer conn.mu.Unlock() defer conn.mu.Unlock()
if !conn.ex { if !conn.ex {
if time.Now().Sub(conn.t) > amqpExpiresAfter { if time.Since(conn.t) > amqpExpiresAfter {
conn.ex = true conn.ex = true
conn.close() conn.close()
} }

View File

@ -32,7 +32,7 @@ func (conn *DisqueConn) Expired() bool {
conn.mu.Lock() conn.mu.Lock()
defer conn.mu.Unlock() defer conn.mu.Unlock()
if !conn.ex { if !conn.ex {
if time.Now().Sub(conn.t) > disqueExpiresAfter { if time.Since(conn.t) > disqueExpiresAfter {
if conn.conn != nil { if conn.conn != nil {
conn.close() conn.close()
} }

View File

@ -35,7 +35,7 @@ func (conn *GRPCConn) Expired() bool {
conn.mu.Lock() conn.mu.Lock()
defer conn.mu.Unlock() defer conn.mu.Unlock()
if !conn.ex { if !conn.ex {
if time.Now().Sub(conn.t) > grpcExpiresAfter { if time.Since(conn.t) > grpcExpiresAfter {
if conn.conn != nil { if conn.conn != nil {
conn.close() conn.close()
} }

View File

@ -32,7 +32,7 @@ func (conn *KafkaConn) Expired() bool {
conn.mu.Lock() conn.mu.Lock()
defer conn.mu.Unlock() defer conn.mu.Unlock()
if !conn.ex { if !conn.ex {
if time.Now().Sub(conn.t) > kafkaExpiresAfter { if time.Since(conn.t) > kafkaExpiresAfter {
if conn.conn != nil { if conn.conn != nil {
conn.close() conn.close()
} }

View File

@ -1,11 +1,5 @@
package endpoint package endpoint
import (
"time"
)
const localExpiresAfter = time.Second * 30
// LocalPublisher is used to publish local notifcations // LocalPublisher is used to publish local notifcations
type LocalPublisher interface { type LocalPublisher interface {
Publish(channel string, message ...string) int Publish(channel string, message ...string) int

View File

@ -32,7 +32,7 @@ func (conn *MQTTConn) Expired() bool {
conn.mu.Lock() conn.mu.Lock()
defer conn.mu.Unlock() defer conn.mu.Unlock()
if !conn.ex { if !conn.ex {
if time.Now().Sub(conn.t) > mqttExpiresAfter { if time.Since(conn.t) > mqttExpiresAfter {
conn.close() conn.close()
conn.ex = true conn.ex = true
} }

View File

@ -31,7 +31,7 @@ func (conn *NATSConn) Expired() bool {
conn.mu.Lock() conn.mu.Lock()
defer conn.mu.Unlock() defer conn.mu.Unlock()
if !conn.ex { if !conn.ex {
if time.Now().Sub(conn.t) > natsExpiresAfter { if time.Since(conn.t) > natsExpiresAfter {
if conn.conn != nil { if conn.conn != nil {
conn.close() conn.close()
} }

View File

@ -31,7 +31,7 @@ func (conn *RedisConn) Expired() bool {
conn.mu.Lock() conn.mu.Lock()
defer conn.mu.Unlock() defer conn.mu.Unlock()
if !conn.ex { if !conn.ex {
if time.Now().Sub(conn.t) > redisExpiresAfter { if time.Since(conn.t) > redisExpiresAfter {
if conn.conn != nil { if conn.conn != nil {
conn.close() conn.close()
} }

View File

@ -1,7 +1,6 @@
package endpoint package endpoint
import ( import (
"errors"
"fmt" "fmt"
"strings" "strings"
"sync" "sync"
@ -11,12 +10,9 @@ import (
"github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/sqs" "github.com/aws/aws-sdk-go/service/sqs"
"github.com/streadway/amqp"
"github.com/tidwall/tile38/internal/log" "github.com/tidwall/tile38/internal/log"
) )
var errCreateQueue = errors.New("Error while creating queue")
const sqsExpiresAfter = time.Second * 30 const sqsExpiresAfter = time.Second * 30
// SQSConn is an endpoint connection // SQSConn is an endpoint connection
@ -25,7 +21,6 @@ type SQSConn struct {
ep Endpoint ep Endpoint
session *session.Session session *session.Session
svc *sqs.SQS svc *sqs.SQS
channel *amqp.Channel
ex bool ex bool
t time.Time t time.Time
} }
@ -43,7 +38,7 @@ func (conn *SQSConn) Expired() bool {
conn.mu.Lock() conn.mu.Lock()
defer conn.mu.Unlock() defer conn.mu.Unlock()
if !conn.ex { if !conn.ex {
if time.Now().Sub(conn.t) > sqsExpiresAfter { if time.Since(conn.t) > sqsExpiresAfter {
conn.ex = true conn.ex = true
conn.close() conn.close()
} }

View File

@ -62,7 +62,6 @@ type qnode struct {
type queue struct { type queue struct {
nodes []qnode nodes []qnode
len int len int
size int
} }
func (q *queue) push(unix int64, item Item) { func (q *queue) push(unix int64, item Item) {

View File

@ -7,7 +7,7 @@ import (
"sync" "sync"
"time" "time"
"golang.org/x/crypto/ssh/terminal" "golang.org/x/term"
) )
var mu sync.Mutex var mu sync.Mutex
@ -24,7 +24,7 @@ var Level = 1
// SetOutput sets the output of the logger // SetOutput sets the output of the logger
func SetOutput(w io.Writer) { func SetOutput(w io.Writer) {
f, ok := w.(*os.File) f, ok := w.(*os.File)
tty = ok && terminal.IsTerminal(int(f.Fd())) tty = ok && term.IsTerminal(int(f.Fd()))
wr = w wr = w
} }

View File

@ -29,8 +29,6 @@ func (err errAOFHook) Error() string {
return fmt.Sprintf("hook: %v", err.err) return fmt.Sprintf("hook: %v", err.err)
} }
var errInvalidAOF = errors.New("invalid aof file")
func (s *Server) loadAOF() (err error) { func (s *Server) loadAOF() (err error) {
fi, err := s.aof.Stat() fi, err := s.aof.Stat()
if err != nil { if err != nil {
@ -39,7 +37,7 @@ func (s *Server) loadAOF() (err error) {
start := time.Now() start := time.Now()
var count int var count int
defer func() { defer func() {
d := time.Now().Sub(start) d := time.Since(start)
ps := float64(count) / (float64(d) / float64(time.Second)) ps := float64(count) / (float64(d) / float64(time.Second))
suf := []string{"bytes/s", "KB/s", "MB/s", "GB/s", "TB/s"} suf := []string{"bytes/s", "KB/s", "MB/s", "GB/s", "TB/s"}
bps := float64(fi.Size()) / (float64(d) / float64(time.Second)) bps := float64(fi.Size()) / (float64(d) / float64(time.Second))
@ -95,7 +93,7 @@ func (s *Server) loadAOF() (err error) {
continue continue
} }
if zeros > 0 { if zeros > 0 {
return errors.New("Zeros found in AOF file (issue #230)") return clientErrorf("Zeros found in AOF file (issue #230)")
} }
} }
complete, args, _, data, err = redcon.ReadNextCommand(data, args[:0]) complete, args, _, data, err = redcon.ReadNextCommand(data, args[:0])
@ -211,9 +209,7 @@ func (s *Server) writeAOF(args []string, d *commandDetails) error {
if len(s.lives) > 0 { if len(s.lives) > 0 {
if d.parent { if d.parent {
// queue children // queue children
for _, d := range d.children { s.lstack = append(s.lstack, d.children...)
s.lstack = append(s.lstack, d)
}
} else { } else {
// queue parent // queue parent
s.lstack = append(s.lstack, d) s.lstack = append(s.lstack, d)
@ -444,7 +440,7 @@ func (s *Server) cmdAOFMD5(msg *Message) (res resp.Value, err error) {
switch msg.OutputType { switch msg.OutputType {
case JSON: case JSON:
res = resp.StringValue( res = resp.StringValue(
fmt.Sprintf(`{"ok":true,"md5":"%s","elapsed":"%s"}`, sum, time.Now().Sub(start))) fmt.Sprintf(`{"ok":true,"md5":"%s","elapsed":"%s"}`, sum, time.Since(start)))
case RESP: case RESP:
res = resp.SimpleStringValue(sum) res = resp.SimpleStringValue(sum)
} }

View File

@ -154,6 +154,6 @@ func (s *Server) migrateAOF() error {
} }
oldf.Close() oldf.Close()
newf.Close() newf.Close()
log.Debugf("%d items: %.0f/sec", count, float64(count)/(float64(time.Now().Sub(start))/float64(time.Second))) log.Debugf("%d items: %.0f/sec", count, float64(count)/(float64(time.Since(start))/float64(time.Second)))
return os.Rename(path.Join(s.dir, "migrate.aof"), path.Join(s.dir, "appendonly.aof")) return os.Rename(path.Join(s.dir, "migrate.aof"), path.Join(s.dir, "appendonly.aof"))
} }

View File

@ -38,8 +38,7 @@ func (server *Server) aofshrink() {
server.shrinking = false server.shrinking = false
server.shrinklog = nil server.shrinklog = nil
server.mu.Unlock() server.mu.Unlock()
log.Infof("aof shrink ended %v", time.Now().Sub(start)) log.Infof("aof shrink ended %v", time.Since(start))
return
}() }()
err := func() error { err := func() error {
@ -199,20 +198,16 @@ func (server *Server) aofshrink() {
} else { } else {
values = append(values, "sethook", name, values = append(values, "sethook", name,
strings.Join(hook.Endpoints, ",")) strings.Join(hook.Endpoints, ","))
values = append(values)
} }
for _, meta := range hook.Metas { for _, meta := range hook.Metas {
values = append(values, "meta", meta.Name, meta.Value) values = append(values, "meta", meta.Name, meta.Value)
} }
if !hook.expires.IsZero() { if !hook.expires.IsZero() {
ex := float64(hook.expires.Sub(time.Now())) / ex := float64(time.Until(hook.expires)) / float64(time.Second)
float64(time.Second)
values = append(values, "ex", values = append(values, "ex",
strconv.FormatFloat(ex, 'f', 1, 64)) strconv.FormatFloat(ex, 'f', 1, 64))
} }
for _, value := range hook.Message.Args { values = append(values, hook.Message.Args...)
values = append(values, value)
}
// append the values to the aof buffer // append the values to the aof buffer
aofbuf = append(aofbuf, '*') aofbuf = append(aofbuf, '*')
aofbuf = append(aofbuf, strconv.FormatInt(int64(len(values)), 10)...) aofbuf = append(aofbuf, strconv.FormatInt(int64(len(values)), 10)...)

View File

@ -60,8 +60,9 @@ func (s *Server) cmdClient(msg *Message, client *Client) (resp.Value, error) {
} }
switch strings.ToLower(msg.Args[1]) { switch strings.ToLower(msg.Args[1]) {
default: default:
return NOMessage, errors.New("Syntax error, try CLIENT " + return NOMessage, clientErrorf(
"(LIST | KILL | GETNAME | SETNAME)") "Syntax error, try CLIENT (LIST | KILL | GETNAME | SETNAME)",
)
case "list": case "list":
if len(msg.Args) != 2 { if len(msg.Args) != 2 {
return NOMessage, errInvalidNumberOfArguments return NOMessage, errInvalidNumberOfArguments
@ -114,7 +115,7 @@ func (s *Server) cmdClient(msg *Message, client *Client) (resp.Value, error) {
if err != nil { if err != nil {
return NOMessage, err return NOMessage, err
} }
return resp.StringValue(`{"ok":true,"list":` + string(data) + `,"elapsed":"` + time.Now().Sub(start).String() + "\"}"), nil return resp.StringValue(`{"ok":true,"list":` + string(data) + `,"elapsed":"` + time.Since(start).String() + "\"}"), nil
case RESP: case RESP:
return resp.BytesValue(buf), nil return resp.BytesValue(buf), nil
} }
@ -131,7 +132,7 @@ func (s *Server) cmdClient(msg *Message, client *Client) (resp.Value, error) {
client.mu.Unlock() client.mu.Unlock()
return resp.StringValue(`{"ok":true,"name":` + return resp.StringValue(`{"ok":true,"name":` +
jsonString(name) + jsonString(name) +
`,"elapsed":"` + time.Now().Sub(start).String() + "\"}"), nil `,"elapsed":"` + time.Since(start).String() + "\"}"), nil
case RESP: case RESP:
return resp.StringValue(name), nil return resp.StringValue(name), nil
} }
@ -142,8 +143,9 @@ func (s *Server) cmdClient(msg *Message, client *Client) (resp.Value, error) {
name := msg.Args[2] name := msg.Args[2]
for i := 0; i < len(name); i++ { for i := 0; i < len(name); i++ {
if name[i] < '!' || name[i] > '~' { if name[i] < '!' || name[i] > '~' {
errstr := "Client names cannot contain spaces, newlines or special characters." return NOMessage, clientErrorf(
return NOMessage, errors.New(errstr) "Client names cannot contain spaces, newlines or special characters.",
)
} }
} }
client.mu.Lock() client.mu.Lock()
@ -151,7 +153,7 @@ func (s *Server) cmdClient(msg *Message, client *Client) (resp.Value, error) {
client.mu.Unlock() client.mu.Unlock()
switch msg.OutputType { switch msg.OutputType {
case JSON: case JSON:
return resp.StringValue(`{"ok":true,"elapsed":"` + time.Now().Sub(start).String() + "\"}"), nil return resp.StringValue(`{"ok":true,"elapsed":"` + time.Since(start).String() + "\"}"), nil
case RESP: case RESP:
return resp.SimpleStringValue("OK"), nil return resp.SimpleStringValue("OK"), nil
} }
@ -172,7 +174,7 @@ func (s *Server) cmdClient(msg *Message, client *Client) (resp.Value, error) {
} }
switch strings.ToLower(arg) { switch strings.ToLower(arg) {
default: default:
return NOMessage, errors.New("No such client") return NOMessage, clientErrorf("No such client")
case "addr": case "addr":
i++ i++
if i == len(msg.Args) { if i == len(msg.Args) {
@ -202,13 +204,13 @@ func (s *Server) cmdClient(msg *Message, client *Client) (resp.Value, error) {
} }
s.connsmu.RUnlock() s.connsmu.RUnlock()
if cclose == nil { if cclose == nil {
return NOMessage, errors.New("No such client") return NOMessage, clientErrorf("No such client")
} }
var res resp.Value var res resp.Value
switch msg.OutputType { switch msg.OutputType {
case JSON: case JSON:
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Now().Sub(start).String() + "\"}") res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Since(start).String() + "\"}")
case RESP: case RESP:
res = resp.SimpleStringValue("OK") res = resp.SimpleStringValue("OK")
} }
@ -229,32 +231,3 @@ func (s *Server) cmdClient(msg *Message, client *Client) (resp.Value, error) {
} }
return NOMessage, errors.New("invalid output type") return NOMessage, errors.New("invalid output type")
} }
/*
func (c *Controller) cmdClientList(msg *Message) (string, error) {
var ok bool
var key string
if vs, key, ok = tokenval(vs); !ok || key == "" {
return "", errInvalidNumberOfArguments
}
col := c.getCol(key)
if col == nil {
if msg.OutputType == RESP {
return "+none\r\n", nil
}
return "", errKeyNotFound
}
typ := "hash"
switch msg.OutputType {
case JSON:
return `{"ok":true,"type":` + string(typ) + `,"elapsed":"` + time.Now().Sub(start).String() + "\"}", nil
case RESP:
return "+" + typ + "\r\n", nil
}
return "", nil
}
*/

View File

@ -2,7 +2,6 @@ package server
import ( import (
"encoding/json" "encoding/json"
"fmt"
"io/ioutil" "io/ioutil"
"os" "os"
"strconv" "strconv"
@ -241,7 +240,7 @@ func (config *Config) setProperty(name, value string, fromLoad bool) error {
var invalid bool var invalid bool
switch name { switch name {
default: default:
return fmt.Errorf("Unsupported CONFIG parameter: %s", name) return clientErrorf("Unsupported CONFIG parameter: %s", name)
case RequirePass: case RequirePass:
config._requirePass = value config._requirePass = value
case LeaderAuth: case LeaderAuth:
@ -259,7 +258,7 @@ func (config *Config) setProperty(name, value string, fromLoad bool) error {
case MaxMemory: case MaxMemory:
sz, ok := parseMemSize(value) sz, ok := parseMemSize(value)
if !ok { if !ok {
return fmt.Errorf("Invalid argument '%s' for CONFIG SET '%s'", value, name) return clientErrorf("Invalid argument '%s' for CONFIG SET '%s'", value, name)
} }
config._maxMemory = sz config._maxMemory = sz
case ProtectedMode: case ProtectedMode:
@ -289,7 +288,7 @@ func (config *Config) setProperty(name, value string, fromLoad bool) error {
} }
if invalid { if invalid {
return fmt.Errorf("Invalid argument '%s' for CONFIG SET '%s'", value, name) return clientErrorf("Invalid argument '%s' for CONFIG SET '%s'", value, name)
} }
return nil return nil
} }
@ -345,7 +344,7 @@ func (s *Server) cmdConfigGet(msg *Message) (res resp.Value, err error) {
if err != nil { if err != nil {
return NOMessage, err return NOMessage, err
} }
res = resp.StringValue(`{"ok":true,"properties":` + string(data) + `,"elapsed":"` + time.Now().Sub(start).String() + "\"}") res = resp.StringValue(`{"ok":true,"properties":` + string(data) + `,"elapsed":"` + time.Since(start).String() + "\"}")
case RESP: case RESP:
vals := respValuesSimpleMap(m) vals := respValuesSimpleMap(m)
res = resp.ArrayValue(vals) res = resp.ArrayValue(vals)
@ -398,18 +397,6 @@ func (config *Config) followPort() int {
config.mu.RUnlock() config.mu.RUnlock()
return int(v) return int(v)
} }
func (config *Config) followID() string {
config.mu.RLock()
v := config._followID
config.mu.RUnlock()
return v
}
func (config *Config) followPos() int64 {
config.mu.RLock()
v := config._followPos
config.mu.RUnlock()
return v
}
func (config *Config) serverID() string { func (config *Config) serverID() string {
config.mu.RLock() config.mu.RLock()
v := config._serverID v := config._serverID
@ -468,53 +455,8 @@ func (config *Config) setFollowPort(v int) {
config._followPort = int64(v) config._followPort = int64(v)
config.mu.Unlock() config.mu.Unlock()
} }
func (config *Config) setFollowID(v string) {
config.mu.Lock()
config._followID = v
config.mu.Unlock()
}
func (config *Config) setFollowPos(v int64) {
config.mu.Lock()
config._followPos = v
config.mu.Unlock()
}
func (config *Config) setServerID(v string) {
config.mu.Lock()
config._serverID = v
config.mu.Unlock()
}
func (config *Config) setReadOnly(v bool) { func (config *Config) setReadOnly(v bool) {
config.mu.Lock() config.mu.Lock()
config._readOnly = v config._readOnly = v
config.mu.Unlock() config.mu.Unlock()
} }
func (config *Config) setRequirePass(v string) {
config.mu.Lock()
config._requirePass = v
config.mu.Unlock()
}
func (config *Config) setLeaderAuth(v string) {
config.mu.Lock()
config._leaderAuth = v
config.mu.Unlock()
}
func (config *Config) setProtectedMode(v string) {
config.mu.Lock()
config._protectedMode = v
config.mu.Unlock()
}
func (config *Config) setMaxMemory(v int) {
config.mu.Lock()
config._maxMemory = int64(v)
config.mu.Unlock()
}
func (config *Config) setAutoGC(v uint64) {
config.mu.Lock()
config._autoGC = v
config.mu.Unlock()
}
func (config *Config) setKeepAlive(v int64) {
config.mu.Lock()
config._keepAlive = v
config.mu.Unlock()
}

View File

@ -87,7 +87,7 @@ func (server *Server) cmdBounds(msg *Message) (resp.Value, error) {
} }
switch msg.OutputType { switch msg.OutputType {
case JSON: case JSON:
buf.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}") buf.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
return resp.StringValue(buf.String()), nil return resp.StringValue(buf.String()), nil
case RESP: case RESP:
return vals[0], nil return vals[0], nil
@ -101,7 +101,7 @@ func (server *Server) cmdType(msg *Message) (resp.Value, error) {
var ok bool var ok bool
var key string var key string
if vs, key, ok = tokenval(vs); !ok || key == "" { if _, key, ok = tokenval(vs); !ok || key == "" {
return NOMessage, errInvalidNumberOfArguments return NOMessage, errInvalidNumberOfArguments
} }
@ -117,7 +117,7 @@ func (server *Server) cmdType(msg *Message) (resp.Value, error) {
switch msg.OutputType { switch msg.OutputType {
case JSON: case JSON:
return resp.StringValue(`{"ok":true,"type":` + string(typ) + `,"elapsed":"` + time.Now().Sub(start).String() + "\"}"), nil return resp.StringValue(`{"ok":true,"type":` + string(typ) + `,"elapsed":"` + time.Since(start).String() + "\"}"), nil
case RESP: case RESP:
return resp.SimpleStringValue(typ), nil return resp.SimpleStringValue(typ), nil
} }
@ -269,7 +269,7 @@ func (server *Server) cmdGet(msg *Message) (resp.Value, error) {
} }
switch msg.OutputType { switch msg.OutputType {
case JSON: case JSON:
buf.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}") buf.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
return resp.StringValue(buf.String()), nil return resp.StringValue(buf.String()), nil
case RESP: case RESP:
var oval resp.Value var oval resp.Value
@ -316,7 +316,7 @@ func (server *Server) cmdDel(msg *Message) (res resp.Value, d commandDetails, er
d.timestamp = time.Now() d.timestamp = time.Now()
switch msg.OutputType { switch msg.OutputType {
case JSON: case JSON:
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Now().Sub(start).String() + "\"}") res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Since(start).String() + "\"}")
case RESP: case RESP:
if d.updated { if d.updated {
res = resp.IntegerValue(1) res = resp.IntegerValue(1)
@ -396,7 +396,7 @@ func (server *Server) cmdPdel(msg *Message) (res resp.Value, d commandDetails, e
d.parent = true d.parent = true
switch msg.OutputType { switch msg.OutputType {
case JSON: case JSON:
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Now().Sub(start).String() + "\"}") res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Since(start).String() + "\"}")
case RESP: case RESP:
total := len(d.children) - expired total := len(d.children) - expired
if total < 0 { if total < 0 {
@ -432,7 +432,7 @@ func (server *Server) cmdDrop(msg *Message) (res resp.Value, d commandDetails, e
server.clearKeyExpires(d.key) server.clearKeyExpires(d.key)
switch msg.OutputType { switch msg.OutputType {
case JSON: case JSON:
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Now().Sub(start).String() + "\"}") res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Since(start).String() + "\"}")
case RESP: case RESP:
if d.updated { if d.updated {
res = resp.IntegerValue(1) res = resp.IntegerValue(1)
@ -489,7 +489,7 @@ func (server *Server) cmdRename(msg *Message, nx bool) (res resp.Value, d comman
d.timestamp = time.Now() d.timestamp = time.Now()
switch msg.OutputType { switch msg.OutputType {
case JSON: case JSON:
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Now().Sub(start).String() + "\"}") res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Since(start).String() + "\"}")
case RESP: case RESP:
if !nx { if !nx {
res = resp.SimpleStringValue("OK") res = resp.SimpleStringValue("OK")
@ -520,7 +520,7 @@ func (server *Server) cmdFlushDB(msg *Message) (res resp.Value, d commandDetails
d.timestamp = time.Now() d.timestamp = time.Now()
switch msg.OutputType { switch msg.OutputType {
case JSON: case JSON:
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Now().Sub(start).String() + "\"}") res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Since(start).String() + "\"}")
case RESP: case RESP:
res = resp.SimpleStringValue("OK") res = resp.SimpleStringValue("OK")
} }
@ -798,7 +798,7 @@ func (server *Server) cmdSet(msg *Message, resetExpires bool) (res resp.Value, d
switch msg.OutputType { switch msg.OutputType {
default: default:
case JSON: case JSON:
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Now().Sub(start).String() + "\"}") res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Since(start).String() + "\"}")
case RESP: case RESP:
res = resp.SimpleStringValue("OK") res = resp.SimpleStringValue("OK")
} }
@ -899,7 +899,7 @@ func (server *Server) cmdFset(msg *Message) (res resp.Value, d commandDetails, e
switch msg.OutputType { switch msg.OutputType {
case JSON: case JSON:
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Now().Sub(start).String() + "\"}") res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Since(start).String() + "\"}")
case RESP: case RESP:
res = resp.IntegerValue(updateCount) res = resp.IntegerValue(updateCount)
} }
@ -946,7 +946,7 @@ func (server *Server) cmdExpire(msg *Message) (res resp.Value, d commandDetails,
switch msg.OutputType { switch msg.OutputType {
case JSON: case JSON:
if ok { if ok {
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Now().Sub(start).String() + "\"}") res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Since(start).String() + "\"}")
} else { } else {
return resp.SimpleStringValue(""), d, errIDNotFound return resp.SimpleStringValue(""), d, errIDNotFound
} }
@ -998,7 +998,7 @@ func (server *Server) cmdPersist(msg *Message) (res resp.Value, d commandDetails
d.timestamp = time.Now() d.timestamp = time.Now()
switch msg.OutputType { switch msg.OutputType {
case JSON: case JSON:
res = resp.SimpleStringValue(`{"ok":true,"elapsed":"` + time.Now().Sub(start).String() + "\"}") res = resp.SimpleStringValue(`{"ok":true,"elapsed":"` + time.Since(start).String() + "\"}")
case RESP: case RESP:
if cleared { if cleared {
res = resp.IntegerValue(1) res = resp.IntegerValue(1)
@ -1040,7 +1040,7 @@ func (server *Server) cmdTTL(msg *Message) (res resp.Value, err error) {
if time.Now().After(at) { if time.Now().After(at) {
ok2 = false ok2 = false
} else { } else {
v = float64(at.Sub(time.Now())) / float64(time.Second) v = float64(time.Until(at)) / float64(time.Second)
if v < 0 { if v < 0 {
v = 0 v = 0
} }
@ -1058,7 +1058,7 @@ func (server *Server) cmdTTL(msg *Message) (res resp.Value, err error) {
ttl = "-1" ttl = "-1"
} }
res = resp.SimpleStringValue( res = resp.SimpleStringValue(
`{"ok":true,"ttl":` + ttl + `,"elapsed":"` + time.Now().Sub(start).String() + "\"}") `{"ok":true,"ttl":` + ttl + `,"elapsed":"` + time.Since(start).String() + "\"}")
} else { } else {
return resp.SimpleStringValue(""), errIDNotFound return resp.SimpleStringValue(""), errIDNotFound
} }

View File

@ -78,8 +78,7 @@ func (s *Server) cmdMassInsert(msg *Message) (res resp.Value, err error) {
docmd := func(args []string) error { docmd := func(args []string) error {
s.mu.Lock() s.mu.Lock()
defer s.mu.Unlock() defer s.mu.Unlock()
var nmsg Message nmsg := *msg
nmsg = *msg
nmsg._command = "" nmsg._command = ""
nmsg.Args = args nmsg.Args = args
_, d, err := s.command(&nmsg, nil) _, d, err := s.command(&nmsg, nil)

View File

@ -107,7 +107,7 @@ func (s *Server) cmdReplConf(msg *Message, client *Client) (res resp.Value, err
if vs, cmd, ok = tokenval(vs); !ok || cmd == "" { if vs, cmd, ok = tokenval(vs); !ok || cmd == "" {
return NOMessage, errInvalidNumberOfArguments return NOMessage, errInvalidNumberOfArguments
} }
if vs, val, ok = tokenval(vs); !ok || val == "" { if _, val, ok = tokenval(vs); !ok || val == "" {
return NOMessage, errInvalidNumberOfArguments return NOMessage, errInvalidNumberOfArguments
} }

View File

@ -109,7 +109,9 @@ func (s *Server) cmdSetHook(msg *Message, chanCmd bool) (
break break
} }
args, err := s.cmdSearchArgs(true, cmdlc, vs, types) args, err := s.cmdSearchArgs(true, cmdlc, vs, types)
if args.usingLua() {
defer args.Close() defer args.Close()
}
if err != nil { if err != nil {
return NOMessage, d, err return NOMessage, d, err
} }
@ -252,7 +254,7 @@ func (s *Server) cmdDelHook(msg *Message, chanCmd bool) (
delete(s.hooks, hook.Name) delete(s.hooks, hook.Name)
delete(s.hooksOut, hook.Name) delete(s.hooksOut, hook.Name)
// remove hook from spatial index // remove hook from spatial index
if hook != nil && hook.Fence != nil && hook.Fence.obj != nil { if hook.Fence != nil && hook.Fence.obj != nil {
rect := hook.Fence.obj.Rect() rect := hook.Fence.obj.Rect()
s.hookTree.Delete( s.hookTree.Delete(
[2]float64{rect.Min.X, rect.Min.Y}, [2]float64{rect.Min.X, rect.Min.Y},
@ -310,7 +312,7 @@ func (s *Server) cmdPDelHook(msg *Message, channel bool) (
delete(s.hooks, hook.Name) delete(s.hooks, hook.Name)
delete(s.hooksOut, hook.Name) delete(s.hooksOut, hook.Name)
// remove hook from spatial index // remove hook from spatial index
if hook != nil && hook.Fence != nil && hook.Fence.obj != nil { if hook.Fence != nil && hook.Fence.obj != nil {
rect := hook.Fence.obj.Rect() rect := hook.Fence.obj.Rect()
s.hookTree.Delete( s.hookTree.Delete(
[2]float64{rect.Min.X, rect.Min.Y}, [2]float64{rect.Min.X, rect.Min.Y},
@ -439,7 +441,7 @@ func (s *Server) cmdHooks(msg *Message, channel bool) (
buf.WriteString(`}}`) buf.WriteString(`}}`)
} }
buf.WriteString(`],"elapsed":"` + buf.WriteString(`],"elapsed":"` +
time.Now().Sub(start).String() + "\"}") time.Since(start).String() + "\"}")
return resp.StringValue(buf.String()), nil return resp.StringValue(buf.String()), nil
case RESP: case RESP:
var vals []resp.Value var vals []resp.Value

View File

@ -222,7 +222,7 @@ func (s *Server) cmdJget(msg *Message) (resp.Value, error) {
if res.Exists() { if res.Exists() {
buf.WriteString(`,"value":` + jsonString(val)) buf.WriteString(`,"value":` + jsonString(val))
} }
buf.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}") buf.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
return resp.StringValue(buf.String()), nil return resp.StringValue(buf.String()), nil
case RESP: case RESP:
if !res.Exists() { if !res.Exists() {
@ -311,7 +311,7 @@ func (s *Server) cmdJset(msg *Message) (res resp.Value, d commandDetails, err er
case JSON: case JSON:
var buf bytes.Buffer var buf bytes.Buffer
buf.WriteString(`{"ok":true`) buf.WriteString(`{"ok":true`)
buf.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}") buf.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
return resp.StringValue(buf.String()), d, nil return resp.StringValue(buf.String()), d, nil
case RESP: case RESP:
return resp.SimpleStringValue("OK"), d, nil return resp.SimpleStringValue("OK"), d, nil
@ -377,7 +377,7 @@ func (s *Server) cmdJdel(msg *Message) (res resp.Value, d commandDetails, err er
case JSON: case JSON:
var buf bytes.Buffer var buf bytes.Buffer
buf.WriteString(`{"ok":true`) buf.WriteString(`{"ok":true`)
buf.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}") buf.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
return resp.StringValue(buf.String()), d, nil return resp.StringValue(buf.String()), d, nil
case RESP: case RESP:
return resp.IntegerValue(1), d, nil return resp.IntegerValue(1), d, nil

View File

@ -88,7 +88,7 @@ func (s *Server) cmdKeys(msg *Message) (res resp.Value, err error) {
s.cols.Ascend(nil, iterator) s.cols.Ascend(nil, iterator)
} }
if msg.OutputType == JSON { if msg.OutputType == JSON {
wr.WriteString(`],"elapsed":"` + time.Now().Sub(start).String() + "\"}") wr.WriteString(`],"elapsed":"` + time.Since(start).String() + "\"}")
return resp.StringValue(wr.String()), nil return resp.StringValue(wr.String()), nil
} }
return resp.ArrayValue(vals), nil return resp.ArrayValue(vals), nil

View File

@ -39,7 +39,6 @@ func (s *Server) liveMonitor(conn net.Conn, rd *PipelineReader, msg *Message) er
s.monconnsMu.Lock() s.monconnsMu.Lock()
conn.Write([]byte("+OK\r\n")) conn.Write([]byte("+OK\r\n"))
s.monconnsMu.Unlock() s.monconnsMu.Unlock()
for {
msgs, err := rd.ReadMessages() msgs, err := rd.ReadMessages()
if err != nil { if err != nil {
if err == io.EOF { if err == io.EOF {
@ -57,7 +56,6 @@ func (s *Server) liveMonitor(conn net.Conn, rd *PipelineReader, msg *Message) er
} }
return nil return nil
} }
}
// send messages to live MONITOR clients // send messages to live MONITOR clients
func (s *Server) sendMonitor(err error, msg *Message, c *Client, lua bool) { func (s *Server) sendMonitor(err error, msg *Message, c *Client, lua bool) {

View File

@ -34,7 +34,7 @@ func (s *Server) cmdOutput(msg *Message) (res resp.Value, err error) {
default: default:
return NOMessage, nil return NOMessage, nil
case JSON: case JSON:
return resp.StringValue(`{"ok":true,"output":"json","elapsed":` + time.Now().Sub(start).String() + `}`), nil return resp.StringValue(`{"ok":true,"output":"json","elapsed":` + time.Since(start).String() + `}`), nil
case RESP: case RESP:
return resp.StringValue("resp"), nil return resp.StringValue("resp"), nil
} }

View File

@ -166,7 +166,7 @@ func (s *Server) cmdPublish(msg *Message) (resp.Value, error) {
case JSON: case JSON:
res = resp.StringValue(`{"ok":true` + res = resp.StringValue(`{"ok":true` +
`,"published":` + strconv.FormatInt(int64(n), 10) + `,"published":` + strconv.FormatInt(int64(n), 10) +
`,"elapsed":"` + time.Now().Sub(start).String() + `"}`) `,"elapsed":"` + time.Since(start).String() + `"}`)
case RESP: case RESP:
res = resp.IntegerValue(n) res = resp.IntegerValue(n)
} }
@ -200,7 +200,7 @@ func (s *Server) liveSubscription(
switch outputType { switch outputType {
case JSON: case JSON:
write([]byte(`{"ok":true` + write([]byte(`{"ok":true` +
`,"elapsed":"` + time.Now().Sub(start).String() + `"}`)) `,"elapsed":"` + time.Since(start).String() + `"}`))
case RESP: case RESP:
write([]byte("+OK\r\n")) write([]byte("+OK\r\n"))
} }
@ -209,7 +209,7 @@ func (s *Server) liveSubscription(
switch outputType { switch outputType {
case JSON: case JSON:
write([]byte(`{"ok":false,"err":"invalid number of arguments"` + write([]byte(`{"ok":false,"err":"invalid number of arguments"` +
`,"elapsed":"` + time.Now().Sub(start).String() + `"}`)) `,"elapsed":"` + time.Since(start).String() + `"}`))
case RESP: case RESP:
write([]byte("-ERR wrong number of arguments " + write([]byte("-ERR wrong number of arguments " +
"for '" + command + "' command\r\n")) "for '" + command + "' command\r\n"))
@ -221,7 +221,7 @@ func (s *Server) liveSubscription(
write([]byte(`{"ok":false` + write([]byte(`{"ok":false` +
`,"err":"only (P)SUBSCRIBE / (P)UNSUBSCRIBE / ` + `,"err":"only (P)SUBSCRIBE / (P)UNSUBSCRIBE / ` +
`PING / QUIT allowed in this context"` + `PING / QUIT allowed in this context"` +
`,"elapsed":"` + time.Now().Sub(start).String() + `"}`)) `,"elapsed":"` + time.Since(start).String() + `"}`))
case RESP: case RESP:
write([]byte("-ERR only (P)SUBSCRIBE / (P)UNSUBSCRIBE / " + write([]byte("-ERR only (P)SUBSCRIBE / (P)UNSUBSCRIBE / " +
"PING / QUIT allowed in this context\r\n")) "PING / QUIT allowed in this context\r\n"))
@ -234,7 +234,7 @@ func (s *Server) liveSubscription(
`,"command":` + jsonString(command) + `,"command":` + jsonString(command) +
`,"channel":` + jsonString(channel) + `,"channel":` + jsonString(channel) +
`,"num":` + strconv.FormatInt(int64(num), 10) + `,"num":` + strconv.FormatInt(int64(num), 10) +
`,"elapsed":"` + time.Now().Sub(start).String() + `"}`)) `,"elapsed":"` + time.Since(start).String() + `"}`))
case RESP: case RESP:
b := redcon.AppendArray(nil, 3) b := redcon.AppendArray(nil, 3)
b = redcon.AppendBulkString(b, command) b = redcon.AppendBulkString(b, command)

View File

@ -58,7 +58,7 @@ func (s *Server) cmdScan(msg *Message) (res resp.Value, err error) {
sw.writeHead() sw.writeHead()
if sw.col != nil { if sw.col != nil {
if sw.output == outputCount && len(sw.wheres) == 0 && if sw.output == outputCount && len(sw.wheres) == 0 &&
len(sw.whereins) == 0 && sw.globEverything == true { len(sw.whereins) == 0 && sw.globEverything {
count := sw.col.Count() - int(args.cursor) count := sw.col.Count() - int(args.cursor)
if count < 0 { if count < 0 {
count = 0 count = 0
@ -93,7 +93,7 @@ func (s *Server) cmdScan(msg *Message) (res resp.Value, err error) {
} }
sw.writeFoot() sw.writeFoot()
if msg.OutputType == JSON { if msg.OutputType == JSON {
wr.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}") wr.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
return resp.BytesValue(wr.Bytes()), nil return resp.BytesValue(wr.Bytes()), nil
} }
return sw.respOut, nil return sw.respOut, nil

View File

@ -482,7 +482,7 @@ func (s *Server) cmdEvalUnified(scriptIsSha bool, msg *Message) (res resp.Value,
var buf bytes.Buffer var buf bytes.Buffer
buf.WriteString(`{"ok":true`) buf.WriteString(`{"ok":true`)
buf.WriteString(`,"result":` + ConvertToJSON(ret)) buf.WriteString(`,"result":` + ConvertToJSON(ret))
buf.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}") buf.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
return resp.StringValue(buf.String()), nil return resp.StringValue(buf.String()), nil
case RESP: case RESP:
return ConvertToRESP(ret), nil return ConvertToRESP(ret), nil
@ -496,7 +496,7 @@ func (s *Server) cmdScriptLoad(msg *Message) (resp.Value, error) {
var ok bool var ok bool
var script string var script string
if vs, script, ok = tokenval(vs); !ok || script == "" { if _, script, ok = tokenval(vs); !ok || script == "" {
return NOMessage, errInvalidNumberOfArguments return NOMessage, errInvalidNumberOfArguments
} }
@ -519,7 +519,7 @@ func (s *Server) cmdScriptLoad(msg *Message) (resp.Value, error) {
var buf bytes.Buffer var buf bytes.Buffer
buf.WriteString(`{"ok":true`) buf.WriteString(`{"ok":true`)
buf.WriteString(`,"result":"` + shaSum + `"`) buf.WriteString(`,"result":"` + shaSum + `"`)
buf.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}") buf.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
return resp.StringValue(buf.String()), nil return resp.StringValue(buf.String()), nil
case RESP: case RESP:
return resp.StringValue(shaSum), nil return resp.StringValue(shaSum), nil
@ -557,7 +557,7 @@ func (s *Server) cmdScriptExists(msg *Message) (resp.Value, error) {
resArray = append(resArray, fmt.Sprintf("%d", ires)) resArray = append(resArray, fmt.Sprintf("%d", ires))
} }
buf.WriteString(`,"result":[` + strings.Join(resArray, ",") + `]`) buf.WriteString(`,"result":[` + strings.Join(resArray, ",") + `]`)
buf.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}") buf.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
return resp.StringValue(buf.String()), nil return resp.StringValue(buf.String()), nil
case RESP: case RESP:
var resArray []resp.Value var resArray []resp.Value
@ -577,7 +577,7 @@ func (s *Server) cmdScriptFlush(msg *Message) (resp.Value, error) {
case JSON: case JSON:
var buf bytes.Buffer var buf bytes.Buffer
buf.WriteString(`{"ok":true`) buf.WriteString(`{"ok":true`)
buf.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}") buf.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
return resp.StringValue(buf.String()), nil return resp.StringValue(buf.String()), nil
case RESP: case RESP:
return resp.StringValue("OK"), nil return resp.StringValue("OK"), nil

View File

@ -393,7 +393,7 @@ func (server *Server) cmdNearby(msg *Message) (res resp.Value, err error) {
} }
sw.writeFoot() sw.writeFoot()
if msg.OutputType == JSON { if msg.OutputType == JSON {
wr.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}") wr.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
return resp.BytesValue(wr.Bytes()), nil return resp.BytesValue(wr.Bytes()), nil
} }
return sw.respOut, nil return sw.respOut, nil
@ -521,7 +521,7 @@ func (server *Server) cmdWithinOrIntersects(cmd string, msg *Message) (res resp.
} }
sw.writeFoot() sw.writeFoot()
if msg.OutputType == JSON { if msg.OutputType == JSON {
wr.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}") wr.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
return resp.BytesValue(wr.Bytes()), nil return resp.BytesValue(wr.Bytes()), nil
} }
return sw.respOut, nil return sw.respOut, nil
@ -573,7 +573,7 @@ func (server *Server) cmdSearch(msg *Message) (res resp.Value, err error) {
} }
sw.writeHead() sw.writeHead()
if sw.col != nil { if sw.col != nil {
if sw.output == outputCount && len(sw.wheres) == 0 && sw.globEverything == true { if sw.output == outputCount && len(sw.wheres) == 0 && sw.globEverything {
count := sw.col.Count() - int(s.cursor) count := sw.col.Count() - int(s.cursor)
if count < 0 { if count < 0 {
count = 0 count = 0
@ -612,7 +612,7 @@ func (server *Server) cmdSearch(msg *Message) (res resp.Value, err error) {
} }
sw.writeFoot() sw.writeFoot()
if msg.OutputType == JSON { if msg.OutputType == JSON {
wr.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}") wr.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
return resp.BytesValue(wr.Bytes()), nil return resp.BytesValue(wr.Bytes()), nil
} }
return sw.respOut, nil return sw.respOut, nil

View File

@ -261,7 +261,7 @@ func Serve(host string, port int, dir string, http bool) error {
if err := server.migrateAOF(); err != nil { if err := server.migrateAOF(); err != nil {
return err return err
} }
if core.AppendOnly == true { if core.AppendOnly {
f, err := os.OpenFile(core.AppendFileName, os.O_CREATE|os.O_RDWR, 0600) f, err := os.OpenFile(core.AppendFileName, os.O_CREATE|os.O_RDWR, 0600)
if err != nil { if err != nil {
return err return err
@ -567,7 +567,7 @@ func (server *Server) watchAutoGC() {
if autoGC == 0 { if autoGC == 0 {
continue continue
} }
if time.Now().Sub(s) < time.Second*time.Duration(autoGC) { if time.Since(s) < time.Second*time.Duration(autoGC) {
continue continue
} }
var mem1, mem2 runtime.MemStats var mem1, mem2 runtime.MemStats
@ -767,9 +767,9 @@ func (server *Server) handleInputCommand(client *Client, msg *Message) error {
switch msg.OutputType { switch msg.OutputType {
case JSON: case JSON:
if len(msg.Args) > 1 { if len(msg.Args) > 1 {
return writeOutput(`{"ok":true,"` + msg.Command() + `":` + jsonString(msg.Args[1]) + `,"elapsed":"` + time.Now().Sub(start).String() + `"}`) return writeOutput(`{"ok":true,"` + msg.Command() + `":` + jsonString(msg.Args[1]) + `,"elapsed":"` + time.Since(start).String() + `"}`)
} }
return writeOutput(`{"ok":true,"` + msg.Command() + `":"pong","elapsed":"` + time.Now().Sub(start).String() + `"}`) return writeOutput(`{"ok":true,"` + msg.Command() + `":"pong","elapsed":"` + time.Since(start).String() + `"}`)
case RESP: case RESP:
if len(msg.Args) > 1 { if len(msg.Args) > 1 {
data := redcon.AppendBulkString(nil, msg.Args[1]) data := redcon.AppendBulkString(nil, msg.Args[1])
@ -784,7 +784,7 @@ func (server *Server) handleInputCommand(client *Client, msg *Message) error {
writeErr := func(errMsg string) error { writeErr := func(errMsg string) error {
switch msg.OutputType { switch msg.OutputType {
case JSON: case JSON:
return writeOutput(`{"ok":false,"err":` + jsonString(errMsg) + `,"elapsed":"` + time.Now().Sub(start).String() + "\"}") return writeOutput(`{"ok":false,"err":` + jsonString(errMsg) + `,"elapsed":"` + time.Since(start).String() + "\"}")
case RESP: case RESP:
if errMsg == errInvalidNumberOfArguments.Error() { if errMsg == errInvalidNumberOfArguments.Error() {
return writeOutput("-ERR wrong number of arguments for '" + msg.Command() + "' command\r\n") return writeOutput("-ERR wrong number of arguments for '" + msg.Command() + "' command\r\n")
@ -1148,19 +1148,6 @@ password. NOTE: You only need to do one of the above things in order for the
server to start accepting connections from the outside. server to start accepting connections from the outside.
`), "\n", " ", -1) + "\r\n") `), "\n", " ", -1) + "\r\n")
// SetKeepAlive sets the connection keepalive
func setKeepAlive(conn net.Conn, period time.Duration) error {
if tcp, ok := conn.(*net.TCPConn); ok {
if err := tcp.SetKeepAlive(true); err != nil {
return err
}
return tcp.SetKeepAlivePeriod(period)
}
return nil
}
var errCloseHTTP = errors.New("close http")
// WriteWebSocketMessage write a websocket message to an io.Writer. // WriteWebSocketMessage write a websocket message to an io.Writer.
func WriteWebSocketMessage(w io.Writer, data []byte) error { func WriteWebSocketMessage(w io.Writer, data []byte) error {
var msg []byte var msg []byte
@ -1189,7 +1176,7 @@ func WriteWebSocketMessage(w io.Writer, data []byte) error {
func OKMessage(msg *Message, start time.Time) resp.Value { func OKMessage(msg *Message, start time.Time) resp.Value {
switch msg.OutputType { switch msg.OutputType {
case JSON: case JSON:
return resp.StringValue(`{"ok":true,"elapsed":"` + time.Now().Sub(start).String() + "\"}") return resp.StringValue(`{"ok":true,"elapsed":"` + time.Since(start).String() + "\"}")
case RESP: case RESP:
return resp.SimpleStringValue("OK") return resp.SimpleStringValue("OK")
} }
@ -1513,3 +1500,11 @@ func (is *InputStream) End(data []byte) {
is.b = is.b[:0] is.b = is.b[:0]
} }
} }
// clientErrorf is the same as fmt.Errorf, but is intented for errors that are
// sent back to the client. This allows for the Go static checker to ignore
// throwing warning for certain error strings.
// https://staticcheck.io/docs/checks#ST1005
func clientErrorf(format string, args ...interface{}) error {
return fmt.Errorf(format, args...)
}

View File

@ -87,7 +87,7 @@ func (s *Server) cmdStats(msg *Message) (res resp.Value, err error) {
if err != nil { if err != nil {
return NOMessage, err return NOMessage, err
} }
res = resp.StringValue(`{"ok":true,"stats":` + string(data) + `,"elapsed":"` + time.Now().Sub(start).String() + "\"}") res = resp.StringValue(`{"ok":true,"stats":` + string(data) + `,"elapsed":"` + time.Since(start).String() + "\"}")
case RESP: case RESP:
res = resp.ArrayValue(vals) res = resp.ArrayValue(vals)
} }
@ -368,7 +368,7 @@ func (s *Server) writeInfoPersistence(w *bytes.Buffer) {
if currentShrinkStart.IsZero() { if currentShrinkStart.IsZero() {
fmt.Fprintf(w, "aof_current_rewrite_time_sec:0\r\n") // Duration of the on-going AOF rewrite operation if any fmt.Fprintf(w, "aof_current_rewrite_time_sec:0\r\n") // Duration of the on-going AOF rewrite operation if any
} else { } else {
fmt.Fprintf(w, "aof_current_rewrite_time_sec:%d\r\n", time.Now().Sub(currentShrinkStart)/time.Second) // Duration of the on-going AOF rewrite operation if any fmt.Fprintf(w, "aof_current_rewrite_time_sec:%d\r\n", time.Since(currentShrinkStart)/time.Second) // Duration of the on-going AOF rewrite operation if any
} }
} }
@ -477,7 +477,7 @@ func (s *Server) cmdInfo(msg *Message) (res resp.Value, err error) {
if err != nil { if err != nil {
return NOMessage, err return NOMessage, err
} }
res = resp.StringValue(`{"ok":true,"info":` + string(data) + `,"elapsed":"` + time.Now().Sub(start).String() + "\"}") res = resp.StringValue(`{"ok":true,"info":` + string(data) + `,"elapsed":"` + time.Since(start).String() + "\"}")
case RESP: case RESP:
res = resp.BytesValue(w.Bytes()) res = resp.BytesValue(w.Bytes())
} }
@ -514,28 +514,3 @@ func respValuesSimpleMap(m map[string]interface{}) []resp.Value {
} }
return vals return vals
} }
func (s *Server) statsCollections(line string) (string, error) {
start := time.Now()
var key string
var ms = []map[string]interface{}{}
for len(line) > 0 {
line, key = token(line)
col := s.getCol(key)
if col != nil {
m := make(map[string]interface{})
points := col.PointCount()
m["num_points"] = points
m["in_memory_size"] = col.TotalWeight()
m["num_objects"] = col.Count()
ms = append(ms, m)
} else {
ms = append(ms, nil)
}
}
data, err := json.Marshal(ms)
if err != nil {
return "", err
}
return `{"ok":true,"stats":` + string(data) + `,"elapsed":"` + time.Now().Sub(start).String() + "\"}", nil
}

View File

@ -269,6 +269,7 @@ func (s *Server) cmdTest(msg *Message) (res resp.Value, err error) {
} }
if len(vs) != 0 { if len(vs) != 0 {
err = errInvalidNumberOfArguments err = errInvalidNumberOfArguments
return
} }
var result int var result int
@ -296,7 +297,7 @@ func (s *Server) cmdTest(msg *Message) (res resp.Value, err error) {
if clipped != nil { if clipped != nil {
buf.WriteString(`,"object":` + clipped.JSON()) buf.WriteString(`,"object":` + clipped.JSON())
} }
buf.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}") buf.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
return resp.StringValue(buf.String()), nil return resp.StringValue(buf.String()), nil
case RESP: case RESP:
if clipped != nil { if clipped != nil {

View File

@ -52,35 +52,6 @@ func tokenvalbytes(vs []string) (nvs []string, token []byte, ok bool) {
return return
} }
func tokenlc(line string) (newLine, token string) {
for i := 0; i < len(line); i++ {
ch := line[i]
if ch == ' ' {
return line[i+1:], line[:i]
}
if ch >= 'A' && ch <= 'Z' {
lc := make([]byte, 0, 16)
if i > 0 {
lc = append(lc, []byte(line[:i])...)
}
lc = append(lc, ch+32)
i++
for ; i < len(line); i++ {
ch = line[i]
if ch == ' ' {
return line[i+1:], string(lc)
}
if ch >= 'A' && ch <= 'Z' {
lc = append(lc, ch+32)
} else {
lc = append(lc, ch)
}
}
return "", string(lc)
}
}
return "", line
}
func lcb(s1 []byte, s2 string) bool { func lcb(s1 []byte, s2 string) bool {
if len(s1) != len(s2) { if len(s1) != len(s2) {
return false return false
@ -144,19 +115,6 @@ func (where whereT) match(value float64) bool {
return true return true
} }
func zMinMaxFromWheres(wheres []whereT) (minZ, maxZ float64) {
for _, w := range wheres {
if w.field == "z" {
minZ = w.min
maxZ = w.max
return
}
}
minZ = math.Inf(-1)
maxZ = math.Inf(+1)
return
}
type whereinT struct { type whereinT struct {
field string field string
valMap map[float64]struct{} valMap map[float64]struct{}
@ -230,7 +188,6 @@ type searchScanBaseTokens struct {
cursor uint64 cursor uint64
output outputT output outputT
precision uint64 precision uint64
lineout string
fence bool fence bool
distance bool distance bool
nodwell bool nodwell bool

View File

@ -1,76 +0,0 @@
// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package terminal provides support functions for dealing with terminals, as
// commonly found on UNIX systems.
//
// Deprecated: this package moved to golang.org/x/term.
package terminal
import (
"io"
"golang.org/x/term"
)
// EscapeCodes contains escape sequences that can be written to the terminal in
// order to achieve different styles of text.
type EscapeCodes = term.EscapeCodes
// Terminal contains the state for running a VT100 terminal that is capable of
// reading lines of input.
type Terminal = term.Terminal
// NewTerminal runs a VT100 terminal on the given ReadWriter. If the ReadWriter is
// a local terminal, that terminal must first have been put into raw mode.
// prompt is a string that is written at the start of each input line (i.e.
// "> ").
func NewTerminal(c io.ReadWriter, prompt string) *Terminal {
return term.NewTerminal(c, prompt)
}
// ErrPasteIndicator may be returned from ReadLine as the error, in addition
// to valid line data. It indicates that bracketed paste mode is enabled and
// that the returned line consists only of pasted data. Programs may wish to
// interpret pasted data more literally than typed data.
var ErrPasteIndicator = term.ErrPasteIndicator
// State contains the state of a terminal.
type State = term.State
// IsTerminal returns whether the given file descriptor is a terminal.
func IsTerminal(fd int) bool {
return term.IsTerminal(fd)
}
// ReadPassword reads a line of input from a terminal without local echo. This
// is commonly used for inputting passwords and other sensitive data. The slice
// returned does not include the \n.
func ReadPassword(fd int) ([]byte, error) {
return term.ReadPassword(fd)
}
// MakeRaw puts the terminal connected to the given file descriptor into raw
// mode and returns the previous state of the terminal so that it can be
// restored.
func MakeRaw(fd int) (*State, error) {
return term.MakeRaw(fd)
}
// Restore restores the terminal connected to the given file descriptor to a
// previous state.
func Restore(fd int, oldState *State) error {
return term.Restore(fd, oldState)
}
// GetState returns the current state of a terminal which may be useful to
// restore the terminal after a signal.
func GetState(fd int) (*State, error) {
return term.GetState(fd)
}
// GetSize returns the dimensions of the given terminal.
func GetSize(fd int) (width, height int, err error) {
return term.GetSize(fd)
}

8
vendor/modules.txt vendored
View File

@ -205,6 +205,7 @@ github.com/yuin/gopher-lua
github.com/yuin/gopher-lua/ast github.com/yuin/gopher-lua/ast
github.com/yuin/gopher-lua/parse github.com/yuin/gopher-lua/parse
github.com/yuin/gopher-lua/pm github.com/yuin/gopher-lua/pm
<<<<<<< HEAD
# go.opencensus.io v0.22.3 # go.opencensus.io v0.22.3
go.opencensus.io go.opencensus.io
go.opencensus.io/internal go.opencensus.io/internal
@ -223,10 +224,14 @@ go.opencensus.io/trace/propagation
go.opencensus.io/trace/tracestate go.opencensus.io/trace/tracestate
# golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad # golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad
## explicit ## explicit
=======
# golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a
>>>>>>> 6b08f7fa (Code cleanup)
golang.org/x/crypto/ed25519 golang.org/x/crypto/ed25519
golang.org/x/crypto/ed25519/internal/edwards25519 golang.org/x/crypto/ed25519/internal/edwards25519
golang.org/x/crypto/md4 golang.org/x/crypto/md4
golang.org/x/crypto/pbkdf2 golang.org/x/crypto/pbkdf2
<<<<<<< HEAD
golang.org/x/crypto/ssh/terminal golang.org/x/crypto/ssh/terminal
# golang.org/x/lint v0.0.0-20200302205851-738671d3881b # golang.org/x/lint v0.0.0-20200302205851-738671d3881b
golang.org/x/lint golang.org/x/lint
@ -234,6 +239,8 @@ golang.org/x/lint/golint
# golang.org/x/mod v0.2.0 # golang.org/x/mod v0.2.0
golang.org/x/mod/module golang.org/x/mod/module
golang.org/x/mod/semver golang.org/x/mod/semver
=======
>>>>>>> 6b08f7fa (Code cleanup)
# golang.org/x/net v0.0.0-20210119194325-5f4716e94777 # golang.org/x/net v0.0.0-20210119194325-5f4716e94777
## explicit ## explicit
golang.org/x/net/context golang.org/x/net/context
@ -261,6 +268,7 @@ golang.org/x/sys/plan9
golang.org/x/sys/unix golang.org/x/sys/unix
golang.org/x/sys/windows golang.org/x/sys/windows
# golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 # golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1
## explicit
golang.org/x/term golang.org/x/term
# golang.org/x/text v0.3.3 # golang.org/x/text v0.3.3
golang.org/x/text/secure/bidirule golang.org/x/text/secure/bidirule