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  }