aboutsummaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorMax Resnick <max@ofmax.li>2024-03-19 22:38:28 -0700
committerMax Resnick <max@ofmax.li>2024-03-23 21:31:46 -0700
commitd82129052e1c99a61abce7c34ea83f508737eeb9 (patch)
treee8998eb745d8bc62f44155c7a9233542947b07e7 /internal
parent20090584fba4f893ea7e6a13057615a3ac2bc9c4 (diff)
downloadgo-git-server-d82129052e1c99a61abce7c34ea83f508737eeb9.tar.gz
feat: handle a fresh start using a mgmt repo
Diffstat (limited to 'internal')
-rw-r--r--internal/admin/model.go48
-rw-r--r--internal/admin/model_test.go11
-rw-r--r--internal/admin/service.go8
-rw-r--r--internal/admin/service_test.go12
4 files changed, 67 insertions, 12 deletions
diff --git a/internal/admin/model.go b/internal/admin/model.go
index 2b97c5a..8618d69 100644
--- a/internal/admin/model.go
+++ b/internal/admin/model.go
@@ -30,6 +30,29 @@ const (
GitExportMagic = "git-daemon-export-ok"
// GitWebExportMagic magic filename for web repos
GitWebExportMagic = "git-web-export-ok"
+ mgmtRepoName = "mgmt.git"
+)
+
+var (
+ ErrMgmtRepoNotFound = errors.New("mgmt repo does not exist")
+
+ defaultRepo = &GitRepo{
+ Name: "mgmt",
+ Public: false,
+ Permissions: []*Permission{
+ {
+ Role: "admin",
+ Mode: 1,
+ },
+ },
+ }
+ defaultServerConfig = &ServerRepos{
+ Name: "default config",
+ Version: "v1alpha1",
+ Repos: []*GitRepo{
+ defaultRepo,
+ },
+ }
)
// Action composite type for modes
@@ -81,13 +104,13 @@ func loadFromGit(gitURL, filePath string) ([]byte, error) {
})
if err != nil {
// log.error
- fmt.Printf("coudln't clone mgmt repo %s", err)
- return []byte(""), errors.New("coudln't clone mgmt repo")
+ fmt.Printf("couldn't clone mgmt repo %s", err)
+ return []byte(""), errors.New("couldn't clone mgmt repo")
}
file, err := fs.Open(filePath)
if err != nil {
fmt.Printf("Failed to open gitserver config %s", err)
- return []byte(""), errors.New("coudln't open git config file from mgmt repo")
+ return []byte(""), errors.New("couldn't open git config file from mgmt repo")
}
defer file.Close()
return io.ReadAll(file)
@@ -115,7 +138,14 @@ func loadServerConfig(mgmtRepo bool, baseDir, configPath string) (*ServerRepos,
err error
)
if mgmtRepo {
- repoURI := filepath.Join("file:///", baseDir, "mgmt.git")
+ mgmtPath := filepath.Join(baseDir, mgmtRepoName)
+ _, err := os.Stat(mgmtPath)
+ if errors.Is(err, os.ErrNotExist) {
+ return &ServerRepos{}, ErrMgmtRepoNotFound
+ } else if err != nil {
+ log.Fatalf("An unexpected error was encountered %s", err)
+ }
+ repoURI := filepath.Join("file:///", mgmtPath)
configBytes, err = loadFromGit(repoURI, configPath)
if err != nil {
// log.error
@@ -207,7 +237,7 @@ func (r *GitRepo) ReconcileRepo(basePath string) {
f, err := os.Create(okExport)
f.Close()
if err != nil {
- log.Fatalf("%s coudln't be created %s", GitExportMagic, err)
+ log.Fatalf("%s couldn't be created %s", GitExportMagic, err)
}
}
r.ConfigureExport(repoBase)
@@ -222,7 +252,7 @@ func (r *GitRepo) ConfigureExport(repoBase string) {
okExport := filepath.Join(repoBase, GitWebExportMagic)
_, err := os.Create(okExport)
if err != nil {
- log.Fatalf("%s coudln't be created %s", GitWebExportMagic, err)
+ log.Fatalf("%s couldn't be created %s", GitWebExportMagic, err)
}
}
@@ -231,14 +261,14 @@ func (r *GitWeb) ReconcileGitConf(repoBase string) {
confPath := filepath.Join(repoBase, "config")
cfg, err := ini.Load(confPath)
if err != nil {
- log.Fatalf("Coudln't read gitconfig %s", err)
+ log.Fatalf("couldn't read gitconfig %s", err)
}
// check if empty, delete
if (GitWeb{} == *r) {
if cfg.HasSection("gitweb") {
cfg.DeleteSection("gitweb")
if err := cfg.SaveTo(confPath); err != nil {
- log.Fatalf("Coudln't save gitconfig %s", err)
+ log.Fatalf("couldn't save gitconfig %s", err)
}
}
return
@@ -249,6 +279,6 @@ func (r *GitWeb) ReconcileGitConf(repoBase string) {
section.Key("url").SetValue(r.URL)
section.Key("category").SetValue(r.Category)
if err := cfg.SaveTo(confPath); err != nil {
- log.Fatalf("Coudln't save gitconfig %s", err)
+ log.Fatalf("couldn't save gitconfig %s", err)
}
}
diff --git a/internal/admin/model_test.go b/internal/admin/model_test.go
index ee0b72a..85d6ed1 100644
--- a/internal/admin/model_test.go
+++ b/internal/admin/model_test.go
@@ -13,6 +13,7 @@ import (
"github.com/go-git/go-billy/v5/osfs"
"github.com/go-git/go-git/v5"
+ "github.com/go-git/go-git/v5/plumbing/object"
"github.com/go-git/go-git/v5/storage/filesystem"
"gopkg.in/ini.v1"
)
@@ -180,7 +181,15 @@ func TestMgmtGitConfig(t *testing.T) {
if _, err := wt.Add(fileToCommit); err != nil {
t.Fatal(err)
}
- _, err = wt.Commit(fileToCommit, &git.CommitOptions{})
+ _, err = wt.Commit(fileToCommit,
+ &git.CommitOptions{
+ Author: &object.Signature{
+ Name: "go git server",
+ Email: "go-git-server@go-git-server",
+ },
+ },
+ )
+
if err != nil {
t.Fatalf("Error creating commit %s", err)
}
diff --git a/internal/admin/service.go b/internal/admin/service.go
index 498215b..267a243 100644
--- a/internal/admin/service.go
+++ b/internal/admin/service.go
@@ -1,6 +1,7 @@
package admin
import (
+ "errors"
"log"
casbin "github.com/casbin/casbin/v2"
@@ -63,9 +64,12 @@ func NewService(modelPath, policyPath, serverConfigPath, reposDir string, mgmtRe
if err != nil {
log.Fatalf("Couldn't load the enforcer encountered the following error: %s", err)
}
-
conf, err := loadServerConfig(mgmtRepo, reposDir, serverConfigPath)
- if err != nil {
+ if errors.Is(err, ErrMgmtRepoNotFound) {
+ log.Print("no server config found, using default")
+ conf = defaultServerConfig
+
+ } else if err != nil {
// log.error
log.Fatalf("Coudln't load server config %s", err)
}
diff --git a/internal/admin/service_test.go b/internal/admin/service_test.go
index ae616c3..8931c9d 100644
--- a/internal/admin/service_test.go
+++ b/internal/admin/service_test.go
@@ -129,4 +129,16 @@ func TestInitServer(t *testing.T) {
log.Fatal("expected to mgmt repo but didn't in policy")
}
})
+ t.Run("test an unitialized server config", func(t *testing.T) {
+ tempRepoDir := t.TempDir()
+ svc := NewService(destModelFile,
+ destPolicyFile,
+ // TODO set abs path
+ "gitserver.yaml",
+ tempRepoDir,
+ true)
+ if svc.Conf.Name != "default config" {
+ log.Fatalf("found %s expected 'default config'", svc.Conf.Name)
+ }
+ })
}