summaryrefslogtreecommitdiff
path: root/vendor/github.com
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com')
-rw-r--r--vendor/github.com/fluffle/goirc/LICENSE27
-rw-r--r--vendor/github.com/fluffle/goirc/client/commands.go304
-rw-r--r--vendor/github.com/fluffle/goirc/client/connection.go587
-rw-r--r--vendor/github.com/fluffle/goirc/client/dispatch.go202
-rw-r--r--vendor/github.com/fluffle/goirc/client/doc.go34
-rw-r--r--vendor/github.com/fluffle/goirc/client/handlers.go105
-rw-r--r--vendor/github.com/fluffle/goirc/client/line.go216
-rw-r--r--vendor/github.com/fluffle/goirc/client/state_handlers.go262
-rw-r--r--vendor/github.com/fluffle/goirc/logging/logging.go44
-rw-r--r--vendor/github.com/fluffle/goirc/state/channel.go360
-rw-r--r--vendor/github.com/fluffle/goirc/state/mock_tracker.go201
-rw-r--r--vendor/github.com/fluffle/goirc/state/nick.go205
-rw-r--r--vendor/github.com/fluffle/goirc/state/tracker.go369
-rw-r--r--vendor/github.com/golang/mock/AUTHORS12
-rw-r--r--vendor/github.com/golang/mock/CONTRIBUTORS37
-rw-r--r--vendor/github.com/golang/mock/LICENSE202
-rw-r--r--vendor/github.com/golang/mock/gomock/call.go420
-rw-r--r--vendor/github.com/golang/mock/gomock/callset.go108
-rw-r--r--vendor/github.com/golang/mock/gomock/controller.go264
-rw-r--r--vendor/github.com/golang/mock/gomock/matchers.go141
-rw-r--r--vendor/github.com/hashicorp/golang-lru/.gitignore23
-rw-r--r--vendor/github.com/hashicorp/golang-lru/2q.go223
-rw-r--r--vendor/github.com/hashicorp/golang-lru/LICENSE362
-rw-r--r--vendor/github.com/hashicorp/golang-lru/README.md25
-rw-r--r--vendor/github.com/hashicorp/golang-lru/arc.go257
-rw-r--r--vendor/github.com/hashicorp/golang-lru/doc.go21
-rw-r--r--vendor/github.com/hashicorp/golang-lru/go.mod1
-rw-r--r--vendor/github.com/hashicorp/golang-lru/lru.go116
-rw-r--r--vendor/github.com/hashicorp/golang-lru/simplelru/lru.go161
-rw-r--r--vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go36
30 files changed, 0 insertions, 5325 deletions
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 "<hop count> <real name>"
- 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: <channel name> e.g. #moo
-// Topic: <channel topic> e.g. Discussing the merits of cows!
-// Mode: <channel modes> e.g. +nsti
-// Nicks:
-// <nick>: <privs> 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: <nick name> e.g. CowMaster
-// Hostmask: <ident@host> e.g. moo@cows.org
-// Real Name: <real name> e.g. Steve "CowMaster" Bush
-// Modes: <nick modes> e.g. +z
-// Channels:
-// <channel>: <privs> 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 <email address>
-# The email address is not required for organizations.
-
-# Please keep the list sorted.
-
-Alex Reece <awreece@gmail.com>
-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 <email address>
-#
-# 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 <jacobsa@google.com> <aaronjjacobs@gmail.com>
-Alex Reece <awreece@gmail.com>
-David Symonds <dsymonds@golang.org>
-Ryan Barrett <ryanb@google.com>
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()
-}