diff options
| author | Max Resnick <max@ofmax.li> | 2024-03-19 22:38:28 -0700 |
|---|---|---|
| committer | Max Resnick <max@ofmax.li> | 2024-03-23 21:31:46 -0700 |
| commit | d82129052e1c99a61abce7c34ea83f508737eeb9 (patch) | |
| tree | e8998eb745d8bc62f44155c7a9233542947b07e7 /internal | |
| parent | 20090584fba4f893ea7e6a13057615a3ac2bc9c4 (diff) | |
| download | go-git-server-d82129052e1c99a61abce7c34ea83f508737eeb9.tar.gz | |
feat: handle a fresh start using a mgmt repo
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/admin/model.go | 48 | ||||
| -rw-r--r-- | internal/admin/model_test.go | 11 | ||||
| -rw-r--r-- | internal/admin/service.go | 8 | ||||
| -rw-r--r-- | internal/admin/service_test.go | 12 |
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) + } + }) } |