(ctx context.Context, req types.BatchRequest, isUpload bool)
| 158 | } |
| 159 | |
| 160 | func (c *GitHTTPComponent) BuildObjectResponse(ctx context.Context, req types.BatchRequest, isUpload bool) (*types.BatchResponse, error) { |
| 161 | var ( |
| 162 | respObjects []*types.ObjectResponse |
| 163 | exists bool |
| 164 | ) |
| 165 | repo, err := c.repo.FindByPath(ctx, req.RepoType, req.Namespace, req.Name) |
| 166 | if err != nil { |
| 167 | return nil, fmt.Errorf("failed to find repo, error: %w", err) |
| 168 | } |
| 169 | |
| 170 | for _, obj := range req.Objects { |
| 171 | if !obj.Valid() { |
| 172 | respObjects = append(respObjects, c.buildObjectResponse(ctx, req, obj, false, false, &types.ObjectError{ |
| 173 | Code: http.StatusUnprocessableEntity, |
| 174 | Message: "Oid or size are invalid", |
| 175 | })) |
| 176 | continue |
| 177 | } |
| 178 | objectKey := path.Join("lfs", obj.RelativePath()) |
| 179 | _, err := c.s3Client.StatObject(ctx, c.config.S3.Bucket, objectKey, minio.StatObjectOptions{}) |
| 180 | if err != nil { |
| 181 | if os.IsNotExist(err) { |
| 182 | exists = false |
| 183 | } |
| 184 | slog.Error("failed to check if lfs file exists", slog.String("oid", objectKey), slog.Any("error", err)) |
| 185 | exists = false |
| 186 | } else { |
| 187 | exists = true |
| 188 | } |
| 189 | |
| 190 | lfsMetaObject, err := c.lfsMetaObjectStore.FindByOID(ctx, repo.ID, obj.Oid) |
| 191 | if err != nil && !errors.Is(err, sql.ErrNoRows) { |
| 192 | slog.Error("failed to check if lfs file exists in database", slog.String("oid", objectKey), slog.Any("error", err)) |
| 193 | return nil, err |
| 194 | } |
| 195 | |
| 196 | if lfsMetaObject != nil && obj.Size != lfsMetaObject.Size { |
| 197 | respObjects = append(respObjects, c.buildObjectResponse(ctx, req, obj, false, false, &types.ObjectError{ |
| 198 | Code: http.StatusUnprocessableEntity, |
| 199 | Message: fmt.Sprintf("Object %s is not %d bytes", obj.Oid, obj.Size), |
| 200 | })) |
| 201 | continue |
| 202 | } |
| 203 | |
| 204 | var responseObject *types.ObjectResponse |
| 205 | if isUpload { |
| 206 | var err *types.ObjectError |
| 207 | // if !exists && setting.LFS.MaxFileSize > 0 && p.Size > setting.LFS.MaxFileSize { |
| 208 | // err = &types.ObjectError{ |
| 209 | // Code: http.StatusUnprocessableEntity, |
| 210 | // Message: fmt.Sprintf("Size must be less than or equal to %d", setting.LFS.MaxFileSize), |
| 211 | // } |
| 212 | // } |
| 213 | |
| 214 | if exists && lfsMetaObject == nil { |
| 215 | allowed, err := c.AllowWriteAccess(ctx, req.RepoType, req.Namespace, req.Name, req.CurrentUser) |
| 216 | if err != nil { |
| 217 | slog.Error("unable to check if user can wirte this repo", slog.String("lfs oid", obj.Oid), slog.Any("error", err)) |
no test coverage detected