MCPcopy Create free account
hub / github.com/OpenCSGs/csghub-server / BuildObjectResponse

Method BuildObjectResponse

component/git_http.go:160–252  ·  view source on GitHub ↗
(ctx context.Context, req types.BatchRequest, isUpload bool)

Source from the content-addressed store, hash-verified

158}
159
160func (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))

Callers 1

LfsBatchMethod · 0.80

Calls 8

buildObjectResponseMethod · 0.95
ValidMethod · 0.80
ErrorMethod · 0.80
FindByOIDMethod · 0.80
AllowWriteAccessMethod · 0.80
FindByPathMethod · 0.45
RelativePathMethod · 0.45
CreateMethod · 0.45

Tested by

no test coverage detected