From 358148964473ef6b1c1339196b4c4da59ec8c5af Mon Sep 17 00:00:00 2001 From: Mike Landau Date: Sun, 25 Oct 2026 14:37:04 -0700 Subject: [PATCH 1/3] perf(generate): skip nix check and telemetry for direnv --print-envrc direnv runs `devbox generate direnv --print-envrc` on every reload. It only prints a fixed .envrc template, but it inherited the nix install check from `generate` (which runs `nix --version`) and recorded a telemetry event, which also spawned the telemetry uploader. Skip the nix check in generate's PersistentPreRunE when --print-envrc is set, and add midcobra.SkipTelemetry so the command can opt out of being recorded. Co-Authored-By: Claude Opus 5.5 (1M context) --- internal/boxcli/generate.go | 26 +++++++++++++++---- internal/boxcli/generate_test.go | 30 +++++++++++++++++++++- internal/boxcli/midcobra/telemetry.go | 20 +++++++++++++++ internal/boxcli/midcobra/telemetry_test.go | 11 ++++++++ 4 files changed, 81 insertions(+), 6 deletions(-) diff --git a/internal/boxcli/generate.go b/internal/boxcli/generate.go index e5e37c8616f..7860ba73273 100644 --- a/internal/boxcli/generate.go +++ b/internal/boxcli/generate.go @@ -12,6 +12,7 @@ import ( "github.com/samber/lo" "github.com/spf13/cobra" + "go.jetify.com/devbox/internal/boxcli/midcobra" "go.jetify.com/devbox/internal/boxcli/usererr" "go.jetify.com/devbox/internal/devbox" "go.jetify.com/devbox/internal/devbox/devopt" @@ -48,11 +49,18 @@ func generateCmd() *cobra.Command { flags := &generateCmdFlags{} command := &cobra.Command{ - Use: "generate", - Aliases: []string{"gen"}, - Short: "Generate supporting files for your project", - Args: cobra.MaximumNArgs(0), - PersistentPreRunE: ensureNixInstalled, + Use: "generate", + Aliases: []string{"gen"}, + Short: "Generate supporting files for your project", + Args: cobra.MaximumNArgs(0), + PersistentPreRunE: func(cmd *cobra.Command, args []string) error { + // direnv runs `generate direnv --print-envrc` on every reload. It + // only prints a fixed template, so it doesn't need nix. + if isPrintEnvrc(cmd) { + return nil + } + return ensureNixInstalled(cmd, args) + }, } command.AddCommand(genAliasCmd()) command.AddCommand(devcontainerCmd()) @@ -294,6 +302,12 @@ func runGenerateCmd(cmd *cobra.Command, flags *generateCmdFlags) error { return nil } +// isPrintEnvrc reports whether cmd is `generate direnv --print-envrc`. +func isPrintEnvrc(cmd *cobra.Command) bool { + printEnvrc, err := cmd.Flags().GetBool("print-envrc") + return err == nil && printEnvrc +} + func runGenerateDirenvCmd(cmd *cobra.Command, flags *generateCmdFlags) error { // --print-envrc is used within the .envrc file and therefore doesn't make sense to also // use it with --envrc-dir, which specifies a directory where the .envrc file should be generated. @@ -305,6 +319,8 @@ func runGenerateDirenvCmd(cmd *cobra.Command, flags *generateCmdFlags) error { } if flags.printEnvrcContent { + // direnv runs this on every reload, so don't record it. + midcobra.SkipTelemetry(cmd) return devbox.PrintEnvrcContent( cmd.OutOrStdout(), devopt.EnvFlags(flags.envFlag), flags.config.path, ) diff --git a/internal/boxcli/generate_test.go b/internal/boxcli/generate_test.go index e0f871a9ed4..d69448bdcee 100644 --- a/internal/boxcli/generate_test.go +++ b/internal/boxcli/generate_test.go @@ -3,7 +3,13 @@ package boxcli -import "testing" +import ( + "bytes" + "strings" + "testing" + + "go.jetify.com/devbox/internal/nix" +) func TestGenerateSubcommandsAcceptConfigFlags(t *testing.T) { for _, sub := range generateCmd().Commands() { @@ -14,3 +20,25 @@ func TestGenerateSubcommandsAcceptConfigFlags(t *testing.T) { }) } } + +// TestGenerateDirenvPrintEnvrcSkipsNixCheck ensures that `generate direnv +// --print-envrc`, which direnv runs on every reload, doesn't check for nix. +func TestGenerateDirenvPrintEnvrcSkipsNixCheck(t *testing.T) { + if nix.Ensured() { + t.Skip("an earlier test already ensured nix is installed") + } + + root := RootCmd() + stdout := &bytes.Buffer{} + root.SetOut(stdout) + root.SetArgs([]string{"generate", "direnv", "--print-envrc"}) + if err := root.Execute(); err != nil { + t.Fatal(err) + } + if !strings.Contains(stdout.String(), "devbox shellenv") { + t.Errorf("got output %q, want an .envrc that calls devbox shellenv", stdout) + } + if nix.Ensured() { + t.Error("generate direnv --print-envrc checked that nix is installed") + } +} diff --git a/internal/boxcli/midcobra/telemetry.go b/internal/boxcli/midcobra/telemetry.go index 77670974383..7b2399d8337 100644 --- a/internal/boxcli/midcobra/telemetry.go +++ b/internal/boxcli/midcobra/telemetry.go @@ -32,6 +32,23 @@ type telemetryMiddleware struct{} // telemetryMiddleware implements interface Middleware (compile-time check) var _ Middleware = (*telemetryMiddleware)(nil) +// skipTelemetryAnnotation is set on a command by SkipTelemetry. +const skipTelemetryAnnotation = "devbox.skip-telemetry" + +// SkipTelemetry stops the telemetry middleware from recording the current run +// of cmd. Use it for commands that run so often in the background (e.g. on +// every direnv reload) that recording them isn't useful. +func SkipTelemetry(cmd *cobra.Command) { + if cmd.Annotations == nil { + cmd.Annotations = map[string]string{} + } + cmd.Annotations[skipTelemetryAnnotation] = "true" +} + +func telemetrySkipped(cmd *cobra.Command) bool { + return cmd.Annotations[skipTelemetryAnnotation] != "" +} + func (m *telemetryMiddleware) preRun(cmd *cobra.Command, args []string) { telemetry.Start() } @@ -51,6 +68,9 @@ func (m *telemetryMiddleware) postRun(cmd *cobra.Command, args []string, runErr // Ignore invalid commands/flags. return } + if telemetrySkipped(subcmd) { + return + } meta.Command = subcmd.CommandPath() meta.CommandFlags = flags diff --git a/internal/boxcli/midcobra/telemetry_test.go b/internal/boxcli/midcobra/telemetry_test.go index fb436c23a98..37dbb590078 100644 --- a/internal/boxcli/midcobra/telemetry_test.go +++ b/internal/boxcli/midcobra/telemetry_test.go @@ -45,3 +45,14 @@ func TestGetPackagesAndCommitHash(t *testing.T) { t.Errorf("Expected commitHash %s, got %s", box.Lockfile().Stdenv().Rev, commitHash) } } + +func TestSkipTelemetry(t *testing.T) { + cmd := &cobra.Command{Use: "test"} + if telemetrySkipped(cmd) { + t.Error("telemetry skipped before calling SkipTelemetry") + } + SkipTelemetry(cmd) + if !telemetrySkipped(cmd) { + t.Error("telemetry not skipped after calling SkipTelemetry") + } +} From 6ac7ece31e020b48875311cd7557b20c486327a1 Mon Sep 17 00:00:00 2001 From: Mike Landau Date: Sun, 25 Oct 2026 14:39:05 -0700 Subject: [PATCH 2/3] test(midcobra): move SkipTelemetry test to avoid conflict with #3021 Co-Authored-By: Claude Opus 5.5 (1M context) --- internal/boxcli/midcobra/midcobra_test.go | 11 +++++++++++ internal/boxcli/midcobra/telemetry_test.go | 11 ----------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/internal/boxcli/midcobra/midcobra_test.go b/internal/boxcli/midcobra/midcobra_test.go index b648c865897..1efc10df6e6 100644 --- a/internal/boxcli/midcobra/midcobra_test.go +++ b/internal/boxcli/midcobra/midcobra_test.go @@ -42,3 +42,14 @@ func TestExecuteParsesPersistentFlagsAfterUnknownFlags(t *testing.T) { t.Error("Execute() with an unknown root flag = 0, want non-zero") } } + +func TestSkipTelemetry(t *testing.T) { + cmd := &cobra.Command{Use: "test"} + if telemetrySkipped(cmd) { + t.Error("telemetry skipped before calling SkipTelemetry") + } + SkipTelemetry(cmd) + if !telemetrySkipped(cmd) { + t.Error("telemetry not skipped after calling SkipTelemetry") + } +} diff --git a/internal/boxcli/midcobra/telemetry_test.go b/internal/boxcli/midcobra/telemetry_test.go index 37dbb590078..fb436c23a98 100644 --- a/internal/boxcli/midcobra/telemetry_test.go +++ b/internal/boxcli/midcobra/telemetry_test.go @@ -45,14 +45,3 @@ func TestGetPackagesAndCommitHash(t *testing.T) { t.Errorf("Expected commitHash %s, got %s", box.Lockfile().Stdenv().Rev, commitHash) } } - -func TestSkipTelemetry(t *testing.T) { - cmd := &cobra.Command{Use: "test"} - if telemetrySkipped(cmd) { - t.Error("telemetry skipped before calling SkipTelemetry") - } - SkipTelemetry(cmd) - if !telemetrySkipped(cmd) { - t.Error("telemetry not skipped after calling SkipTelemetry") - } -} From 8c1b6e94dacdf7e2f11ff5cbf0965014de3fa40b Mon Sep 17 00:00:00 2001 From: Mike Landau Date: Sun, 25 Oct 2026 14:46:36 -0700 Subject: [PATCH 3/3] docs(specs): mark perf item(s) 5 done Co-Authored-By: Claude Opus 5.5 (1M context) --- specs/perf-improvements.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/perf-improvements.md b/specs/perf-improvements.md index 70ff55bfe03..b79b3d1a73d 100644 --- a/specs/perf-improvements.md +++ b/specs/perf-improvements.md @@ -105,7 +105,7 @@ every successful command. Fix: record the last upload time in the state dir and only spawn the uploader when it was more than N minutes ago, or when the buffered event count exceeds a threshold. -### 5. Make `generate direnv --print-envrc` cheap +### 5. Make `generate direnv --print-envrc` cheap (done in #3022) **Win:** every direnv reload. **Effort:** ~15–30 LOC.