summaryrefslogtreecommitdiffstats
BranchCommit messageAuthorAge
nextmeta-agl-kuksa: update patch Upstream-StatusScott Murray6 days
quillbackPrepare Quirky Quillback 17.1.3Jan-Simon Moeller2 weeks
masterAdd support NanoPC-T6(RK3588) boardNaoto Yamaguchi4 weeks
ricefishPrepare Royal Ricefish 18.0.1Jan-Simon Moeller5 weeks
lampreyPrepare Lucky Lamprey 12.1.20Jan-Simon Moeller5 months
sandbox/jsmoeller/qt6WIP: Prepare for QT6Jan-Simon Moeller6 months
sandbox/jsmoeller/lampreymeta-agl-bsp/meta-ti: remove local patch from meta-agl-bsp before updateJan-Simon Moeller6 months
sandbox/jsmoeller/next-riscv-EW24Include visionfive2 board templatesJan-Simon Moeller6 months
sandbox/jsmoeller/canbusfdWIP canfdJan-Simon Moeller6 months
pikePrepare Prickly Pike 16.0.5Jan-Simon Moeller7 months
sandbox/YAMAGUCHINaoto/rk3588-nanopc-t6Add NanoPC-T6 support to wireplumberNaoto Yamaguchi11 months
octopusPrepare Optimistic Octopus 15.0.5Jan-Simon Moeller13 months
sandbox/hauvolecong/spec4808Restructure Salvator-x .inc filesHau Vo14 months
sandbox/nguyentanloc27/spec4808gstreamer1.0-plugins-bad_%.bbappend: Added a title/appidMarius Vlad14 months
sandbox/nguyentanloc27/S4SK-devAdding s4sk supportLoc Nguyen14 months
needlefishPrepare Nifty Needlefish 14.0.5Jan-Simon Moeller17 months
marlinPrepare Magic Marlin 13.0.3 releaseJan-Simon Moeller2 years
koiaglsetup: Fix append_fragment fails with heredocs on Ubuntu 21.04.vasyl3 years
sandbox/jsmoeller/rmappfwPrepare master for new framework integrationJan-Simon Moeller3 years
jellyfishaglsetup: Override templateconf.cfg in case of -f, --force.Vasyl Vavrychuk3 years
icefishmeta-agl-bsp: extend qemux86-64 hardware supportScott Murray4 years
sandbox/jsmoeller/cleanupCleanup draftJan-Simon Möller4 years
halibutaf-binder: fix bug in reconnectionJose Bollo5 years
floundermeta-agl-bsp: Update dtb and include for raspberrypi3Dennis Field5 years
guppyFix compilation of nasm-native with newer gcc versionsJan-Simon Möller5 years
eelAdd a patch for u-boot-ota to work with qemuEugene Smirnov6 years
dabFix build of json-c on newer hostsJan-Simon Möller6 years
chinookFix for CVE-2017-1000366 in glibcJan-Simon Möller7 years
blowfishFix: CVE-2016-1238 recent perl doesn't include cwdRomain Forlot8 years
albacoreFix hvacplugin cross-compilation issue due to wrong path in CMakeLists.txtJan-Simon Möller9 years
 
TagDownloadAuthorAge
17.1.3commit 3ef9b693b0...Jan-Simon Moeller2 weeks
quillback/17.1.3commit 3ef9b693b0...Jan-Simon Moeller2 weeks
quillback_17.1.3commit 3ef9b693b0...Jan-Simon Moeller
/*
 * Copyright (C) 2017-2018 "IoT.bzh"
 * Author Sebastien Douheret <sebastien@iot.bzh>
 *
 * 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 st

import (
	"encoding/json"
	"fmt"
	"os"
	"strconv"
	"strings"
	"time"

	"github.com/Sirupsen/logrus"
	uuid "github.com/satori/go.uuid"
	"github.com/syncthing/syncthing/lib/sync"
)

// Events .
type Events struct {
	MonitorTime time.Duration
	Debug       bool

	stop  chan bool
	st    *SyncThing
	log   *logrus.Logger
	cbArr map[string][]cbMap
	mutex sync.Mutex
}

// Event Syncthing events structure
type Event struct {
	Type string            `json:"type"`
	Time time.Time         `json:"time"`
	Data map[string]string `json:"data"`
}

// EventsCBData Data parameter of Event callback
type EventsCBData map[string]interface{}

// EventsCB Event callback
type EventsCB func(ev Event, cbData *EventsCBData)

const (
	// EventFolderCompletion .
	EventFolderCompletion string = "FolderCompletion"
	// EventFolderSummary .
	EventFolderSummary string = "FolderSummary"
	// EventFolderPaused .
	EventFolderPaused string = "FolderPaused"
	// EventFolderResumed .
	EventFolderResumed string = "FolderResumed"
	// EventFolderErrors .
	EventFolderErrors string = "FolderErrors"
	// EventStateChanged .
	EventStateChanged string = "StateChanged"
)

// EventsAll .
var EventsAll = EventFolderCompletion + "|" +
	EventFolderSummary + "|" +
	EventFolderPaused + "|" +
	EventFolderResumed + "|" +
	EventFolderErrors + "|" +
	EventStateChanged

// SyncthingEvent Syncthing Event structure definition
type SyncthingEvent struct {
	// Per-subscription sequential event ID. Named "id" for backwards compatibility with the REST API
	SubscriptionID int `json:"id"`
	// Global ID of the event across all subscriptions
	GlobalID int                    `json:"globalID"`
	Time     time.Time              `json:"time"`
	Type     string                 `json:"type"`
	Data     map[string]interface{} `json:"data"`
}

type cbMap struct {
	id       string
	cb       EventsCB
	filterID string
	data     *EventsCBData
}

// NewEventListener Create a new instance of Event listener
func (s *SyncThing) NewEventListener() *Events {
	_, dbg := os.LookupEnv("XDS_DEBUG_STEVENTS") // set to add more debug log
	return &Events{
		MonitorTime: 100, // in Milliseconds
		Debug:       dbg,
		stop:        make(chan bool, 1),
		st:          s,
		log:         s.log,
		cbArr:       make(map[string][]cbMap),
		mutex:       sync.NewMutex(),
	}
}

// Start starts event monitoring loop
func (e *Events) Start() error {
	go e.monitorLoop()
	return nil
}

// Stop stops event monitoring loop
func (e *Events) Stop() {
	e.stop <- true
}

// Register Add a listener on an event
func (e *Events) Register(evName string, cb EventsCB, filterID string, data *EventsCBData) (string, error) {
	if evName == "" || !strings.Contains(EventsAll, evName) {
		return "", fmt.Errorf("Unknown event name")
	}
	if data == nil {
		data = &EventsCBData{}
	}

	e.mutex.Lock()
	defer e.mutex.Unlock()

	cbList := []cbMap{}
	if _, ok := e.cbArr[evName]; ok {
		cbList = e.cbArr[evName]
	}

	id := uuid.NewV1().String()
	(*data)["id"] = id

	e.cbArr[evName] = append(cbList, cbMap{id: id, cb: cb, filterID: filterID, data: data})

	return id, nil
}

// UnRegister Remove a listener event
func (e *Events) UnRegister(id string) error {
	e.mutex.Lock()
	defer e.mutex.Unlock()

	for evName, cbKey := range e.cbArr {
		newCbList := []cbMap{}
		change := false
		for _, k := range cbKey {
			if k.id != id {
				newCbList = append(newCbList, k)
			} else {
				change = true
			}
		}
		if change {
			e.cbArr[evName] = newCbList
		}
	}

	return nil
}

// GetEvents returns the Syncthing events
func (e *Events) getEvents(since int) ([]SyncthingEvent, error) {
	var data []byte
	ev := []SyncthingEvent{}
	url := "events"
	if since != -1 {
		url += "?since=" + strconv.Itoa(since)
	}
	if err := e.st.client.HTTPGet(url, &data); err != nil {
		return ev, err
	}
	err := json.Unmarshal(data, &ev)
	return ev, err
}

// Loop to monitor Syncthing events
func (e *Events) monitorLoop() {
	e.log.Infof("Event monitoring running...")
	since := 0
	cntErrConn := 0
	cntErrRetry := 1
	for {
		select {
		case <-e.stop:
			e.log.Infof("Event monitoring exited")
			return

		case <-time.After(e.MonitorTime * time.Millisecond):

			if !e.st.Connected {
				cntErrConn++
				time.Sleep(time.Second)
				if cntErrConn > cntErrRetry {
					e.log.Error("ST Event monitor: ST connection down")
					cntErrConn = 0
					cntErrRetry *= 2
					if _, err := e.getEvents(since); err == nil {
						e.st.Connected = true
						cntErrRetry = 1
						// XXX - should we reset since value ?
						goto readEvent
					}
				}
				continue
			}

		readEvent:
			stEvArr, err := e.getEvents(since)
			if err != nil {
				e.log.Errorf("Syncthing Get Events: %v", err)
				e.st.Connected = false
				continue
			}

			// Process events
			for _, stEv := range stEvArr {
				since = stEv.SubscriptionID
				if e.Debug {
					e.log.Warnf("ST EVENT: %d %s\n  %v", stEv.GlobalID, stEv.Type, stEv)
				}

				e.mutex.Lock()
				cbKey, ok := e.cbArr[stEv.Type]
				if !ok {
					e.mutex.Unlock()
					continue
				}

				evData := Event{
					Type: stEv.Type,
					Time: stEv.Time,
				}

				// Decode Events
				// FIXME: re-define data struct for each events
				// instead of map of string and use JSON marshing/unmarshing
				fID := ""
				evData.Data = make(map[string]string)
				switch stEv.Type {

				case EventFolderCompletion:
					fID = convString(stEv.Data["folder"])
					evData.Data["completion"] = convFloat64(stEv.Data["completion"])

				case EventFolderSummary:
					fID = convString(stEv.Data["folder"])
					evData.Data["needBytes"] = convInt64(stEv.Data["needBytes"])
					evData.Data["state"] = convString(stEv.Data["state"])

				case EventFolderPaused, EventFolderResumed:
					fID = convString(stEv.Data["id"])
					evData.Data["label"] = convString(stEv.Data["label"])

				case EventFolderErrors:
					fID = convString(stEv.Data["folder"])
					// TODO decode array evData.Data["errors"] = convString(stEv.Data["errors"])

				case EventStateChanged:
					fID = convString(stEv.Data["folder"])
					evData.Data["from"] = convString(stEv.Data["from"])
					evData.Data["to"] = convString(stEv.Data["to"])

				default:
					e.log.Warnf("Unsupported event type")
				}

				if fID != "" {
					evData.Data["id"] = fID
				}

				// Call all registered callbacks
				for _, c := range cbKey {
					if e.Debug {
						e.log.Warnf("EVENT CB fID=%s, filterID=%s", fID, c.filterID)
					}
					// Call when filterID is not set or when it matches
					if c.filterID == "" || (fID != "" && fID == c.filterID) {
						c.cb(evData, c.data)
					}
				}

				e.mutex.Unlock()
			}
		}
	}
}

func convString(d interface{}) string {
	return d.(string)
}

func convFloat64(d interface{}) string {
	return strconv.FormatFloat(d.(float64), 'f', -1, 64)
}

func convInt64(d interface{}) string {
	return strconv.FormatInt(d.(int64), 10)
}
td>
10 months
quillback_16.92.0commit 64258485d6...Jan-Simon Moeller10 months
16.0.3commit 35368f9251...Jan-Simon Moeller10 months
pike/16.0.3commit 35368f9251...Jan-Simon Moeller10 months
pike_16.0.3commit 35368f9251...Jan-Simon Moeller10 months
12.1.16commit 512d244d48...Jan-Simon Moeller11 months
lamprey/12.1.16commit 512d244d48...Jan-Simon Moeller11 months
lamprey_12.1.16commit 512d244d48...Jan-Simon Moeller11 months
16.91.0commit 4c9618f6af...Jan-Simon Moeller11 months
quillback/16.91.0commit 4c9618f6af...Jan-Simon Moeller11 months
quillback_16.91.0commit 4c9618f6af...Jan-Simon Moeller11 months
16.91.1commit c764d00258...Jan-Simon Moeller11 months
quillback/16.91.1commit c764d00258...Jan-Simon Moeller11 months
quillback_16.91.1commit c764d00258...Jan-Simon Moeller11 months
16.0.2commit ae3e2918a0...Jan-Simon Moeller12 months
pike/16.0.2commit ae3e2918a0...Jan-Simon Moeller12 months
pike_16.0.2commit ae3e2918a0...Jan-Simon Moeller12 months
12.1.15commit 280f7e70af...Jan-Simon Moeller12 months
lamprey/12.1.15commit 280f7e70af...Jan-Simon Moeller12 months
lamprey_12.1.15commit 280f7e70af...Jan-Simon Moeller12 months
15.0.5commit 36d25dc63d...Jan-Simon Moeller13 months
octopus/15.0.5commit 36d25dc63d...Jan-Simon Moeller13 months
octopus_15.0.5commit 36d25dc63d...Jan-Simon Moeller13 months
16.0.1commit 9af4ff37f3...Jan-Simon Moeller13 months
pike/16.0.1commit 9af4ff37f3...Jan-Simon Moeller13 months
pike_16.0.1commit 9af4ff37f3...Jan-Simon Moeller13 months
12.1.14commit e0f6590189...Jan-Simon Moeller14 months
lamprey/12.1.14commit e0f6590189...Jan-Simon Moeller14 months
lamprey_12.1.14commit e0f6590189...Jan-Simon Moeller14 months
15.0.4commit f0783c76a5...Jan-Simon Moeller14 months
octopus/15.0.4commit f0783c76a5...Jan-Simon Moeller14 months
octopus_15.0.4commit f0783c76a5...Jan-Simon Moeller14 months
16.0.0commit 1c7b328ce8...Jan-Simon Moeller14 months
pike/16.0.0commit 1c7b328ce8...Jan-Simon Moeller14 months
pike_16.0.0commit 1c7b328ce8...Jan-Simon Moeller14 months
15.93.0commit 903e108049...Jan-Simon Moeller15 months
pike/15.93.0commit 903e108049...Jan-Simon Moeller15 months
pike_15.93.0commit 903e108049...Jan-Simon Moeller15 months
15.92.0commit 2d0f4726b3...Jan-Simon Moeller15 months
pike/15.92.0commit 2d0f4726b3...Jan-Simon Moeller15 months
pike_15.92.0commit 2d0f4726b3...Jan-Simon Moeller15 months
12.1.13commit 583f80f8e9...Jan-Simon Moeller15 months
lamprey/12.1.13commit 583f80f8e9...Jan-Simon Moeller15 months
lamprey_12.1.13commit 583f80f8e9...Jan-Simon Moeller15 months
15.0.3commit 2fc0726d1f...Jan-Simon Moeller16 months
octopus/15.0.3commit 2fc0726d1f...Jan-Simon Moeller16 months
octopus_15.0.3commit 2fc0726d1f...Jan-Simon Moeller16 months
15.91.1commit e3c77539cd...Jan-Simon Moeller16 months
pike/15.91.1commit e3c77539cd...Jan-Simon Moeller16 months
pike_15.91.1commit e3c77539cd...Jan-Simon Moeller16 months
15.91.0commit cce8856658...Jan-Simon Moeller16 months
pike/15.91.0commit cce8856658...Jan-Simon Moeller16 months
pike_15.91.0commit cce8856658...Jan-Simon Moeller16 months
12.1.12commit 009153010c...Jan-Simon Moeller16 months
lamprey/12.1.12commit 009153010c...Jan-Simon Moeller16 months
lamprey_12.1.12commit 009153010c...Jan-Simon Moeller16 months
15.0.2commit 89143beca6...Jan-Simon Moeller17 months
octopus/15.0.2commit 89143beca6...Jan-Simon Moeller17 months
octopus_15.0.2commit 89143beca6...Jan-Simon Moeller17 months
14.0.5commit 48af618813...Jan-Simon Moeller17 months
needlefish/14.0.5commit 48af618813...Jan-Simon Moeller17 months
needlefish_14.0.5commit 48af618813...Jan-Simon Moeller17 months
12.1.11commit bb1af1fb24...Jan-Simon Moeller18 months
lamprey/12.1.11commit bb1af1fb24...Jan-Simon Moeller18 months
lamprey_12.1.11commit bb1af1fb24...Jan-Simon Moeller18 months
14.0.4commit a0fd17fd51...Jan-Simon Moeller18 months
needlefish/14.0.4commit a0fd17fd51...Jan-Simon Moeller18 months
needlefish_14.0.4commit a0fd17fd51...Jan-Simon Moeller18 months
15.0.1commit 33ac6e22d9...Jan-Simon Moeller18 months
octopus/15.0.1commit 33ac6e22d9...Jan-Simon Moeller18 months
octopus_15.0.1commit 33ac6e22d9...Jan-Simon Moeller18 months
12.1.10commit b86985a00f...Jan-Simon Moeller19 months
lamprey/12.1.10commit b86985a00f...Jan-Simon Moeller19 months
lamprey_12.1.10commit b86985a00f...Jan-Simon Moeller19 months
15.0.0commit cc1710f95b...Jan-Simon Moeller20 months
octopus/15.0.0commit cc1710f95b...Jan-Simon Moeller20 months
octopus_15.0.0commit cc1710f95b...Jan-Simon Moeller20 months
12.1.9commit 13f0267039...Jan-Simon Moeller20 months
lamprey/12.1.9commit 13f0267039...Jan-Simon Moeller20 months
lamprey_12.1.9commit 13f0267039...Jan-Simon Moeller20 months
14.94.0commit d32e234309...Jan-Simon Moeller21 months
octopus/14.94.0commit d32e234309...Jan-Simon Moeller21 months
octopus_14.94.0commit d32e234309...Jan-Simon Moeller21 months
14.93.0commit b9d4796f44...Jan-Simon Moeller21 months
octopus/14.93.0commit b9d4796f44...Jan-Simon Moeller21 months
octopus_14.93.0commit b9d4796f44...Jan-Simon Moeller21 months
14.0.3commit 0ff2cdad22...Jan-Simon Moeller21 months
needlefish/14.0.3commit 0ff2cdad22...Jan-Simon Moeller21 months
needlefish_14.0.3commit 0ff2cdad22...Jan-Simon Moeller21 months
12.1.8commit ae982d798a...Jan-Simon Moeller22 months
lamprey/12.1.8commit ae982d798a...Jan-Simon Moeller22 months
lamprey_12.1.8commit ae982d798a...Jan-Simon Moeller22 months
14.92.0commit 7406bdefc6...Jan-Simon Moeller22 months
octopus/14.92.0commit 7406bdefc6...Jan-Simon Moeller22 months
octopus_14.92.0commit 7406bdefc6...Jan-Simon Moeller22 months
14.91.0commit fc9f15eef8...Jan-Simon Moeller23 months
octopus/14.91.0commit fc9f15eef8...Jan-Simon Moeller23 months
octopus_14.91.0commit fc9f15eef8...Jan-Simon Moeller23 months
14.0.2commit fdcfaf6bc2...Jan-Simon Moeller23 months
needlefish/14.0.2commit fdcfaf6bc2...Jan-Simon Moeller23 months
needlefish_14.0.2commit fdcfaf6bc2...Jan-Simon Moeller23 months
12.1.7commit 8e87a90505...Jan-Simon Moeller23 months
lamprey/12.1.7commit 8e87a90505...Jan-Simon Moeller23 months
lamprey_12.1.7commit 8e87a90505...Jan-Simon Moeller23 months
12.1.6commit 10a00fc8e9...Jan-Simon Moeller2 years
lamprey/12.1.6commit 10a00fc8e9...Jan-Simon Moeller2 years
lamprey_12.1.6commit 10a00fc8e9...Jan-Simon Moeller2 years
14.0.1commit 5181312423...Jan-Simon Moeller2 years
needlefish/14.0.1commit 5181312423...Jan-Simon Moeller2 years
needlefish_14.0.1commit 5181312423...Jan-Simon Moeller2 years
13.0.3commit ce1e486b05...Jan-Simon Moeller2 years
marlin/13.0.3commit ce1e486b05...Jan-Simon Moeller2 years
marlin_13.0.3commit ce1e486b05...Jan-Simon Moeller2 years
12.1.5commit 68942b0d3c...Jan-Simon Moeller2 years
lamprey/12.1.5commit 68942b0d3c...Jan-Simon Moeller2 years
lamprey_12.1.5commit 68942b0d3c...Jan-Simon Moeller2 years
14.0.0commit 02eef14403...Jan-Simon Moeller2 years
needlefish/14.0.0commit 02eef14403...Jan-Simon Moeller2 years
needlefish_14.0.0commit 02eef14403...Jan-Simon Moeller2 years
13.93.0commit 015a9b684d...Jan-Simon Moeller2 years
needlefish/13.93.0commit 015a9b684d...Jan-Simon Moeller2 years
needlefish_13.93.0commit 015a9b684d...Jan-Simon Moeller2 years
13.92.0commit 1cf04e3f6e...Jan-Simon Moeller2 years
needlefish/13.92.0commit 1cf04e3f6e...Jan-Simon Moeller2 years
needlefish_13.92.0commit 1cf04e3f6e...Jan-Simon Moeller2 years
13.0.2commit 92fb641075...Jan-Simon Moeller2 years
marlin/13.0.2commit 92fb641075...Jan-Simon Moeller2 years
marlin_13.0.2commit 92fb641075...Jan-Simon Moeller2 years
13.91.0commit b5044156fc...Jan-Simon Moeller2 years
needlefish/13.91.0commit b5044156fc...Jan-Simon Moeller2 years
needlefish_13.91.0commit b5044156fc...Jan-Simon Moeller2 years
12.1.4commit dc4729dd4c...Jan-Simon Moeller2 years
lamprey/12.1.4commit dc4729dd4c...Jan-Simon Moeller2 years
lamprey_12.1.4commit dc4729dd4c...Jan-Simon Moeller2 years
13.0.1commit 3a11fd6479...Jan-Simon Moeller2 years
marlin/13.0.1commit 3a11fd6479...Jan-Simon Moeller2 years
marlin_13.0.1commit 3a11fd6479...Jan-Simon Moeller2 years
12.1.3commit be6f8e99b3...Jan-Simon Moeller2 years
lamprey/12.1.3commit be6f8e99b3...Jan-Simon Moeller2 years
lamprey_12.1.3commit be6f8e99b3...Jan-Simon Moeller2 years
12.1.2commit 825a674a08...Jan-Simon Moeller3 years
lamprey/12.1.2commit 825a674a08...Jan-Simon Moeller3 years
lamprey_12.1.2commit 825a674a08...Jan-Simon Moeller3 years
13.0.0commit 70ee918271...Jan-Simon Moeller3 years
marlin/13.0.0commit 70ee918271...Jan-Simon Moeller3 years
marlin_13.0.0commit 70ee918271...Jan-Simon Moeller3 years
12.93.0commit 381e2a9405...Jan-Simon Moeller3 years
marlin/12.93.0commit 381e2a9405...Jan-Simon Moeller3 years
marlin_12.93.0commit 381e2a9405...Jan-Simon Moeller3 years
12.1.1commit e1a973f86e...Jan-Simon Moeller3 years
lamprey/12.1.1commit e1a973f86e...Jan-Simon Moeller3 years
lamprey_12.1.1commit e1a973f86e...Jan-Simon Moeller3 years
12.92.0commit c31a7ac007...Jan-Simon Moeller3 years
marlin/12.92.0commit c31a7ac007...Jan-Simon Moeller3 years
marlin_12.92.0commit c31a7ac007...Jan-Simon Moeller3 years
12.91.0commit 8b273d4b3c...Jan-Simon Moeller3 years
marlin/12.91.0commit 8b273d4b3c...Jan-Simon Moeller3 years
marlin_12.91.0commit 8b273d4b3c...Jan-Simon Moeller3 years
11.0.5commit 38eb21d8a2...Jan-Simon Moeller3 years
koi/11.0.5commit 38eb21d8a2...Jan-Simon Moeller3 years
koi_11.0.5commit 38eb21d8a2...Jan-Simon Moeller3 years
12.1.0commit 663448671f...Jan-Simon Moeller3 years
lamprey/12.1.0commit 663448671f...Jan-Simon Moeller3 years
lamprey_12.1.0commit 663448671f...Jan-Simon Moeller3 years
12.90.1commit abc4742a71...Jan-Simon Möller3 years
marlin/12.90.1commit abc4742a71...Jan-Simon Möller3 years
marlin_12.90.1commit abc4742a71...Jan-Simon Möller3 years
12.0.1commit 1b6d5c8ecf...Jan-Simon Möller3 years
lamprey/12.0.1commit 1b6d5c8ecf...Jan-Simon Möller3 years
lamprey_12.0.1commit 1b6d5c8ecf...Jan-Simon Möller3 years
11.0.4commit b0896b1c70...Jan-Simon Möller3 years
koi/11.0.4commit b0896b1c70...Jan-Simon Möller3 years
koi_11.0.4commit b0896b1c70...Jan-Simon Möller3 years
11.0.3commit 6ae3e85c24...Jan-Simon Moeller3 years
koi/11.0.3commit 6ae3e85c24...Jan-Simon Moeller3 years
koi_11.0.3commit 6ae3e85c24...Jan-Simon Moeller3 years
11.93.0commit 9e95c7ed53...Jan-Simon Möller3 years
lamprey/11.93.0commit 9e95c7ed53...Jan-Simon Möller3 years
lamprey_11.93.0commit 9e95c7ed53...Jan-Simon Möller3 years
12.0.0commit d85019a3ec...Jan-Simon Möller3 years
lamprey/12.0.0commit d85019a3ec...Jan-Simon Möller3 years
lamprey_12.0.0commit d85019a3ec...Jan-Simon Möller3 years
12.90.0commit 552e691f4e...Jan-Simon Möller3 years
marlin/12.90.0commit 552e691f4e...Jan-Simon Möller3 years
marlin_12.90.0commit 552e691f4e...Jan-Simon Möller3 years
11.92.0commit 042f81bc91...Jan-Simon Moeller3 years
lamprey/11.92.0commit 042f81bc91...Jan-Simon Moeller3 years
lamprey_11.92.0commit 042f81bc91...Jan-Simon Moeller3 years
11.0.2commit 496a849e4d...Jan-Simon Moeller3 years
koi/11.0.2commit 496a849e4d...Jan-Simon Moeller3 years
koi_11.0.2commit 496a849e4d...Jan-Simon Moeller3 years
11.91.0commit 851c0a0968...Jan-Simon Möller3 years
lamprey/11.91.0commit 851c0a0968...Jan-Simon Möller3 years
lamprey_11.91.0commit 851c0a0968...Jan-Simon Möller3 years
10.0.3commit 384499f6ac...Jan-Simon Moeller3 years
jellyfish/10.0.3commit 384499f6ac...Jan-Simon Moeller3 years
jellyfish_10.0.3commit 384499f6ac...Jan-Simon Moeller3 years
11.0.1commit 795f0f7aef...Jan-Simon Möller4 years
koi/11.0.1commit 795f0f7aef...Jan-Simon Möller4 years
koi_11.0.1commit 795f0f7aef...Jan-Simon Möller4 years
10.0.2commit 85cc5622e6...Jan-Simon Möller4 years
jellyfish/10.0.2commit 85cc5622e6...Jan-Simon Möller4 years
jellyfish_10.0.2commit 85cc5622e6...Jan-Simon Möller4 years
11.0.0commit 4b755c4e17...Jan-Simon Möller4 years
koi/11.0.0commit 4b755c4e17...Jan-Simon Möller4 years
koi_11.0.0commit 4b755c4e17...Jan-Simon Möller4 years
10.93.1commit 2bab673a36...Jan-Simon Möller4 years
koi/10.93.1commit 2bab673a36...Jan-Simon Möller4 years
koi_10.93.1commit 2bab673a36...Jan-Simon Möller4 years
10.93.0commit 710583ec2e...Jan-Simon Möller4 years
koi/10.93.0commit 710583ec2e...Jan-Simon Möller4 years
koi_10.93.0commit 710583ec2e...Jan-Simon Möller4 years
10.92.0commit 7edeebda38...Jan-Simon Möller4 years
koi/10.92.0commit 7edeebda38...Jan-Simon Möller4 years
koi_10.92.0commit 7edeebda38...Jan-Simon Möller4 years
10.91.0commit d3f1db09e7...Jan-Simon Möller4 years
koi/10.91.0commit d3f1db09e7...Jan-Simon Möller4 years
koi_10.91.0commit d3f1db09e7...Jan-Simon Möller4 years
9.0.4commit e2abf967b9...Jan-Simon Möller4 years
icefish/9.0.4commit e2abf967b9...Jan-Simon Möller4 years
icefish_9.0.4commit e2abf967b9...Jan-Simon Möller4 years
10.0.1commit f092b22cc5...Jan-Simon Möller4 years
jellyfish/10.0.1commit f092b22cc5...Jan-Simon Möller4 years
jellyfish_10.0.1commit f092b22cc5...Jan-Simon Möller4 years
10.0.0commit 2bea3a629b...Jan-Simon Möller4 years
jellyfish/10.0.0commit 2bea3a629b...Jan-Simon Möller4 years
jellyfish_10.0.0commit 2bea3a629b...Jan-Simon Möller4 years
9.99.4commit 6920e60a3d...Jan-Simon Möller4 years
jellyfish/9.99.4commit 6920e60a3d...Jan-Simon Möller4 years
jellyfish_9.99.4commit 6920e60a3d...Jan-Simon Möller4 years
9.99.3commit 4e751e3b5a...Jan-Simon Möller4 years
jellyfish/9.99.3commit 4e751e3b5a...Jan-Simon Möller4 years
jellyfish_9.99.3commit 4e751e3b5a...Jan-Simon Möller4 years
9.0.3commit fdcaa09ee5...Jan-Simon Möller4 years
icefish/9.0.3commit fdcaa09ee5...Jan-Simon Möller4 years
icefish_9.0.3commit fdcaa09ee5...Jan-Simon Möller4 years
9.99.2commit 5e12e21bf0...Jan-Simon Moeller4 years
jellyfish/9.99.2commit 5e12e21bf0...Jan-Simon Moeller4 years
jellyfish_9.99.2commit 5e12e21bf0...Jan-Simon Moeller4 years
9.99.1commit 7a1e961b48...Jan-Simon Möller4 years
jellyfish/9.99.1commit 7a1e961b48...Jan-Simon Möller4 years
jellyfish_9.99.1commit 7a1e961b48...Jan-Simon Möller4 years
9.0.2commit a69184212e...Jan-Simon Möller4 years
icefish/9.0.2commit a69184212e...Jan-Simon Möller4 years
icefish_9.0.2commit a69184212e...Jan-Simon Möller4 years
9.0.1commit be63118538...Jan-Simon Möller5 years
icefish/9.0.1commit be63118538...Jan-Simon Möller5 years
icefish_9.0.1commit be63118538...Jan-Simon Möller5 years
8.0.6commit 052722a079...Jan-Simon Möller5 years
halibut/8.0.6commit 052722a079...Jan-Simon Möller5 years
halibut_8.0.6commit 052722a079...Jan-Simon Möller5 years
9.0.0commit 60308c26c7...Jan-Simon Möller5 years
icefish/9.0.0commit 60308c26c7...Jan-Simon Möller5 years
icefish_9.0.0commit 60308c26c7...Jan-Simon Möller5 years
8.99.5commit 908d7992e1...Jan-Simon Möller5 years
icefish/8.99.5commit 908d7992e1...Jan-Simon Möller5 years
icefish_8.99.5commit 908d7992e1...Jan-Simon Möller5 years
8.0.5commit 9319e53e82...Jan-Simon Möller5 years
halibut/8.0.5commit 9319e53e82...Jan-Simon Möller5 years
halibut_8.0.5commit 9319e53e82...Jan-Simon Möller5 years
8.99.4commit 40fbceab58...Jan-Simon Möller5 years
icefish/8.99.4commit 40fbceab58...Jan-Simon Möller5 years
icefish_8.99.4commit 40fbceab58...Jan-Simon Möller5 years
8.0.4commit ab4c19fb01...Jan-Simon Möller5 years
halibut/8.0.4commit ab4c19fb01...Jan-Simon Möller5 years
halibut_8.0.4commit ab4c19fb01...Jan-Simon Möller5 years
8.99.3commit d444569564...Jan-Simon Möller5 years
icefish/8.99.3commit d444569564...Jan-Simon Möller5 years
icefish_8.99.3commit d444569564...Jan-Simon Möller5 years
8.99.2commit dc3958ce86...Jan-Simon Möller5 years
icefish/8.99.2commit dc3958ce86...Jan-Simon Möller5 years
icefish_8.99.2commit dc3958ce86...Jan-Simon Möller5 years
8.99.1commit 66c26d2329...Jan-Simon Möller5 years
icefish/8.99.1commit 66c26d2329...Jan-Simon Möller5 years
icefish_8.99.1commit 66c26d2329...Jan-Simon Möller5 years
8.0.3commit e15a9df48b...Jan-Simon Möller5 years
halibut/8.0.3commit e15a9df48b...Jan-Simon Möller5 years
halibut_8.0.3commit e15a9df48b...Jan-Simon Möller5 years
8.0.2commit 8a7ddd4627...Jan-Simon Möller5 years
halibut/8.0.2commit 8a7ddd4627...Jan-Simon Möller5 years
halibut_8.0.2commit 8a7ddd4627...Jan-Simon Möller5 years
7.0.4commit 57824f4d8f...Jan-Simon Möller5 years
guppy/7.0.4commit 57824f4d8f...Jan-Simon Möller5 years
guppy_7.0.4commit 57824f4d8f...Jan-Simon Möller5 years
8.0.1commit b4099c5fd7...Jan-Simon Möller5 years
halibut/8.0.1commit b4099c5fd7...Jan-Simon Möller5 years
halibut_8.0.1commit b4099c5fd7...Jan-Simon Möller5 years
8.0.0commit 59f37556d1...Jan-Simon Möller5 years
halibut/8.0.0commit 59f37556d1...Jan-Simon Möller5 years
halibut_8.0.0commit 59f37556d1...Jan-Simon Möller5 years
7.99.3commit 42ab2045be...Jan-Simon Möller5 years
halibut/7.99.3commit 42ab2045be...Jan-Simon Möller5 years
halibut_7.99.3commit 42ab2045be...Jan-Simon Möller5 years
7.0.3commit 5855c1d849...Jan-Simon Möller5 years
guppy/7.0.3commit 5855c1d849...Jan-Simon Möller5 years
guppy_7.0.3commit 5855c1d849...Jan-Simon Möller5 years
7.99.2commit 0723ce7012...Jan-Simon Möller5 years
halibut/7.99.2commit 0723ce7012...Jan-Simon Möller5 years
halibut_7.99.2commit 0723ce7012...Jan-Simon Möller5 years
7.99.1commit a039cce097...Jan-Simon Möller5 years
halibut/7.99.1commit a039cce097...Jan-Simon Möller5 years
halibut_7.99.1commit a039cce097...Jan-Simon Möller5 years
7.0.2commit 6c60ed66a4...Jan-Simon Möller5 years
guppy/7.0.2commit 6c60ed66a4...Jan-Simon Möller5 years
guppy_7.0.2commit 6c60ed66a4...Jan-Simon Möller5 years
7.0.1commit 6a170f94b3...Jan-Simon Möller6 years
guppy/7.0.1commit 6a170f94b3...Jan-Simon Möller6 years
guppy_7.0.1commit 6a170f94b3...Jan-Simon Möller6 years
6.0.5commit bf364d8911...Jan-Simon Möller6 years
flounder/6.0.5commit bf364d8911...Jan-Simon Möller6 years
flounder_6.0.5commit bf364d8911...Jan-Simon Möller6 years
7.0.0commit 725d3c3177...Jan-Simon Möller6 years
guppy/7.0.0commit 725d3c3177...Jan-Simon Möller6 years
guppy_7.0.0commit 725d3c3177...Jan-Simon Möller6 years
7.90.0commit 8117996305...Jan-Simon Möller6 years
halibut/7.90.0commit 8117996305...Jan-Simon Möller6 years
halibut_7.90.0commit 8117996305...Jan-Simon Möller6 years
6.99.5commit 59abc08de3...Jan-Simon Möller6 years
guppy/6.99.5commit 59abc08de3...Jan-Simon Möller6 years
guppy_6.99.5commit 59abc08de3...Jan-Simon Möller6 years
6.0.4commit 4ea0b93b14...Jan-Simon Möller6 years
flounder/6.0.4commit 4ea0b93b14...Jan-Simon Möller6 years
flounder_6.0.4commit 4ea0b93b14...Jan-Simon Möller6 years
6.99.4commit f835ee311c...Jan-Simon Möller6 years
guppy/6.99.4commit f835ee311c...Jan-Simon Möller6 years
guppy_6.99.4commit f835ee311c...Jan-Simon Möller6 years
6.99.3commit cf71a3e8fd...Jan-Simon Möller6 years
guppy/6.99.3commit cf71a3e8fd...Jan-Simon Möller6 years
guppy_6.99.3commit cf71a3e8fd...Jan-Simon Möller6 years
6.0.3commit 0f1bcdcbe3...Jan-Simon Möller6 years
flounder/6.0.3commit 0f1bcdcbe3...Jan-Simon Möller6 years
flounder_6.0.3commit 0f1bcdcbe3...Jan-Simon Möller6 years
6.99.2commit c46d25ae06...Jan-Simon Möller6 years
guppy/6.99.2commit c46d25ae06...Jan-Simon Möller6 years
guppy_6.99.2commit c46d25ae06...Jan-Simon Möller6 years
6.99.1commit 7d027fc628...Jan-Simon Möller6 years
guppy/6.99.1commit 7d027fc628...Jan-Simon Möller6 years
guppy_6.99.1commit 7d027fc628...Jan-Simon Möller6 years
6.0.2commit f76872c5b8...Jan-Simon Möller6 years
flounder/6.0.2commit f76872c5b8...Jan-Simon Möller6 years
flounder_6.0.2commit f76872c5b8...Jan-Simon Möller6 years
6.0.1commit 7a6616c138...Jan-Simon Möller6 years
flounder/6.0.1commit 7a6616c138...Jan-Simon Möller6 years
flounder_6.0.1commit 7a6616c138...Jan-Simon Möller6 years
6.90.0commit 065eb6fcd2...Jan-Simon Möller6 years
guppy/6.90.0commit 065eb6fcd2...Jan-Simon Möller6 years
guppy_6.90.0commit 065eb6fcd2...Jan-Simon Möller6 years
6.0.0commit 0fde830e52...Jan-Simon Möller6 years
flounder/6.0.0commit 0fde830e52...Jan-Simon Möller6 years
flounder_6.0.0commit 0fde830e52...Jan-Simon Möller6 years
5.99.7commit a37385c65b...Jan-Simon Möller6 years
flounder/5.99.7commit a37385c65b...Jan-Simon Möller6 years
flounder_5.99.7commit a37385c65b...Jan-Simon Möller6 years
5.99.6commit 1ac6af91ec...Jan-Simon Möller6 years
flounder/5.99.6commit 1ac6af91ec...Jan-Simon Möller6 years
flounder_5.99.6commit 1ac6af91ec...Jan-Simon Möller6 years
5.99.5commit ea20324404...Jan-Simon Möller6 years
flounder/5.99.5commit ea20324404...Jan-Simon Möller6 years
flounder_5.99.5commit ea20324404...Jan-Simon Möller6 years
5.99.4commit 8ca211abd1...Jan-Simon Möller6 years
flounder/5.99.4commit 8ca211abd1...Jan-Simon Möller6 years
flounder_5.99.4commit 8ca211abd1...Jan-Simon Möller6 years
5.99.3commit 499444bfa9...Jan-Simon Möller6 years
flounder/5.99.3commit 499444bfa9...Jan-Simon Möller6 years
flounder_5.99.3commit 499444bfa9...Jan-Simon Möller6 years
5.99.2commit f126a1cb09...Jan-Simon Möller6 years
flounder/5.99.2commit f126a1cb09...Jan-Simon Möller6 years
flounder_5.99.2commit f126a1cb09...Jan-Simon Möller6 years
5.1.0commit e5cb9cdea2...Jan-Simon Möller6 years
eel/5.1.0commit e5cb9cdea2...Jan-Simon Möller6 years
eel_5.1.0commit e5cb9cdea2...Jan-Simon Möller6 years
5.99.1commit d12df8891a...Jan-Simon Möller6 years
flounder/5.99.1commit d12df8891a...Jan-Simon Möller6 years
flounder_5.99.1commit d12df8891a...Jan-Simon Möller6 years
5.0.3commit e1b558e1f0...Jan-Simon Möller6 years
eel/5.0.3commit e1b558e1f0...Jan-Simon Möller6 years
eel_5.0.3commit e1b558e1f0...Jan-Simon Möller6 years
5.0.2commit 14579523b8...Jan-Simon Möller7 years
eel/5.0.2commit 14579523b8...Jan-Simon Möller7 years
eel_5.0.2commit 14579523b8...Jan-Simon Möller7 years
4.0.3commit 1b2addabaa...Jan-Simon Möller7 years
dab/4.0.3commit 1b2addabaa...Jan-Simon Möller7 years
dab_4.0.3commit 1b2addabaa...Jan-Simon Möller7 years
5.0.1commit bd48aea823...Jan-Simon Möller7 years
eel/5.0.1commit bd48aea823...Jan-Simon Möller7 years
eel_5.0.1commit bd48aea823...Jan-Simon Möller7 years
5.0.0commit b3084b0edd...Jan-Simon Möller7 years
eel/5.0.0commit b3084b0edd...Jan-Simon Möller7 years
eel_5.0.0commit b3084b0edd...Jan-Simon Möller7 years
4.99.5commit 2a1c8e5e89...Jan-Simon Möller7 years
eel/4.99.5commit 2a1c8e5e89...Jan-Simon Möller7 years
eel_4.99.5commit 2a1c8e5e89...Jan-Simon Möller7 years
4.99.4commit 2c5e0e646a...Jan-Simon Möller7 years
eel/4.99.4commit 2c5e0e646a...Jan-Simon Möller7 years
eel_4.99.4commit 2c5e0e646a...Jan-Simon Möller7 years
4.99.3commit 9cdd1e7b56...Jan-Simon Möller7 years
eel/4.99.3commit 9cdd1e7b56...Jan-Simon Möller7 years
eel_4.99.3commit 9cdd1e7b56...Jan-Simon Möller7 years
4.99.2commit f0e87b1656...Jan-Simon Möller7 years
eel/4.99.2commit f0e87b1656...Jan-Simon Möller7 years
eel_4.99.2commit f0e87b1656...Jan-Simon Möller7 years
4.99.1commit 970a7f8e15...Jan-Simon Möller7 years
eel/4.99.1commit 970a7f8e15...Jan-Simon Möller7 years
eel_4.99.1commit 970a7f8e15...Jan-Simon Möller7 years
4.0.2commit a5f69d3d31...Jan-Simon Möller7 years
dab/4.0.2commit a5f69d3d31...Jan-Simon Möller7 years
dab_4.0.2commit a5f69d3d31...Jan-Simon Möller7 years
4.0.1commit 7b971469a8...Jan-Simon Möller7 years
dab/4.0.1commit 7b971469a8...Jan-Simon Möller7 years
dab_4.0.1commit 7b971469a8...Jan-Simon Möller7 years
3.0.5commit 29c296c3e1...Jan-Simon Möller7 years
chinook/3.0.5commit 29c296c3e1...Jan-Simon Möller7 years
chinook_3.0.5commit 29c296c3e1...Jan-Simon Möller7 years
4.0.0commit 84f2e448c6...Jan-Simon Möller7 years
dab/4.0.0commit 84f2e448c6...Jan-Simon Möller7 years
dab_4.0.0commit 84f2e448c6...Jan-Simon Möller7 years
3.99.3commit 4307ed5d28...Jan-Simon Möller7 years
dab/3.99.3commit 4307ed5d28...Jan-Simon Möller7 years
dab_3.99.3commit 4307ed5d28...Jan-Simon Möller7 years
3.99.2commit 0c484021ac...Jan-Simon Möller7 years
dab/3.99.2commit 0c484021ac...Jan-Simon Möller7 years
dab_3.99.2commit 0c484021ac...Jan-Simon Möller7 years
3.0.4commit 29c296c3e1...Jan-Simon Möller7 years
chinook/3.0.4commit 29c296c3e1...Jan-Simon Möller7 years
chinook_3.0.4commit 29c296c3e1...Jan-Simon Möller7 years
3.99.1commit 79fe06d7b1...Jan-Simon Möller7 years
dab/3.99.1commit 79fe06d7b1...Jan-Simon Möller7 years
dab_3.99.1commit 79fe06d7b1...Jan-Simon Möller7 years
3.0.3commit 900c064d04...Jan-Simon Möller8 years
chinook/3.0.3commit 900c064d04...Jan-Simon Möller8 years
chinook_3.0.3commit 900c064d04...Jan-Simon Möller8 years
3.0.2commit f12cf6c411...Jan-Simon Möller8 years
chinook/3.0.2commit f12cf6c411...Jan-Simon Möller8 years
chinook_3.0.2commit f12cf6c411...Jan-Simon Möller8 years
2.0.5commit 775d5687d4...Jan-Simon Möller8 years
blowfish_2.0.5commit 775d5687d4...Jan-Simon Möller8 years
3.0.1commit 301c9b3236...Jan-Simon Möller8 years
chinook/3.0.1commit 301c9b3236...Jan-Simon Möller8 years
chinook_3.0.1commit 301c9b3236...Jan-Simon Möller8 years
3.0.0commit fb57dd647f...Jan-Simon Möller8 years
chinook/3.0.0commit fb57dd647f...Jan-Simon Möller8 years
chinook_3.0.0commit fb57dd647f...Jan-Simon Möller8 years
2.0.4commit 775d5687d4...Jan-Simon Möller8 years
blowfish_2.0.4commit 775d5687d4...Jan-Simon Möller8 years
2.0.3commit fe44384501...Jan-Simon Möller8 years
blowfish_2.0.3commit fe44384501...Jan-Simon Möller8 years
2.0.2commit 2031b8aad4...Tadao Tanikawa8 years
blowflish_2.0.2commit 2031b8aad4...Tadao Tanikawa8 years
blowfish_2.0.1commit 744c7b1093...Jan-Simon Möller8 years
2.0.1commit 744c7b1093...Jan-Simon Möller8 years
2.0.0commit cc54151075...Jan-Simon Möller8 years
blowfish_2.0.0commit cc54151075...Jan-Simon Möller8 years
albacore_1.0commit b346f282b1...Jan-Simon Möller9 years
0.2015.33commit 752f9723fe...Paul Sherwood9 years