From 5d55bc03e829afdad427f7539c1e08e65b88d409 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 6 Jul 2019 18:59:20 +0200 Subject: drop vendor --- vendor/github.com/fluffle/goirc/LICENSE | 27 - vendor/github.com/fluffle/goirc/client/commands.go | 304 ----------- .../github.com/fluffle/goirc/client/connection.go | 587 --------------------- vendor/github.com/fluffle/goirc/client/dispatch.go | 202 ------- vendor/github.com/fluffle/goirc/client/doc.go | 34 -- vendor/github.com/fluffle/goirc/client/handlers.go | 105 ---- vendor/github.com/fluffle/goirc/client/line.go | 216 -------- .../fluffle/goirc/client/state_handlers.go | 262 --------- vendor/github.com/fluffle/goirc/logging/logging.go | 44 -- vendor/github.com/fluffle/goirc/state/channel.go | 360 ------------- .../github.com/fluffle/goirc/state/mock_tracker.go | 201 ------- vendor/github.com/fluffle/goirc/state/nick.go | 205 ------- vendor/github.com/fluffle/goirc/state/tracker.go | 369 ------------- vendor/github.com/golang/mock/AUTHORS | 12 - vendor/github.com/golang/mock/CONTRIBUTORS | 37 -- vendor/github.com/golang/mock/LICENSE | 202 ------- vendor/github.com/golang/mock/gomock/call.go | 420 --------------- vendor/github.com/golang/mock/gomock/callset.go | 108 ---- vendor/github.com/golang/mock/gomock/controller.go | 264 --------- vendor/github.com/golang/mock/gomock/matchers.go | 141 ----- vendor/github.com/hashicorp/golang-lru/.gitignore | 23 - vendor/github.com/hashicorp/golang-lru/2q.go | 223 -------- vendor/github.com/hashicorp/golang-lru/LICENSE | 362 ------------- vendor/github.com/hashicorp/golang-lru/README.md | 25 - vendor/github.com/hashicorp/golang-lru/arc.go | 257 --------- vendor/github.com/hashicorp/golang-lru/doc.go | 21 - vendor/github.com/hashicorp/golang-lru/go.mod | 1 - vendor/github.com/hashicorp/golang-lru/lru.go | 116 ---- .../hashicorp/golang-lru/simplelru/lru.go | 161 ------ .../golang-lru/simplelru/lru_interface.go | 36 -- 30 files changed, 5325 deletions(-) delete mode 100644 vendor/github.com/fluffle/goirc/LICENSE delete mode 100644 vendor/github.com/fluffle/goirc/client/commands.go delete mode 100644 vendor/github.com/fluffle/goirc/client/connection.go delete mode 100644 vendor/github.com/fluffle/goirc/client/dispatch.go delete mode 100644 vendor/github.com/fluffle/goirc/client/doc.go delete mode 100644 vendor/github.com/fluffle/goirc/client/handlers.go delete mode 100644 vendor/github.com/fluffle/goirc/client/line.go delete mode 100644 vendor/github.com/fluffle/goirc/client/state_handlers.go delete mode 100644 vendor/github.com/fluffle/goirc/logging/logging.go delete mode 100644 vendor/github.com/fluffle/goirc/state/channel.go delete mode 100644 vendor/github.com/fluffle/goirc/state/mock_tracker.go delete mode 100644 vendor/github.com/fluffle/goirc/state/nick.go delete mode 100644 vendor/github.com/fluffle/goirc/state/tracker.go delete mode 100644 vendor/github.com/golang/mock/AUTHORS delete mode 100644 vendor/github.com/golang/mock/CONTRIBUTORS delete mode 100644 vendor/github.com/golang/mock/LICENSE delete mode 100644 vendor/github.com/golang/mock/gomock/call.go delete mode 100644 vendor/github.com/golang/mock/gomock/callset.go delete mode 100644 vendor/github.com/golang/mock/gomock/controller.go delete mode 100644 vendor/github.com/golang/mock/gomock/matchers.go delete mode 100644 vendor/github.com/hashicorp/golang-lru/.gitignore delete mode 100644 vendor/github.com/hashicorp/golang-lru/2q.go delete mode 100644 vendor/github.com/hashicorp/golang-lru/LICENSE delete mode 100644 vendor/github.com/hashicorp/golang-lru/README.md delete mode 100644 vendor/github.com/hashicorp/golang-lru/arc.go delete mode 100644 vendor/github.com/hashicorp/golang-lru/doc.go delete mode 100644 vendor/github.com/hashicorp/golang-lru/go.mod delete mode 100644 vendor/github.com/hashicorp/golang-lru/lru.go delete mode 100644 vendor/github.com/hashicorp/golang-lru/simplelru/lru.go delete mode 100644 vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go (limited to 'vendor/github.com') diff --git a/vendor/github.com/fluffle/goirc/LICENSE b/vendor/github.com/fluffle/goirc/LICENSE deleted file mode 100644 index e1b4d5c..0000000 --- a/vendor/github.com/fluffle/goirc/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2009+ Alex Bramley. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/fluffle/goirc/client/commands.go b/vendor/github.com/fluffle/goirc/client/commands.go deleted file mode 100644 index 101c7d3..0000000 --- a/vendor/github.com/fluffle/goirc/client/commands.go +++ /dev/null @@ -1,304 +0,0 @@ -package client - -import ( - "fmt" - "strings" -) - -const ( - REGISTER = "REGISTER" - CONNECTED = "CONNECTED" - DISCONNECTED = "DISCONNECTED" - ACTION = "ACTION" - AWAY = "AWAY" - CAP = "CAP" - CTCP = "CTCP" - CTCPREPLY = "CTCPREPLY" - ERROR = "ERROR" - INVITE = "INVITE" - JOIN = "JOIN" - KICK = "KICK" - MODE = "MODE" - NICK = "NICK" - NOTICE = "NOTICE" - OPER = "OPER" - PART = "PART" - PASS = "PASS" - PING = "PING" - PONG = "PONG" - PRIVMSG = "PRIVMSG" - QUIT = "QUIT" - TOPIC = "TOPIC" - USER = "USER" - VERSION = "VERSION" - VHOST = "VHOST" - WHO = "WHO" - WHOIS = "WHOIS" - defaultSplit = 450 -) - -// cutNewLines() pares down a string to the part before the first "\r" or "\n". -func cutNewLines(s string) string { - r := strings.SplitN(s, "\r", 2) - r = strings.SplitN(r[0], "\n", 2) - return r[0] -} - -// indexFragment looks for the last sentence split-point (defined as one of -// the punctuation characters .:;,!?"' followed by a space) in the string s -// and returns the index in the string after that split-point. If no split- -// point is found it returns the index after the last space in s, or -1. -func indexFragment(s string) int { - max := -1 - for _, sep := range []string{". ", ": ", "; ", ", ", "! ", "? ", "\" ", "' "} { - if idx := strings.LastIndex(s, sep); idx > max { - max = idx - } - } - if max > 0 { - return max + 2 - } - if idx := strings.LastIndex(s, " "); idx > 0 { - return idx + 1 - } - return -1 -} - -// splitMessage splits a message > splitLen chars at: -// 1. the end of the last sentence fragment before splitLen -// 2. the end of the last word before splitLen -// 3. splitLen itself -func splitMessage(msg string, splitLen int) (msgs []string) { - // This is quite short ;-) - if splitLen < 13 { - splitLen = defaultSplit - } - for len(msg) > splitLen { - idx := indexFragment(msg[:splitLen-3]) - if idx < 0 { - idx = splitLen - 3 - } - msgs = append(msgs, msg[:idx]+"...") - msg = msg[idx:] - } - return append(msgs, msg) -} - -// Raw sends a raw line to the server, should really only be used for -// debugging purposes but may well come in handy. -func (conn *Conn) Raw(rawline string) { - // Avoid command injection by enforcing one command per line. - conn.out <- cutNewLines(rawline) -} - -// Pass sends a PASS command to the server. -// PASS password -func (conn *Conn) Pass(password string) { conn.Raw(PASS + " " + password) } - -// Nick sends a NICK command to the server. -// NICK nick -func (conn *Conn) Nick(nick string) { conn.Raw(NICK + " " + nick) } - -// User sends a USER command to the server. -// USER ident 12 * :name -func (conn *Conn) User(ident, name string) { - conn.Raw(USER + " " + ident + " 12 * :" + name) -} - -// Join sends a JOIN command to the server with an optional key. -// JOIN channel [key] -func (conn *Conn) Join(channel string, key ...string) { - k := "" - if len(key) > 0 { - k = " " + key[0] - } - conn.Raw(JOIN + " " + channel + k) -} - -// Part sends a PART command to the server with an optional part message. -// PART channel [:message] -func (conn *Conn) Part(channel string, message ...string) { - msg := strings.Join(message, " ") - if msg != "" { - msg = " :" + msg - } - conn.Raw(PART + " " + channel + msg) -} - -// Kick sends a KICK command to remove a nick from a channel. -// KICK channel nick [:message] -func (conn *Conn) Kick(channel, nick string, message ...string) { - msg := strings.Join(message, " ") - if msg != "" { - msg = " :" + msg - } - conn.Raw(KICK + " " + channel + " " + nick + msg) -} - -// Quit sends a QUIT command to the server with an optional quit message. -// QUIT [:message] -func (conn *Conn) Quit(message ...string) { - msg := strings.Join(message, " ") - if msg == "" { - msg = conn.cfg.QuitMessage - } - conn.Raw(QUIT + " :" + msg) -} - -// Whois sends a WHOIS command to the server. -// WHOIS nick -func (conn *Conn) Whois(nick string) { conn.Raw(WHOIS + " " + nick) } - -// Who sends a WHO command to the server. -// WHO nick -func (conn *Conn) Who(nick string) { conn.Raw(WHO + " " + nick) } - -// Privmsg sends a PRIVMSG to the target nick or channel t. -// If msg is longer than Config.SplitLen characters, multiple PRIVMSGs -// will be sent to the target containing sequential parts of msg. -// PRIVMSG t :msg -func (conn *Conn) Privmsg(t, msg string) { - prefix := PRIVMSG + " " + t + " :" - for _, s := range splitMessage(msg, conn.cfg.SplitLen) { - conn.Raw(prefix + s) - } -} - -// Privmsgln is the variadic version of Privmsg that formats the message -// that is sent to the target nick or channel t using the -// fmt.Sprintln function. -// Note: Privmsgln doesn't add the '\n' character at the end of the message. -func (conn *Conn) Privmsgln(t string, a ...interface{}) { - msg := fmt.Sprintln(a...) - // trimming the new-line character added by the fmt.Sprintln function, - // since it's irrelevant. - msg = msg[:len(msg)-1] - conn.Privmsg(t, msg) -} - -// Privmsgf is the variadic version of Privmsg that formats the message -// that is sent to the target nick or channel t using the -// fmt.Sprintf function. -func (conn *Conn) Privmsgf(t, format string, a ...interface{}) { - msg := fmt.Sprintf(format, a...) - conn.Privmsg(t, msg) -} - -// Notice sends a NOTICE to the target nick or channel t. -// If msg is longer than Config.SplitLen characters, multiple NOTICEs -// will be sent to the target containing sequential parts of msg. -// NOTICE t :msg -func (conn *Conn) Notice(t, msg string) { - for _, s := range splitMessage(msg, conn.cfg.SplitLen) { - conn.Raw(NOTICE + " " + t + " :" + s) - } -} - -// Ctcp sends a (generic) CTCP message to the target nick -// or channel t, with an optional argument. -// PRIVMSG t :\001CTCP arg\001 -func (conn *Conn) Ctcp(t, ctcp string, arg ...string) { - // We need to split again here to ensure - for _, s := range splitMessage(strings.Join(arg, " "), conn.cfg.SplitLen) { - if s != "" { - s = " " + s - } - // Using Raw rather than PRIVMSG here to avoid double-split problems. - conn.Raw(PRIVMSG + " " + t + " :\001" + strings.ToUpper(ctcp) + s + "\001") - } -} - -// CtcpReply sends a (generic) CTCP reply to the target nick -// or channel t, with an optional argument. -// NOTICE t :\001CTCP arg\001 -func (conn *Conn) CtcpReply(t, ctcp string, arg ...string) { - for _, s := range splitMessage(strings.Join(arg, " "), conn.cfg.SplitLen) { - if s != "" { - s = " " + s - } - // Using Raw rather than NOTICE here to avoid double-split problems. - conn.Raw(NOTICE + " " + t + " :\001" + strings.ToUpper(ctcp) + s + "\001") - } -} - -// Version sends a CTCP "VERSION" to the target nick or channel t. -func (conn *Conn) Version(t string) { conn.Ctcp(t, VERSION) } - -// Action sends a CTCP "ACTION" to the target nick or channel t. -func (conn *Conn) Action(t, msg string) { conn.Ctcp(t, ACTION, msg) } - -// Topic() sends a TOPIC command for a channel. -// If no topic is provided this requests that a 332 response is sent by the -// server for that channel, which can then be handled to retrieve the current -// channel topic. If a topic is provided the channel's topic will be set. -// TOPIC channel -// TOPIC channel :topic -func (conn *Conn) Topic(channel string, topic ...string) { - t := strings.Join(topic, " ") - if t != "" { - t = " :" + t - } - conn.Raw(TOPIC + " " + channel + t) -} - -// Mode sends a MODE command for a target nick or channel t. -// If no mode strings are provided this requests that a 324 response is sent -// by the server for the target. Otherwise the mode strings are concatenated -// with spaces and sent to the server. This allows e.g. -// conn.Mode("#channel", "+nsk", "mykey") -// -// MODE t -// MODE t modestring -func (conn *Conn) Mode(t string, modestring ...string) { - mode := strings.Join(modestring, " ") - if mode != "" { - mode = " " + mode - } - conn.Raw(MODE + " " + t + mode) -} - -// Away sends an AWAY command to the server. -// If a message is provided it sets the client's away status with that message, -// otherwise it resets the client's away status. -// AWAY -// AWAY :message -func (conn *Conn) Away(message ...string) { - msg := strings.Join(message, " ") - if msg != "" { - msg = " :" + msg - } - conn.Raw(AWAY + msg) -} - -// Invite sends an INVITE command to the server. -// INVITE nick channel -func (conn *Conn) Invite(nick, channel string) { - conn.Raw(INVITE + " " + nick + " " + channel) -} - -// Oper sends an OPER command to the server. -// OPER user pass -func (conn *Conn) Oper(user, pass string) { conn.Raw(OPER + " " + user + " " + pass) } - -// VHost sends a VHOST command to the server. -// VHOST user pass -func (conn *Conn) VHost(user, pass string) { conn.Raw(VHOST + " " + user + " " + pass) } - -// Ping sends a PING command to the server, which should PONG. -// PING :message -func (conn *Conn) Ping(message string) { conn.Raw(PING + " :" + message) } - -// Pong sends a PONG command to the server. -// PONG :message -func (conn *Conn) Pong(message string) { conn.Raw(PONG + " :" + message) } - -// Cap sends a CAP command to the server. -// CAP subcommand -// CAP subcommand :message -func (conn *Conn) Cap(subcommmand string, capabilities ...string) { - if len(capabilities) == 0 { - conn.Raw(CAP + " " + subcommmand) - } else { - conn.Raw(CAP + " " + subcommmand + " :" + strings.Join(capabilities, " ")) - } -} diff --git a/vendor/github.com/fluffle/goirc/client/connection.go b/vendor/github.com/fluffle/goirc/client/connection.go deleted file mode 100644 index 12d0e59..0000000 --- a/vendor/github.com/fluffle/goirc/client/connection.go +++ /dev/null @@ -1,587 +0,0 @@ -package client - -import ( - "bufio" - "crypto/tls" - "fmt" - "io" - "net" - "net/url" - "strings" - "sync" - "time" - - "github.com/fluffle/goirc/logging" - "github.com/fluffle/goirc/state" - "golang.org/x/net/proxy" -) - -// Conn encapsulates a connection to a single IRC server. Create -// one with Client or SimpleClient. -type Conn struct { - // For preventing races on (dis)connect. - mu sync.RWMutex - - // Contains parameters that people can tweak to change client behaviour. - cfg *Config - - // Handlers - intHandlers *hSet - fgHandlers *hSet - bgHandlers *hSet - - // State tracker for nicks and channels - st state.Tracker - stRemovers []Remover - - // I/O stuff to server - dialer *net.Dialer - proxyDialer proxy.Dialer - sock net.Conn - io *bufio.ReadWriter - in chan *Line - out chan string - connected bool - - // Control channel and WaitGroup for goroutines - die chan struct{} - wg sync.WaitGroup - - // Internal counters for flood protection - badness time.Duration - lastsent time.Time -} - -// Config contains options that can be passed to Client to change the -// behaviour of the library during use. It is recommended that NewConfig -// is used to create this struct rather than instantiating one directly. -// Passing a Config with no Nick in the Me field to Client will result -// in unflattering consequences. -type Config struct { - // Set this to provide the Nick, Ident and Name for the client to use. - // It is recommended to call Conn.Me to get up-to-date information - // about the current state of the client's IRC nick after connecting. - Me *state.Nick - - // Hostname to connect to and optional connect password. - // Changing these after connection will have no effect until the - // client reconnects. - Server, Pass string - - // Are we connecting via SSL? Do we care about certificate validity? - // Changing these after connection will have no effect until the - // client reconnects. - SSL bool - SSLConfig *tls.Config - - // To connect via proxy set the proxy url here. - // Changing these after connection will have no effect until the - // client reconnects. - Proxy string - - // Local address to bind to when connecting to the server. - LocalAddr string - - // To attempt RFC6555 parallel IPv4 and IPv6 connections if both - // address families are returned for a hostname, set this to true. - // Passed through to https://golang.org/pkg/net/#Dialer - DualStack bool - - // Replaceable function to customise the 433 handler's new nick. - // By default an underscore "_" is appended to the current nick. - NewNick func(string) string - - // Client->server ping frequency, in seconds. Defaults to 3m. - // Set to 0 to disable client-side pings. - PingFreq time.Duration - - // The duration before a connection timeout is triggered. Defaults to 1m. - // Set to 0 to wait indefinitely. - Timeout time.Duration - - // Set this to true to disable flood protection and false to re-enable. - Flood bool - - // Sent as the reply to a CTCP VERSION message. - Version string - - // Sent as the default QUIT message if Quit is called with no args. - QuitMessage string - - // Configurable panic recovery for all handlers. - // Defaults to logging an error, see LogPanic. - Recover func(*Conn, *Line) - - // Split PRIVMSGs, NOTICEs and CTCPs longer than SplitLen characters - // over multiple lines. Default to 450 if not set. - SplitLen int -} - -// NewConfig creates a Config struct containing sensible defaults. -// It takes one required argument: the nick to use for the client. -// Subsequent string arguments set the client's ident and "real" -// name, but these are optional. -func NewConfig(nick string, args ...string) *Config { - cfg := &Config{ - Me: &state.Nick{Nick: nick}, - PingFreq: 3 * time.Minute, - NewNick: func(s string) string { return s + "_" }, - Recover: (*Conn).LogPanic, // in dispatch.go - SplitLen: defaultSplit, - Timeout: 60 * time.Second, - } - cfg.Me.Ident = "goirc" - if len(args) > 0 && args[0] != "" { - cfg.Me.Ident = args[0] - } - cfg.Me.Name = "Powered by GoIRC" - if len(args) > 1 && args[1] != "" { - cfg.Me.Name = args[1] - } - cfg.Version = "Powered by GoIRC" - cfg.QuitMessage = "GoBye!" - return cfg -} - -// SimpleClient creates a new Conn, passing its arguments to NewConfig. -// If you don't need to change any client options and just want to get -// started quickly, this is a convenient shortcut. -func SimpleClient(nick string, args ...string) *Conn { - conn := Client(NewConfig(nick, args...)) - return conn -} - -// Client takes a Config struct and returns a new Conn ready to have -// handlers added and connect to a server. -func Client(cfg *Config) *Conn { - if cfg == nil { - cfg = NewConfig("__idiot__") - } - if cfg.Me == nil || cfg.Me.Nick == "" || cfg.Me.Ident == "" { - cfg.Me = &state.Nick{Nick: "__idiot__"} - cfg.Me.Ident = "goirc" - cfg.Me.Name = "Powered by GoIRC" - } - - dialer := new(net.Dialer) - dialer.Timeout = cfg.Timeout - dialer.DualStack = cfg.DualStack - if cfg.LocalAddr != "" { - if !hasPort(cfg.LocalAddr) { - cfg.LocalAddr += ":0" - } - - local, err := net.ResolveTCPAddr("tcp", cfg.LocalAddr) - if err == nil { - dialer.LocalAddr = local - } else { - logging.Error("irc.Client(): Cannot resolve local address %s: %s", cfg.LocalAddr, err) - } - } - - conn := &Conn{ - cfg: cfg, - dialer: dialer, - intHandlers: handlerSet(), - fgHandlers: handlerSet(), - bgHandlers: handlerSet(), - stRemovers: make([]Remover, 0, len(stHandlers)), - lastsent: time.Now(), - } - conn.addIntHandlers() - return conn -} - -// Connected returns true if the client is successfully connected to -// an IRC server. It becomes true when the TCP connection is established, -// and false again when the connection is closed. -func (conn *Conn) Connected() bool { - conn.mu.RLock() - defer conn.mu.RUnlock() - return conn.connected -} - -// Config returns a pointer to the Config struct used by the client. -// Many of the elements of Config may be changed at any point to -// affect client behaviour. To disable flood protection temporarily, -// for example, a handler could do: -// -// conn.Config().Flood = true -// // Send many lines to the IRC server, risking "excess flood" -// conn.Config().Flood = false -// -func (conn *Conn) Config() *Config { - return conn.cfg -} - -// Me returns a state.Nick that reflects the client's IRC nick at the -// time it is called. If state tracking is enabled, this comes from -// the tracker, otherwise it is equivalent to conn.cfg.Me. -func (conn *Conn) Me() *state.Nick { - if conn.st != nil { - conn.cfg.Me = conn.st.Me() - } - return conn.cfg.Me -} - -// StateTracker returns the state tracker being used by the client, -// if tracking is enabled, and nil otherwise. -func (conn *Conn) StateTracker() state.Tracker { - return conn.st -} - -// EnableStateTracking causes the client to track information about -// all channels it is joined to, and all the nicks in those channels. -// This can be rather handy for a number of bot-writing tasks. See -// the state package for more details. -// -// NOTE: Calling this while connected to an IRC server may cause the -// state tracker to become very confused all over STDERR if logging -// is enabled. State tracking should enabled before connecting or -// at a pinch while the client is not joined to any channels. -func (conn *Conn) EnableStateTracking() { - conn.mu.Lock() - defer conn.mu.Unlock() - if conn.st == nil { - n := conn.cfg.Me - conn.st = state.NewTracker(n.Nick) - conn.st.NickInfo(n.Nick, n.Ident, n.Host, n.Name) - conn.cfg.Me = conn.st.Me() - conn.addSTHandlers() - } -} - -// DisableStateTracking causes the client to stop tracking information -// about the channels and nicks it knows of. It will also wipe current -// state from the state tracker. -func (conn *Conn) DisableStateTracking() { - conn.mu.Lock() - defer conn.mu.Unlock() - if conn.st != nil { - conn.cfg.Me = conn.st.Me() - conn.delSTHandlers() - conn.st.Wipe() - conn.st = nil - } -} - -// Per-connection state initialisation. -func (conn *Conn) initialise() { - conn.io = nil - conn.sock = nil - conn.in = make(chan *Line, 32) - conn.out = make(chan string, 32) - conn.die = make(chan struct{}) - if conn.st != nil { - conn.st.Wipe() - } -} - -// ConnectTo connects the IRC client to "host[:port]", which should be either -// a hostname or an IP address, with an optional port. It sets the client's -// Config.Server to host, Config.Pass to pass if one is provided, and then -// calls Connect. -func (conn *Conn) ConnectTo(host string, pass ...string) error { - conn.cfg.Server = host - if len(pass) > 0 { - conn.cfg.Pass = pass[0] - } - return conn.Connect() -} - -// Connect connects the IRC client to the server configured in Config.Server. -// To enable explicit SSL on the connection to the IRC server, set Config.SSL -// to true before calling Connect(). The port will default to 6697 if SSL is -// enabled, and 6667 otherwise. -// To enable connecting via a proxy server, set Config.Proxy to the proxy URL -// (example socks5://localhost:9000) before calling Connect(). -// -// Upon successful connection, Connected will return true and a REGISTER event -// will be fired. This is mostly for internal use; it is suggested that a -// handler for the CONNECTED event is used to perform any initial client work -// like joining channels and sending messages. -func (conn *Conn) Connect() error { - // We don't want to hold conn.mu while firing the REGISTER event, - // and it's much easier and less error prone to defer the unlock, - // so the connect mechanics have been delegated to internalConnect. - err := conn.internalConnect() - if err == nil { - conn.dispatch(&Line{Cmd: REGISTER, Time: time.Now()}) - } - return err -} - -// internalConnect handles the work of actually connecting to the server. -func (conn *Conn) internalConnect() error { - conn.mu.Lock() - defer conn.mu.Unlock() - conn.initialise() - - if conn.cfg.Server == "" { - return fmt.Errorf("irc.Connect(): cfg.Server must be non-empty") - } - if conn.connected { - return fmt.Errorf("irc.Connect(): Cannot connect to %s, already connected.", conn.cfg.Server) - } - - if !hasPort(conn.cfg.Server) { - if conn.cfg.SSL { - conn.cfg.Server = net.JoinHostPort(conn.cfg.Server, "6697") - } else { - conn.cfg.Server = net.JoinHostPort(conn.cfg.Server, "6667") - } - } - - if conn.cfg.Proxy != "" { - proxyURL, err := url.Parse(conn.cfg.Proxy) - if err != nil { - return err - } - conn.proxyDialer, err = proxy.FromURL(proxyURL, conn.dialer) - if err != nil { - return err - } - - logging.Info("irc.Connect(): Connecting to %s.", conn.cfg.Server) - if s, err := conn.proxyDialer.Dial("tcp", conn.cfg.Server); err == nil { - conn.sock = s - } else { - return err - } - } else { - logging.Info("irc.Connect(): Connecting to %s.", conn.cfg.Server) - if s, err := conn.dialer.Dial("tcp", conn.cfg.Server); err == nil { - conn.sock = s - } else { - return err - } - } - - if conn.cfg.SSL { - logging.Info("irc.Connect(): Performing SSL handshake.") - s := tls.Client(conn.sock, conn.cfg.SSLConfig) - if err := s.Handshake(); err != nil { - return err - } - conn.sock = s - } - - conn.postConnect(true) - conn.connected = true - return nil -} - -// postConnect performs post-connection setup, for ease of testing. -func (conn *Conn) postConnect(start bool) { - conn.io = bufio.NewReadWriter( - bufio.NewReader(conn.sock), - bufio.NewWriter(conn.sock)) - if start { - conn.wg.Add(3) - go conn.send() - go conn.recv() - go conn.runLoop() - if conn.cfg.PingFreq > 0 { - conn.wg.Add(1) - go conn.ping() - } - } -} - -// hasPort returns true if the string hostname has a :port suffix. -// It was copied from net/http for great justice. -func hasPort(s string) bool { - return strings.LastIndex(s, ":") > strings.LastIndex(s, "]") -} - -// send is started as a goroutine after a connection is established. -// It shuttles data from the output channel to write(), and is killed -// when Conn.die is closed. -func (conn *Conn) send() { - for { - select { - case line := <-conn.out: - if err := conn.write(line); err != nil { - logging.Error("irc.send(): %s", err.Error()) - // We can't defer this, because Close() waits for it. - conn.wg.Done() - conn.Close() - return - } - case <-conn.die: - // control channel closed, bail out - conn.wg.Done() - return - } - } -} - -// recv is started as a goroutine after a connection is established. -// It receives "\r\n" terminated lines from the server, parses them into -// Lines, and sends them to the input channel. -func (conn *Conn) recv() { - for { - s, err := conn.io.ReadString('\n') - if err != nil { - if err != io.EOF { - logging.Error("irc.recv(): %s", err.Error()) - } - // We can't defer this, because Close() waits for it. - conn.wg.Done() - conn.Close() - return - } - s = strings.Trim(s, "\r\n") - logging.Debug("<- %s", s) - - if line := ParseLine(s); line != nil { - line.Time = time.Now() - conn.in <- line - } else { - logging.Warn("irc.recv(): problems parsing line:\n %s", s) - } - } -} - -// ping is started as a goroutine after a connection is established, as -// long as Config.PingFreq >0. It pings the server every PingFreq seconds. -func (conn *Conn) ping() { - defer conn.wg.Done() - tick := time.NewTicker(conn.cfg.PingFreq) - for { - select { - case <-tick.C: - conn.Ping(fmt.Sprintf("%d", time.Now().UnixNano())) - case <-conn.die: - // control channel closed, bail out - tick.Stop() - return - } - } -} - -// runLoop is started as a goroutine after a connection is established. -// It pulls Lines from the input channel and dispatches them to any -// handlers that have been registered for that IRC verb. -func (conn *Conn) runLoop() { - defer conn.wg.Done() - for { - select { - case line := <-conn.in: - conn.dispatch(line) - case <-conn.die: - // control channel closed, bail out - return - } - } -} - -// write writes a \r\n terminated line of output to the connected server, -// using Hybrid's algorithm to rate limit if conn.cfg.Flood is false. -func (conn *Conn) write(line string) error { - if !conn.cfg.Flood { - if t := conn.rateLimit(len(line)); t != 0 { - // sleep for the current line's time value before sending it - logging.Info("irc.rateLimit(): Flood! Sleeping for %.2f secs.", - t.Seconds()) - <-time.After(t) - } - } - - if _, err := conn.io.WriteString(line + "\r\n"); err != nil { - return err - } - if err := conn.io.Flush(); err != nil { - return err - } - if strings.HasPrefix(line, "PASS") { - line = "PASS **************" - } - logging.Debug("-> %s", line) - return nil -} - -// rateLimit implements Hybrid's flood control algorithm for outgoing lines. -func (conn *Conn) rateLimit(chars int) time.Duration { - // Hybrid's algorithm allows for 2 seconds per line and an additional - // 1/120 of a second per character on that line. - linetime := 2*time.Second + time.Duration(chars)*time.Second/120 - elapsed := time.Now().Sub(conn.lastsent) - if conn.badness += linetime - elapsed; conn.badness < 0 { - // negative badness times are badness... - conn.badness = 0 - } - conn.lastsent = time.Now() - // If we've sent more than 10 second's worth of lines according to the - // calculation above, then we're at risk of "Excess Flood". - if conn.badness > 10*time.Second { - return linetime - } - return 0 -} - -// Close tears down all connection-related state. It is called when either -// the sending or receiving goroutines encounter an error. -// It may also be used to forcibly shut down the connection to the server. -func (conn *Conn) Close() error { - // Guard against double-call of Close() if we get an error in send() - // as calling sock.Close() will cause recv() to receive EOF in readstring() - conn.mu.Lock() - if !conn.connected { - conn.mu.Unlock() - return nil - } - logging.Info("irc.Close(): Disconnected from server.") - conn.connected = false - err := conn.sock.Close() - close(conn.die) - // Drain both in and out channels to avoid a deadlock if the buffers - // have filled. See TestSendDeadlockOnFullBuffer in connection_test.go. - conn.drainIn() - conn.drainOut() - conn.wg.Wait() - conn.mu.Unlock() - // Dispatch after closing connection but before reinit - // so event handlers can still access state information. - conn.dispatch(&Line{Cmd: DISCONNECTED, Time: time.Now()}) - return err -} - -// drainIn sends all data buffered in conn.in to /dev/null. -func (conn *Conn) drainIn() { - for { - select { - case <-conn.in: - default: - return - } - } -} - -// drainOut does the same for conn.out. Generics! -func (conn *Conn) drainOut() { - for { - select { - case <-conn.out: - default: - return - } - } -} - -// Dumps a load of information about the current state of the connection to a -// string for debugging state tracking and other such things. -func (conn *Conn) String() string { - str := "GoIRC Connection\n" - str += "----------------\n\n" - if conn.Connected() { - str += "Connected to " + conn.cfg.Server + "\n\n" - } else { - str += "Not currently connected!\n\n" - } - str += conn.Me().String() + "\n" - if conn.st != nil { - str += conn.st.String() + "\n" - } - return str -} diff --git a/vendor/github.com/fluffle/goirc/client/dispatch.go b/vendor/github.com/fluffle/goirc/client/dispatch.go deleted file mode 100644 index 4a5deb9..0000000 --- a/vendor/github.com/fluffle/goirc/client/dispatch.go +++ /dev/null @@ -1,202 +0,0 @@ -package client - -import ( - "runtime" - "strings" - "sync" - - "github.com/fluffle/goirc/logging" -) - -// Handlers are triggered on incoming Lines from the server, with the handler -// "name" being equivalent to Line.Cmd. Read the RFCs for details on what -// replies could come from the server. They'll generally be things like -// "PRIVMSG", "JOIN", etc. but all the numeric replies are left as ascii -// strings of digits like "332" (mainly because I really didn't feel like -// putting massive constant tables in). -// -// Foreground handlers have a guarantee of protocol consistency: all the -// handlers for one event will have finished before the handlers for the -// next start processing. They are run in parallel but block the event -// loop, so care should be taken to ensure these handlers are quick :-) -// -// Background handlers are run in parallel and do not block the event loop. -// This is useful for things that may need to do significant work. -type Handler interface { - Handle(*Conn, *Line) -} - -// Removers allow for a handler that has been previously added to the client -// to be removed. -type Remover interface { - Remove() -} - -// HandlerFunc allows a bare function with this signature to implement the -// Handler interface. It is used by Conn.HandleFunc. -type HandlerFunc func(*Conn, *Line) - -func (hf HandlerFunc) Handle(conn *Conn, line *Line) { - hf(conn, line) -} - -// Handlers are organised using a map of linked-lists, with each map -// key representing an IRC verb or numeric, and the linked list values -// being handlers that are executed in parallel when a Line from the -// server with that verb or numeric arrives. -type hSet struct { - set map[string]*hList - sync.RWMutex -} - -type hList struct { - start, end *hNode -} - -// Storing the forward and backward links in the node allows O(1) removal. -// This probably isn't strictly necessary but I think it's kinda nice. -type hNode struct { - next, prev *hNode - set *hSet - event string - handler Handler -} - -// A hNode implements both Handler (with configurable panic recovery)... -func (hn *hNode) Handle(conn *Conn, line *Line) { - defer conn.cfg.Recover(conn, line) - hn.handler.Handle(conn, line) -} - -// ... and Remover. -func (hn *hNode) Remove() { - hn.set.remove(hn) -} - -func handlerSet() *hSet { - return &hSet{set: make(map[string]*hList)} -} - -// When a new Handler is added for an event, it is wrapped in a hNode and -// returned as a Remover so the caller can remove it at a later time. -func (hs *hSet) add(ev string, h Handler) Remover { - hs.Lock() - defer hs.Unlock() - ev = strings.ToLower(ev) - l, ok := hs.set[ev] - if !ok { - l = &hList{} - } - hn := &hNode{ - set: hs, - event: ev, - handler: h, - } - if !ok { - l.start = hn - } else { - hn.prev = l.end - l.end.next = hn - } - l.end = hn - hs.set[ev] = l - return hn -} - -func (hs *hSet) remove(hn *hNode) { - hs.Lock() - defer hs.Unlock() - l, ok := hs.set[hn.event] - if !ok { - logging.Error("Removing node for unknown event '%s'", hn.event) - return - } - if hn.next == nil { - l.end = hn.prev - } else { - hn.next.prev = hn.prev - } - if hn.prev == nil { - l.start = hn.next - } else { - hn.prev.next = hn.next - } - hn.next = nil - hn.prev = nil - hn.set = nil - if l.start == nil || l.end == nil { - delete(hs.set, hn.event) - } -} - -func (hs *hSet) getHandlers(ev string) []*hNode { - hs.RLock() - defer hs.RUnlock() - list, ok := hs.set[ev] - if !ok { - return nil - } - // Copy current list of handlers to a temporary slice under the lock. - handlers := make([]*hNode, 0) - for hn := list.start; hn != nil; hn = hn.next { - handlers = append(handlers, hn) - } - return handlers -} - -func (hs *hSet) dispatch(conn *Conn, line *Line) { - ev := strings.ToLower(line.Cmd) - wg := &sync.WaitGroup{} - for _, hn := range hs.getHandlers(ev) { - wg.Add(1) - go func(hn *hNode) { - hn.Handle(conn, line.Copy()) - wg.Done() - }(hn) - } - wg.Wait() -} - -// Handle adds the provided handler to the foreground set for the named event. -// It will return a Remover that allows that handler to be removed again. -func (conn *Conn) Handle(name string, h Handler) Remover { - return conn.fgHandlers.add(name, h) -} - -// HandleBG adds the provided handler to the background set for the named -// event. It may go away in the future. -// It will return a Remover that allows that handler to be removed again. -func (conn *Conn) HandleBG(name string, h Handler) Remover { - return conn.bgHandlers.add(name, h) -} - -func (conn *Conn) handle(name string, h Handler) Remover { - return conn.intHandlers.add(name, h) -} - -// HandleFunc adds the provided function as a handler in the foreground set -// for the named event. -// It will return a Remover that allows that handler to be removed again. -func (conn *Conn) HandleFunc(name string, hf HandlerFunc) Remover { - return conn.Handle(name, hf) -} - -func (conn *Conn) dispatch(line *Line) { - // We run the internal handlers first, including all state tracking ones. - // This ensures that user-supplied handlers that use the tracker have a - // consistent view of the connection state in handlers that mutate it. - conn.intHandlers.dispatch(conn, line) - go conn.bgHandlers.dispatch(conn, line) - conn.fgHandlers.dispatch(conn, line) -} - -// LogPanic is used as the default panic catcher for the client. If, like me, -// you are not good with computer, and you'd prefer your bot not to vanish into -// the ether whenever you make unfortunate programming mistakes, you may find -// this useful: it will recover panics from handler code and log the errors. -func (conn *Conn) LogPanic(line *Line) { - if err := recover(); err != nil { - _, f, l, _ := runtime.Caller(2) - logging.Error("%s:%d: panic: %v", f, l, err) - } -} diff --git a/vendor/github.com/fluffle/goirc/client/doc.go b/vendor/github.com/fluffle/goirc/client/doc.go deleted file mode 100644 index 08a79dd..0000000 --- a/vendor/github.com/fluffle/goirc/client/doc.go +++ /dev/null @@ -1,34 +0,0 @@ -// Package client implements an IRC client. It handles protocol basics -// such as initial connection and responding to server PINGs, and has -// optional state tracking support which will keep tabs on every nick -// present in the same channels as the client. Other features include -// SSL support, automatic splitting of long lines, and panic recovery -// for handlers. -// -// Incoming IRC messages are parsed into client.Line structs and trigger -// events based on the IRC verb (e.g. PRIVMSG) of the message. Handlers -// for these events conform to the client.Handler interface; a HandlerFunc -// type to wrap bare functions is provided a-la the net/http package. -// -// Creating a client, adding a handler and connecting to a server looks -// soemthing like this, for the simple case: -// -// // Create a new client, which will connect with the nick "myNick" -// irc := client.SimpleClient("myNick") -// -// // Add a handler that waits for the "disconnected" event and -// // closes a channel to signal everything is done. -// disconnected := make(chan struct{}) -// c.HandleFunc("disconnected", func(c *client.Conn, l *client.Line) { -// close(disconnected) -// }) -// -// // Connect to an IRC server. -// if err := c.ConnectTo("irc.freenode.net"); err != nil { -// log.Fatalf("Connection error: %v\n", err) -// } -// -// // Wait for disconnection. -// <-disconnected -// -package client diff --git a/vendor/github.com/fluffle/goirc/client/handlers.go b/vendor/github.com/fluffle/goirc/client/handlers.go deleted file mode 100644 index b538579..0000000 --- a/vendor/github.com/fluffle/goirc/client/handlers.go +++ /dev/null @@ -1,105 +0,0 @@ -package client - -// this file contains the basic set of event handlers -// to manage tracking an irc connection etc. - -import ( - "strings" - "time" -) - -// sets up the internal event handlers to do essential IRC protocol things -var intHandlers = map[string]HandlerFunc{ - REGISTER: (*Conn).h_REGISTER, - "001": (*Conn).h_001, - "433": (*Conn).h_433, - CTCP: (*Conn).h_CTCP, - NICK: (*Conn).h_NICK, - PING: (*Conn).h_PING, -} - -func (conn *Conn) addIntHandlers() { - for n, h := range intHandlers { - // internal handlers are essential for the IRC client - // to function, so we don't save their Removers here - conn.handle(n, h) - } -} - -// Basic ping/pong handler -func (conn *Conn) h_PING(line *Line) { - conn.Pong(line.Args[0]) -} - -// Handler for initial registration with server once tcp connection is made. -func (conn *Conn) h_REGISTER(line *Line) { - if conn.cfg.Pass != "" { - conn.Pass(conn.cfg.Pass) - } - conn.Nick(conn.cfg.Me.Nick) - conn.User(conn.cfg.Me.Ident, conn.cfg.Me.Name) -} - -// Handler to trigger a CONNECTED event on receipt of numeric 001 -func (conn *Conn) h_001(line *Line) { - // we're connected! - conn.dispatch(&Line{Cmd: CONNECTED, Time: time.Now()}) - // and we're being given our hostname (from the server's perspective) - t := line.Args[len(line.Args)-1] - if idx := strings.LastIndex(t, " "); idx != -1 { - t = t[idx+1:] - if idx = strings.Index(t, "@"); idx != -1 { - if conn.st != nil { - me := conn.Me() - conn.st.NickInfo(me.Nick, me.Ident, t[idx+1:], me.Name) - } else { - conn.cfg.Me.Host = t[idx+1:] - } - } - } -} - -// XXX: do we need 005 protocol support message parsing here? -// probably in the future, but I can't quite be arsed yet. -/* - :irc.pl0rt.org 005 GoTest CMDS=KNOCK,MAP,DCCALLOW,USERIP UHNAMES NAMESX SAFELIST HCN MAXCHANNELS=20 CHANLIMIT=#:20 MAXLIST=b:60,e:60,I:60 NICKLEN=30 CHANNELLEN=32 TOPICLEN=307 KICKLEN=307 AWAYLEN=307 :are supported by this server - :irc.pl0rt.org 005 GoTest MAXTARGETS=20 WALLCHOPS WATCH=128 WATCHOPTS=A SILENCE=15 MODES=12 CHANTYPES=# PREFIX=(qaohv)~&@%+ CHANMODES=beI,kfL,lj,psmntirRcOAQKVCuzNSMT NETWORK=bb101.net CASEMAPPING=ascii EXTBAN=~,cqnr ELIST=MNUCT :are supported by this server - :irc.pl0rt.org 005 GoTest STATUSMSG=~&@%+ EXCEPTS INVEX :are supported by this server -*/ - -// Handler to deal with "433 :Nickname already in use" -func (conn *Conn) h_433(line *Line) { - // Args[1] is the new nick we were attempting to acquire - me := conn.Me() - neu := conn.cfg.NewNick(line.Args[1]) - conn.Nick(neu) - if !line.argslen(1) { - return - } - // if this is happening before we're properly connected (i.e. the nick - // we sent in the initial NICK command is in use) we will not receive - // a NICK message to confirm our change of nick, so ReNick here... - if line.Args[1] == me.Nick { - if conn.st != nil { - conn.cfg.Me = conn.st.ReNick(me.Nick, neu) - } else { - conn.cfg.Me.Nick = neu - } - } -} - -// Handle VERSION requests and CTCP PING -func (conn *Conn) h_CTCP(line *Line) { - if line.Args[0] == VERSION { - conn.CtcpReply(line.Nick, VERSION, conn.cfg.Version) - } else if line.Args[0] == PING && line.argslen(2) { - conn.CtcpReply(line.Nick, PING, line.Args[2]) - } -} - -// Handle updating our own NICK if we're not using the state tracker -func (conn *Conn) h_NICK(line *Line) { - if conn.st == nil && line.Nick == conn.cfg.Me.Nick { - conn.cfg.Me.Nick = line.Args[0] - } -} diff --git a/vendor/github.com/fluffle/goirc/client/line.go b/vendor/github.com/fluffle/goirc/client/line.go deleted file mode 100644 index bfa473a..0000000 --- a/vendor/github.com/fluffle/goirc/client/line.go +++ /dev/null @@ -1,216 +0,0 @@ -package client - -import ( - "runtime" - "strings" - "time" - - "github.com/fluffle/goirc/logging" -) - -var tagsReplacer = strings.NewReplacer("\\:", ";", "\\s", " ", "\\r", "\r", "\\n", "\n") - -// We parse an incoming line into this struct. Line.Cmd is used as the trigger -// name for incoming event handlers and is the IRC verb, the first sequence -// of non-whitespace characters after ":nick!user@host", e.g. PRIVMSG. -// Raw =~ ":nick!user@host cmd args[] :text" -// Src == "nick!user@host" -// Cmd == e.g. PRIVMSG, 332 -type Line struct { - Tags map[string]string - Nick, Ident, Host, Src string - Cmd, Raw string - Args []string - Time time.Time -} - -// Copy returns a deep copy of the Line. -func (l *Line) Copy() *Line { - nl := *l - nl.Args = make([]string, len(l.Args)) - copy(nl.Args, l.Args) - if l.Tags != nil { - nl.Tags = make(map[string]string) - for k, v := range l.Tags { - nl.Tags[k] = v - } - } - return &nl -} - -// Text returns the contents of the text portion of a line. This only really -// makes sense for lines with a :text part, but there are a lot of them. -func (line *Line) Text() string { - if len(line.Args) > 0 { - return line.Args[len(line.Args)-1] - } - return "" -} - -// Target returns the contextual target of the line, usually the first Arg -// for the IRC verb. If the line was broadcast from a channel, the target -// will be that channel. If the line was sent directly by a user, the target -// will be that user. -func (line *Line) Target() string { - // TODO(fluffle): Add 005 CHANTYPES parsing for this? - switch line.Cmd { - case PRIVMSG, NOTICE, ACTION: - if !line.Public() { - return line.Nick - } - case CTCP, CTCPREPLY: - if !line.Public() { - return line.Nick - } - return line.Args[1] - } - if len(line.Args) > 0 { - return line.Args[0] - } - return "" -} - -// Public returns true if the line is the result of an IRC user sending -// a message to a channel the client has joined instead of directly -// to the client. -// -// NOTE: This is very permissive, allowing all 4 RFC channel types even if -// your server doesn't technically support them. -func (line *Line) Public() bool { - switch line.Cmd { - case PRIVMSG, NOTICE, ACTION: - switch line.Args[0][0] { - case '#', '&', '+', '!': - return true - } - case CTCP, CTCPREPLY: - // CTCP prepends the CTCP verb to line.Args, thus for the message - // :nick!user@host PRIVMSG #foo :\001BAR baz\001 - // line.Args contains: []string{"BAR", "#foo", "baz"} - // TODO(fluffle): Arguably this is broken, and we should have - // line.Args containing: []string{"#foo", "BAR", "baz"} - // ... OR change conn.Ctcp()'s argument order to be consistent. - switch line.Args[1][0] { - case '#', '&', '+', '!': - return true - } - } - return false -} - -// ParseLine creates a Line from an incoming message from the IRC server. -// -// It contains special casing for CTCP messages, most notably CTCP ACTION. -// All CTCP messages have the \001 bytes stripped from the message and the -// CTCP command separated from any subsequent text. Then, CTCP ACTIONs are -// rewritten such that Line.Cmd == ACTION. Other CTCP messages have Cmd -// set to CTCP or CTCPREPLY, and the CTCP command prepended to line.Args. -// -// ParseLine also parses IRCv3 tags, if received. If a line does not have -// the tags section, Line.Tags will be nil. Tags are optional, and will -// only be included after the correct CAP command. -// -// http://ircv3.net/specs/core/capability-negotiation-3.1.html -// http://ircv3.net/specs/core/message-tags-3.2.html -func ParseLine(s string) *Line { - line := &Line{Raw: s} - - if s == "" { - return nil - } - - if s[0] == '@' { - var rawTags string - line.Tags = make(map[string]string) - if idx := strings.Index(s, " "); idx != -1 { - rawTags, s = s[1:idx], s[idx+1:] - } else { - return nil - } - - // ; is represented as \: in a tag, so it's safe to split on ; - for _, tag := range strings.Split(rawTags, ";") { - if tag == "" { - continue - } - - pair := strings.SplitN(tagsReplacer.Replace(tag), "=", 2) - if len(pair) < 2 { - line.Tags[tag] = "" - } else { - line.Tags[pair[0]] = pair[1] - } - } - } - - if s[0] == ':' { - // remove a source and parse it - if idx := strings.Index(s, " "); idx != -1 { - line.Src, s = s[1:idx], s[idx+1:] - } else { - // pretty sure we shouldn't get here ... - return nil - } - - // src can be the hostname of the irc server or a nick!user@host - line.Host = line.Src - nidx, uidx := strings.Index(line.Src, "!"), strings.Index(line.Src, "@") - if uidx != -1 && nidx != -1 { - line.Nick = line.Src[:nidx] - line.Ident = line.Src[nidx+1 : uidx] - line.Host = line.Src[uidx+1:] - } - } - - // now we're here, we've parsed a :nick!user@host or :server off - // s should contain "cmd args[] :text" - args := strings.SplitN(s, " :", 2) - if len(args) > 1 { - args = append(strings.Fields(args[0]), args[1]) - } else { - args = strings.Fields(args[0]) - } - line.Cmd = strings.ToUpper(args[0]) - if len(args) > 1 { - line.Args = args[1:] - } - - // So, I think CTCP and (in particular) CTCP ACTION are better handled as - // separate events as opposed to forcing people to have gargantuan - // handlers to cope with the possibilities. - if (line.Cmd == PRIVMSG || line.Cmd == NOTICE) && - len(line.Args[1]) > 2 && - strings.HasPrefix(line.Args[1], "\001") && - strings.HasSuffix(line.Args[1], "\001") { - // WOO, it's a CTCP message - t := strings.SplitN(strings.Trim(line.Args[1], "\001"), " ", 2) - if len(t) > 1 { - // Replace the line with the unwrapped CTCP - line.Args[1] = t[1] - } - if c := strings.ToUpper(t[0]); c == ACTION && line.Cmd == PRIVMSG { - // make a CTCP ACTION it's own event a-la PRIVMSG - line.Cmd = c - } else { - // otherwise, dispatch a generic CTCP/CTCPREPLY event that - // contains the type of CTCP in line.Args[0] - if line.Cmd == PRIVMSG { - line.Cmd = CTCP - } else { - line.Cmd = CTCPREPLY - } - line.Args = append([]string{c}, line.Args...) - } - } - return line -} - -func (line *Line) argslen(minlen int) bool { - pc, _, _, _ := runtime.Caller(1) - fn := runtime.FuncForPC(pc) - if len(line.Args) <= minlen { - logging.Warn("%s: too few arguments: %s", fn.Name(), strings.Join(line.Args, " ")) - return false - } - return true -} diff --git a/vendor/github.com/fluffle/goirc/client/state_handlers.go b/vendor/github.com/fluffle/goirc/client/state_handlers.go deleted file mode 100644 index 847679c..0000000 --- a/vendor/github.com/fluffle/goirc/client/state_handlers.go +++ /dev/null @@ -1,262 +0,0 @@ -package client - -// this file contains the extra set of event handlers -// to manage tracking state for an IRC connection - -import ( - "strings" - - "github.com/fluffle/goirc/logging" -) - -var stHandlers = map[string]HandlerFunc{ - "JOIN": (*Conn).h_JOIN, - "KICK": (*Conn).h_KICK, - "MODE": (*Conn).h_MODE, - "NICK": (*Conn).h_STNICK, - "PART": (*Conn).h_PART, - "QUIT": (*Conn).h_QUIT, - "TOPIC": (*Conn).h_TOPIC, - "311": (*Conn).h_311, - "324": (*Conn).h_324, - "332": (*Conn).h_332, - "352": (*Conn).h_352, - "353": (*Conn).h_353, - "671": (*Conn).h_671, -} - -func (conn *Conn) addSTHandlers() { - for n, h := range stHandlers { - conn.stRemovers = append(conn.stRemovers, conn.handle(n, h)) - } -} - -func (conn *Conn) delSTHandlers() { - for _, h := range conn.stRemovers { - h.Remove() - } - conn.stRemovers = conn.stRemovers[:0] -} - -// Handle NICK messages that need to update the state tracker -func (conn *Conn) h_STNICK(line *Line) { - // all nicks should be handled the same way, our own included - conn.st.ReNick(line.Nick, line.Args[0]) -} - -// Handle JOINs to channels to maintain state -func (conn *Conn) h_JOIN(line *Line) { - ch := conn.st.GetChannel(line.Args[0]) - nk := conn.st.GetNick(line.Nick) - if ch == nil { - // first we've seen of this channel, so should be us joining it - // NOTE this will also take care of nk == nil && ch == nil - if !conn.Me().Equals(nk) { - logging.Warn("irc.JOIN(): JOIN to unknown channel %s received "+ - "from (non-me) nick %s", line.Args[0], line.Nick) - return - } - conn.st.NewChannel(line.Args[0]) - // since we don't know much about this channel, ask server for info - // we get the channel users automatically in 353 and the channel - // topic in 332 on join, so we just need to get the modes - conn.Mode(line.Args[0]) - // sending a WHO for the channel is MUCH more efficient than - // triggering a WHOIS on every nick from the 353 handler - conn.Who(line.Args[0]) - } - if nk == nil { - // this is the first we've seen of this nick - conn.st.NewNick(line.Nick) - conn.st.NickInfo(line.Nick, line.Ident, line.Host, "") - // since we don't know much about this nick, ask server for info - conn.Who(line.Nick) - } - // this takes care of both nick and channel linking \o/ - conn.st.Associate(line.Args[0], line.Nick) -} - -// Handle PARTs from channels to maintain state -func (conn *Conn) h_PART(line *Line) { - conn.st.Dissociate(line.Args[0], line.Nick) -} - -// Handle KICKs from channels to maintain state -func (conn *Conn) h_KICK(line *Line) { - if !line.argslen(1) { - return - } - // XXX: this won't handle autorejoining channels on KICK - // it's trivial to do this in a seperate handler... - conn.st.Dissociate(line.Args[0], line.Args[1]) -} - -// Handle other people's QUITs -func (conn *Conn) h_QUIT(line *Line) { - conn.st.DelNick(line.Nick) -} - -// Handle MODE changes for channels we know about (and our nick personally) -func (conn *Conn) h_MODE(line *Line) { - if !line.argslen(1) { - return - } - if ch := conn.st.GetChannel(line.Args[0]); ch != nil { - // channel modes first - conn.st.ChannelModes(line.Args[0], line.Args[1], line.Args[2:]...) - } else if nk := conn.st.GetNick(line.Args[0]); nk != nil { - // nick mode change, should be us - if !conn.Me().Equals(nk) { - logging.Warn("irc.MODE(): recieved MODE %s for (non-me) nick %s", - line.Args[1], line.Args[0]) - return - } - conn.st.NickModes(line.Args[0], line.Args[1]) - } else { - logging.Warn("irc.MODE(): not sure what to do with MODE %s", - strings.Join(line.Args, " ")) - } -} - -// Handle TOPIC changes for channels -func (conn *Conn) h_TOPIC(line *Line) { - if !line.argslen(1) { - return - } - if ch := conn.st.GetChannel(line.Args[0]); ch != nil { - conn.st.Topic(line.Args[0], line.Args[1]) - } else { - logging.Warn("irc.TOPIC(): topic change on unknown channel %s", - line.Args[0]) - } -} - -// Handle 311 whois reply -func (conn *Conn) h_311(line *Line) { - if !line.argslen(5) { - return - } - if nk := conn.st.GetNick(line.Args[1]); (nk != nil) && !conn.Me().Equals(nk) { - conn.st.NickInfo(line.Args[1], line.Args[2], line.Args[3], line.Args[5]) - } else { - logging.Warn("irc.311(): received WHOIS info for unknown nick %s", - line.Args[1]) - } -} - -// Handle 324 mode reply -func (conn *Conn) h_324(line *Line) { - if !line.argslen(2) { - return - } - if ch := conn.st.GetChannel(line.Args[1]); ch != nil { - conn.st.ChannelModes(line.Args[1], line.Args[2], line.Args[3:]...) - } else { - logging.Warn("irc.324(): received MODE settings for unknown channel %s", - line.Args[1]) - } -} - -// Handle 332 topic reply on join to channel -func (conn *Conn) h_332(line *Line) { - if !line.argslen(2) { - return - } - if ch := conn.st.GetChannel(line.Args[1]); ch != nil { - conn.st.Topic(line.Args[1], line.Args[2]) - } else { - logging.Warn("irc.332(): received TOPIC value for unknown channel %s", - line.Args[1]) - } -} - -// Handle 352 who reply -func (conn *Conn) h_352(line *Line) { - if !line.argslen(5) { - return - } - nk := conn.st.GetNick(line.Args[5]) - if nk == nil { - logging.Warn("irc.352(): received WHO reply for unknown nick %s", - line.Args[5]) - return - } - if conn.Me().Equals(nk) { - return - } - // XXX: do we care about the actual server the nick is on? - // or the hop count to this server? - // last arg contains " " - a := strings.SplitN(line.Args[len(line.Args)-1], " ", 2) - conn.st.NickInfo(nk.Nick, line.Args[2], line.Args[3], a[1]) - if !line.argslen(6) { - return - } - if idx := strings.Index(line.Args[6], "*"); idx != -1 { - conn.st.NickModes(nk.Nick, "+o") - } - if idx := strings.Index(line.Args[6], "B"); idx != -1 { - conn.st.NickModes(nk.Nick, "+B") - } - if idx := strings.Index(line.Args[6], "H"); idx != -1 { - conn.st.NickModes(nk.Nick, "+i") - } -} - -// Handle 353 names reply -func (conn *Conn) h_353(line *Line) { - if !line.argslen(2) { - return - } - if ch := conn.st.GetChannel(line.Args[2]); ch != nil { - nicks := strings.Split(line.Args[len(line.Args)-1], " ") - for _, nick := range nicks { - // UnrealIRCd's coders are lazy and leave a trailing space - if nick == "" { - continue - } - switch c := nick[0]; c { - case '~', '&', '@', '%', '+': - nick = nick[1:] - fallthrough - default: - if conn.st.GetNick(nick) == nil { - // we don't know this nick yet! - conn.st.NewNick(nick) - } - if _, ok := conn.st.IsOn(ch.Name, nick); !ok { - // This nick isn't associated with this channel yet! - conn.st.Associate(ch.Name, nick) - } - switch c { - case '~': - conn.st.ChannelModes(ch.Name, "+q", nick) - case '&': - conn.st.ChannelModes(ch.Name, "+a", nick) - case '@': - conn.st.ChannelModes(ch.Name, "+o", nick) - case '%': - conn.st.ChannelModes(ch.Name, "+h", nick) - case '+': - conn.st.ChannelModes(ch.Name, "+v", nick) - } - } - } - } else { - logging.Warn("irc.353(): received NAMES list for unknown channel %s", - line.Args[2]) - } -} - -// Handle 671 whois reply (nick connected via SSL) -func (conn *Conn) h_671(line *Line) { - if !line.argslen(1) { - return - } - if nk := conn.st.GetNick(line.Args[1]); nk != nil { - conn.st.NickModes(nk.Nick, "+z") - } else { - logging.Warn("irc.671(): received WHOIS SSL info for unknown nick %s", - line.Args[1]) - } -} diff --git a/vendor/github.com/fluffle/goirc/logging/logging.go b/vendor/github.com/fluffle/goirc/logging/logging.go deleted file mode 100644 index f939fce..0000000 --- a/vendor/github.com/fluffle/goirc/logging/logging.go +++ /dev/null @@ -1,44 +0,0 @@ -package logging - -// The IRC client will log things using these methods -type Logger interface { - // Debug logging of raw socket comms to/from server. - Debug(format string, args ...interface{}) - // Informational logging about client behaviour. - Info(format string, args ...interface{}) - // Warnings of inconsistent or unexpected data, mostly - // related to state tracking of IRC nicks/chans. - Warn(format string, args ...interface{}) - // Errors, mostly to do with network communication. - Error(format string, args ...interface{}) -} - -// By default we do no logging. Logging is enabled or disabled -// at the package level, since I'm lazy and re-re-reorganising -// my code to pass a per-client-struct Logger around to all the -// state objects is a pain in the arse. -var logger Logger = nullLogger{} - -// SetLogger sets the internal goirc Logger to l. If l is nil, -// a dummy logger that does nothing is installed instead. -func SetLogger(l Logger) { - if l == nil { - logger = nullLogger{} - } else { - logger = l - } -} - -// A nullLogger does nothing while fulfilling Logger. -type nullLogger struct{} - -func (nl nullLogger) Debug(f string, a ...interface{}) {} -func (nl nullLogger) Info(f string, a ...interface{}) {} -func (nl nullLogger) Warn(f string, a ...interface{}) {} -func (nl nullLogger) Error(f string, a ...interface{}) {} - -// Shim functions so that the package can be used directly -func Debug(f string, a ...interface{}) { logger.Debug(f, a...) } -func Info(f string, a ...interface{}) { logger.Info(f, a...) } -func Warn(f string, a ...interface{}) { logger.Warn(f, a...) } -func Error(f string, a ...interface{}) { logger.Error(f, a...) } diff --git a/vendor/github.com/fluffle/goirc/state/channel.go b/vendor/github.com/fluffle/goirc/state/channel.go deleted file mode 100644 index e45b6c8..0000000 --- a/vendor/github.com/fluffle/goirc/state/channel.go +++ /dev/null @@ -1,360 +0,0 @@ -package state - -import ( - "github.com/fluffle/goirc/logging" - - "reflect" - "strconv" -) - -// A Channel is returned from the state tracker and contains -// a copy of the channel state at a particular time. -type Channel struct { - Name, Topic string - Modes *ChanMode - Nicks map[string]*ChanPrivs -} - -// Internal bookkeeping struct for channels. -type channel struct { - name, topic string - modes *ChanMode - lookup map[string]*nick - nicks map[*nick]*ChanPrivs -} - -// A struct representing the modes of an IRC Channel -// (the ones we care about, at least). -// http://www.unrealircd.com/files/docs/unreal32docs.html#userchannelmodes -type ChanMode struct { - // MODE +p, +s, +t, +n, +m - Private, Secret, ProtectedTopic, NoExternalMsg, Moderated bool - - // MODE +i, +O, +z - InviteOnly, OperOnly, SSLOnly bool - - // MODE +r, +Z - Registered, AllSSL bool - - // MODE +k - Key string - - // MODE +l - Limit int -} - -// A struct representing the modes a Nick can have on a Channel -type ChanPrivs struct { - // MODE +q, +a, +o, +h, +v - Owner, Admin, Op, HalfOp, Voice bool -} - -// Map ChanMode fields to IRC mode characters -var StringToChanMode = map[string]string{} -var ChanModeToString = map[string]string{ - "Private": "p", - "Secret": "s", - "ProtectedTopic": "t", - "NoExternalMsg": "n", - "Moderated": "m", - "InviteOnly": "i", - "OperOnly": "O", - "SSLOnly": "z", - "Registered": "r", - "AllSSL": "Z", - "Key": "k", - "Limit": "l", -} - -// Map *irc.ChanPrivs fields to IRC mode characters -var StringToChanPriv = map[string]string{} -var ChanPrivToString = map[string]string{ - "Owner": "q", - "Admin": "a", - "Op": "o", - "HalfOp": "h", - "Voice": "v", -} - -// Map *irc.ChanPrivs fields to the symbols used to represent these modes -// in NAMES and WHOIS responses -var ModeCharToChanPriv = map[byte]string{} -var ChanPrivToModeChar = map[string]byte{ - "Owner": '~', - "Admin": '&', - "Op": '@', - "HalfOp": '%', - "Voice": '+', -} - -// Init function to fill in reverse mappings for *toString constants. -func init() { - for k, v := range ChanModeToString { - StringToChanMode[v] = k - } - for k, v := range ChanPrivToString { - StringToChanPriv[v] = k - } - for k, v := range ChanPrivToModeChar { - ModeCharToChanPriv[v] = k - } -} - -/******************************************************************************\ - * Channel methods for state management -\******************************************************************************/ - -func newChannel(name string) *channel { - return &channel{ - name: name, - modes: new(ChanMode), - nicks: make(map[*nick]*ChanPrivs), - lookup: make(map[string]*nick), - } -} - -// Returns a copy of the internal tracker channel state at this time. -// Relies on tracker-level locking for concurrent access. -func (ch *channel) Channel() *Channel { - c := &Channel{ - Name: ch.name, - Topic: ch.topic, - Modes: ch.modes.Copy(), - Nicks: make(map[string]*ChanPrivs), - } - for n, cp := range ch.nicks { - c.Nicks[n.nick] = cp.Copy() - } - return c -} - -func (ch *channel) isOn(nk *nick) (*ChanPrivs, bool) { - cp, ok := ch.nicks[nk] - return cp.Copy(), ok -} - -// Associates a Nick with a Channel -func (ch *channel) addNick(nk *nick, cp *ChanPrivs) { - if _, ok := ch.nicks[nk]; !ok { - ch.nicks[nk] = cp - ch.lookup[nk.nick] = nk - } else { - logging.Warn("Channel.addNick(): %s already on %s.", nk.nick, ch.name) - } -} - -// Disassociates a Nick from a Channel. -func (ch *channel) delNick(nk *nick) { - if _, ok := ch.nicks[nk]; ok { - delete(ch.nicks, nk) - delete(ch.lookup, nk.nick) - } else { - logging.Warn("Channel.delNick(): %s not on %s.", nk.nick, ch.name) - } -} - -// Parses mode strings for a channel. -func (ch *channel) parseModes(modes string, modeargs ...string) { - var modeop bool // true => add mode, false => remove mode - var modestr string - for i := 0; i < len(modes); i++ { - switch m := modes[i]; m { - case '+': - modeop = true - modestr = string(m) - case '-': - modeop = false - modestr = string(m) - case 'i': - ch.modes.InviteOnly = modeop - case 'm': - ch.modes.Moderated = modeop - case 'n': - ch.modes.NoExternalMsg = modeop - case 'p': - ch.modes.Private = modeop - case 'r': - ch.modes.Registered = modeop - case 's': - ch.modes.Secret = modeop - case 't': - ch.modes.ProtectedTopic = modeop - case 'z': - ch.modes.SSLOnly = modeop - case 'Z': - ch.modes.AllSSL = modeop - case 'O': - ch.modes.OperOnly = modeop - case 'k': - if modeop && len(modeargs) != 0 { - ch.modes.Key, modeargs = modeargs[0], modeargs[1:] - } else if !modeop { - ch.modes.Key = "" - } else { - logging.Warn("Channel.ParseModes(): not enough arguments to "+ - "process MODE %s %s%c", ch.name, modestr, m) - } - case 'l': - if modeop && len(modeargs) != 0 { - ch.modes.Limit, _ = strconv.Atoi(modeargs[0]) - modeargs = modeargs[1:] - } else if !modeop { - ch.modes.Limit = 0 - } else { - logging.Warn("Channel.ParseModes(): not enough arguments to "+ - "process MODE %s %s%c", ch.name, modestr, m) - } - case 'q', 'a', 'o', 'h', 'v': - if len(modeargs) != 0 { - if nk, ok := ch.lookup[modeargs[0]]; ok { - cp := ch.nicks[nk] - switch m { - case 'q': - cp.Owner = modeop - case 'a': - cp.Admin = modeop - case 'o': - cp.Op = modeop - case 'h': - cp.HalfOp = modeop - case 'v': - cp.Voice = modeop - } - modeargs = modeargs[1:] - } else { - logging.Warn("Channel.ParseModes(): untracked nick %s "+ - "received MODE on channel %s", modeargs[0], ch.name) - } - } else { - logging.Warn("Channel.ParseModes(): not enough arguments to "+ - "process MODE %s %s%c", ch.name, modestr, m) - } - default: - logging.Info("Channel.ParseModes(): unknown mode char %c", m) - } - } -} - -// Returns true if the Nick is associated with the Channel -func (ch *Channel) IsOn(nk string) (*ChanPrivs, bool) { - cp, ok := ch.Nicks[nk] - return cp, ok -} - -// Test Channel equality. -func (ch *Channel) Equals(other *Channel) bool { - return reflect.DeepEqual(ch, other) -} - -// Duplicates a ChanMode struct. -func (cm *ChanMode) Copy() *ChanMode { - if cm == nil { - return nil - } - c := *cm - return &c -} - -// Test ChanMode equality. -func (cm *ChanMode) Equals(other *ChanMode) bool { - return reflect.DeepEqual(cm, other) -} - -// Duplicates a ChanPrivs struct. -func (cp *ChanPrivs) Copy() *ChanPrivs { - if cp == nil { - return nil - } - c := *cp - return &c -} - -// Test ChanPrivs equality. -func (cp *ChanPrivs) Equals(other *ChanPrivs) bool { - return reflect.DeepEqual(cp, other) -} - -// Returns a string representing the channel. Looks like: -// Channel: e.g. #moo -// Topic: e.g. Discussing the merits of cows! -// Mode: e.g. +nsti -// Nicks: -// : e.g. CowMaster: +o -// ... -func (ch *Channel) String() string { - str := "Channel: " + ch.Name + "\n\t" - str += "Topic: " + ch.Topic + "\n\t" - str += "Modes: " + ch.Modes.String() + "\n\t" - str += "Nicks: \n" - for nk, cp := range ch.Nicks { - str += "\t\t" + nk + ": " + cp.String() + "\n" - } - return str -} - -func (ch *channel) String() string { - return ch.Channel().String() -} - -// Returns a string representing the channel modes. Looks like: -// +npk key -func (cm *ChanMode) String() string { - if cm == nil { - return "No modes set" - } - str := "+" - a := make([]string, 0) - v := reflect.Indirect(reflect.ValueOf(cm)) - t := v.Type() - for i := 0; i < v.NumField(); i++ { - switch f := v.Field(i); f.Kind() { - case reflect.Bool: - if f.Bool() { - str += ChanModeToString[t.Field(i).Name] - } - case reflect.String: - if f.String() != "" { - str += ChanModeToString[t.Field(i).Name] - a = append(a, f.String()) - } - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - if f.Int() != 0 { - str += ChanModeToString[t.Field(i).Name] - a = append(a, strconv.FormatInt(f.Int(), 10)) - } - } - } - for _, s := range a { - if s != "" { - str += " " + s - } - } - if str == "+" { - str = "No modes set" - } - return str -} - -// Returns a string representing the channel privileges. Looks like: -// +o -func (cp *ChanPrivs) String() string { - if cp == nil { - return "No modes set" - } - str := "+" - v := reflect.Indirect(reflect.ValueOf(cp)) - t := v.Type() - for i := 0; i < v.NumField(); i++ { - switch f := v.Field(i); f.Kind() { - // only bools here at the mo too! - case reflect.Bool: - if f.Bool() { - str += ChanPrivToString[t.Field(i).Name] - } - } - } - if str == "+" { - str = "No modes set" - } - return str -} diff --git a/vendor/github.com/fluffle/goirc/state/mock_tracker.go b/vendor/github.com/fluffle/goirc/state/mock_tracker.go deleted file mode 100644 index aa594c4..0000000 --- a/vendor/github.com/fluffle/goirc/state/mock_tracker.go +++ /dev/null @@ -1,201 +0,0 @@ -// Automatically generated by MockGen. DO NOT EDIT! -// Source: tracker.go - -package state - -import ( - gomock "github.com/golang/mock/gomock" -) - -// Mock of Tracker interface -type MockTracker struct { - ctrl *gomock.Controller - recorder *_MockTrackerRecorder -} - -// Recorder for MockTracker (not exported) -type _MockTrackerRecorder struct { - mock *MockTracker -} - -func NewMockTracker(ctrl *gomock.Controller) *MockTracker { - mock := &MockTracker{ctrl: ctrl} - mock.recorder = &_MockTrackerRecorder{mock} - return mock -} - -func (_m *MockTracker) EXPECT() *_MockTrackerRecorder { - return _m.recorder -} - -func (_m *MockTracker) NewNick(nick string) *Nick { - ret := _m.ctrl.Call(_m, "NewNick", nick) - ret0, _ := ret[0].(*Nick) - return ret0 -} - -func (_mr *_MockTrackerRecorder) NewNick(arg0 interface{}) *gomock.Call { - return _mr.mock.ctrl.RecordCall(_mr.mock, "NewNick", arg0) -} - -func (_m *MockTracker) GetNick(nick string) *Nick { - ret := _m.ctrl.Call(_m, "GetNick", nick) - ret0, _ := ret[0].(*Nick) - return ret0 -} - -func (_mr *_MockTrackerRecorder) GetNick(arg0 interface{}) *gomock.Call { - return _mr.mock.ctrl.RecordCall(_mr.mock, "GetNick", arg0) -} - -func (_m *MockTracker) ReNick(old string, neu string) *Nick { - ret := _m.ctrl.Call(_m, "ReNick", old, neu) - ret0, _ := ret[0].(*Nick) - return ret0 -} - -func (_mr *_MockTrackerRecorder) ReNick(arg0, arg1 interface{}) *gomock.Call { - return _mr.mock.ctrl.RecordCall(_mr.mock, "ReNick", arg0, arg1) -} - -func (_m *MockTracker) DelNick(nick string) *Nick { - ret := _m.ctrl.Call(_m, "DelNick", nick) - ret0, _ := ret[0].(*Nick) - return ret0 -} - -func (_mr *_MockTrackerRecorder) DelNick(arg0 interface{}) *gomock.Call { - return _mr.mock.ctrl.RecordCall(_mr.mock, "DelNick", arg0) -} - -func (_m *MockTracker) NickInfo(nick string, ident string, host string, name string) *Nick { - ret := _m.ctrl.Call(_m, "NickInfo", nick, ident, host, name) - ret0, _ := ret[0].(*Nick) - return ret0 -} - -func (_mr *_MockTrackerRecorder) NickInfo(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { - return _mr.mock.ctrl.RecordCall(_mr.mock, "NickInfo", arg0, arg1, arg2, arg3) -} - -func (_m *MockTracker) NickModes(nick string, modestr string) *Nick { - ret := _m.ctrl.Call(_m, "NickModes", nick, modestr) - ret0, _ := ret[0].(*Nick) - return ret0 -} - -func (_mr *_MockTrackerRecorder) NickModes(arg0, arg1 interface{}) *gomock.Call { - return _mr.mock.ctrl.RecordCall(_mr.mock, "NickModes", arg0, arg1) -} - -func (_m *MockTracker) NewChannel(channel string) *Channel { - ret := _m.ctrl.Call(_m, "NewChannel", channel) - ret0, _ := ret[0].(*Channel) - return ret0 -} - -func (_mr *_MockTrackerRecorder) NewChannel(arg0 interface{}) *gomock.Call { - return _mr.mock.ctrl.RecordCall(_mr.mock, "NewChannel", arg0) -} - -func (_m *MockTracker) GetChannel(channel string) *Channel { - ret := _m.ctrl.Call(_m, "GetChannel", channel) - ret0, _ := ret[0].(*Channel) - return ret0 -} - -func (_mr *_MockTrackerRecorder) GetChannel(arg0 interface{}) *gomock.Call { - return _mr.mock.ctrl.RecordCall(_mr.mock, "GetChannel", arg0) -} - -func (_m *MockTracker) DelChannel(channel string) *Channel { - ret := _m.ctrl.Call(_m, "DelChannel", channel) - ret0, _ := ret[0].(*Channel) - return ret0 -} - -func (_mr *_MockTrackerRecorder) DelChannel(arg0 interface{}) *gomock.Call { - return _mr.mock.ctrl.RecordCall(_mr.mock, "DelChannel", arg0) -} - -func (_m *MockTracker) Topic(channel string, topic string) *Channel { - ret := _m.ctrl.Call(_m, "Topic", channel, topic) - ret0, _ := ret[0].(*Channel) - return ret0 -} - -func (_mr *_MockTrackerRecorder) Topic(arg0, arg1 interface{}) *gomock.Call { - return _mr.mock.ctrl.RecordCall(_mr.mock, "Topic", arg0, arg1) -} - -func (_m *MockTracker) ChannelModes(channel string, modestr string, modeargs ...string) *Channel { - _s := []interface{}{channel, modestr} - for _, _x := range modeargs { - _s = append(_s, _x) - } - ret := _m.ctrl.Call(_m, "ChannelModes", _s...) - ret0, _ := ret[0].(*Channel) - return ret0 -} - -func (_mr *_MockTrackerRecorder) ChannelModes(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { - _s := append([]interface{}{arg0, arg1}, arg2...) - return _mr.mock.ctrl.RecordCall(_mr.mock, "ChannelModes", _s...) -} - -func (_m *MockTracker) Me() *Nick { - ret := _m.ctrl.Call(_m, "Me") - ret0, _ := ret[0].(*Nick) - return ret0 -} - -func (_mr *_MockTrackerRecorder) Me() *gomock.Call { - return _mr.mock.ctrl.RecordCall(_mr.mock, "Me") -} - -func (_m *MockTracker) IsOn(channel string, nick string) (*ChanPrivs, bool) { - ret := _m.ctrl.Call(_m, "IsOn", channel, nick) - ret0, _ := ret[0].(*ChanPrivs) - ret1, _ := ret[1].(bool) - return ret0, ret1 -} - -func (_mr *_MockTrackerRecorder) IsOn(arg0, arg1 interface{}) *gomock.Call { - return _mr.mock.ctrl.RecordCall(_mr.mock, "IsOn", arg0, arg1) -} - -func (_m *MockTracker) Associate(channel string, nick string) *ChanPrivs { - ret := _m.ctrl.Call(_m, "Associate", channel, nick) - ret0, _ := ret[0].(*ChanPrivs) - return ret0 -} - -func (_mr *_MockTrackerRecorder) Associate(arg0, arg1 interface{}) *gomock.Call { - return _mr.mock.ctrl.RecordCall(_mr.mock, "Associate", arg0, arg1) -} - -func (_m *MockTracker) Dissociate(channel string, nick string) { - _m.ctrl.Call(_m, "Dissociate", channel, nick) -} - -func (_mr *_MockTrackerRecorder) Dissociate(arg0, arg1 interface{}) *gomock.Call { - return _mr.mock.ctrl.RecordCall(_mr.mock, "Dissociate", arg0, arg1) -} - -func (_m *MockTracker) Wipe() { - _m.ctrl.Call(_m, "Wipe") -} - -func (_mr *_MockTrackerRecorder) Wipe() *gomock.Call { - return _mr.mock.ctrl.RecordCall(_mr.mock, "Wipe") -} - -func (_m *MockTracker) String() string { - ret := _m.ctrl.Call(_m, "String") - ret0, _ := ret[0].(string) - return ret0 -} - -func (_mr *_MockTrackerRecorder) String() *gomock.Call { - return _mr.mock.ctrl.RecordCall(_mr.mock, "String") -} diff --git a/vendor/github.com/fluffle/goirc/state/nick.go b/vendor/github.com/fluffle/goirc/state/nick.go deleted file mode 100644 index b29d98a..0000000 --- a/vendor/github.com/fluffle/goirc/state/nick.go +++ /dev/null @@ -1,205 +0,0 @@ -package state - -import ( - "github.com/fluffle/goirc/logging" - - "reflect" -) - -// A Nick is returned from the state tracker and contains -// a copy of the nick state at a particular time. -type Nick struct { - Nick, Ident, Host, Name string - Modes *NickMode - Channels map[string]*ChanPrivs -} - -// Internal bookkeeping struct for nicks. -type nick struct { - nick, ident, host, name string - modes *NickMode - lookup map[string]*channel - chans map[*channel]*ChanPrivs -} - -// A struct representing the modes of an IRC Nick (User Modes) -// (again, only the ones we care about) -// -// This is only really useful for me, as we can't see other people's modes -// without IRC operator privileges (and even then only on some IRCd's). -type NickMode struct { - // MODE +B, +i, +o, +w, +x, +z - Bot, Invisible, Oper, WallOps, HiddenHost, SSL bool -} - -// Map *irc.NickMode fields to IRC mode characters and vice versa -var StringToNickMode = map[string]string{} -var NickModeToString = map[string]string{ - "Bot": "B", - "Invisible": "i", - "Oper": "o", - "WallOps": "w", - "HiddenHost": "x", - "SSL": "z", -} - -func init() { - for k, v := range NickModeToString { - StringToNickMode[v] = k - } -} - -/******************************************************************************\ - * nick methods for state management -\******************************************************************************/ - -func newNick(n string) *nick { - return &nick{ - nick: n, - modes: new(NickMode), - chans: make(map[*channel]*ChanPrivs), - lookup: make(map[string]*channel), - } -} - -// Returns a copy of the internal tracker nick state at this time. -// Relies on tracker-level locking for concurrent access. -func (nk *nick) Nick() *Nick { - n := &Nick{ - Nick: nk.nick, - Ident: nk.ident, - Host: nk.host, - Name: nk.name, - Modes: nk.modes.Copy(), - Channels: make(map[string]*ChanPrivs), - } - for c, cp := range nk.chans { - n.Channels[c.name] = cp.Copy() - } - return n -} - -func (nk *nick) isOn(ch *channel) (*ChanPrivs, bool) { - cp, ok := nk.chans[ch] - return cp.Copy(), ok -} - -// Associates a Channel with a Nick. -func (nk *nick) addChannel(ch *channel, cp *ChanPrivs) { - if _, ok := nk.chans[ch]; !ok { - nk.chans[ch] = cp - nk.lookup[ch.name] = ch - } else { - logging.Warn("Nick.addChannel(): %s already on %s.", nk.nick, ch.name) - } -} - -// Disassociates a Channel from a Nick. -func (nk *nick) delChannel(ch *channel) { - if _, ok := nk.chans[ch]; ok { - delete(nk.chans, ch) - delete(nk.lookup, ch.name) - } else { - logging.Warn("Nick.delChannel(): %s not on %s.", nk.nick, ch.name) - } -} - -// Parse mode strings for a Nick. -func (nk *nick) parseModes(modes string) { - var modeop bool // true => add mode, false => remove mode - for i := 0; i < len(modes); i++ { - switch m := modes[i]; m { - case '+': - modeop = true - case '-': - modeop = false - case 'B': - nk.modes.Bot = modeop - case 'i': - nk.modes.Invisible = modeop - case 'o': - nk.modes.Oper = modeop - case 'w': - nk.modes.WallOps = modeop - case 'x': - nk.modes.HiddenHost = modeop - case 'z': - nk.modes.SSL = modeop - default: - logging.Info("Nick.ParseModes(): unknown mode char %c", m) - } - } -} - -// Returns true if the Nick is associated with the Channel. -func (nk *Nick) IsOn(ch string) (*ChanPrivs, bool) { - cp, ok := nk.Channels[ch] - return cp, ok -} - -// Tests Nick equality. -func (nk *Nick) Equals(other *Nick) bool { - return reflect.DeepEqual(nk, other) -} - -// Duplicates a NickMode struct. -func (nm *NickMode) Copy() *NickMode { - if nm == nil { - return nil - } - n := *nm - return &n -} - -// Tests NickMode equality. -func (nm *NickMode) Equals(other *NickMode) bool { - return reflect.DeepEqual(nm, other) -} - -// Returns a string representing the nick. Looks like: -// Nick: e.g. CowMaster -// Hostmask: e.g. moo@cows.org -// Real Name: e.g. Steve "CowMaster" Bush -// Modes: e.g. +z -// Channels: -// : e.g. #moo: +o -// ... -func (nk *Nick) String() string { - str := "Nick: " + nk.Nick + "\n\t" - str += "Hostmask: " + nk.Ident + "@" + nk.Host + "\n\t" - str += "Real Name: " + nk.Name + "\n\t" - str += "Modes: " + nk.Modes.String() + "\n\t" - str += "Channels: \n" - for ch, cp := range nk.Channels { - str += "\t\t" + ch + ": " + cp.String() + "\n" - } - return str -} - -func (nk *nick) String() string { - return nk.Nick().String() -} - -// Returns a string representing the nick modes. Looks like: -// +iwx -func (nm *NickMode) String() string { - if nm == nil { - return "No modes set" - } - str := "+" - v := reflect.Indirect(reflect.ValueOf(nm)) - t := v.Type() - for i := 0; i < v.NumField(); i++ { - switch f := v.Field(i); f.Kind() { - // only bools here at the mo! - case reflect.Bool: - if f.Bool() { - str += NickModeToString[t.Field(i).Name] - } - } - } - if str == "+" { - str = "No modes set" - } - return str -} diff --git a/vendor/github.com/fluffle/goirc/state/tracker.go b/vendor/github.com/fluffle/goirc/state/tracker.go deleted file mode 100644 index 209c7cf..0000000 --- a/vendor/github.com/fluffle/goirc/state/tracker.go +++ /dev/null @@ -1,369 +0,0 @@ -package state - -import ( - "github.com/fluffle/goirc/logging" - - "sync" -) - -// The state manager interface -type Tracker interface { - // Nick methods - NewNick(nick string) *Nick - GetNick(nick string) *Nick - ReNick(old, neu string) *Nick - DelNick(nick string) *Nick - NickInfo(nick, ident, host, name string) *Nick - NickModes(nick, modestr string) *Nick - // Channel methods - NewChannel(channel string) *Channel - GetChannel(channel string) *Channel - DelChannel(channel string) *Channel - Topic(channel, topic string) *Channel - ChannelModes(channel, modestr string, modeargs ...string) *Channel - // Information about ME! - Me() *Nick - // And the tracking operations - IsOn(channel, nick string) (*ChanPrivs, bool) - Associate(channel, nick string) *ChanPrivs - Dissociate(channel, nick string) - Wipe() - // The state tracker can output a debugging string - String() string -} - -// ... and a struct to implement it ... -type stateTracker struct { - // Map of channels we're on - chans map[string]*channel - // Map of nicks we know about - nicks map[string]*nick - - // We need to keep state on who we are :-) - me *nick - - // And we need to protect against data races *cough*. - mu sync.Mutex -} - -var _ Tracker = (*stateTracker)(nil) - -// ... and a constructor to make it ... -func NewTracker(mynick string) *stateTracker { - st := &stateTracker{ - chans: make(map[string]*channel), - nicks: make(map[string]*nick), - } - st.me = newNick(mynick) - st.nicks[mynick] = st.me - return st -} - -// ... and a method to wipe the state clean. -func (st *stateTracker) Wipe() { - st.mu.Lock() - defer st.mu.Unlock() - // Deleting all the channels implicitly deletes every nick but me. - for _, ch := range st.chans { - st.delChannel(ch) - } -} - -/******************************************************************************\ - * tracker methods to create/look up nicks/channels -\******************************************************************************/ - -// Creates a new nick, initialises it, and stores it so it -// can be properly tracked for state management purposes. -func (st *stateTracker) NewNick(n string) *Nick { - if n == "" { - logging.Warn("Tracker.NewNick(): Not tracking empty nick.") - return nil - } - st.mu.Lock() - defer st.mu.Unlock() - if _, ok := st.nicks[n]; ok { - logging.Warn("Tracker.NewNick(): %s already tracked.", n) - return nil - } - st.nicks[n] = newNick(n) - return st.nicks[n].Nick() -} - -// Returns a nick for the nick n, if we're tracking it. -func (st *stateTracker) GetNick(n string) *Nick { - st.mu.Lock() - defer st.mu.Unlock() - if nk, ok := st.nicks[n]; ok { - return nk.Nick() - } - return nil -} - -// Signals to the tracker that a nick should be tracked -// under a "neu" nick rather than the old one. -func (st *stateTracker) ReNick(old, neu string) *Nick { - st.mu.Lock() - defer st.mu.Unlock() - nk, ok := st.nicks[old] - if !ok { - logging.Warn("Tracker.ReNick(): %s not tracked.", old) - return nil - } - if _, ok := st.nicks[neu]; ok { - logging.Warn("Tracker.ReNick(): %s already exists.", neu) - return nil - } - - nk.nick = neu - delete(st.nicks, old) - st.nicks[neu] = nk - for ch, _ := range nk.chans { - // We also need to update the lookup maps of all the channels - // the nick is on, to keep things in sync. - delete(ch.lookup, old) - ch.lookup[neu] = nk - } - return nk.Nick() -} - -// Removes a nick from being tracked. -func (st *stateTracker) DelNick(n string) *Nick { - st.mu.Lock() - defer st.mu.Unlock() - if nk, ok := st.nicks[n]; ok { - if nk == st.me { - logging.Warn("Tracker.DelNick(): won't delete myself.") - return nil - } - st.delNick(nk) - return nk.Nick() - } - logging.Warn("Tracker.DelNick(): %s not tracked.", n) - return nil -} - -func (st *stateTracker) delNick(nk *nick) { - // st.mu lock held by DelNick, DelChannel or Wipe - if nk == st.me { - // Shouldn't get here => internal state tracking code is fubar. - logging.Error("Tracker.DelNick(): TRYING TO DELETE ME :-(") - return - } - delete(st.nicks, nk.nick) - for ch, _ := range nk.chans { - nk.delChannel(ch) - ch.delNick(nk) - if len(ch.nicks) == 0 { - // Deleting a nick from tracking shouldn't empty any channels as - // *we* should be on the channel with them to be tracking them. - logging.Error("Tracker.delNick(): deleting nick %s emptied "+ - "channel %s, this shouldn't happen!", nk.nick, ch.name) - } - } -} - -// Sets ident, host and "real" name for the nick. -func (st *stateTracker) NickInfo(n, ident, host, name string) *Nick { - st.mu.Lock() - defer st.mu.Unlock() - nk, ok := st.nicks[n] - if !ok { - return nil - } - nk.ident = ident - nk.host = host - nk.name = name - return nk.Nick() -} - -// Sets user modes for the nick. -func (st *stateTracker) NickModes(n, modes string) *Nick { - st.mu.Lock() - defer st.mu.Unlock() - nk, ok := st.nicks[n] - if !ok { - return nil - } - nk.parseModes(modes) - return nk.Nick() -} - -// Creates a new Channel, initialises it, and stores it so it -// can be properly tracked for state management purposes. -func (st *stateTracker) NewChannel(c string) *Channel { - if c == "" { - logging.Warn("Tracker.NewChannel(): Not tracking empty channel.") - return nil - } - st.mu.Lock() - defer st.mu.Unlock() - if _, ok := st.chans[c]; ok { - logging.Warn("Tracker.NewChannel(): %s already tracked.", c) - return nil - } - st.chans[c] = newChannel(c) - return st.chans[c].Channel() -} - -// Returns a Channel for the channel c, if we're tracking it. -func (st *stateTracker) GetChannel(c string) *Channel { - st.mu.Lock() - defer st.mu.Unlock() - if ch, ok := st.chans[c]; ok { - return ch.Channel() - } - return nil -} - -// Removes a Channel from being tracked. -func (st *stateTracker) DelChannel(c string) *Channel { - st.mu.Lock() - defer st.mu.Unlock() - if ch, ok := st.chans[c]; ok { - st.delChannel(ch) - return ch.Channel() - } - logging.Warn("Tracker.DelChannel(): %s not tracked.", c) - return nil -} - -func (st *stateTracker) delChannel(ch *channel) { - // st.mu lock held by DelChannel or Wipe - delete(st.chans, ch.name) - for nk, _ := range ch.nicks { - ch.delNick(nk) - nk.delChannel(ch) - if len(nk.chans) == 0 && nk != st.me { - // We're no longer in any channels with this nick. - st.delNick(nk) - } - } -} - -// Sets the topic of a channel. -func (st *stateTracker) Topic(c, topic string) *Channel { - st.mu.Lock() - defer st.mu.Unlock() - ch, ok := st.chans[c] - if !ok { - return nil - } - ch.topic = topic - return ch.Channel() -} - -// Sets modes for a channel, including privileges like +o. -func (st *stateTracker) ChannelModes(c, modes string, args ...string) *Channel { - st.mu.Lock() - defer st.mu.Unlock() - ch, ok := st.chans[c] - if !ok { - return nil - } - ch.parseModes(modes, args...) - return ch.Channel() -} - -// Returns the Nick the state tracker thinks is Me. -// NOTE: Nick() requires the mutex to be held. -func (st *stateTracker) Me() *Nick { - st.mu.Lock() - defer st.mu.Unlock() - return st.me.Nick() -} - -// Returns true if both the channel c and the nick n are tracked -// and the nick is associated with the channel. -func (st *stateTracker) IsOn(c, n string) (*ChanPrivs, bool) { - st.mu.Lock() - defer st.mu.Unlock() - nk, nok := st.nicks[n] - ch, cok := st.chans[c] - if nok && cok { - return nk.isOn(ch) - } - return nil, false -} - -// Associates an already known nick with an already known channel. -func (st *stateTracker) Associate(c, n string) *ChanPrivs { - st.mu.Lock() - defer st.mu.Unlock() - nk, nok := st.nicks[n] - ch, cok := st.chans[c] - - if !cok { - // As we can implicitly delete both nicks and channels from being - // tracked by dissociating one from the other, we should verify that - // we're not being passed an old Nick or Channel. - logging.Error("Tracker.Associate(): channel %s not found in "+ - "internal state.", c) - return nil - } else if !nok { - logging.Error("Tracker.Associate(): nick %s not found in "+ - "internal state.", n) - return nil - } else if _, ok := nk.isOn(ch); ok { - logging.Warn("Tracker.Associate(): %s already on %s.", - nk, ch) - return nil - } - cp := new(ChanPrivs) - ch.addNick(nk, cp) - nk.addChannel(ch, cp) - return cp.Copy() -} - -// Dissociates an already known nick from an already known channel. -// Does some tidying up to stop tracking nicks we're no longer on -// any common channels with, and channels we're no longer on. -func (st *stateTracker) Dissociate(c, n string) { - st.mu.Lock() - defer st.mu.Unlock() - nk, nok := st.nicks[n] - ch, cok := st.chans[c] - - if !cok { - // As we can implicitly delete both nicks and channels from being - // tracked by dissociating one from the other, we should verify that - // we're not being passed an old Nick or Channel. - logging.Error("Tracker.Dissociate(): channel %s not found in "+ - "internal state.", c) - } else if !nok { - logging.Error("Tracker.Dissociate(): nick %s not found in "+ - "internal state.", n) - } else if _, ok := nk.isOn(ch); !ok { - logging.Warn("Tracker.Dissociate(): %s not on %s.", - nk.nick, ch.name) - } else if nk == st.me { - // I'm leaving the channel for some reason, so it won't be tracked. - st.delChannel(ch) - } else { - // Remove the nick from the channel and the channel from the nick. - ch.delNick(nk) - nk.delChannel(ch) - if len(nk.chans) == 0 { - // We're no longer in any channels with this nick. - st.delNick(nk) - } - } -} - -func (st *stateTracker) String() string { - st.mu.Lock() - defer st.mu.Unlock() - str := "GoIRC Channels\n" - str += "--------------\n\n" - for _, ch := range st.chans { - str += ch.String() + "\n" - } - str += "GoIRC NickNames\n" - str += "---------------\n\n" - for _, n := range st.nicks { - if n != st.me { - str += n.String() + "\n" - } - } - return str -} diff --git a/vendor/github.com/golang/mock/AUTHORS b/vendor/github.com/golang/mock/AUTHORS deleted file mode 100644 index 660b8cc..0000000 --- a/vendor/github.com/golang/mock/AUTHORS +++ /dev/null @@ -1,12 +0,0 @@ -# This is the official list of GoMock authors for copyright purposes. -# This file is distinct from the CONTRIBUTORS files. -# See the latter for an explanation. - -# Names should be added to this file as -# Name or Organization -# The email address is not required for organizations. - -# Please keep the list sorted. - -Alex Reece -Google Inc. diff --git a/vendor/github.com/golang/mock/CONTRIBUTORS b/vendor/github.com/golang/mock/CONTRIBUTORS deleted file mode 100644 index def849c..0000000 --- a/vendor/github.com/golang/mock/CONTRIBUTORS +++ /dev/null @@ -1,37 +0,0 @@ -# This is the official list of people who can contribute (and typically -# have contributed) code to the gomock repository. -# The AUTHORS file lists the copyright holders; this file -# lists people. For example, Google employees are listed here -# but not in AUTHORS, because Google holds the copyright. -# -# The submission process automatically checks to make sure -# that people submitting code are listed in this file (by email address). -# -# Names should be added to this file only after verifying that -# the individual or the individual's organization has agreed to -# the appropriate Contributor License Agreement, found here: -# -# http://code.google.com/legal/individual-cla-v1.0.html -# http://code.google.com/legal/corporate-cla-v1.0.html -# -# The agreement for individuals can be filled out on the web. -# -# When adding J Random Contributor's name to this file, -# either J's name or J's organization's name should be -# added to the AUTHORS file, depending on whether the -# individual or corporate CLA was used. - -# Names should be added to this file like so: -# Name -# -# An entry with two email addresses specifies that the -# first address should be used in the submit logs and -# that the second address should be recognized as the -# same person when interacting with Rietveld. - -# Please keep the list sorted. - -Aaron Jacobs -Alex Reece -David Symonds -Ryan Barrett diff --git a/vendor/github.com/golang/mock/LICENSE b/vendor/github.com/golang/mock/LICENSE deleted file mode 100644 index d645695..0000000 --- a/vendor/github.com/golang/mock/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/golang/mock/gomock/call.go b/vendor/github.com/golang/mock/gomock/call.go deleted file mode 100644 index 3d54d9f..0000000 --- a/vendor/github.com/golang/mock/gomock/call.go +++ /dev/null @@ -1,420 +0,0 @@ -// Copyright 2010 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package gomock - -import ( - "fmt" - "reflect" - "strconv" - "strings" -) - -// Call represents an expected call to a mock. -type Call struct { - t TestHelper // for triggering test failures on invalid call setup - - receiver interface{} // the receiver of the method call - method string // the name of the method - methodType reflect.Type // the type of the method - args []Matcher // the args - origin string // file and line number of call setup - - preReqs []*Call // prerequisite calls - - // Expectations - minCalls, maxCalls int - - numCalls int // actual number made - - // actions are called when this Call is called. Each action gets the args and - // can set the return values by returning a non-nil slice. Actions run in the - // order they are created. - actions []func([]interface{}) []interface{} -} - -// newCall creates a *Call. It requires the method type in order to support -// unexported methods. -func newCall(t TestHelper, receiver interface{}, method string, methodType reflect.Type, args ...interface{}) *Call { - t.Helper() - - // TODO: check arity, types. - margs := make([]Matcher, len(args)) - for i, arg := range args { - if m, ok := arg.(Matcher); ok { - margs[i] = m - } else if arg == nil { - // Handle nil specially so that passing a nil interface value - // will match the typed nils of concrete args. - margs[i] = Nil() - } else { - margs[i] = Eq(arg) - } - } - - origin := callerInfo(3) - actions := []func([]interface{}) []interface{}{func([]interface{}) []interface{} { - // Synthesize the zero value for each of the return args' types. - rets := make([]interface{}, methodType.NumOut()) - for i := 0; i < methodType.NumOut(); i++ { - rets[i] = reflect.Zero(methodType.Out(i)).Interface() - } - return rets - }} - return &Call{t: t, receiver: receiver, method: method, methodType: methodType, - args: margs, origin: origin, minCalls: 1, maxCalls: 1, actions: actions} -} - -// AnyTimes allows the expectation to be called 0 or more times -func (c *Call) AnyTimes() *Call { - c.minCalls, c.maxCalls = 0, 1e8 // close enough to infinity - return c -} - -// MinTimes requires the call to occur at least n times. If AnyTimes or MaxTimes have not been called, MinTimes also -// sets the maximum number of calls to infinity. -func (c *Call) MinTimes(n int) *Call { - c.minCalls = n - if c.maxCalls == 1 { - c.maxCalls = 1e8 - } - return c -} - -// MaxTimes limits the number of calls to n times. If AnyTimes or MinTimes have not been called, MaxTimes also -// sets the minimum number of calls to 0. -func (c *Call) MaxTimes(n int) *Call { - c.maxCalls = n - if c.minCalls == 1 { - c.minCalls = 0 - } - return c -} - -// DoAndReturn declares the action to run when the call is matched. -// The return values from this function are returned by the mocked function. -// It takes an interface{} argument to support n-arity functions. -func (c *Call) DoAndReturn(f interface{}) *Call { - // TODO: Check arity and types here, rather than dying badly elsewhere. - v := reflect.ValueOf(f) - - c.addAction(func(args []interface{}) []interface{} { - vargs := make([]reflect.Value, len(args)) - ft := v.Type() - for i := 0; i < len(args); i++ { - if args[i] != nil { - vargs[i] = reflect.ValueOf(args[i]) - } else { - // Use the zero value for the arg. - vargs[i] = reflect.Zero(ft.In(i)) - } - } - vrets := v.Call(vargs) - rets := make([]interface{}, len(vrets)) - for i, ret := range vrets { - rets[i] = ret.Interface() - } - return rets - }) - return c -} - -// Do declares the action to run when the call is matched. The function's -// return values are ignored to retain backward compatibility. To use the -// return values call DoAndReturn. -// It takes an interface{} argument to support n-arity functions. -func (c *Call) Do(f interface{}) *Call { - // TODO: Check arity and types here, rather than dying badly elsewhere. - v := reflect.ValueOf(f) - - c.addAction(func(args []interface{}) []interface{} { - vargs := make([]reflect.Value, len(args)) - ft := v.Type() - for i := 0; i < len(args); i++ { - if args[i] != nil { - vargs[i] = reflect.ValueOf(args[i]) - } else { - // Use the zero value for the arg. - vargs[i] = reflect.Zero(ft.In(i)) - } - } - v.Call(vargs) - return nil - }) - return c -} - -// Return declares the values to be returned by the mocked function call. -func (c *Call) Return(rets ...interface{}) *Call { - c.t.Helper() - - mt := c.methodType - if len(rets) != mt.NumOut() { - c.t.Fatalf("wrong number of arguments to Return for %T.%v: got %d, want %d [%s]", - c.receiver, c.method, len(rets), mt.NumOut(), c.origin) - } - for i, ret := range rets { - if got, want := reflect.TypeOf(ret), mt.Out(i); got == want { - // Identical types; nothing to do. - } else if got == nil { - // Nil needs special handling. - switch want.Kind() { - case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: - // ok - default: - c.t.Fatalf("argument %d to Return for %T.%v is nil, but %v is not nillable [%s]", - i, c.receiver, c.method, want, c.origin) - } - } else if got.AssignableTo(want) { - // Assignable type relation. Make the assignment now so that the generated code - // can return the values with a type assertion. - v := reflect.New(want).Elem() - v.Set(reflect.ValueOf(ret)) - rets[i] = v.Interface() - } else { - c.t.Fatalf("wrong type of argument %d to Return for %T.%v: %v is not assignable to %v [%s]", - i, c.receiver, c.method, got, want, c.origin) - } - } - - c.addAction(func([]interface{}) []interface{} { - return rets - }) - - return c -} - -// Times declares the exact number of times a function call is expected to be executed. -func (c *Call) Times(n int) *Call { - c.minCalls, c.maxCalls = n, n - return c -} - -// SetArg declares an action that will set the nth argument's value, -// indirected through a pointer. Or, in the case of a slice, SetArg -// will copy value's elements into the nth argument. -func (c *Call) SetArg(n int, value interface{}) *Call { - c.t.Helper() - - mt := c.methodType - // TODO: This will break on variadic methods. - // We will need to check those at invocation time. - if n < 0 || n >= mt.NumIn() { - c.t.Fatalf("SetArg(%d, ...) called for a method with %d args [%s]", - n, mt.NumIn(), c.origin) - } - // Permit setting argument through an interface. - // In the interface case, we don't (nay, can't) check the type here. - at := mt.In(n) - switch at.Kind() { - case reflect.Ptr: - dt := at.Elem() - if vt := reflect.TypeOf(value); !vt.AssignableTo(dt) { - c.t.Fatalf("SetArg(%d, ...) argument is a %v, not assignable to %v [%s]", - n, vt, dt, c.origin) - } - case reflect.Interface: - // nothing to do - case reflect.Slice: - // nothing to do - default: - c.t.Fatalf("SetArg(%d, ...) referring to argument of non-pointer non-interface non-slice type %v [%s]", - n, at, c.origin) - } - - c.addAction(func(args []interface{}) []interface{} { - v := reflect.ValueOf(value) - switch reflect.TypeOf(args[n]).Kind() { - case reflect.Slice: - setSlice(args[n], v) - default: - reflect.ValueOf(args[n]).Elem().Set(v) - } - return nil - }) - return c -} - -// isPreReq returns true if other is a direct or indirect prerequisite to c. -func (c *Call) isPreReq(other *Call) bool { - for _, preReq := range c.preReqs { - if other == preReq || preReq.isPreReq(other) { - return true - } - } - return false -} - -// After declares that the call may only match after preReq has been exhausted. -func (c *Call) After(preReq *Call) *Call { - c.t.Helper() - - if c == preReq { - c.t.Fatalf("A call isn't allowed to be its own prerequisite") - } - if preReq.isPreReq(c) { - c.t.Fatalf("Loop in call order: %v is a prerequisite to %v (possibly indirectly).", c, preReq) - } - - c.preReqs = append(c.preReqs, preReq) - return c -} - -// Returns true if the minimum number of calls have been made. -func (c *Call) satisfied() bool { - return c.numCalls >= c.minCalls -} - -// Returns true iff the maximum number of calls have been made. -func (c *Call) exhausted() bool { - return c.numCalls >= c.maxCalls -} - -func (c *Call) String() string { - args := make([]string, len(c.args)) - for i, arg := range c.args { - args[i] = arg.String() - } - arguments := strings.Join(args, ", ") - return fmt.Sprintf("%T.%v(%s) %s", c.receiver, c.method, arguments, c.origin) -} - -// Tests if the given call matches the expected call. -// If yes, returns nil. If no, returns error with message explaining why it does not match. -func (c *Call) matches(args []interface{}) error { - if !c.methodType.IsVariadic() { - if len(args) != len(c.args) { - return fmt.Errorf("Expected call at %s has the wrong number of arguments. Got: %d, want: %d", - c.origin, len(args), len(c.args)) - } - - for i, m := range c.args { - if !m.Matches(args[i]) { - return fmt.Errorf("Expected call at %s doesn't match the argument at index %s.\nGot: %v\nWant: %v", - c.origin, strconv.Itoa(i), args[i], m) - } - } - } else { - if len(c.args) < c.methodType.NumIn()-1 { - return fmt.Errorf("Expected call at %s has the wrong number of matchers. Got: %d, want: %d", - c.origin, len(c.args), c.methodType.NumIn()-1) - } - if len(c.args) != c.methodType.NumIn() && len(args) != len(c.args) { - return fmt.Errorf("Expected call at %s has the wrong number of arguments. Got: %d, want: %d", - c.origin, len(args), len(c.args)) - } - if len(args) < len(c.args)-1 { - return fmt.Errorf("Expected call at %s has the wrong number of arguments. Got: %d, want: greater than or equal to %d", - c.origin, len(args), len(c.args)-1) - } - - for i, m := range c.args { - if i < c.methodType.NumIn()-1 { - // Non-variadic args - if !m.Matches(args[i]) { - return fmt.Errorf("Expected call at %s doesn't match the argument at index %s.\nGot: %v\nWant: %v", - c.origin, strconv.Itoa(i), args[i], m) - } - continue - } - // The last arg has a possibility of a variadic argument, so let it branch - - // sample: Foo(a int, b int, c ...int) - if i < len(c.args) && i < len(args) { - if m.Matches(args[i]) { - // Got Foo(a, b, c) want Foo(matcherA, matcherB, gomock.Any()) - // Got Foo(a, b, c) want Foo(matcherA, matcherB, someSliceMatcher) - // Got Foo(a, b, c) want Foo(matcherA, matcherB, matcherC) - // Got Foo(a, b) want Foo(matcherA, matcherB) - // Got Foo(a, b, c, d) want Foo(matcherA, matcherB, matcherC, matcherD) - continue - } - } - - // The number of actual args don't match the number of matchers, - // or the last matcher is a slice and the last arg is not. - // If this function still matches it is because the last matcher - // matches all the remaining arguments or the lack of any. - // Convert the remaining arguments, if any, into a slice of the - // expected type. - vargsType := c.methodType.In(c.methodType.NumIn() - 1) - vargs := reflect.MakeSlice(vargsType, 0, len(args)-i) - for _, arg := range args[i:] { - vargs = reflect.Append(vargs, reflect.ValueOf(arg)) - } - if m.Matches(vargs.Interface()) { - // Got Foo(a, b, c, d, e) want Foo(matcherA, matcherB, gomock.Any()) - // Got Foo(a, b, c, d, e) want Foo(matcherA, matcherB, someSliceMatcher) - // Got Foo(a, b) want Foo(matcherA, matcherB, gomock.Any()) - // Got Foo(a, b) want Foo(matcherA, matcherB, someEmptySliceMatcher) - break - } - // Wrong number of matchers or not match. Fail. - // Got Foo(a, b) want Foo(matcherA, matcherB, matcherC, matcherD) - // Got Foo(a, b, c) want Foo(matcherA, matcherB, matcherC, matcherD) - // Got Foo(a, b, c, d) want Foo(matcherA, matcherB, matcherC, matcherD, matcherE) - // Got Foo(a, b, c, d, e) want Foo(matcherA, matcherB, matcherC, matcherD) - // Got Foo(a, b, c) want Foo(matcherA, matcherB) - return fmt.Errorf("Expected call at %s doesn't match the argument at index %s.\nGot: %v\nWant: %v", - c.origin, strconv.Itoa(i), args[i:], c.args[i]) - - } - } - - // Check that all prerequisite calls have been satisfied. - for _, preReqCall := range c.preReqs { - if !preReqCall.satisfied() { - return fmt.Errorf("Expected call at %s doesn't have a prerequisite call satisfied:\n%v\nshould be called before:\n%v", - c.origin, preReqCall, c) - } - } - - // Check that the call is not exhausted. - if c.exhausted() { - return fmt.Errorf("Expected call at %s has already been called the max number of times.", c.origin) - } - - return nil -} - -// dropPrereqs tells the expected Call to not re-check prerequisite calls any -// longer, and to return its current set. -func (c *Call) dropPrereqs() (preReqs []*Call) { - preReqs = c.preReqs - c.preReqs = nil - return -} - -func (c *Call) call(args []interface{}) []func([]interface{}) []interface{} { - c.numCalls++ - return c.actions -} - -// InOrder declares that the given calls should occur in order. -func InOrder(calls ...*Call) { - for i := 1; i < len(calls); i++ { - calls[i].After(calls[i-1]) - } -} - -func setSlice(arg interface{}, v reflect.Value) { - va := reflect.ValueOf(arg) - for i := 0; i < v.Len(); i++ { - va.Index(i).Set(v.Index(i)) - } -} - -func (c *Call) addAction(action func([]interface{}) []interface{}) { - c.actions = append(c.actions, action) -} diff --git a/vendor/github.com/golang/mock/gomock/callset.go b/vendor/github.com/golang/mock/gomock/callset.go deleted file mode 100644 index c44a8a5..0000000 --- a/vendor/github.com/golang/mock/gomock/callset.go +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright 2011 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package gomock - -import ( - "bytes" - "fmt" -) - -// callSet represents a set of expected calls, indexed by receiver and method -// name. -type callSet struct { - // Calls that are still expected. - expected map[callSetKey][]*Call - // Calls that have been exhausted. - exhausted map[callSetKey][]*Call -} - -// callSetKey is the key in the maps in callSet -type callSetKey struct { - receiver interface{} - fname string -} - -func newCallSet() *callSet { - return &callSet{make(map[callSetKey][]*Call), make(map[callSetKey][]*Call)} -} - -// Add adds a new expected call. -func (cs callSet) Add(call *Call) { - key := callSetKey{call.receiver, call.method} - m := cs.expected - if call.exhausted() { - m = cs.exhausted - } - m[key] = append(m[key], call) -} - -// Remove removes an expected call. -func (cs callSet) Remove(call *Call) { - key := callSetKey{call.receiver, call.method} - calls := cs.expected[key] - for i, c := range calls { - if c == call { - // maintain order for remaining calls - cs.expected[key] = append(calls[:i], calls[i+1:]...) - cs.exhausted[key] = append(cs.exhausted[key], call) - break - } - } -} - -// FindMatch searches for a matching call. Returns error with explanation message if no call matched. -func (cs callSet) FindMatch(receiver interface{}, method string, args []interface{}) (*Call, error) { - key := callSetKey{receiver, method} - - // Search through the expected calls. - expected := cs.expected[key] - var callsErrors bytes.Buffer - for _, call := range expected { - err := call.matches(args) - if err != nil { - fmt.Fprintf(&callsErrors, "\n%v", err) - } else { - return call, nil - } - } - - // If we haven't found a match then search through the exhausted calls so we - // get useful error messages. - exhausted := cs.exhausted[key] - for _, call := range exhausted { - if err := call.matches(args); err != nil { - fmt.Fprintf(&callsErrors, "\n%v", err) - } - } - - if len(expected)+len(exhausted) == 0 { - fmt.Fprintf(&callsErrors, "there are no expected calls of the method %q for that receiver", method) - } - - return nil, fmt.Errorf(callsErrors.String()) -} - -// Failures returns the calls that are not satisfied. -func (cs callSet) Failures() []*Call { - failures := make([]*Call, 0, len(cs.expected)) - for _, calls := range cs.expected { - for _, call := range calls { - if !call.satisfied() { - failures = append(failures, call) - } - } - } - return failures -} diff --git a/vendor/github.com/golang/mock/gomock/controller.go b/vendor/github.com/golang/mock/gomock/controller.go deleted file mode 100644 index 0651c91..0000000 --- a/vendor/github.com/golang/mock/gomock/controller.go +++ /dev/null @@ -1,264 +0,0 @@ -// Copyright 2010 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package gomock is a mock framework for Go. -// -// Standard usage: -// (1) Define an interface that you wish to mock. -// type MyInterface interface { -// SomeMethod(x int64, y string) -// } -// (2) Use mockgen to generate a mock from the interface. -// (3) Use the mock in a test: -// func TestMyThing(t *testing.T) { -// mockCtrl := gomock.NewController(t) -// defer mockCtrl.Finish() -// -// mockObj := something.NewMockMyInterface(mockCtrl) -// mockObj.EXPECT().SomeMethod(4, "blah") -// // pass mockObj to a real object and play with it. -// } -// -// By default, expected calls are not enforced to run in any particular order. -// Call order dependency can be enforced by use of InOrder and/or Call.After. -// Call.After can create more varied call order dependencies, but InOrder is -// often more convenient. -// -// The following examples create equivalent call order dependencies. -// -// Example of using Call.After to chain expected call order: -// -// firstCall := mockObj.EXPECT().SomeMethod(1, "first") -// secondCall := mockObj.EXPECT().SomeMethod(2, "second").After(firstCall) -// mockObj.EXPECT().SomeMethod(3, "third").After(secondCall) -// -// Example of using InOrder to declare expected call order: -// -// gomock.InOrder( -// mockObj.EXPECT().SomeMethod(1, "first"), -// mockObj.EXPECT().SomeMethod(2, "second"), -// mockObj.EXPECT().SomeMethod(3, "third"), -// ) -// -// TODO: -// - Handle different argument/return types (e.g. ..., chan, map, interface). -package gomock - -import ( - "context" - "fmt" - "reflect" - "runtime" - "sync" -) - -// A TestReporter is something that can be used to report test failures. It -// is satisfied by the standard library's *testing.T. -type TestReporter interface { - Errorf(format string, args ...interface{}) - Fatalf(format string, args ...interface{}) -} - -// TestHelper is a TestReporter that has the Helper method. It is satisfied -// by the standard library's *testing.T. -type TestHelper interface { - TestReporter - Helper() -} - -// A Controller represents the top-level control of a mock ecosystem. It -// defines the scope and lifetime of mock objects, as well as their -// expectations. It is safe to call Controller's methods from multiple -// goroutines. Each test should create a new Controller and invoke Finish via -// defer. -// -// func TestFoo(t *testing.T) { -// ctrl := gomock.NewController(st) -// defer ctrl.Finish() -// // .. -// } -// -// func TestBar(t *testing.T) { -// t.Run("Sub-Test-1", st) { -// ctrl := gomock.NewController(st) -// defer ctrl.Finish() -// // .. -// }) -// t.Run("Sub-Test-2", st) { -// ctrl := gomock.NewController(st) -// defer ctrl.Finish() -// // .. -// }) -// }) -type Controller struct { - // T should only be called within a generated mock. It is not intended to - // be used in user code and may be changed in future versions. T is the - // TestReporter passed in when creating the Controller via NewController. - // If the TestReporter does not implement a TestHelper it will be wrapped - // with a nopTestHelper. - T TestHelper - mu sync.Mutex - expectedCalls *callSet - finished bool -} - -// NewController returns a new Controller. It is the preferred way to create a -// Controller. -func NewController(t TestReporter) *Controller { - h, ok := t.(TestHelper) - if !ok { - h = nopTestHelper{t} - } - - return &Controller{ - T: h, - expectedCalls: newCallSet(), - } -} - -type cancelReporter struct { - TestHelper - cancel func() -} - -func (r *cancelReporter) Errorf(format string, args ...interface{}) { - r.TestHelper.Errorf(format, args...) -} -func (r *cancelReporter) Fatalf(format string, args ...interface{}) { - defer r.cancel() - r.TestHelper.Fatalf(format, args...) -} - -// WithContext returns a new Controller and a Context, which is cancelled on any -// fatal failure. -func WithContext(ctx context.Context, t TestReporter) (*Controller, context.Context) { - h, ok := t.(TestHelper) - if !ok { - h = nopTestHelper{t} - } - - ctx, cancel := context.WithCancel(ctx) - return NewController(&cancelReporter{h, cancel}), ctx -} - -type nopTestHelper struct { - TestReporter -} - -func (h nopTestHelper) Helper() {} - -// RecordCall is called by a mock. It should not be called by user code. -func (ctrl *Controller) RecordCall(receiver interface{}, method string, args ...interface{}) *Call { - ctrl.T.Helper() - - recv := reflect.ValueOf(receiver) - for i := 0; i < recv.Type().NumMethod(); i++ { - if recv.Type().Method(i).Name == method { - return ctrl.RecordCallWithMethodType(receiver, method, recv.Method(i).Type(), args...) - } - } - ctrl.T.Fatalf("gomock: failed finding method %s on %T", method, receiver) - panic("unreachable") -} - -// RecordCallWithMethodType is called by a mock. It should not be called by user code. -func (ctrl *Controller) RecordCallWithMethodType(receiver interface{}, method string, methodType reflect.Type, args ...interface{}) *Call { - ctrl.T.Helper() - - call := newCall(ctrl.T, receiver, method, methodType, args...) - - ctrl.mu.Lock() - defer ctrl.mu.Unlock() - ctrl.expectedCalls.Add(call) - - return call -} - -// Call is called by a mock. It should not be called by user code. -func (ctrl *Controller) Call(receiver interface{}, method string, args ...interface{}) []interface{} { - ctrl.T.Helper() - - // Nest this code so we can use defer to make sure the lock is released. - actions := func() []func([]interface{}) []interface{} { - ctrl.T.Helper() - ctrl.mu.Lock() - defer ctrl.mu.Unlock() - - expected, err := ctrl.expectedCalls.FindMatch(receiver, method, args) - if err != nil { - origin := callerInfo(2) - ctrl.T.Fatalf("Unexpected call to %T.%v(%v) at %s because: %s", receiver, method, args, origin, err) - } - - // Two things happen here: - // * the matching call no longer needs to check prerequite calls, - // * and the prerequite calls are no longer expected, so remove them. - preReqCalls := expected.dropPrereqs() - for _, preReqCall := range preReqCalls { - ctrl.expectedCalls.Remove(preReqCall) - } - - actions := expected.call(args) - if expected.exhausted() { - ctrl.expectedCalls.Remove(expected) - } - return actions - }() - - var rets []interface{} - for _, action := range actions { - if r := action(args); r != nil { - rets = r - } - } - - return rets -} - -// Finish checks to see if all the methods that were expected to be called -// were called. It should be invoked for each Controller. It is not idempotent -// and therefore can only be invoked once. -func (ctrl *Controller) Finish() { - ctrl.T.Helper() - - ctrl.mu.Lock() - defer ctrl.mu.Unlock() - - if ctrl.finished { - ctrl.T.Fatalf("Controller.Finish was called more than once. It has to be called exactly once.") - } - ctrl.finished = true - - // If we're currently panicking, probably because this is a deferred call, - // pass through the panic. - if err := recover(); err != nil { - panic(err) - } - - // Check that all remaining expected calls are satisfied. - failures := ctrl.expectedCalls.Failures() - for _, call := range failures { - ctrl.T.Errorf("missing call(s) to %v", call) - } - if len(failures) != 0 { - ctrl.T.Fatalf("aborting test due to missing call(s)") - } -} - -func callerInfo(skip int) string { - if _, file, line, ok := runtime.Caller(skip + 1); ok { - return fmt.Sprintf("%s:%d", file, line) - } - return "unknown file" -} diff --git a/vendor/github.com/golang/mock/gomock/matchers.go b/vendor/github.com/golang/mock/gomock/matchers.go deleted file mode 100644 index fbff060..0000000 --- a/vendor/github.com/golang/mock/gomock/matchers.go +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright 2010 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package gomock - -import ( - "fmt" - "reflect" -) - -// A Matcher is a representation of a class of values. -// It is used to represent the valid or expected arguments to a mocked method. -type Matcher interface { - // Matches returns whether x is a match. - Matches(x interface{}) bool - - // String describes what the matcher matches. - String() string -} - -type anyMatcher struct{} - -func (anyMatcher) Matches(x interface{}) bool { - return true -} - -func (anyMatcher) String() string { - return "is anything" -} - -type eqMatcher struct { - x interface{} -} - -func (e eqMatcher) Matches(x interface{}) bool { - return reflect.DeepEqual(e.x, x) -} - -func (e eqMatcher) String() string { - return fmt.Sprintf("is equal to %v", e.x) -} - -type nilMatcher struct{} - -func (nilMatcher) Matches(x interface{}) bool { - if x == nil { - return true - } - - v := reflect.ValueOf(x) - switch v.Kind() { - case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, - reflect.Ptr, reflect.Slice: - return v.IsNil() - } - - return false -} - -func (nilMatcher) String() string { - return "is nil" -} - -type notMatcher struct { - m Matcher -} - -func (n notMatcher) Matches(x interface{}) bool { - return !n.m.Matches(x) -} - -func (n notMatcher) String() string { - // TODO: Improve this if we add a NotString method to the Matcher interface. - return "not(" + n.m.String() + ")" -} - -type assignableToTypeOfMatcher struct { - targetType reflect.Type -} - -func (m assignableToTypeOfMatcher) Matches(x interface{}) bool { - return reflect.TypeOf(x).AssignableTo(m.targetType) -} - -func (m assignableToTypeOfMatcher) String() string { - return "is assignable to " + m.targetType.Name() -} - -// Constructors -// Any returns a matcher that always matches. -func Any() Matcher { return anyMatcher{} } - -// Eq returns a matcher that matches on equality. -// -// Example usage: -// Eq(5).Matches(5) // returns true -// Eq(5).Matches(4) // returns false -func Eq(x interface{}) Matcher { return eqMatcher{x} } - -// Nil returns a matcher that matches if the received value is nil. -// -// Example usage: -// var x *bytes.Buffer -// Nil().Matches(x) // returns true -// x = &bytes.Buffer{} -// Nil().Matches(x) // returns false -func Nil() Matcher { return nilMatcher{} } - -// Not reverses the results of its given child matcher. -// -// Example usage: -// Not(Eq(5)).Matches(4) // returns true -// Not(Eq(5)).Matches(5) // returns false -func Not(x interface{}) Matcher { - if m, ok := x.(Matcher); ok { - return notMatcher{m} - } - return notMatcher{Eq(x)} -} - -// AssignableToTypeOf is a Matcher that matches if the parameter to the mock -// function is assignable to the type of the parameter to this function. -// -// Example usage: -// var s fmt.Stringer = &bytes.Buffer{} -// AssignableToTypeOf(s).Matches(time.Second) // returns true -// AssignableToTypeOf(s).Matches(99) // returns false -func AssignableToTypeOf(x interface{}) Matcher { - return assignableToTypeOfMatcher{reflect.TypeOf(x)} -} diff --git a/vendor/github.com/hashicorp/golang-lru/.gitignore b/vendor/github.com/hashicorp/golang-lru/.gitignore deleted file mode 100644 index 8365624..0000000 --- a/vendor/github.com/hashicorp/golang-lru/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.test diff --git a/vendor/github.com/hashicorp/golang-lru/2q.go b/vendor/github.com/hashicorp/golang-lru/2q.go deleted file mode 100644 index e474cd0..0000000 --- a/vendor/github.com/hashicorp/golang-lru/2q.go +++ /dev/null @@ -1,223 +0,0 @@ -package lru - -import ( - "fmt" - "sync" - - "github.com/hashicorp/golang-lru/simplelru" -) - -const ( - // Default2QRecentRatio is the ratio of the 2Q cache dedicated - // to recently added entries that have only been accessed once. - Default2QRecentRatio = 0.25 - - // Default2QGhostEntries is the default ratio of ghost - // entries kept to track entries recently evicted - Default2QGhostEntries = 0.50 -) - -// TwoQueueCache is a thread-safe fixed size 2Q cache. -// 2Q is an enhancement over the standard LRU cache -// in that it tracks both frequently and recently used -// entries separately. This avoids a burst in access to new -// entries from evicting frequently used entries. It adds some -// additional tracking overhead to the standard LRU cache, and is -// computationally about 2x the cost, and adds some metadata over -// head. The ARCCache is similar, but does not require setting any -// parameters. -type TwoQueueCache struct { - size int - recentSize int - - recent simplelru.LRUCache - frequent simplelru.LRUCache - recentEvict simplelru.LRUCache - lock sync.RWMutex -} - -// New2Q creates a new TwoQueueCache using the default -// values for the parameters. -func New2Q(size int) (*TwoQueueCache, error) { - return New2QParams(size, Default2QRecentRatio, Default2QGhostEntries) -} - -// New2QParams creates a new TwoQueueCache using the provided -// parameter values. -func New2QParams(size int, recentRatio float64, ghostRatio float64) (*TwoQueueCache, error) { - if size <= 0 { - return nil, fmt.Errorf("invalid size") - } - if recentRatio < 0.0 || recentRatio > 1.0 { - return nil, fmt.Errorf("invalid recent ratio") - } - if ghostRatio < 0.0 || ghostRatio > 1.0 { - return nil, fmt.Errorf("invalid ghost ratio") - } - - // Determine the sub-sizes - recentSize := int(float64(size) * recentRatio) - evictSize := int(float64(size) * ghostRatio) - - // Allocate the LRUs - recent, err := simplelru.NewLRU(size, nil) - if err != nil { - return nil, err - } - frequent, err := simplelru.NewLRU(size, nil) - if err != nil { - return nil, err - } - recentEvict, err := simplelru.NewLRU(evictSize, nil) - if err != nil { - return nil, err - } - - // Initialize the cache - c := &TwoQueueCache{ - size: size, - recentSize: recentSize, - recent: recent, - frequent: frequent, - recentEvict: recentEvict, - } - return c, nil -} - -// Get looks up a key's value from the cache. -func (c *TwoQueueCache) Get(key interface{}) (value interface{}, ok bool) { - c.lock.Lock() - defer c.lock.Unlock() - - // Check if this is a frequent value - if val, ok := c.frequent.Get(key); ok { - return val, ok - } - - // If the value is contained in recent, then we - // promote it to frequent - if val, ok := c.recent.Peek(key); ok { - c.recent.Remove(key) - c.frequent.Add(key, val) - return val, ok - } - - // No hit - return nil, false -} - -// Add adds a value to the cache. -func (c *TwoQueueCache) Add(key, value interface{}) { - c.lock.Lock() - defer c.lock.Unlock() - - // Check if the value is frequently used already, - // and just update the value - if c.frequent.Contains(key) { - c.frequent.Add(key, value) - return - } - - // Check if the value is recently used, and promote - // the value into the frequent list - if c.recent.Contains(key) { - c.recent.Remove(key) - c.frequent.Add(key, value) - return - } - - // If the value was recently evicted, add it to the - // frequently used list - if c.recentEvict.Contains(key) { - c.ensureSpace(true) - c.recentEvict.Remove(key) - c.frequent.Add(key, value) - return - } - - // Add to the recently seen list - c.ensureSpace(false) - c.recent.Add(key, value) - return -} - -// ensureSpace is used to ensure we have space in the cache -func (c *TwoQueueCache) ensureSpace(recentEvict bool) { - // If we have space, nothing to do - recentLen := c.recent.Len() - freqLen := c.frequent.Len() - if recentLen+freqLen < c.size { - return - } - - // If the recent buffer is larger than - // the target, evict from there - if recentLen > 0 && (recentLen > c.recentSize || (recentLen == c.recentSize && !recentEvict)) { - k, _, _ := c.recent.RemoveOldest() - c.recentEvict.Add(k, nil) - return - } - - // Remove from the frequent list otherwise - c.frequent.RemoveOldest() -} - -// Len returns the number of items in the cache. -func (c *TwoQueueCache) Len() int { - c.lock.RLock() - defer c.lock.RUnlock() - return c.recent.Len() + c.frequent.Len() -} - -// Keys returns a slice of the keys in the cache. -// The frequently used keys are first in the returned slice. -func (c *TwoQueueCache) Keys() []interface{} { - c.lock.RLock() - defer c.lock.RUnlock() - k1 := c.frequent.Keys() - k2 := c.recent.Keys() - return append(k1, k2...) -} - -// Remove removes the provided key from the cache. -func (c *TwoQueueCache) Remove(key interface{}) { - c.lock.Lock() - defer c.lock.Unlock() - if c.frequent.Remove(key) { - return - } - if c.recent.Remove(key) { - return - } - if c.recentEvict.Remove(key) { - return - } -} - -// Purge is used to completely clear the cache. -func (c *TwoQueueCache) Purge() { - c.lock.Lock() - defer c.lock.Unlock() - c.recent.Purge() - c.frequent.Purge() - c.recentEvict.Purge() -} - -// Contains is used to check if the cache contains a key -// without updating recency or frequency. -func (c *TwoQueueCache) Contains(key interface{}) bool { - c.lock.RLock() - defer c.lock.RUnlock() - return c.frequent.Contains(key) || c.recent.Contains(key) -} - -// Peek is used to inspect the cache value of a key -// without updating recency or frequency. -func (c *TwoQueueCache) Peek(key interface{}) (value interface{}, ok bool) { - c.lock.RLock() - defer c.lock.RUnlock() - if val, ok := c.frequent.Peek(key); ok { - return val, ok - } - return c.recent.Peek(key) -} diff --git a/vendor/github.com/hashicorp/golang-lru/LICENSE b/vendor/github.com/hashicorp/golang-lru/LICENSE deleted file mode 100644 index be2cc4d..0000000 --- a/vendor/github.com/hashicorp/golang-lru/LICENSE +++ /dev/null @@ -1,362 +0,0 @@ -Mozilla Public License, version 2.0 - -1. Definitions - -1.1. "Contributor" - - means each individual or legal entity that creates, contributes to the - creation of, or owns Covered Software. - -1.2. "Contributor Version" - - means the combination of the Contributions of others (if any) used by a - Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - - means Source Code Form to which the initial Contributor has attached the - notice in Exhibit A, the Executable Form of such Source Code Form, and - Modifications of such Source Code Form, in each case including portions - thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - a. that the initial Contributor has attached the notice described in - Exhibit B to the Covered Software; or - - b. that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the terms of - a Secondary License. - -1.6. "Executable Form" - - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - - means a work that combines Covered Software with other material, in a - separate file or files, that is not Covered Software. - -1.8. "License" - - means this document. - -1.9. "Licensable" - - means having the right to grant, to the maximum extent possible, whether - at the time of the initial grant or subsequently, any and all of the - rights conveyed by this License. - -1.10. "Modifications" - - means any of the following: - - a. any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered Software; or - - b. any new file in Source Code Form that contains any Covered Software. - -1.11. "Patent Claims" of a Contributor - - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the License, - by the making, using, selling, offering for sale, having made, import, - or transfer of either its Contributions or its Contributor Version. - -1.12. "Secondary License" - - means either the GNU General Public License, Version 2.0, the GNU Lesser - General Public License, Version 2.1, the GNU Affero General Public - License, Version 3.0, or any later versions of those licenses. - -1.13. "Source Code Form" - - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that controls, is - controlled by, or is under common control with You. For purposes of this - definition, "control" means (a) the power, direct or indirect, to cause - the direction or management of such entity, whether by contract or - otherwise, or (b) ownership of more than fifty percent (50%) of the - outstanding shares or beneficial ownership of such entity. - - -2. License Grants and Conditions - -2.1. Grants - - Each Contributor hereby grants You a world-wide, royalty-free, - non-exclusive license: - - a. under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - - b. under Patent Claims of such Contributor to make, use, sell, offer for - sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - - The licenses granted in Section 2.1 with respect to any Contribution - become effective for each Contribution on the date the Contributor first - distributes such Contribution. - -2.3. Limitations on Grant Scope - - The licenses granted in this Section 2 are the only rights granted under - this License. No additional rights or licenses will be implied from the - distribution or licensing of Covered Software under this License. - Notwithstanding Section 2.1(b) above, no patent license is granted by a - Contributor: - - a. for any code that a Contributor has removed from Covered Software; or - - b. for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - - c. under Patent Claims infringed by Covered Software in the absence of - its Contributions. - - This License does not grant any rights in the trademarks, service marks, - or logos of any Contributor (except as may be necessary to comply with - the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - - No Contributor makes additional grants as a result of Your choice to - distribute the Covered Software under a subsequent version of this - License (see Section 10.2) or under the terms of a Secondary License (if - permitted under the terms of Section 3.3). - -2.5. Representation - - Each Contributor represents that the Contributor believes its - Contributions are its original creation(s) or it has sufficient rights to - grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - - This License is not intended to limit any rights You have under - applicable copyright doctrines of fair use, fair dealing, or other - equivalents. - -2.7. Conditions - - Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in - Section 2.1. - - -3. Responsibilities - -3.1. Distribution of Source Form - - All distribution of Covered Software in Source Code Form, including any - Modifications that You create or to which You contribute, must be under - the terms of this License. You must inform recipients that the Source - Code Form of the Covered Software is governed by the terms of this - License, and how they can obtain a copy of this License. You may not - attempt to alter or restrict the recipients' rights in the Source Code - Form. - -3.2. Distribution of Executable Form - - If You distribute Covered Software in Executable Form then: - - a. such Covered Software must also be made available in Source Code Form, - as described in Section 3.1, and You must inform recipients of the - Executable Form how they can obtain a copy of such Source Code Form by - reasonable means in a timely manner, at a charge no more than the cost - of distribution to the recipient; and - - b. You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter the - recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - - You may create and distribute a Larger Work under terms of Your choice, - provided that You also comply with the requirements of this License for - the Covered Software. If the Larger Work is a combination of Covered - Software with a work governed by one or more Secondary Licenses, and the - Covered Software is not Incompatible With Secondary Licenses, this - License permits You to additionally distribute such Covered Software - under the terms of such Secondary License(s), so that the recipient of - the Larger Work may, at their option, further distribute the Covered - Software under the terms of either this License or such Secondary - License(s). - -3.4. Notices - - You may not remove or alter the substance of any license notices - (including copyright notices, patent notices, disclaimers of warranty, or - limitations of liability) contained within the Source Code Form of the - Covered Software, except that You may alter any license notices to the - extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - - You may choose to offer, and to charge a fee for, warranty, support, - indemnity or liability obligations to one or more recipients of Covered - Software. However, You may do so only on Your own behalf, and not on - behalf of any Contributor. You must make it absolutely clear that any - such warranty, support, indemnity, or liability obligation is offered by - You alone, and You hereby agree to indemnify every Contributor for any - liability incurred by such Contributor as a result of warranty, support, - indemnity or liability terms You offer. You may include additional - disclaimers of warranty and limitations of liability specific to any - jurisdiction. - -4. Inability to Comply Due to Statute or Regulation - - If it is impossible for You to comply with any of the terms of this License - with respect to some or all of the Covered Software due to statute, - judicial order, or regulation then You must: (a) comply with the terms of - this License to the maximum extent possible; and (b) describe the - limitations and the code they affect. Such description must be placed in a - text file included with all distributions of the Covered Software under - this License. Except to the extent prohibited by statute or regulation, - such description must be sufficiently detailed for a recipient of ordinary - skill to be able to understand it. - -5. Termination - -5.1. The rights granted under this License will terminate automatically if You - fail to comply with any of its terms. However, if You become compliant, - then the rights granted under this License from a particular Contributor - are reinstated (a) provisionally, unless and until such Contributor - explicitly and finally terminates Your grants, and (b) on an ongoing - basis, if such Contributor fails to notify You of the non-compliance by - some reasonable means prior to 60 days after You have come back into - compliance. Moreover, Your grants from a particular Contributor are - reinstated on an ongoing basis if such Contributor notifies You of the - non-compliance by some reasonable means, this is the first time You have - received notice of non-compliance with this License from such - Contributor, and You become compliant prior to 30 days after Your receipt - of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent - infringement claim (excluding declaratory judgment actions, - counter-claims, and cross-claims) alleging that a Contributor Version - directly or indirectly infringes any patent, then the rights granted to - You by any and all Contributors for the Covered Software under Section - 2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user - license agreements (excluding distributors and resellers) which have been - validly granted by You or Your distributors under this License prior to - termination shall survive termination. - -6. Disclaimer of Warranty - - Covered Software is provided under this License on an "as is" basis, - without warranty of any kind, either expressed, implied, or statutory, - including, without limitation, warranties that the Covered Software is free - of defects, merchantable, fit for a particular purpose or non-infringing. - The entire risk as to the quality and performance of the Covered Software - is with You. Should any Covered Software prove defective in any respect, - You (not any Contributor) assume the cost of any necessary servicing, - repair, or correction. This disclaimer of warranty constitutes an essential - part of this License. No use of any Covered Software is authorized under - this License except under this disclaimer. - -7. Limitation of Liability - - Under no circumstances and under no legal theory, whether tort (including - negligence), contract, or otherwise, shall any Contributor, or anyone who - distributes Covered Software as permitted above, be liable to You for any - direct, indirect, special, incidental, or consequential damages of any - character including, without limitation, damages for lost profits, loss of - goodwill, work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses, even if such party shall have been - informed of the possibility of such damages. This limitation of liability - shall not apply to liability for death or personal injury resulting from - such party's negligence to the extent applicable law prohibits such - limitation. Some jurisdictions do not allow the exclusion or limitation of - incidental or consequential damages, so this exclusion and limitation may - not apply to You. - -8. Litigation - - Any litigation relating to this License may be brought only in the courts - of a jurisdiction where the defendant maintains its principal place of - business and such litigation shall be governed by laws of that - jurisdiction, without reference to its conflict-of-law provisions. Nothing - in this Section shall prevent a party's ability to bring cross-claims or - counter-claims. - -9. Miscellaneous - - This License represents the complete agreement concerning the subject - matter hereof. If any provision of this License is held to be - unenforceable, such provision shall be reformed only to the extent - necessary to make it enforceable. Any law or regulation which provides that - the language of a contract shall be construed against the drafter shall not - be used to construe this License against a Contributor. - - -10. Versions of the License - -10.1. New Versions - - Mozilla Foundation is the license steward. Except as provided in Section - 10.3, no one other than the license steward has the right to modify or - publish new versions of this License. Each version will be given a - distinguishing version number. - -10.2. Effect of New Versions - - You may distribute the Covered Software under the terms of the version - of the License under which You originally received the Covered Software, - or under the terms of any subsequent version published by the license - steward. - -10.3. Modified Versions - - If you create software not governed by this License, and you want to - create a new license for such software, you may create and use a - modified version of this License if you rename the license and remove - any references to the name of the license steward (except to note that - such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary - Licenses If You choose to distribute Source Code Form that is - Incompatible With Secondary Licenses under the terms of this version of - the License, the notice described in Exhibit B of this License must be - attached. - -Exhibit A - Source Code Form License Notice - - This Source Code Form is subject to the - terms of the Mozilla Public License, v. - 2.0. If a copy of the MPL was not - distributed with this file, You can - obtain one at - http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular file, -then You may include the notice in a location (such as a LICENSE file in a -relevant directory) where a recipient would be likely to look for such a -notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice - - This Source Code Form is "Incompatible - With Secondary Licenses", as defined by - the Mozilla Public License, v. 2.0. diff --git a/vendor/github.com/hashicorp/golang-lru/README.md b/vendor/github.com/hashicorp/golang-lru/README.md deleted file mode 100644 index 33e58cf..0000000 --- a/vendor/github.com/hashicorp/golang-lru/README.md +++ /dev/null @@ -1,25 +0,0 @@ -golang-lru -========== - -This provides the `lru` package which implements a fixed-size -thread safe LRU cache. It is based on the cache in Groupcache. - -Documentation -============= - -Full docs are available on [Godoc](http://godoc.org/github.com/hashicorp/golang-lru) - -Example -======= - -Using the LRU is very simple: - -```go -l, _ := New(128) -for i := 0; i < 256; i++ { - l.Add(i, nil) -} -if l.Len() != 128 { - panic(fmt.Sprintf("bad len: %v", l.Len())) -} -``` diff --git a/vendor/github.com/hashicorp/golang-lru/arc.go b/vendor/github.com/hashicorp/golang-lru/arc.go deleted file mode 100644 index 555225a..0000000 --- a/vendor/github.com/hashicorp/golang-lru/arc.go +++ /dev/null @@ -1,257 +0,0 @@ -package lru - -import ( - "sync" - - "github.com/hashicorp/golang-lru/simplelru" -) - -// ARCCache is a thread-safe fixed size Adaptive Replacement Cache (ARC). -// ARC is an enhancement over the standard LRU cache in that tracks both -// frequency and recency of use. This avoids a burst in access to new -// entries from evicting the frequently used older entries. It adds some -// additional tracking overhead to a standard LRU cache, computationally -// it is roughly 2x the cost, and the extra memory overhead is linear -// with the size of the cache. ARC has been patented by IBM, but is -// similar to the TwoQueueCache (2Q) which requires setting parameters. -type ARCCache struct { - size int // Size is the total capacity of the cache - p int // P is the dynamic preference towards T1 or T2 - - t1 simplelru.LRUCache // T1 is the LRU for recently accessed items - b1 simplelru.LRUCache // B1 is the LRU for evictions from t1 - - t2 simplelru.LRUCache // T2 is the LRU for frequently accessed items - b2 simplelru.LRUCache // B2 is the LRU for evictions from t2 - - lock sync.RWMutex -} - -// NewARC creates an ARC of the given size -func NewARC(size int) (*ARCCache, error) { - // Create the sub LRUs - b1, err := simplelru.NewLRU(size, nil) - if err != nil { - return nil, err - } - b2, err := simplelru.NewLRU(size, nil) - if err != nil { - return nil, err - } - t1, err := simplelru.NewLRU(size, nil) - if err != nil { - return nil, err - } - t2, err := simplelru.NewLRU(size, nil) - if err != nil { - return nil, err - } - - // Initialize the ARC - c := &ARCCache{ - size: size, - p: 0, - t1: t1, - b1: b1, - t2: t2, - b2: b2, - } - return c, nil -} - -// Get looks up a key's value from the cache. -func (c *ARCCache) Get(key interface{}) (value interface{}, ok bool) { - c.lock.Lock() - defer c.lock.Unlock() - - // If the value is contained in T1 (recent), then - // promote it to T2 (frequent) - if val, ok := c.t1.Peek(key); ok { - c.t1.Remove(key) - c.t2.Add(key, val) - return val, ok - } - - // Check if the value is contained in T2 (frequent) - if val, ok := c.t2.Get(key); ok { - return val, ok - } - - // No hit - return nil, false -} - -// Add adds a value to the cache. -func (c *ARCCache) Add(key, value interface{}) { - c.lock.Lock() - defer c.lock.Unlock() - - // Check if the value is contained in T1 (recent), and potentially - // promote it to frequent T2 - if c.t1.Contains(key) { - c.t1.Remove(key) - c.t2.Add(key, value) - return - } - - // Check if the value is already in T2 (frequent) and update it - if c.t2.Contains(key) { - c.t2.Add(key, value) - return - } - - // Check if this value was recently evicted as part of the - // recently used list - if c.b1.Contains(key) { - // T1 set is too small, increase P appropriately - delta := 1 - b1Len := c.b1.Len() - b2Len := c.b2.Len() - if b2Len > b1Len { - delta = b2Len / b1Len - } - if c.p+delta >= c.size { - c.p = c.size - } else { - c.p += delta - } - - // Potentially need to make room in the cache - if c.t1.Len()+c.t2.Len() >= c.size { - c.replace(false) - } - - // Remove from B1 - c.b1.Remove(key) - - // Add the key to the frequently used list - c.t2.Add(key, value) - return - } - - // Check if this value was recently evicted as part of the - // frequently used list - if c.b2.Contains(key) { - // T2 set is too small, decrease P appropriately - delta := 1 - b1Len := c.b1.Len() - b2Len := c.b2.Len() - if b1Len > b2Len { - delta = b1Len / b2Len - } - if delta >= c.p { - c.p = 0 - } else { - c.p -= delta - } - - // Potentially need to make room in the cache - if c.t1.Len()+c.t2.Len() >= c.size { - c.replace(true) - } - - // Remove from B2 - c.b2.Remove(key) - - // Add the key to the frequently used list - c.t2.Add(key, value) - return - } - - // Potentially need to make room in the cache - if c.t1.Len()+c.t2.Len() >= c.size { - c.replace(false) - } - - // Keep the size of the ghost buffers trim - if c.b1.Len() > c.size-c.p { - c.b1.RemoveOldest() - } - if c.b2.Len() > c.p { - c.b2.RemoveOldest() - } - - // Add to the recently seen list - c.t1.Add(key, value) - return -} - -// replace is used to adaptively evict from either T1 or T2 -// based on the current learned value of P -func (c *ARCCache) replace(b2ContainsKey bool) { - t1Len := c.t1.Len() - if t1Len > 0 && (t1Len > c.p || (t1Len == c.p && b2ContainsKey)) { - k, _, ok := c.t1.RemoveOldest() - if ok { - c.b1.Add(k, nil) - } - } else { - k, _, ok := c.t2.RemoveOldest() - if ok { - c.b2.Add(k, nil) - } - } -} - -// Len returns the number of cached entries -func (c *ARCCache) Len() int { - c.lock.RLock() - defer c.lock.RUnlock() - return c.t1.Len() + c.t2.Len() -} - -// Keys returns all the cached keys -func (c *ARCCache) Keys() []interface{} { - c.lock.RLock() - defer c.lock.RUnlock() - k1 := c.t1.Keys() - k2 := c.t2.Keys() - return append(k1, k2...) -} - -// Remove is used to purge a key from the cache -func (c *ARCCache) Remove(key interface{}) { - c.lock.Lock() - defer c.lock.Unlock() - if c.t1.Remove(key) { - return - } - if c.t2.Remove(key) { - return - } - if c.b1.Remove(key) { - return - } - if c.b2.Remove(key) { - return - } -} - -// Purge is used to clear the cache -func (c *ARCCache) Purge() { - c.lock.Lock() - defer c.lock.Unlock() - c.t1.Purge() - c.t2.Purge() - c.b1.Purge() - c.b2.Purge() -} - -// Contains is used to check if the cache contains a key -// without updating recency or frequency. -func (c *ARCCache) Contains(key interface{}) bool { - c.lock.RLock() - defer c.lock.RUnlock() - return c.t1.Contains(key) || c.t2.Contains(key) -} - -// Peek is used to inspect the cache value of a key -// without updating recency or frequency. -func (c *ARCCache) Peek(key interface{}) (value interface{}, ok bool) { - c.lock.RLock() - defer c.lock.RUnlock() - if val, ok := c.t1.Peek(key); ok { - return val, ok - } - return c.t2.Peek(key) -} diff --git a/vendor/github.com/hashicorp/golang-lru/doc.go b/vendor/github.com/hashicorp/golang-lru/doc.go deleted file mode 100644 index 2547df9..0000000 --- a/vendor/github.com/hashicorp/golang-lru/doc.go +++ /dev/null @@ -1,21 +0,0 @@ -// Package lru provides three different LRU caches of varying sophistication. -// -// Cache is a simple LRU cache. It is based on the -// LRU implementation in groupcache: -// https://github.com/golang/groupcache/tree/master/lru -// -// TwoQueueCache tracks frequently used and recently used entries separately. -// This avoids a burst of accesses from taking out frequently used entries, -// at the cost of about 2x computational overhead and some extra bookkeeping. -// -// ARCCache is an adaptive replacement cache. It tracks recent evictions as -// well as recent usage in both the frequent and recent caches. Its -// computational overhead is comparable to TwoQueueCache, but the memory -// overhead is linear with the size of the cache. -// -// ARC has been patented by IBM, so do not use it if that is problematic for -// your program. -// -// All caches in this package take locks while operating, and are therefore -// thread-safe for consumers. -package lru diff --git a/vendor/github.com/hashicorp/golang-lru/go.mod b/vendor/github.com/hashicorp/golang-lru/go.mod deleted file mode 100644 index 824cb97..0000000 --- a/vendor/github.com/hashicorp/golang-lru/go.mod +++ /dev/null @@ -1 +0,0 @@ -module github.com/hashicorp/golang-lru diff --git a/vendor/github.com/hashicorp/golang-lru/lru.go b/vendor/github.com/hashicorp/golang-lru/lru.go deleted file mode 100644 index 1cbe04b..0000000 --- a/vendor/github.com/hashicorp/golang-lru/lru.go +++ /dev/null @@ -1,116 +0,0 @@ -package lru - -import ( - "sync" - - "github.com/hashicorp/golang-lru/simplelru" -) - -// Cache is a thread-safe fixed size LRU cache. -type Cache struct { - lru simplelru.LRUCache - lock sync.RWMutex -} - -// New creates an LRU of the given size. -func New(size int) (*Cache, error) { - return NewWithEvict(size, nil) -} - -// NewWithEvict constructs a fixed size cache with the given eviction -// callback. -func NewWithEvict(size int, onEvicted func(key interface{}, value interface{})) (*Cache, error) { - lru, err := simplelru.NewLRU(size, simplelru.EvictCallback(onEvicted)) - if err != nil { - return nil, err - } - c := &Cache{ - lru: lru, - } - return c, nil -} - -// Purge is used to completely clear the cache. -func (c *Cache) Purge() { - c.lock.Lock() - c.lru.Purge() - c.lock.Unlock() -} - -// Add adds a value to the cache. Returns true if an eviction occurred. -func (c *Cache) Add(key, value interface{}) (evicted bool) { - c.lock.Lock() - evicted = c.lru.Add(key, value) - c.lock.Unlock() - return evicted -} - -// Get looks up a key's value from the cache. -func (c *Cache) Get(key interface{}) (value interface{}, ok bool) { - c.lock.Lock() - value, ok = c.lru.Get(key) - c.lock.Unlock() - return value, ok -} - -// Contains checks if a key is in the cache, without updating the -// recent-ness or deleting it for being stale. -func (c *Cache) Contains(key interface{}) bool { - c.lock.RLock() - containKey := c.lru.Contains(key) - c.lock.RUnlock() - return containKey -} - -// Peek returns the key value (or undefined if not found) without updating -// the "recently used"-ness of the key. -func (c *Cache) Peek(key interface{}) (value interface{}, ok bool) { - c.lock.RLock() - value, ok = c.lru.Peek(key) - c.lock.RUnlock() - return value, ok -} - -// ContainsOrAdd checks if a key is in the cache without updating the -// recent-ness or deleting it for being stale, and if not, adds the value. -// Returns whether found and whether an eviction occurred. -func (c *Cache) ContainsOrAdd(key, value interface{}) (ok, evicted bool) { - c.lock.Lock() - defer c.lock.Unlock() - - if c.lru.Contains(key) { - return true, false - } - evicted = c.lru.Add(key, value) - return false, evicted -} - -// Remove removes the provided key from the cache. -func (c *Cache) Remove(key interface{}) { - c.lock.Lock() - c.lru.Remove(key) - c.lock.Unlock() -} - -// RemoveOldest removes the oldest item from the cache. -func (c *Cache) RemoveOldest() { - c.lock.Lock() - c.lru.RemoveOldest() - c.lock.Unlock() -} - -// Keys returns a slice of the keys in the cache, from oldest to newest. -func (c *Cache) Keys() []interface{} { - c.lock.RLock() - keys := c.lru.Keys() - c.lock.RUnlock() - return keys -} - -// Len returns the number of items in the cache. -func (c *Cache) Len() int { - c.lock.RLock() - length := c.lru.Len() - c.lock.RUnlock() - return length -} diff --git a/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go b/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go deleted file mode 100644 index 5673773..0000000 --- a/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go +++ /dev/null @@ -1,161 +0,0 @@ -package simplelru - -import ( - "container/list" - "errors" -) - -// EvictCallback is used to get a callback when a cache entry is evicted -type EvictCallback func(key interface{}, value interface{}) - -// LRU implements a non-thread safe fixed size LRU cache -type LRU struct { - size int - evictList *list.List - items map[interface{}]*list.Element - onEvict EvictCallback -} - -// entry is used to hold a value in the evictList -type entry struct { - key interface{} - value interface{} -} - -// NewLRU constructs an LRU of the given size -func NewLRU(size int, onEvict EvictCallback) (*LRU, error) { - if size <= 0 { - return nil, errors.New("Must provide a positive size") - } - c := &LRU{ - size: size, - evictList: list.New(), - items: make(map[interface{}]*list.Element), - onEvict: onEvict, - } - return c, nil -} - -// Purge is used to completely clear the cache. -func (c *LRU) Purge() { - for k, v := range c.items { - if c.onEvict != nil { - c.onEvict(k, v.Value.(*entry).value) - } - delete(c.items, k) - } - c.evictList.Init() -} - -// Add adds a value to the cache. Returns true if an eviction occurred. -func (c *LRU) Add(key, value interface{}) (evicted bool) { - // Check for existing item - if ent, ok := c.items[key]; ok { - c.evictList.MoveToFront(ent) - ent.Value.(*entry).value = value - return false - } - - // Add new item - ent := &entry{key, value} - entry := c.evictList.PushFront(ent) - c.items[key] = entry - - evict := c.evictList.Len() > c.size - // Verify size not exceeded - if evict { - c.removeOldest() - } - return evict -} - -// Get looks up a key's value from the cache. -func (c *LRU) Get(key interface{}) (value interface{}, ok bool) { - if ent, ok := c.items[key]; ok { - c.evictList.MoveToFront(ent) - return ent.Value.(*entry).value, true - } - return -} - -// Contains checks if a key is in the cache, without updating the recent-ness -// or deleting it for being stale. -func (c *LRU) Contains(key interface{}) (ok bool) { - _, ok = c.items[key] - return ok -} - -// Peek returns the key value (or undefined if not found) without updating -// the "recently used"-ness of the key. -func (c *LRU) Peek(key interface{}) (value interface{}, ok bool) { - var ent *list.Element - if ent, ok = c.items[key]; ok { - return ent.Value.(*entry).value, true - } - return nil, ok -} - -// Remove removes the provided key from the cache, returning if the -// key was contained. -func (c *LRU) Remove(key interface{}) (present bool) { - if ent, ok := c.items[key]; ok { - c.removeElement(ent) - return true - } - return false -} - -// RemoveOldest removes the oldest item from the cache. -func (c *LRU) RemoveOldest() (key interface{}, value interface{}, ok bool) { - ent := c.evictList.Back() - if ent != nil { - c.removeElement(ent) - kv := ent.Value.(*entry) - return kv.key, kv.value, true - } - return nil, nil, false -} - -// GetOldest returns the oldest entry -func (c *LRU) GetOldest() (key interface{}, value interface{}, ok bool) { - ent := c.evictList.Back() - if ent != nil { - kv := ent.Value.(*entry) - return kv.key, kv.value, true - } - return nil, nil, false -} - -// Keys returns a slice of the keys in the cache, from oldest to newest. -func (c *LRU) Keys() []interface{} { - keys := make([]interface{}, len(c.items)) - i := 0 - for ent := c.evictList.Back(); ent != nil; ent = ent.Prev() { - keys[i] = ent.Value.(*entry).key - i++ - } - return keys -} - -// Len returns the number of items in the cache. -func (c *LRU) Len() int { - return c.evictList.Len() -} - -// removeOldest removes the oldest item from the cache. -func (c *LRU) removeOldest() { - ent := c.evictList.Back() - if ent != nil { - c.removeElement(ent) - } -} - -// removeElement is used to remove a given list element from the cache -func (c *LRU) removeElement(e *list.Element) { - c.evictList.Remove(e) - kv := e.Value.(*entry) - delete(c.items, kv.key) - if c.onEvict != nil { - c.onEvict(kv.key, kv.value) - } -} diff --git a/vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go b/vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go deleted file mode 100644 index 74c7077..0000000 --- a/vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go +++ /dev/null @@ -1,36 +0,0 @@ -package simplelru - -// LRUCache is the interface for simple LRU cache. -type LRUCache interface { - // Adds a value to the cache, returns true if an eviction occurred and - // updates the "recently used"-ness of the key. - Add(key, value interface{}) bool - - // Returns key's value from the cache and - // updates the "recently used"-ness of the key. #value, isFound - Get(key interface{}) (value interface{}, ok bool) - - // Check if a key exsists in cache without updating the recent-ness. - Contains(key interface{}) (ok bool) - - // Returns key's value without updating the "recently used"-ness of the key. - Peek(key interface{}) (value interface{}, ok bool) - - // Removes a key from the cache. - Remove(key interface{}) bool - - // Removes the oldest entry from cache. - RemoveOldest() (interface{}, interface{}, bool) - - // Returns the oldest entry from the cache. #key, value, isFound - GetOldest() (interface{}, interface{}, bool) - - // Returns a slice of the keys in the cache, from oldest to newest. - Keys() []interface{} - - // Returns the number of items in the cache. - Len() int - - // Clear all cache entries - Purge() -} -- cgit v1.2.3