fix some linting trouble

Michael Muré created

Change summary

bug/bug.go                                 | 30 ++++++++++++++---------
bug/bug_actions.go                         |  5 ++++
bug/clocks.go                              |  2 +
bug/comment.go                             |  2 +
bug/operation.go                           | 11 ++++++++
bug/operation_pack.go                      |  6 ++++
bug/operations/label_change.go             |  6 ++--
graphql/connections/connection_template.go | 10 ++++++++
graphql/connections/connections.go         |  5 ++-
graphql/connections/gen_bug.go             |  4 +++
graphql/connections/gen_comment.go         |  4 +++
graphql/connections/gen_operation.go       |  4 +++
graphql/connections/lazy_bug.go            |  2 +
graphql/models/edges.go                    |  3 ++
graphql/relay.go                           |  2 -
graphql/resolvers/operations.go            |  2 
input/input.go                             | 26 +++++++++++++++-----
repository/git.go                          |  7 ++++-
repository/repo.go                         |  2 
termui/termui.go                           |  1 
util/hash.go                               |  4 +++
webui/debug_assets.go                      |  3 ++
22 files changed, 111 insertions(+), 30 deletions(-)

Detailed changes

bug/bug.go 🔗

@@ -26,7 +26,7 @@ const humanIdLength = 7
 
 // Bug hold the data of a bug thread, organized in a way close to
 // how it will be persisted inside Git. This is the data structure
-// used for merge of two different version.
+// used to merge two different version of the same Bug.
 type Bug struct {
 
 	// A Lamport clock is a logical clock that allow to order event
@@ -41,7 +41,7 @@ type Bug struct {
 	lastCommit util.Hash
 	rootPack   util.Hash
 
-	// all the commited operations
+	// all the committed operations
 	packs []OperationPack
 
 	// a temporary pack of operations used for convenience to pile up new operations
@@ -49,14 +49,14 @@ type Bug struct {
 	staging OperationPack
 }
 
-// Create a new Bug
+// NewBug create a new Bug
 func NewBug() *Bug {
 	// No id yet
 	// No logical clock yet
 	return &Bug{}
 }
 
-// Find an existing Bug matching a prefix
+// FindLocalBug find an existing Bug matching a prefix
 func FindLocalBug(repo repository.Repo, prefix string) (*Bug, error) {
 	ids, err := repo.ListIds(bugsRefPattern)
 
@@ -84,17 +84,19 @@ func FindLocalBug(repo repository.Repo, prefix string) (*Bug, error) {
 	return ReadLocalBug(repo, matching[0])
 }
 
+// ReadLocalBug will read a local bug from its hash
 func ReadLocalBug(repo repository.Repo, id string) (*Bug, error) {
 	ref := bugsRefPattern + id
 	return readBug(repo, ref)
 }
 
+// ReadRemoteBug will read a remote bug from its hash
 func ReadRemoteBug(repo repository.Repo, remote string, id string) (*Bug, error) {
 	ref := fmt.Sprintf(bugsRemoteRefPattern, remote) + id
 	return readBug(repo, ref)
 }
 
-// Read and parse a Bug from git
+// readBug will read and parse a Bug from git
 func readBug(repo repository.Repo, ref string) (*Bug, error) {
 	hashes, err := repo.ListCommits(ref)
 
@@ -212,12 +214,12 @@ type StreamedBug struct {
 	Err error
 }
 
-// Read and parse all local bugs
+// ReadAllLocalBugs read and parse all local bugs
 func ReadAllLocalBugs(repo repository.Repo) <-chan StreamedBug {
 	return readAllBugs(repo, bugsRefPattern)
 }
 
-// Read and parse all remote bugs for a given remote
+// ReadAllRemoteBugs read and parse all remote bugs for a given remote
 func ReadAllRemoteBugs(repo repository.Repo, remote string) <-chan StreamedBug {
 	refPrefix := fmt.Sprintf(bugsRemoteRefPattern, remote)
 	return readAllBugs(repo, refPrefix)
@@ -251,7 +253,7 @@ func readAllBugs(repo repository.Repo, refPrefix string) <-chan StreamedBug {
 	return out
 }
 
-// List all the available local bug ids
+// ListLocalIds list all the available local bug ids
 func ListLocalIds(repo repository.Repo) ([]string, error) {
 	return repo.ListIds(bugsRefPattern)
 }
@@ -304,12 +306,12 @@ func (bug *Bug) Append(op Operation) {
 	bug.staging.Append(op)
 }
 
-// Return if the bug need to be committed
+// HasPendingOp tell if the bug need to be committed
 func (bug *Bug) HasPendingOp() bool {
 	return !bug.staging.IsEmpty()
 }
 
-// Write the staging area in Git and move the operations to the packs
+// Commit write the staging area in Git and move the operations to the packs
 func (bug *Bug) Commit(repo repository.Repo) error {
 	if bug.staging.IsEmpty() {
 		return fmt.Errorf("can't commit a bug with no pending operation")
@@ -515,6 +517,10 @@ func (bug *Bug) Merge(repo repository.Repo, other *Bug) (bool, error) {
 		// create a new commit with the correct ancestor
 		hash, err := repo.StoreCommitWithParent(treeHash, bug.lastCommit)
 
+		if err != nil {
+			return false, err
+		}
+
 		// replace the pack
 		newPack := pack.Clone()
 		newPack.commitHash = hash
@@ -533,7 +539,7 @@ func (bug *Bug) Merge(repo repository.Repo, other *Bug) (bool, error) {
 	return true, nil
 }
 
-// Return the Bug identifier
+// Id return the Bug identifier
 func (bug *Bug) Id() string {
 	if bug.id == "" {
 		// simply panic as it would be a coding error
@@ -543,7 +549,7 @@ func (bug *Bug) Id() string {
 	return bug.id
 }
 
-// Return the Bug identifier truncated for human consumption
+// HumanId return the Bug identifier truncated for human consumption
 func (bug *Bug) HumanId() string {
 	return formatHumanId(bug.Id())
 }

bug/bug_actions.go 🔗

@@ -107,6 +107,11 @@ func MergeAll(repo repository.Repo, remote string) <-chan MergeResult {
 			localRef := bugsRefPattern + remoteBug.Id()
 			localExist, err := repo.RefExist(localRef)
 
+			if err != nil {
+				out <- newMergeError(id, err)
+				continue
+			}
+
 			// the bug is not local yet, simply create the reference
 			if !localExist {
 				err := repo.CopyRef(remoteRef, localRef)

bug/clocks.go 🔗

@@ -4,6 +4,8 @@ import (
 	"github.com/MichaelMure/git-bug/repository"
 )
 
+// Witnesser will read all the available Bug to recreate the different logical
+// clocks
 func Witnesser(repo *repository.GitRepo) error {
 	for b := range ReadAllLocalBugs(repo) {
 		if b.Err != nil {

bug/comment.go 🔗

@@ -6,6 +6,7 @@ import (
 	"time"
 )
 
+// Comment represent a comment in a Bug
 type Comment struct {
 	Author  Person
 	Message string
@@ -16,6 +17,7 @@ type Comment struct {
 	UnixTime int64
 }
 
+// FormatTime format the UnixTime of the comment for human consumption
 func (c Comment) FormatTime() string {
 	t := time.Unix(c.UnixTime, 0)
 	return humanize.Time(t)

bug/operation.go 🔗

@@ -5,6 +5,7 @@ import (
 	"time"
 )
 
+// OperationType is an identifier
 type OperationType int
 
 const (
@@ -16,22 +17,29 @@ const (
 	LabelChangeOp
 )
 
+// Operation define the interface to fulfill for an edit operation of a Bug
 type Operation interface {
+	// OpType return the type of operation
 	OpType() OperationType
+	// Time return the time when the operation was added
 	Time() time.Time
+	// Apply the operation to a Snapshot to create the final state
 	Apply(snapshot Snapshot) Snapshot
+	// Files return the files needed by this operation
 	Files() []util.Hash
 
 	// TODO: data validation (ex: a title is a single line)
 	// Validate() bool
 }
 
+// OpBase implement the common code for all operations
 type OpBase struct {
 	OperationType OperationType
 	Author        Person
 	UnixTime      int64
 }
 
+// NewOpBase is the constructor for an OpBase
 func NewOpBase(opType OperationType, author Person) OpBase {
 	return OpBase{
 		OperationType: opType,
@@ -40,14 +48,17 @@ func NewOpBase(opType OperationType, author Person) OpBase {
 	}
 }
 
+// OpType return the type of operation
 func (op OpBase) OpType() OperationType {
 	return op.OperationType
 }
 
+// Time return the time when the operation was added
 func (op OpBase) Time() time.Time {
 	return time.Unix(op.UnixTime, 0)
 }
 
+// Files return the files needed by this operation
 func (op OpBase) Files() []util.Hash {
 	return nil
 }

bug/operation_pack.go 🔗

@@ -20,6 +20,7 @@ type OperationPack struct {
 	commitHash util.Hash
 }
 
+// ParseOperationPack will deserialize an OperationPack from raw bytes
 func ParseOperationPack(data []byte) (*OperationPack, error) {
 	reader := bytes.NewReader(data)
 	decoder := gob.NewDecoder(reader)
@@ -35,6 +36,7 @@ func ParseOperationPack(data []byte) (*OperationPack, error) {
 	return &opp, nil
 }
 
+// Serialize will serialise an OperationPack into raw bytes
 func (opp *OperationPack) Serialize() ([]byte, error) {
 	var data bytes.Buffer
 
@@ -53,14 +55,18 @@ func (opp *OperationPack) Append(op Operation) {
 	opp.Operations = append(opp.Operations, op)
 }
 
+// IsEmpty tell if the OperationPack is empty
 func (opp *OperationPack) IsEmpty() bool {
 	return len(opp.Operations) == 0
 }
 
+// IsValid tell if the OperationPack is considered valid
 func (opp *OperationPack) IsValid() bool {
 	return !opp.IsEmpty()
 }
 
+// Write will serialize and store the OperationPack as a git blob and return
+// its hash
 func (opp *OperationPack) Write(repo repository.Repo) (util.Hash, error) {
 	data, err := opp.Serialize()
 

bug/operations/label_change.go 🔗

@@ -9,16 +9,16 @@ import (
 	"github.com/MichaelMure/git-bug/bug"
 )
 
-// LabelChangeOperation will add or remove a set of labels
-
 var _ bug.Operation = LabelChangeOperation{}
 
+// LabelChangeOperation define a Bug operation to add or remove labels
 type LabelChangeOperation struct {
 	bug.OpBase
 	Added   []bug.Label
 	Removed []bug.Label
 }
 
+// Apply apply the operation
 func (op LabelChangeOperation) Apply(snapshot bug.Snapshot) bug.Snapshot {
 	// Add in the set
 AddLoop:
@@ -59,7 +59,7 @@ func NewLabelChangeOperation(author bug.Person, added, removed []bug.Label) Labe
 	}
 }
 
-// Convenience function to apply the operation
+// ChangeLabels is a convenience function to apply the operation
 func ChangeLabels(out io.Writer, b *bug.Bug, author bug.Person, add, remove []string) error {
 	var added, removed []bug.Label
 

graphql/connections/connection_template.go 🔗

@@ -2,22 +2,32 @@ package connections
 
 import (
 	"fmt"
+
 	"github.com/MichaelMure/git-bug/graphql/models"
 	"github.com/cheekybits/genny/generic"
 )
 
+// NodeType define the node type handled by this relay connection
 type NodeType generic.Type
+
+// EdgeType define the edge type handled by this relay connection
 type EdgeType generic.Type
+
+// ConnectionType define the connection type handled by this relay connection
 type ConnectionType generic.Type
 
+// NodeTypeEdger define a function that take a NodeType and an offset and
+// create an Edge.
 type NodeTypeEdger func(value NodeType, offset int) Edge
 
+// NodeTypeConMaker define a function that create a ConnectionType
 type NodeTypeConMaker func(
 	edges []EdgeType,
 	nodes []NodeType,
 	info models.PageInfo,
 	totalCount int) (ConnectionType, error)
 
+// NodeTypeCon will paginate a source according to the input of a relay connection
 func NodeTypeCon(source []NodeType, edger NodeTypeEdger, conMaker NodeTypeConMaker, input models.ConnectionInput) (ConnectionType, error) {
 	var nodes []NodeType
 	var edges []EdgeType

graphql/connections/connections.go 🔗

@@ -13,17 +13,18 @@ import (
 
 const cursorPrefix = "cursor:"
 
+// Edge define the contract for an edge in a relay connection
 type Edge interface {
 	GetCursor() string
 }
 
-// Creates the cursor string from an offset
+// OffsetToCursor create the cursor string from an offset
 func OffsetToCursor(offset int) string {
 	str := fmt.Sprintf("%v%v", cursorPrefix, offset)
 	return base64.StdEncoding.EncodeToString([]byte(str))
 }
 
-// Re-derives the offset from the cursor string.
+// CursorToOffset re-derives the offset from the cursor string.
 func CursorToOffset(cursor string) (int, error) {
 	str := ""
 	b, err := base64.StdEncoding.DecodeString(cursor)

graphql/connections/gen_bug.go 🔗

@@ -10,14 +10,18 @@ import (
 	"github.com/MichaelMure/git-bug/graphql/models"
 )
 
+// StringEdger define a function that take a string and an offset and
+// create an Edge.
 type StringEdger func(value string, offset int) Edge
 
+// StringConMaker define a function that create a models.BugConnection
 type StringConMaker func(
 	edges []LazyBugEdge,
 	nodes []string,
 	info models.PageInfo,
 	totalCount int) (models.BugConnection, error)
 
+// StringCon will paginate a source according to the input of a relay connection
 func StringCon(source []string, edger StringEdger, conMaker StringConMaker, input models.ConnectionInput) (models.BugConnection, error) {
 	var nodes []string
 	var edges []LazyBugEdge

graphql/connections/gen_comment.go 🔗

@@ -11,14 +11,18 @@ import (
 	"github.com/MichaelMure/git-bug/graphql/models"
 )
 
+// BugCommentEdger define a function that take a bug.Comment and an offset and
+// create an Edge.
 type BugCommentEdger func(value bug.Comment, offset int) Edge
 
+// BugCommentConMaker define a function that create a models.CommentConnection
 type BugCommentConMaker func(
 	edges []models.CommentEdge,
 	nodes []bug.Comment,
 	info models.PageInfo,
 	totalCount int) (models.CommentConnection, error)
 
+// BugCommentCon will paginate a source according to the input of a relay connection
 func BugCommentCon(source []bug.Comment, edger BugCommentEdger, conMaker BugCommentConMaker, input models.ConnectionInput) (models.CommentConnection, error) {
 	var nodes []bug.Comment
 	var edges []models.CommentEdge

graphql/connections/gen_operation.go 🔗

@@ -11,14 +11,18 @@ import (
 	"github.com/MichaelMure/git-bug/graphql/models"
 )
 
+// BugOperationEdger define a function that take a bug.Operation and an offset and
+// create an Edge.
 type BugOperationEdger func(value bug.Operation, offset int) Edge
 
+// BugOperationConMaker define a function that create a models.OperationConnection
 type BugOperationConMaker func(
 	edges []models.OperationEdge,
 	nodes []bug.Operation,
 	info models.PageInfo,
 	totalCount int) (models.OperationConnection, error)
 
+// BugOperationCon will paginate a source according to the input of a relay connection
 func BugOperationCon(source []bug.Operation, edger BugOperationEdger, conMaker BugOperationConMaker, input models.ConnectionInput) (models.OperationConnection, error) {
 	var nodes []bug.Operation
 	var edges []models.OperationEdge

graphql/connections/lazy_bug.go 🔗

@@ -1,10 +1,12 @@
 package connections
 
+// LazyBugEdge is a special relay edge used to implement a lazy loading connection
 type LazyBugEdge struct {
 	Id     string
 	Cursor string
 }
 
+// GetCursor return the cursor of a LazyBugEdge
 func (lbe LazyBugEdge) GetCursor() string {
 	return lbe.Cursor
 }

graphql/models/edges.go 🔗

@@ -1,13 +1,16 @@
 package models
 
+// GetCursor return the cursor entry of an edge
 func (e OperationEdge) GetCursor() string {
 	return e.Cursor
 }
 
+// GetCursor return the cursor entry of an edge
 func (e BugEdge) GetCursor() string {
 	return e.Cursor
 }
 
+// GetCursor return the cursor entry of an edge
 func (e CommentEdge) GetCursor() string {
 	return e.Cursor
 }

graphql/relay.go 🔗

@@ -5,7 +5,6 @@ import (
 	"strings"
 )
 
-
 type ResolvedGlobalID struct {
 	Type string `json:"type"`
 	ID   string `json:"id"`
@@ -36,4 +35,3 @@ func FromGlobalID(globalID string) *ResolvedGlobalID {
 		ID:   tokens[1],
 	}
 }
-

graphql/resolvers/operations.go 🔗

@@ -5,8 +5,8 @@ import (
 	"fmt"
 	"github.com/MichaelMure/git-bug/bug"
 	"github.com/MichaelMure/git-bug/bug/operations"
-	"time"
 	"github.com/MichaelMure/git-bug/graphql/models"
+	"time"
 )
 
 type addCommentOperationResolver struct{}

input/input.go 🔗

@@ -16,7 +16,10 @@ import (
 
 const messageFilename = "BUG_MESSAGE_EDITMSG"
 
+// ErrEmptyMessage is returned when the required message has not been entered
 var ErrEmptyMessage = errors.New("empty message")
+
+// ErrEmptyMessage is returned when the required title has not been entered
 var ErrEmptyTitle = errors.New("empty title")
 
 const bugTitleCommentTemplate = `%s%s
@@ -26,6 +29,9 @@ const bugTitleCommentTemplate = `%s%s
 # An empty title aborts the operation.
 `
 
+// BugCreateEditorInput will open the default editor in the terminal with a
+// template for the user to fill. The file is then processed to extract title
+// and message.
 func BugCreateEditorInput(repo repository.Repo, preTitle string, preMessage string) (string, string, error) {
 	if preMessage != "" {
 		preMessage = "\n\n" + preMessage
@@ -33,7 +39,7 @@ func BugCreateEditorInput(repo repository.Repo, preTitle string, preMessage stri
 
 	template := fmt.Sprintf(bugTitleCommentTemplate, preTitle, preMessage)
 
-	raw, err := LaunchEditorWithTemplate(repo, messageFilename, template)
+	raw, err := launchEditorWithTemplate(repo, messageFilename, template)
 
 	if err != nil {
 		return "", "", err
@@ -75,8 +81,10 @@ const bugCommentTemplate = `
 # and an empty message aborts the operation.
 `
 
+// BugCommentEditorInput will open the default editor in the terminal with a
+// template for the user to fill. The file is then processed to extract a comment.
 func BugCommentEditorInput(repo repository.Repo) (string, error) {
-	raw, err := LaunchEditorWithTemplate(repo, messageFilename, bugCommentTemplate)
+	raw, err := launchEditorWithTemplate(repo, messageFilename, bugCommentTemplate)
 
 	if err != nil {
 		return "", err
@@ -108,9 +116,11 @@ const bugTitleTemplate = `%s
 # Lines starting with '#' will be ignored, and an empty title aborts the operation.
 `
 
+// BugTitleEditorInput will open the default editor in the terminal with a
+// template for the user to fill. The file is then processed to extract a title.
 func BugTitleEditorInput(repo repository.Repo, preTitle string) (string, error) {
 	template := fmt.Sprintf(bugTitleTemplate, preTitle)
-	raw, err := LaunchEditorWithTemplate(repo, messageFilename, template)
+	raw, err := launchEditorWithTemplate(repo, messageFilename, template)
 
 	if err != nil {
 		return "", err
@@ -138,7 +148,9 @@ func BugTitleEditorInput(repo repository.Repo, preTitle string) (string, error)
 	return title, nil
 }
 
-func LaunchEditorWithTemplate(repo repository.Repo, fileName string, template string) (string, error) {
+// launchEditorWithTemplate will launch an editor as launchEditor do, but with a
+// provided template.
+func launchEditorWithTemplate(repo repository.Repo, fileName string, template string) (string, error) {
 	path := fmt.Sprintf("%s/.git/%s", repo.GetPath(), fileName)
 
 	err := ioutil.WriteFile(path, []byte(template), 0644)
@@ -147,10 +159,10 @@ func LaunchEditorWithTemplate(repo repository.Repo, fileName string, template st
 		return "", err
 	}
 
-	return LaunchEditor(repo, fileName)
+	return launchEditor(repo, fileName)
 }
 
-// LaunchEditor launches the default editor configured for the given repo. This
+// launchEditor launches the default editor configured for the given repo. This
 // method blocks until the editor command has returned.
 //
 // The specified filename should be a temporary file and provided as a relative path
@@ -159,7 +171,7 @@ func LaunchEditorWithTemplate(repo repository.Repo, fileName string, template st
 //
 // This method returns the text that was read from the temporary file, or
 // an error if any step in the process failed.
-func LaunchEditor(repo repository.Repo, fileName string) (string, error) {
+func launchEditor(repo repository.Repo, fileName string) (string, error) {
 	path := fmt.Sprintf("%s/.git/%s", repo.GetPath(), fileName)
 	defer os.Remove(path)
 

repository/git.go 🔗

@@ -17,6 +17,7 @@ import (
 const createClockFile = "/.git/git-bug/create-clock"
 const editClockFile = "/.git/git-bug/edit-clock"
 
+// ErrNotARepo is the error returned when the git repo root wan't be found
 var ErrNotARepo = errors.New("not a git repository")
 
 // GitRepo represents an instance of a (local) git repository.
@@ -106,6 +107,7 @@ func NewGitRepo(path string, witnesser func(repo *GitRepo) error) (*GitRepo, err
 	return repo, nil
 }
 
+// InitGitRepo create a new empty git repo at the given path
 func InitGitRepo(path string) (*GitRepo, error) {
 	repo := &GitRepo{Path: path}
 	repo.createClocks()
@@ -118,6 +120,7 @@ func InitGitRepo(path string) (*GitRepo, error) {
 	return repo, nil
 }
 
+// InitBareGitRepo create a new --bare empty git repo at the given path
 func InitBareGitRepo(path string) (*GitRepo, error) {
 	repo := &GitRepo{Path: path}
 	repo.createClocks()
@@ -332,7 +335,7 @@ func (repo *GitRepo) FindCommonAncestor(hash1 util.Hash, hash2 util.Hash) (util.
 	return util.Hash(stdout), nil
 }
 
-// Return the git tree hash referenced in a commit
+// GetTreeHash return the git tree hash referenced in a commit
 func (repo *GitRepo) GetTreeHash(commit util.Hash) (util.Hash, error) {
 	stdout, err := repo.runGitCommand("rev-parse", string(commit)+"^{tree}")
 
@@ -343,7 +346,7 @@ func (repo *GitRepo) GetTreeHash(commit util.Hash) (util.Hash, error) {
 	return util.Hash(stdout), nil
 }
 
-// Add a new remote to the repository
+// AddRemote add a new remote to the repository
 // Not in the interface because it's only used for testing
 func (repo *GitRepo) AddRemote(name string, url string) error {
 	_, err := repo.runGitCommand("remote", "add", name, url)

repository/repo.go 🔗

@@ -67,7 +67,7 @@ type Repo interface {
 	// FindCommonAncestor will return the last common ancestor of two chain of commit
 	FindCommonAncestor(hash1 util.Hash, hash2 util.Hash) (util.Hash, error)
 
-	// Return the git tree hash referenced in a commit
+	// GetTreeHash return the git tree hash referenced in a commit
 	GetTreeHash(commit util.Hash) (util.Hash, error)
 
 	LoadClocks() error

termui/termui.go 🔗

@@ -41,6 +41,7 @@ type window interface {
 	disable(g *gocui.Gui) error
 }
 
+// Run will launch the termUI in the terminal
 func Run(repo repository.Repo) error {
 	c := cache.NewRepoCache(repo)
 

util/hash.go 🔗

@@ -5,12 +5,14 @@ import (
 	"io"
 )
 
+// Hash is a git hash
 type Hash string
 
 func (h Hash) String() string {
 	return string(h)
 }
 
+// UnmarshalGQL implement the Unmarshaler interface for gqlgen
 func (h *Hash) UnmarshalGQL(v interface{}) error {
 	_, ok := v.(string)
 	if !ok {
@@ -26,10 +28,12 @@ func (h *Hash) UnmarshalGQL(v interface{}) error {
 	return nil
 }
 
+// MarshalGQL implement the Marshaler interface for gqlgen
 func (h Hash) MarshalGQL(w io.Writer) {
 	w.Write([]byte(`"` + h.String() + `"`))
 }
 
+// IsValid tell if the hash is valid
 func (h *Hash) IsValid() bool {
 	if len(*h) != 40 {
 		return false

webui/debug_assets.go 🔗

@@ -4,4 +4,7 @@ package webui
 
 import "net/http"
 
+// WebUIAssets give access to the files of the Web UI for a http handler
+// This access is only used in a debug build to be able to edit the WebUI
+// files without having to package them.
 var WebUIAssets http.FileSystem = http.Dir("webui/build")