feat: initialize configured app repository

This commit is contained in:
eding 2026-07-26 20:46:11 +02:00
parent a45618d704
commit 4d5f9f46da
3 changed files with 55 additions and 4 deletions

View file

@ -58,6 +58,15 @@ func runBootstrap(cmd *cobra.Command, args []string) error {
return err return err
} }
manager := forgejo.NewRepoManager(cfg.Git.BaseURL, cfg.Git.Token, owner, cfg.Git.Username, "", "", cfg.Delivery.AppRepoRef, "") manager := forgejo.NewRepoManager(cfg.Git.BaseURL, cfg.Git.Token, owner, cfg.Git.Username, "", "", cfg.Delivery.AppRepoRef, "")
created, err := manager.EnsureRepository(repo, "Application source for Maidn CI/CD delivery")
if err != nil {
return err
}
if created {
if err := manager.PushRef(bootstrapPublishAppFrom, cfg.Delivery.AppRepoURL, cfg.Delivery.AppRepoRef, cfg.Delivery.AppRepoRef); err != nil {
return err
}
}
if err := manager.PushBranch(bootstrapPublishAppFrom, cfg.Delivery.AppRepoURL, branch); err != nil { if err := manager.PushBranch(bootstrapPublishAppFrom, cfg.Delivery.AppRepoURL, branch); err != nil {
return err return err
} }

View file

@ -90,7 +90,7 @@ func (rm *RepoManager) ensureRepo(name, description string, createStructure func
return err return err
} }
if !exists { if !exists {
if err := rm.createRepo(name, description); err != nil { if err := rm.createRepo(name, description, true); err != nil {
return err return err
} }
} }
@ -112,12 +112,12 @@ func (rm *RepoManager) repoExists(name string) (bool, error) {
} }
} }
func (rm *RepoManager) createRepo(name, description string) error { func (rm *RepoManager) createRepo(name, description string, autoInit bool) error {
createURL := fmt.Sprintf("%s/api/v1/orgs/%s/repos", rm.BaseURL, rm.Owner) createURL := fmt.Sprintf("%s/api/v1/orgs/%s/repos", rm.BaseURL, rm.Owner)
if rm.Owner == rm.Username { if rm.Owner == rm.Username {
createURL = fmt.Sprintf("%s/api/v1/user/repos", rm.BaseURL) createURL = fmt.Sprintf("%s/api/v1/user/repos", rm.BaseURL)
} }
body, err := json.Marshal(createRepoRequest{Name: name, Description: description, Private: true, AutoInit: true, DefaultBranch: rm.Branch}) body, err := json.Marshal(createRepoRequest{Name: name, Description: description, Private: true, AutoInit: autoInit, DefaultBranch: rm.Branch})
if err != nil { if err != nil {
return err return err
} }
@ -131,6 +131,17 @@ func (rm *RepoManager) createRepo(name, description string) error {
return nil return nil
} }
func (rm *RepoManager) EnsureRepository(name, description string) (bool, error) {
exists, err := rm.repoExists(name)
if err != nil {
return false, err
}
if exists {
return false, nil
}
return true, rm.createRepo(name, description, false)
}
func (rm *RepoManager) setupRepository(repoURL, repoName string, existing bool, createStructure func(string) error) error { func (rm *RepoManager) setupRepository(repoURL, repoName string, existing bool, createStructure func(string) error) error {
tempDir, err := os.MkdirTemp("", "repo-setup-*") tempDir, err := os.MkdirTemp("", "repo-setup-*")
if err != nil { if err != nil {
@ -183,12 +194,16 @@ func (rm *RepoManager) CreatePullRequest(repo, title, head, base string) error {
} }
func (rm *RepoManager) PushBranch(dir, repoURL, branch string) error { func (rm *RepoManager) PushBranch(dir, repoURL, branch string) error {
return rm.PushRef(dir, repoURL, "HEAD", branch)
}
func (rm *RepoManager) PushRef(dir, repoURL, sourceRef, targetBranch string) error {
cleanupAskPass, environment, err := rm.gitEnvironment(dir) cleanupAskPass, environment, err := rm.gitEnvironment(dir)
if err != nil { if err != nil {
return err return err
} }
defer cleanupAskPass() defer cleanupAskPass()
return runGit(dir, environment, "push", repoURL, "HEAD:refs/heads/"+branch) return runGit(dir, environment, "push", repoURL, sourceRef+":refs/heads/"+targetBranch)
} }
func CurrentBranch(dir string) (string, error) { func CurrentBranch(dir string) (string, error) {

View file

@ -89,6 +89,33 @@ func TestRepositoryFromURL(t *testing.T) {
} }
} }
func TestEnsureRepositoryCreatesWithoutInitialization(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
switch request.Method {
case http.MethodGet:
writer.WriteHeader(http.StatusNotFound)
case http.MethodPost:
var body createRepoRequest
if err := json.NewDecoder(request.Body).Decode(&body); err != nil {
t.Fatal(err)
}
if body.AutoInit {
t.Fatal("application repository must be created without an initial commit")
}
writer.WriteHeader(http.StatusCreated)
default:
t.Fatalf("unexpected method %q", request.Method)
}
}))
defer server.Close()
manager := NewRepoManager(server.URL, "token", "owner", "user", "manifests", "cluster", "main", "maidn/bootstrap-test")
manager.HTTPClient = server.Client()
created, err := manager.EnsureRepository("app", "description")
if err != nil || !created {
t.Fatalf("EnsureRepository() = (%t, %v)", created, err)
}
}
func TestRepoExistsReturnsFalseOnNotFound(t *testing.T) { func TestRepoExistsReturnsFalseOnNotFound(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) { server := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
writer.WriteHeader(http.StatusNotFound) writer.WriteHeader(http.StatusNotFound)