gastownhall/beads · error

uow: resolving server root dir: %w

Error message

uow: resolving server root dir: %w

What it means

The provider resolves serverRootDir to an absolute path with filepath.Abs before creating the server's working directory tree. This error wraps a failure of filepath.Abs itself. filepath.Abs only fails when the process cannot determine its current working directory (e.g. the cwd was deleted), so this error is rare and environmental rather than a config problem.

Source

Thrown at internal/storage/uow/external_doltserver_provider.go:47

	expectedProjectID string,
	opts ...ProviderOption,
) (UnitOfWorkProvider, error) {
	if idleTimeout == 0 {
		idleTimeout = defaultProxyIdleTimeout
	}
	if database == "" {
		return nil, fmt.Errorf("uow: database name must not be empty (caller should default to %q)", "beads")
	}
	if rootUser == "" {
		return nil, fmt.Errorf("uow: rootUser must not be empty")
	}
	if err := external.Validate(); err != nil {
		return nil, fmt.Errorf("uow: external: %w", err)
	}

	absServerRootDir, err := filepath.Abs(serverRootDir)
	if err != nil {
		return nil, fmt.Errorf("uow: resolving server root dir: %w", err)
	}

	if err := os.MkdirAll(absServerRootDir, config.BeadsDirPerm); err != nil {
		return nil, fmt.Errorf("uow: creating server root directory: %w", err)
	}

	tlsConfigName, err := registerExternalTLSConfig(external)
	if err != nil {
		return nil, fmt.Errorf("uow: external TLS: %w", err)
	}

	ep, err := proxy.GetCreateDatabaseProxyServerEndpoint(absServerRootDir, proxy.OpenOpts{
		Backend:     proxy.BackendExternal,
		LogFilePath: serverLogFilePath,
		External:    external,
		IdleTimeout: idleTimeout,
		Port:        proxyPort,
	})

View on GitHub (pinned to 71377f2769)

Solutions

  1. Pass an already-absolute path for serverRootDir so filepath.Abs does not need the cwd
  2. Ensure the process is started from a valid working directory (cd into an existing dir before launch)
  3. Inspect the wrapped error after "uow: resolving server root dir: " to confirm the underlying Getwd failure

Example fix

// before
provider, err := uow.NewExternalDoltServerUOWProvider(ctx, db, root, serverRootDir, external)
// after
absRoot, err := filepath.Abs(serverRootDir) // or use a hardcoded absolute path
if err != nil {
    return err
}
provider, err := uow.NewExternalDoltServerUOWProvider(ctx, db, root, absRoot, external)
Defensive patterns

Strategy: validation

Validate before calling

if _, err := os.Getwd(); err != nil {
    // cwd unavailable: pass an absolute serverRootDir or chdir to a valid dir first
    return fmt.Errorf("environment: working directory unavailable: %w", err)
}
if !filepath.IsAbs(serverRootDir) {
    serverRootDir = filepath.Join(fallbackBaseDir, serverRootDir)
}

Try / catch

provider, err := uow.NewExternalDoltServerUOWProvider(ctx, db, root, dir, ext)
if err != nil {
    if strings.Contains(err.Error(), "resolving server root dir") {
        return fmt.Errorf("environment: cannot resolve cwd; pass an absolute server root dir: %w", err)
    }
    return err
}

Prevention

When it happens

Trigger: Calling NewExternalDoltServerUOWProvider when the process's current working directory no longer exists or os.Getwd() fails for permission/OS reasons.

Common situations: A test or daemon started in a temp directory that was later removed; running inside a container after its cwd was deleted; restrictive environments where Getwd fails.

Related errors


AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30). Data as JSON: /api/errors/1ae6218d9534dc23. Report an issue: GitHub.