github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/pkg/platform/model/buildplanner/commit.go (about) 1 package buildplanner 2 3 import ( 4 "time" 5 6 "github.com/ActiveState/cli/internal/errs" 7 "github.com/ActiveState/cli/internal/logging" 8 "github.com/ActiveState/cli/pkg/platform/api/buildplanner/request" 9 "github.com/ActiveState/cli/pkg/platform/api/buildplanner/response" 10 "github.com/ActiveState/cli/pkg/platform/api/buildplanner/types" 11 "github.com/ActiveState/cli/pkg/platform/runtime/buildexpression" 12 "github.com/go-openapi/strfmt" 13 ) 14 15 type StageCommitRequirement struct { 16 Name string 17 Version []types.VersionRequirement 18 Namespace string 19 Revision *int 20 Operation types.Operation 21 } 22 23 type StageCommitParams struct { 24 Owner string 25 Project string 26 ParentCommit string 27 Description string 28 // Commits can have either requirements (e.g. installing a package)... 29 Requirements []StageCommitRequirement 30 // ... or commits can have an expression (e.g. from pull). When pulling an expression, we do not 31 // compute its changes into a series of above operations. Instead, we just pass the new 32 // expression directly. 33 Expression *buildexpression.BuildExpression 34 TimeStamp *time.Time 35 } 36 37 func (b *BuildPlanner) StageCommit(params StageCommitParams) (strfmt.UUID, error) { 38 logging.Debug("StageCommit, params: %+v", params) 39 expression := params.Expression 40 if expression == nil { 41 var err error 42 expression, err = b.GetBuildExpression(params.ParentCommit) 43 if err != nil { 44 return "", errs.Wrap(err, "Failed to get build expression") 45 } 46 47 var containsPackageOperation bool 48 for _, req := range params.Requirements { 49 if req.Namespace == types.NamespacePlatform { 50 err = expression.UpdatePlatform(req.Operation, strfmt.UUID(req.Name)) 51 if err != nil { 52 return "", errs.Wrap(err, "Failed to update build expression with platform") 53 } 54 } else { 55 requirement := types.Requirement{ 56 Namespace: req.Namespace, 57 Name: req.Name, 58 VersionRequirement: req.Version, 59 Revision: req.Revision, 60 } 61 62 err = expression.UpdateRequirement(req.Operation, requirement) 63 if err != nil { 64 return "", errs.Wrap(err, "Failed to update build expression with requirement") 65 } 66 containsPackageOperation = true 67 } 68 } 69 70 if containsPackageOperation { 71 if err := expression.SetDefaultTimestamp(); err != nil { 72 return "", errs.Wrap(err, "Failed to set default timestamp") 73 } 74 } 75 76 } 77 78 // With the updated build expression call the stage commit mutation 79 request := request.StageCommit(params.Owner, params.Project, params.ParentCommit, params.Description, params.TimeStamp, expression) 80 resp := &response.StageCommitResult{} 81 err := b.client.Run(request, resp) 82 if err != nil { 83 return "", processBuildPlannerError(err, "failed to stage commit") 84 } 85 86 if resp.Commit == nil { 87 return "", errs.New("Staged commit is nil") 88 } 89 90 if response.IsErrorResponse(resp.Commit.Type) { 91 return "", response.ProcessCommitError(resp.Commit, "Could not process error response from stage commit") 92 } 93 94 if resp.Commit.CommitID == "" { 95 return "", errs.New("Staged commit does not contain commitID") 96 } 97 98 return resp.Commit.CommitID, nil 99 } 100 101 func (b *BuildPlanner) RevertCommit(organization, project, parentCommitID, commitID string) (strfmt.UUID, error) { 102 logging.Debug("RevertCommit, organization: %s, project: %s, commitID: %s", organization, project, commitID) 103 resp := &response.RevertCommitResult{} 104 err := b.client.Run(request.RevertCommit(organization, project, parentCommitID, commitID), resp) 105 if err != nil { 106 return "", processBuildPlannerError(err, "Failed to revert commit") 107 } 108 109 if resp.RevertedCommit == nil { 110 return "", errs.New("Revert commit response is nil") 111 } 112 113 if response.IsErrorResponse(resp.RevertedCommit.Type) { 114 return "", response.ProcessRevertCommitError(resp.RevertedCommit, "Could not revert commit") 115 } 116 117 if resp.RevertedCommit.Commit == nil { 118 return "", errs.New("Revert commit's commit is nil'") 119 } 120 121 if response.IsErrorResponse(resp.RevertedCommit.Commit.Type) { 122 return "", response.ProcessCommitError(resp.RevertedCommit.Commit, "Could not process error response from revert commit") 123 } 124 125 if resp.RevertedCommit.Commit.CommitID == "" { 126 return "", errs.New("Commit does not contain commitID") 127 } 128 129 return resp.RevertedCommit.Commit.CommitID, nil 130 } 131 132 type MergeCommitParams struct { 133 Owner string 134 Project string 135 TargetRef string // the commit ID or branch name to merge into 136 OtherRef string // the commit ID or branch name to merge from 137 Strategy types.MergeStrategy 138 } 139 140 func (b *BuildPlanner) MergeCommit(params *MergeCommitParams) (strfmt.UUID, error) { 141 logging.Debug("MergeCommit, owner: %s, project: %s", params.Owner, params.Project) 142 request := request.MergeCommit(params.Owner, params.Project, params.TargetRef, params.OtherRef, params.Strategy) 143 resp := &response.MergeCommitResult{} 144 err := b.client.Run(request, resp) 145 if err != nil { 146 return "", processBuildPlannerError(err, "Failed to merge commit") 147 } 148 149 if resp.MergedCommit == nil { 150 return "", errs.New("MergedCommit is nil") 151 } 152 153 if response.IsErrorResponse(resp.MergedCommit.Type) { 154 return "", response.ProcessMergedCommitError(resp.MergedCommit, "Could not merge commit") 155 } 156 157 if resp.MergedCommit.Commit == nil { 158 return "", errs.New("Merge commit's commit is nil'") 159 } 160 161 if response.IsErrorResponse(resp.MergedCommit.Commit.Type) { 162 return "", response.ProcessCommitError(resp.MergedCommit.Commit, "Could not process error response from merge commit") 163 } 164 165 return resp.MergedCommit.Commit.CommitID, nil 166 }