aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRunxi Yu <me@runxiyu.org>2025-04-06 00:42:11 +0800
committerRunxi Yu <me@runxiyu.org>2025-04-06 00:42:26 +0800
commitf5ebe96649a30658bb8a8bee4cb2ac1b45823b28 (patch)
tree980c5fb915da731335baa30860d2e660bcffa407
parentLMTP: Fix sed mistake (diff)
downloadforge-f5ebe96649a30658bb8a8bee4cb2ac1b45823b28.tar.gz
forge-f5ebe96649a30658bb8a8bee4cb2ac1b45823b28.tar.zst
forge-f5ebe96649a30658bb8a8bee4cb2ac1b45823b28.zip
Hooks, git2d: Simplify deployment logicv0.1.27
-rw-r--r--git2d_deploy.go29
-rw-r--r--git_hooks_deploy.go60
-rw-r--r--internal/misc/deploy.go17
-rw-r--r--internal/misc/misc.go7
-rw-r--r--internal/misc/panic.go14
-rw-r--r--server.go18
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)
+ }
+}
diff --git a/server.go b/server.go
index feab082..3e02586 100644
--- a/server.go
+++ b/server.go
@@ -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() {