Skip to content

Commit

Permalink
zed: Default app data location
Browse files Browse the repository at this point in the history
If no lake location is specified, zed will use a per-os default
location. Also if the default location is used, zed will first check if
there's a service on 9867 and opt to connect to that instead of
operating locally.
  • Loading branch information
mattnibs committed Sep 29, 2023
1 parent 8efc55c commit bd0668f
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 13 deletions.
36 changes: 36 additions & 0 deletions cli/lakeflags/datadir.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package lakeflags

import (
"os"
"path/filepath"
"runtime"
)

var defaultDataDir string

func init() {
defaultDataDir = getDefaultDataDir()
}

// getDefaultDataDir returns the default data directory for the current user.
// Derived from https://github.com/btcsuite/btcd/blob/master/btcutil/appdata.go
func getDefaultDataDir() string {
// Resolve the XDG data home directory if set.
if xdgDataHome := os.Getenv("XDG_DATA_HOME"); xdgDataHome != "" {
return filepath.Join(xdgDataHome, "zed")
}
if runtime.GOOS == "windows" {
if appData := os.Getenv("LOCALAPPDATA"); appData != "" {
return filepath.Join(appData, "zed")
}
}
if homeDir, _ := os.UserHomeDir(); homeDir != "" {
// Follow the XDG spec which states:
// If $XDG_DATA_HOME is either not set or empty, a default equal to
// $HOME/.local/share should be used.
return filepath.Join(homeDir, ".local", "share", "zed")
}
// Return an empty string which will cause an error if a default data
// directory cannot be found.
return ""
}
27 changes: 19 additions & 8 deletions cli/lakeflags/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"errors"
"flag"
"fmt"
"net"
"os"
"path/filepath"
"strings"
Expand All @@ -21,11 +22,8 @@ var ErrNoHEAD = errors.New("HEAD not specified: indicate with -use or run the \"

type Flags struct {
ConfigDir string
// LakeSpecified is set to true if the lake is explicitly set via either
// command line flag or environment variable.
LakeSpecified bool
Lake string
Quiet bool
Lake string
Quiet bool
}

func (l *Flags) SetFlags(fs *flag.FlagSet) {
Expand All @@ -35,14 +33,13 @@ func (l *Flags) SetFlags(fs *flag.FlagSet) {
dir = filepath.Join(dir, ".zed")
}
fs.StringVar(&l.ConfigDir, "configdir", dir, "configuration and credentials directory")
l.Lake = "http://localhost:9867"
if s, ok := os.LookupEnv("ZED_LAKE"); ok {
l.Lake = strings.TrimRight(s, "/")
l.LakeSpecified = true
} else {
l.Lake = defaultDataDir
}
fs.Func("lake", fmt.Sprintf("lake location (env ZED_LAKE) (default %s)", l.Lake), func(s string) error {
l.Lake = strings.TrimRight(s, "/")
l.LakeSpecified = true
return nil
})
}
Expand All @@ -62,7 +59,21 @@ func (l *Flags) Connection() (*client.Connection, error) {
return conn, nil
}

func portInUse(port string) bool {
ln, err := net.Listen("tcp", port)
if err != nil {
return true
}
ln.Close()
return false
}

func (l *Flags) Open(ctx context.Context) (api.Interface, error) {
// If the lake is the defaultDataDir, first check if a service is running
// on port 9867 and if so, use this as the lake location.
if l.Lake == defaultDataDir && portInUse("9867") {
l.Lake = "http://localhost:9867"
}
uri, err := l.URI()
if err != nil {
return nil, err
Expand Down
3 changes: 0 additions & 3 deletions cmd/zed/serve/command.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,6 @@ func (c *Command) Run(args []string) error {
return err
}
defer cleanup()
if !c.LakeFlags.LakeSpecified {
c.LakeFlags.Lake = ""
}
uri, err := c.LakeFlags.URI()
if err != nil {
return err
Expand Down
2 changes: 1 addition & 1 deletion cmd/zed/ztests/no-lake-location.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
script: |
! zed ls -lake ''
! zed serve
! zed serve -lake ''
outputs:
- name: stderr
Expand Down
2 changes: 1 addition & 1 deletion compiler/ztests/from-error.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
script: |
! zc -C -s 'from p'
! zc -lake='' -C -s 'from p'
echo === >&2
export ZED_LAKE=test
zed init
Expand Down

0 comments on commit bd0668f

Please sign in to comment.