feat: initialize configured app repository
This commit is contained in:
parent
a45618d704
commit
4d5f9f46da
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue