( ctx context.Context, parent string, revisions []*v1pb.Revision, database *store.DatabaseMessage, )
| 165 | } |
| 166 | |
| 167 | func (s *RevisionService) createRevisions( |
| 168 | ctx context.Context, |
| 169 | parent string, |
| 170 | revisions []*v1pb.Revision, |
| 171 | database *store.DatabaseMessage, |
| 172 | ) ([]*v1pb.Revision, error) { |
| 173 | var sheetSha256s []string |
| 174 | for _, revisionReq := range revisions { |
| 175 | if revisionReq == nil { |
| 176 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("request.Revision is not set")) |
| 177 | } |
| 178 | // Validate the version format. |
| 179 | if _, err := model.NewVersion(revisionReq.Version); err != nil { |
| 180 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.Wrapf(err, "failed to parse version %q", revisionReq.Version)) |
| 181 | } |
| 182 | |
| 183 | _, sha, err := common.GetProjectResourceIDSheetSha256(revisionReq.Sheet) |
| 184 | if err != nil { |
| 185 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.Wrapf(err, "failed to get sheet from %v", revisionReq.Sheet)) |
| 186 | } |
| 187 | sheetSha256s = append(sheetSha256s, sha) |
| 188 | } |
| 189 | |
| 190 | exist, err := s.store.HasSheets(ctx, sheetSha256s...) |
| 191 | if err != nil { |
| 192 | return nil, connect.NewError(connect.CodeInternal, errors.Errorf("failed to check sheets: %v", err)) |
| 193 | } |
| 194 | if !exist { |
| 195 | return nil, connect.NewError(connect.CodeNotFound, errors.Errorf("some sheets are not found")) |
| 196 | } |
| 197 | |
| 198 | var createdRevisions []*v1pb.Revision |
| 199 | for i, revision := range revisions { |
| 200 | if revision.TaskRun != "" { |
| 201 | projectID, planID, stageID, taskID, taskRunID, err := common.GetProjectIDPlanIDStageIDTaskIDTaskRunID(revision.TaskRun) |
| 202 | if err != nil { |
| 203 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("failed to get taskRun from %q", revision.TaskRun)) |
| 204 | } |
| 205 | taskRun, err := s.store.GetTaskRunV1(ctx, &store.FindTaskRunMessage{ |
| 206 | Workspace: common.GetWorkspaceIDFromContext(ctx), |
| 207 | ProjectID: projectID, |
| 208 | UID: &taskRunID, |
| 209 | }) |
| 210 | if err != nil { |
| 211 | return nil, connect.NewError(connect.CodeInternal, errors.Wrapf(err, "failed to get taskRun")) |
| 212 | } |
| 213 | if taskRun == nil { |
| 214 | return nil, connect.NewError(connect.CodeNotFound, errors.Errorf("taskRun %q not found", revision.TaskRun)) |
| 215 | } |
| 216 | if taskRun.ProjectID != projectID || |
| 217 | taskRun.PlanUID != planID || |
| 218 | taskRun.Environment != formatEnvironmentFromStageID(stageID) || |
| 219 | taskRun.TaskUID != taskID { |
| 220 | return nil, connect.NewError(connect.CodeNotFound, errors.Errorf("taskRun %q not found", revision.TaskRun)) |
| 221 | } |
| 222 | } |
| 223 | |
| 224 | if revision.Type == v1pb.Revision_TYPE_UNSPECIFIED { |
no test coverage detected