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 6, 2023
1 parent 08fc271 commit e4103dd
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 13 deletions.
59 changes: 59 additions & 0 deletions cli/lakeflags/datadir.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package lakeflags

import (
"os"
"os/user"
"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")
}
// Get the OS specific home directory via the Go standard lib.
var homeDir string
usr, err := user.Current()
if err == nil {
homeDir = usr.HomeDir
}
// Fall back to standard HOME environment variable that works
// for most POSIX OSes if the directory from the Go standard
// lib failed.
if err != nil || homeDir == "" {
homeDir = os.Getenv("HOME")
}
switch runtime.GOOS {
case "windows":
// Windows XP and before didn't have a LOCALAPPDATA, so fallback
// to regular APPDATA when LOCALAPPDATA is not set.
appData := os.Getenv("LOCALAPPDATA")
if appData == "" {
appData = os.Getenv("APPDATA")
}
if appData != "" {
return filepath.Join(appData, "zed")
}
case "darwin":
if homeDir != "" {
return filepath.Join(homeDir, "Library",
"Application Support", "zed")
}
default:
if homeDir != "" {
return filepath.Join(homeDir, ".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 @@ -20,11 +21,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 @@ -34,14 +32,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 @@ -61,7 +58,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 e4103dd

Please sign in to comment.