@@ -189,6 +189,16 @@ func Run(options ...RunOption) {
189189 return
190190 }
191191
192+ var (
193+ ideReady = newIDEReadyState (& cfg .IDE )
194+ desktopIdeReady * ideReadyState = nil
195+
196+ cstate = NewInMemoryContentState (cfg .RepoRoot )
197+ gitpodService serverapi.APIInterface
198+
199+ notificationService = NewNotificationService ()
200+ )
201+
192202 endpoint , host , err := cfg .GitpodAPIEndpoint ()
193203 if err != nil {
194204 log .WithError (err ).Fatal ("cannot find Gitpod API endpoint" )
@@ -210,7 +220,7 @@ func Run(options ...RunOption) {
210220 }
211221 symlinkBinaries (cfg )
212222
213- configureGit (cfg )
223+ configureGit (cfg , cstate . ContentReady () )
214224
215225 telemetry := analytics .NewFromEnvironment ()
216226 defer telemetry .Close ()
@@ -260,16 +270,6 @@ func Run(options ...RunOption) {
260270 internalPorts = append (internalPorts , debugProxyPort )
261271 }
262272
263- var (
264- ideReady = newIDEReadyState (& cfg .IDE )
265- desktopIdeReady * ideReadyState = nil
266-
267- cstate = NewInMemoryContentState (cfg .RepoRoot )
268- gitpodService serverapi.APIInterface
269-
270- notificationService = NewNotificationService ()
271- )
272-
273273 if ! opts .RunGP {
274274 gitpodService = serverapi .NewServerApiService (ctx , & serverapi.ServiceConfig {
275275 Host : host ,
@@ -804,7 +804,7 @@ func symlinkBinaries(cfg *Config) {
804804 }
805805}
806806
807- func configureGit (cfg * Config ) {
807+ func configureGit (cfg * Config , contentReady <- chan struct {} ) {
808808 settings := [][]string {
809809 {"push.default" , "simple" },
810810 {"alias.lg" , "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" },
@@ -818,13 +818,6 @@ func configureGit(cfg *Config) {
818818 settings = append (settings , []string {"user.email" , cfg .GitEmail })
819819 }
820820
821- if cfg .CommitAnnotationEnabled {
822- err := setupGitMessageHook (filepath .Join (cfg .RepoRoot , ".git" , "hooks" ))
823- if err != nil {
824- log .WithError (err ).Error ("cannot setup git message hook" )
825- }
826- }
827-
828821 for _ , s := range settings {
829822 cmd := exec .Command ("git" , append ([]string {"config" , "--global" }, s ... )... )
830823 cmd = runAsGitpodUser (cmd )
@@ -835,6 +828,15 @@ func configureGit(cfg *Config) {
835828 log .WithError (err ).WithField ("args" , s ).Warn ("git config error" )
836829 }
837830 }
831+
832+ go func () {
833+ <- contentReady
834+ if cfg .CommitAnnotationEnabled && ! cfg .isHeadless () {
835+ if err := setupGitMessageHook (filepath .Join (cfg .RepoRoot , ".git" , "hooks" )); err != nil {
836+ log .WithError (err ).Error ("cannot setup git message hook" )
837+ }
838+ }
839+ }()
838840}
839841
840842const hookContent = `#!/bin/sh
@@ -847,14 +849,22 @@ func setupGitMessageHook(path string) error {
847849 }
848850
849851 fn := filepath .Join (path , "prepare-commit-msg" )
850- // do not override existing hooks. Relevant for workspaces based off of prebuilds, which might already have a hook.
852+ // do not override existing hooks
851853 if _ , err := os .Stat (fn ); err == nil {
852854 return nil
853855 }
854856 if err := os .WriteFile (fn , []byte (hookContent ), 0755 ); err != nil {
855857 return err
856858 }
857859
860+ // Change ownership of both path and file to the gitpod user
861+ if err := os .Chown (path , gitpodUID , gitpodGID ); err != nil {
862+ return err
863+ }
864+ if err := os .Chown (fn , gitpodUID , gitpodGID ); err != nil {
865+ return err
866+ }
867+
858868 return nil
859869}
860870
0 commit comments