Diff
1diff --git a/cmd/soft/serve/serve.go b/cmd/soft/serve/serve.go
2index a8546abbe3b4ff9f782448eb922d3531932bdf5b..8a670cc95863d779300eba7fa2f7ae0f47b8d4c6 100644
3--- a/cmd/soft/serve/serve.go
4+++ b/cmd/soft/serve/serve.go
5@@ -107,7 +107,13 @@ var (
6 doneOnce()
7 }()
8
9- <-done
10+ select {
11+ case err := <-lch:
12+ if err != nil {
13+ return fmt.Errorf("server error: %w", err)
14+ }
15+ case <-done:
16+ }
17
18 ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
19 defer cancel()
20@@ -115,8 +121,7 @@ var (
21 return err
22 }
23
24- // wait for serve to finish
25- return <-lch
26+ return nil
27 },
28 }
29 )
30diff --git a/pkg/daemon/daemon.go b/pkg/daemon/daemon.go
31index a5156355e3362162ca8f958b232a4e5709c79751..2f7fd77e040eb8fb797e01481d61b32afd94bfb7 100644
32--- a/pkg/daemon/daemon.go
33+++ b/pkg/daemon/daemon.go
34@@ -321,11 +321,18 @@ func (d *GitDaemon) closeListener() error {
35 if d.done.Load() {
36 return ErrServerClosed
37 }
38+ var err error
39+ for _, l := range d.listeners {
40+ if err = l.Close(); err != nil {
41+ err = errors.Join(err, fmt.Errorf("close listener %s: %w", l.Addr(), err))
42+ }
43+ }
44+ d.listeners = d.listeners[:0]
45 d.once.Do(func() {
46- close(d.finished)
47 d.done.Store(true)
48+ close(d.finished)
49 })
50- return nil
51+ return err
52 }
53
54 // Shutdown gracefully shuts down the daemon.
55@@ -337,8 +344,8 @@ func (d *GitDaemon) Shutdown(ctx context.Context) error {
56 err := d.closeListener()
57 finished := make(chan struct{}, 1)
58 go func() {
59+ defer close(finished)
60 d.wg.Wait()
61- finished <- struct{}{}
62 }()
63 select {
64 case <-ctx.Done():