I compiled the binary and opened the todo-tracks repo and was able to browse it, but when I tried on my private personal repo I got the following. I do have submodules, not sure what the restrictions currently are.
โฏ ../todo-tracks/bin/todos
fatal error: concurrent map read and map write
goroutine 856 [running]:
runtime.throw(0x7d52c5, 0x21)
/usr/lib/go-1.9/src/runtime/panic.go:605 +0x95 fp=0xc4204d55c0 sp=0xc4204d55a0 pc=0x42bf15
runtime.mapaccess1_faststr(0x7621c0, 0xc42008f0b0, 0xc4201da0ac, 0x28, 0xc4204d5660)
/usr/lib/go-1.9/src/runtime/hashmap_fast.go:217 +0x43a fp=0xc4204d5618 sp=0xc4204d55c0 pc=0x40d21a
repo.(*gitRepository).asyncLoadFileTodos(0xc420114340, 0xc42019e0a8, 0x28, 0xc42018bf25, 0x1b, 0xc4201da0ac, 0x28, 0x7d9fb8, 0x30, 0xc4201c84e0)
/home/joetoth/projects/todo-tracks/src/repo/git.go:314 +0x6d fp=0xc4204d5790 sp=0xc4204d5618 pc=0x6f89ad
runtime.goexit()
/usr/lib/go-1.9/src/runtime/asm_amd64.s:2337 +0x1 fp=0xc4204d5798 sp=0xc4204d5790 pc=0x459c21
created by repo.(*gitRepository).asyncLoadRevisionTodos
/home/joetoth/projects/todo-tracks/src/repo/git.go:287 +0x178
goroutine 1 [IO wait]:
internal/poll.runtime_pollWait(0x7f98c7cf1f70, 0x72, 0xffffffffffffffff)
/usr/lib/go-1.9/src/runtime/netpoll.go:173 +0x57
internal/poll.(*pollDesc).wait(0xc420130098, 0x72, 0xc420065b00, 0x0, 0x0)
/usr/lib/go-1.9/src/internal/poll/fd_poll_runtime.go:85 +0xae
internal/poll.(*pollDesc).waitRead(0xc420130098, 0xffffffffffffff00, 0x0, 0x0)
/usr/lib/go-1.9/src/internal/poll/fd_poll_runtime.go:90 +0x3d
internal/poll.(*FD).Accept(0xc420130080, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
/usr/lib/go-1.9/src/internal/poll/fd_unix.go:335 +0x1e2
net.(*netFD).accept(0xc420130080, 0x7f98c7d2d000, 0x0, 0x7e2448)
/usr/lib/go-1.9/src/net/fd_unix.go:238 +0x42
net.(*TCPListener).accept(0xc42000e050, 0xc420065cc0, 0x412828, 0x30)
/usr/lib/go-1.9/src/net/tcpsock_posix.go:136 +0x2e
net.(*TCPListener).AcceptTCP(0xc42000e050, 0xc42008f3b0, 0xc42008f3b0, 0x75be60)
/usr/lib/go-1.9/src/net/tcpsock.go:234 +0x49
net/http.tcpKeepAliveListener.Accept(0xc42000e050, 0xc42001a180, 0x75be60, 0x9be060, 0x7b8fa0)
/usr/lib/go-1.9/src/net/http/server.go:3120 +0x2f
net/http.(*Server).Serve(0xc420156d00, 0x993000, 0xc42000e050, 0x0, 0x0)
/usr/lib/go-1.9/src/net/http/server.go:2695 +0x1b2
net/http.(*Server).ListenAndServe(0xc420156d00, 0xc420156d00, 0xc42001ae60)
/usr/lib/go-1.9/src/net/http/server.go:2636 +0xa9
net/http.ListenAndServe(0xc42001ae60, 0x5, 0x0, 0x0, 0x1, 0xc42001ae60)
/usr/lib/go-1.9/src/net/http/server.go:2882 +0x7f
main.serveDashboard(0xc42008f050, 0x7d9fb8, 0x30, 0x0, 0x0)
/home/joetoth/projects/todo-tracks/src/main.go:87 +0x500
main.main()
/home/joetoth/projects/todo-tracks/src/main.go:132 +0xf1
goroutine 5 [chan receive]:
repo.(*gitRepository).LoadRevisionTodos(0xc420114340, 0xc42019e0a8, 0x28, 0x7d9fb8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0)
/home/joetoth/projects/todo-tracks/src/repo/git.go:255 +0xef
repo.NewGitRepository.func1(0xc420114340, 0x7d9fb8, 0x30, 0x0, 0x0)
/home/joetoth/projects/todo-tracks/src/repo/git.go:66 +0xa0
created by repo.NewGitRepository
/home/joetoth/projects/todo-tracks/src/repo/git.go:63 +0x13c
goroutine 20 [runnable]:
os/exec.(*Cmd).Start(0xc420744000, 0xc420051c01, 0xc4204fc000)
/usr/lib/go-1.9/src/os/exec/exec.go:358 +0x1e5
os/exec.(*Cmd).Run(0xc420744000, 0xc4204fc000, 0xc420051cc0)
/usr/lib/go-1.9/src/os/exec/exec.go:286 +0x2b
os/exec.(*Cmd).Output(0xc420744000, 0xc4200160e4, 0x4, 0xc420744000, 0xc42027c000, 0xc4205721c0)
/usr/lib/go-1.9/src/os/exec/exec.go:485 +0x119
repo.(*gitRepository).runGitCommand(0xc420114340, 0xc420744000, 0xc420051d98, 0x3, 0x3, 0xc420744000)
/home/joetoth/projects/todo-tracks/src/repo/git.go:82 +0x55
repo.(*gitRepository).getFileBlob(0xc420114340, 0xc42019e0a8, 0x28, 0xc42018bfc5, 0x13, 0x9cd380, 0xc420051e50, 0x4351fb, 0xc420051e28)
/home/joetoth/projects/todo-tracks/src/repo/git.go:181 +0xc4
repo.(*gitRepository).getFileBlobOrDie(0xc420114340, 0xc42019e0a8, 0x28, 0xc42018bfc5, 0x13, 0xc42018bf25, 0x1b)
/home/joetoth/projects/todo-tracks/src/repo/git.go:196 +0x69
repo.(*gitRepository).asyncLoadRevisionTodos(0xc420114340, 0xc42019e0a8, 0x28, 0x7d9fb8, 0x30, 0x0, 0x0, 0xc42015c0c0)
/home/joetoth/projects/todo-tracks/src/repo/git.go:284 +0x221
created by repo.(*gitRepository).LoadRevisionTodos
/home/joetoth/projects/todo-tracks/src/repo/git.go:254 +0xbc
goroutine 185 [runnable]:
regexp.(*inputString).step(0xc42067c318, 0x2f51, 0xc42067c268, 0x2f4f)
/usr/lib/go-1.9/src/regexp/regexp.go:294 +0xc0
regexp.(*machine).match(0xc42067c240, 0x994400, 0xc42067c318, 0x2f4f, 0xa0)
/usr/lib/go-1.9/src/regexp/exec.go:175 +0x2cb
regexp.(*Regexp).doExecute(0xc4205ea1e0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc4211ceb71, 0x5f9d, 0x0, 0x0, ...)
/usr/lib/go-1.9/src/regexp/exec.go:447 +0x11d
regexp.(*Regexp).doMatch(0xc4205ea1e0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc4211ceb71, 0x5f9d, 0x0)
/usr/lib/go-1.9/src/regexp/exec.go:412 +0xc8
regexp.(*Regexp).MatchString(0xc4205ea1e0, 0xc4211ceb71, 0x5f9d, 0x0)
/usr/lib/go-1.9/src/regexp/regexp.go:435 +0x6c
regexp.MatchString(0x7d9fb8, 0x30, 0xc4211ceb71, 0x5f9d, 0x0, 0x0, 0x0)
/usr/lib/go-1.9/src/regexp/regexp.go:462 +0x83
repo.(*gitRepository).asyncLoadFileTodos(0xc420114340, 0xc42019e0a8, 0x28, 0xc42018a9e5, 0x16, 0xc4205d89bc, 0x28, 0x7d9fb8, 0x30, 0xc42024b1a0)
/home/joetoth/projects/todo-tracks/src/repo/git.go:319 +0x20d
created by repo.(*gitRepository).asyncLoadRevisionTodos
/home/joetoth/projects/todo-tracks/src/repo/git.go:287 +0x178