From 71916c73a54b824a1edc5a219cf952effb205b3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Tron=C3=AD=C4=8Dek?= Date: Fri, 24 Jan 2025 15:41:23 +0000 Subject: [PATCH 1/5] [supervisor] Don't install git msg annotation hook in headless workspaces --- components/supervisor/pkg/supervisor/supervisor.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/supervisor/pkg/supervisor/supervisor.go b/components/supervisor/pkg/supervisor/supervisor.go index 16918a665da0f1..bde86c7d201d00 100644 --- a/components/supervisor/pkg/supervisor/supervisor.go +++ b/components/supervisor/pkg/supervisor/supervisor.go @@ -818,7 +818,7 @@ func configureGit(cfg *Config) { settings = append(settings, []string{"user.email", cfg.GitEmail}) } - if cfg.CommitAnnotationEnabled { + if cfg.CommitAnnotationEnabled && !cfg.isHeadless() { err := setupGitMessageHook(filepath.Join(cfg.RepoRoot, ".git", "hooks")) if err != nil { log.WithError(err).Error("cannot setup git message hook") From 087c38e46f11e08625b8d32b167688c28379fcb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Tron=C3=AD=C4=8Dek?= Date: Fri, 24 Jan 2025 15:47:18 +0000 Subject: [PATCH 2/5] chown hooks to gitpod user --- components/supervisor/pkg/supervisor/supervisor.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/components/supervisor/pkg/supervisor/supervisor.go b/components/supervisor/pkg/supervisor/supervisor.go index bde86c7d201d00..cb055e155a7280 100644 --- a/components/supervisor/pkg/supervisor/supervisor.go +++ b/components/supervisor/pkg/supervisor/supervisor.go @@ -845,6 +845,9 @@ func setupGitMessageHook(path string) error { if err := os.MkdirAll(path, 0755); err != nil { return err } + if err := os.Chown(path, gitpodUID, gitpodGID); err != nil { + return err + } fn := filepath.Join(path, "prepare-commit-msg") // do not override existing hooks. Relevant for workspaces based off of prebuilds, which might already have a hook. @@ -854,6 +857,9 @@ func setupGitMessageHook(path string) error { if err := os.WriteFile(fn, []byte(hookContent), 0755); err != nil { return err } + if err := os.Chown(fn, gitpodUID, gitpodGID); err != nil { + return err + } return nil } From a9290d7ecbf4749af85abe42445dcf0517bf5f2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Tron=C3=AD=C4=8Dek?= Date: Mon, 27 Jan 2025 10:51:17 +0000 Subject: [PATCH 3/5] Wait for content ready with git commit hooks --- .../supervisor/pkg/supervisor/supervisor.go | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/components/supervisor/pkg/supervisor/supervisor.go b/components/supervisor/pkg/supervisor/supervisor.go index cb055e155a7280..ef21b57d0dc5e0 100644 --- a/components/supervisor/pkg/supervisor/supervisor.go +++ b/components/supervisor/pkg/supervisor/supervisor.go @@ -189,6 +189,16 @@ func Run(options ...RunOption) { return } + var ( + ideReady = newIDEReadyState(&cfg.IDE) + desktopIdeReady *ideReadyState = nil + + cstate = NewInMemoryContentState(cfg.RepoRoot) + gitpodService serverapi.APIInterface + + notificationService = NewNotificationService() + ) + endpoint, host, err := cfg.GitpodAPIEndpoint() if err != nil { log.WithError(err).Fatal("cannot find Gitpod API endpoint") @@ -211,6 +221,14 @@ func Run(options ...RunOption) { symlinkBinaries(cfg) configureGit(cfg) + go func() { + <-cstate.ContentReady() + if cfg.CommitAnnotationEnabled && !cfg.isHeadless() { + if err := setupGitMessageHook(filepath.Join(cfg.RepoRoot, ".git", "hooks")); err != nil { + log.WithError(err).Error("cannot setup git message hook") + } + } + }() telemetry := analytics.NewFromEnvironment() defer telemetry.Close() @@ -260,16 +278,6 @@ func Run(options ...RunOption) { internalPorts = append(internalPorts, debugProxyPort) } - var ( - ideReady = newIDEReadyState(&cfg.IDE) - desktopIdeReady *ideReadyState = nil - - cstate = NewInMemoryContentState(cfg.RepoRoot) - gitpodService serverapi.APIInterface - - notificationService = NewNotificationService() - ) - if !opts.RunGP { gitpodService = serverapi.NewServerApiService(ctx, &serverapi.ServiceConfig{ Host: host, @@ -818,13 +826,6 @@ func configureGit(cfg *Config) { settings = append(settings, []string{"user.email", cfg.GitEmail}) } - if cfg.CommitAnnotationEnabled && !cfg.isHeadless() { - err := setupGitMessageHook(filepath.Join(cfg.RepoRoot, ".git", "hooks")) - if err != nil { - log.WithError(err).Error("cannot setup git message hook") - } - } - for _, s := range settings { cmd := exec.Command("git", append([]string{"config", "--global"}, s...)...) cmd = runAsGitpodUser(cmd) @@ -850,7 +851,7 @@ func setupGitMessageHook(path string) error { } fn := filepath.Join(path, "prepare-commit-msg") - // do not override existing hooks. Relevant for workspaces based off of prebuilds, which might already have a hook. + // do not override existing hooks if _, err := os.Stat(fn); err == nil { return nil } From 0712aeac882f4e208925aa9589944c67f8959834 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Tron=C3=AD=C4=8Dek?= Date: Mon, 27 Jan 2025 12:55:39 +0000 Subject: [PATCH 4/5] Move hook setup back inside `configureGit` --- .../supervisor/pkg/supervisor/supervisor.go | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/components/supervisor/pkg/supervisor/supervisor.go b/components/supervisor/pkg/supervisor/supervisor.go index ef21b57d0dc5e0..001ae745490c0e 100644 --- a/components/supervisor/pkg/supervisor/supervisor.go +++ b/components/supervisor/pkg/supervisor/supervisor.go @@ -220,15 +220,7 @@ func Run(options ...RunOption) { } symlinkBinaries(cfg) - configureGit(cfg) - go func() { - <-cstate.ContentReady() - if cfg.CommitAnnotationEnabled && !cfg.isHeadless() { - if err := setupGitMessageHook(filepath.Join(cfg.RepoRoot, ".git", "hooks")); err != nil { - log.WithError(err).Error("cannot setup git message hook") - } - } - }() + configureGit(cfg, cstate.ContentReady()) telemetry := analytics.NewFromEnvironment() defer telemetry.Close() @@ -812,7 +804,7 @@ func symlinkBinaries(cfg *Config) { } } -func configureGit(cfg *Config) { +func configureGit(cfg *Config, contentReady <-chan struct{}) { settings := [][]string{ {"push.default", "simple"}, {"alias.lg", "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"}, @@ -836,6 +828,15 @@ func configureGit(cfg *Config) { log.WithError(err).WithField("args", s).Warn("git config error") } } + + go func() { + <-contentReady + if cfg.CommitAnnotationEnabled && !cfg.isHeadless() { + if err := setupGitMessageHook(filepath.Join(cfg.RepoRoot, ".git", "hooks")); err != nil { + log.WithError(err).Error("cannot setup git message hook") + } + } + }() } const hookContent = `#!/bin/sh From c0de48f53d428158fdc5da8b485eba48b90f5a26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Tron=C3=AD=C4=8Dek?= Date: Mon, 27 Jan 2025 13:13:52 +0000 Subject: [PATCH 5/5] Clean up chowns --- components/supervisor/pkg/supervisor/supervisor.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/components/supervisor/pkg/supervisor/supervisor.go b/components/supervisor/pkg/supervisor/supervisor.go index 001ae745490c0e..258fee5c3b7c1e 100644 --- a/components/supervisor/pkg/supervisor/supervisor.go +++ b/components/supervisor/pkg/supervisor/supervisor.go @@ -847,9 +847,6 @@ func setupGitMessageHook(path string) error { if err := os.MkdirAll(path, 0755); err != nil { return err } - if err := os.Chown(path, gitpodUID, gitpodGID); err != nil { - return err - } fn := filepath.Join(path, "prepare-commit-msg") // do not override existing hooks @@ -859,6 +856,11 @@ func setupGitMessageHook(path string) error { if err := os.WriteFile(fn, []byte(hookContent), 0755); err != nil { return err } + + // Change ownership of both path and file to the gitpod user + if err := os.Chown(path, gitpodUID, gitpodGID); err != nil { + return err + } if err := os.Chown(fn, gitpodUID, gitpodGID); err != nil { return err }