diff options
author | Runxi Yu <me@runxiyu.org> | 2025-04-06 00:42:11 +0800 |
---|---|---|
committer | Runxi Yu <me@runxiyu.org> | 2025-04-06 00:42:26 +0800 |
commit | f5ebe96649a30658bb8a8bee4cb2ac1b45823b28 (patch) | |
tree | 980c5fb915da731335baa30860d2e660bcffa407 | |
parent | LMTP: Fix sed mistake (diff) | |
download | forge-f5ebe96649a30658bb8a8bee4cb2ac1b45823b28.tar.gz forge-f5ebe96649a30658bb8a8bee4cb2ac1b45823b28.tar.zst forge-f5ebe96649a30658bb8a8bee4cb2ac1b45823b28.zip |
Hooks, git2d: Simplify deployment logicv0.1.27
-rw-r--r-- | git2d_deploy.go | 29 | ||||
-rw-r--r-- | git_hooks_deploy.go | 60 | ||||
-rw-r--r-- | internal/misc/deploy.go | 17 | ||||
-rw-r--r-- | internal/misc/misc.go | 7 | ||||
-rw-r--r-- | internal/misc/panic.go | 14 | ||||
-rw-r--r-- | server.go | 18 |
6 files changed, 37 insertions, 108 deletions
diff --git a/git2d_deploy.go b/git2d_deploy.go deleted file mode 100644 index b75b63a..0000000 --- a/git2d_deploy.go +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-only -// SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> - -package forge - -import ( - "io" - "io/fs" - "os" -) - -func (s *Server) deployGit2D() (err error) { - var srcFD fs.File - var dstFD *os.File - - if srcFD, err = embeddedResourcesFS.Open("git2d/git2d"); err != nil { - return err - } - defer srcFD.Close() - - if dstFD, err = os.OpenFile(s.config.Git.DaemonPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o755); err != nil { - return err - } - defer dstFD.Close() - - _, err = io.Copy(dstFD, srcFD) - - return err -} diff --git a/git_hooks_deploy.go b/git_hooks_deploy.go deleted file mode 100644 index afab7f0..0000000 --- a/git_hooks_deploy.go +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-only -// SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> - -package forge - -import ( - "errors" - "io" - "io/fs" - "os" - "path/filepath" -) - -// deployHooks deploys the git hooks client to the filesystem. The git hooks -// client is expected to be embedded in resourcesFS and must be pre-compiled -// during the build process; see the Makefile. -func (s *Server) deployHooks() (err error) { - err = func() (err error) { - var srcFD fs.File - var dstFD *os.File - - if srcFD, err = embeddedResourcesFS.Open("hookc/hookc"); err != nil { - return err - } - defer srcFD.Close() - - if dstFD, err = os.OpenFile(filepath.Join(s.config.Hooks.Execs, "hookc"), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o755); err != nil { - return err - } - defer dstFD.Close() - - if _, err = io.Copy(dstFD, srcFD); err != nil { - return err - } - - return nil - }() - if err != nil { - return err - } - - // Go's embed filesystems do not store permissions; but in any case, - // they would need to be 0o755: - if err = os.Chmod(filepath.Join(s.config.Hooks.Execs, "hookc"), 0o755); err != nil { - return err - } - - for _, hookName := range []string{ - "pre-receive", - } { - if err = os.Symlink(filepath.Join(s.config.Hooks.Execs, "hookc"), filepath.Join(s.config.Hooks.Execs, hookName)); err != nil { - if !errors.Is(err, fs.ErrExist) { - return err - } - // TODO: Maybe check if it points to the right place? - } - } - - return nil -} diff --git a/internal/misc/deploy.go b/internal/misc/deploy.go new file mode 100644 index 0000000..80a1dec --- /dev/null +++ b/internal/misc/deploy.go @@ -0,0 +1,17 @@ +package misc + +import ( + "io" + "io/fs" + "os" +) + +func DeployBinary(src fs.File, dst string) (err error) { + var dstFile *os.File + if dstFile, err = os.OpenFile(dst, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o755); err != nil { + return err + } + defer dstFile.Close() + _, err = io.Copy(dstFile, src) + return err +} diff --git a/internal/misc/misc.go b/internal/misc/misc.go index 87f7f70..3ad0211 100644 --- a/internal/misc/misc.go +++ b/internal/misc/misc.go @@ -5,13 +5,6 @@ package misc import "strings" -func FirstOrPanic[T any](v T, err error) T { - if err != nil { - panic(err) - } - return v -} - // sliceContainsNewlines returns true if and only if the given slice contains // one or more strings that contains newlines. func SliceContainsNewlines(s []string) bool { diff --git a/internal/misc/panic.go b/internal/misc/panic.go new file mode 100644 index 0000000..2400aed --- /dev/null +++ b/internal/misc/panic.go @@ -0,0 +1,14 @@ +package misc + +func FirstOrPanic[T any](v T, err error) T { + if err != nil { + panic(err) + } + return v +} + +func NoneOrPanic(err error) { + if err != nil { + panic(err) + } +} @@ -13,10 +13,12 @@ import ( "net/http" "os" "os/exec" + "path/filepath" "syscall" "time" "go.lindenii.runxiyu.org/forge/internal/database" + "go.lindenii.runxiyu.org/forge/internal/misc" "go.lindenii.runxiyu.org/lindenii-common/cmap" goSSH "golang.org/x/crypto/ssh" ) @@ -64,18 +66,10 @@ func (s *Server) Setup() { } func (s *Server) Run() { - if err := s.deployHooks(); err != nil { - slog.Error("deploying hooks", "error", err) - os.Exit(1) - } - if err := s.loadTemplates(); err != nil { - slog.Error("loading templates", "error", err) - os.Exit(1) - } - if err := s.deployGit2D(); err != nil { - slog.Error("deploying git2d", "error", err) - os.Exit(1) - } + misc.NoneOrPanic(s.loadTemplates()) + misc.NoneOrPanic(misc.DeployBinary(misc.FirstOrPanic(embeddedResourcesFS.Open("git2d/git2d")), s.config.Git.DaemonPath)) + misc.NoneOrPanic(misc.DeployBinary(misc.FirstOrPanic(embeddedResourcesFS.Open("hookc/hookc")), filepath.Join(s.config.Hooks.Execs, "pre-receive"))) + misc.NoneOrPanic(os.Chmod(filepath.Join(s.config.Hooks.Execs, "pre-receive"), 0o755)) // Launch Git2D go func() { |