2021-04-09 00:25:57 +02:00
// Copyright 2020 The Gitea Authors. All rights reserved.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2021-04-09 00:25:57 +02:00
package lfs
import (
2024-07-31 18:29:48 +08:00
"errors"
"fmt"
2021-04-09 00:25:57 +02:00
"time"
2024-07-31 18:29:48 +08:00
"code.gitea.io/gitea/modules/util"
2021-04-09 00:25:57 +02:00
)
const (
// MediaType contains the media type for LFS server requests
MediaType = "application/vnd.git-lfs+json"
2024-06-12 06:22:28 +08:00
// Some LFS servers offer content with other types, so fallback to '*/*' if application/vnd.git-lfs+json cannot be served
AcceptHeader = "application/vnd.git-lfs+json;q=0.9, */*;q=0.8"
2021-04-09 00:25:57 +02:00
)
// BatchRequest contains multiple requests processed in one batch operation.
// https://github.com/git-lfs/git-lfs/blob/main/docs/api/batch.md#requests
type BatchRequest struct {
Operation string ` json:"operation" `
Transfers [ ] string ` json:"transfers,omitempty" `
Ref * Reference ` json:"ref,omitempty" `
Objects [ ] Pointer ` json:"objects" `
}
// Reference contains a git reference.
// https://github.com/git-lfs/git-lfs/blob/main/docs/api/batch.md#ref-property
type Reference struct {
Name string ` json:"name" `
}
// Pointer contains LFS pointer data
type Pointer struct {
Oid string ` json:"oid" xorm:"UNIQUE(s) INDEX NOT NULL" `
Size int64 ` json:"size" xorm:"NOT NULL" `
}
// BatchResponse contains multiple object metadata Representation structures
// for use with the batch API.
// https://github.com/git-lfs/git-lfs/blob/main/docs/api/batch.md#successful-responses
type BatchResponse struct {
Transfer string ` json:"transfer,omitempty" `
Objects [ ] * ObjectResponse ` json:"objects" `
}
// ObjectResponse is object metadata as seen by clients of the LFS server.
type ObjectResponse struct {
Pointer
2021-06-06 01:59:27 +02:00
Actions map [ string ] * Link ` json:"actions,omitempty" `
2024-06-28 01:42:57 -07:00
Links map [ string ] * Link ` json:"_links,omitempty" `
2021-04-09 00:25:57 +02:00
Error * ObjectError ` json:"error,omitempty" `
}
2021-07-08 07:38:13 -04:00
// Link provides a structure with information about how to access a object.
2021-04-09 00:25:57 +02:00
type Link struct {
Href string ` json:"href" `
Header map [ string ] string ` json:"header,omitempty" `
2021-06-06 01:59:27 +02:00
ExpiresAt * time . Time ` json:"expires_at,omitempty" `
2021-04-09 00:25:57 +02:00
}
2021-06-14 19:20:43 +02:00
// ObjectError defines the JSON structure returned to the client in case of an error.
2021-04-09 00:25:57 +02:00
type ObjectError struct {
Code int ` json:"code" `
Message string ` json:"message" `
}
2024-07-31 18:29:48 +08:00
var (
// See https://github.com/git-lfs/git-lfs/blob/main/docs/api/batch.md#successful-responses
// LFS object error codes should match HTTP status codes where possible:
// 404 - The object does not exist on the server.
// 409 - The specified hash algorithm disagrees with the server's acceptable options.
// 410 - The object was removed by the owner.
// 422 - Validation error.
ErrObjectNotExist = util . ErrNotExist // the object does not exist on the server
ErrObjectHashMismatch = errors . New ( "the specified hash algorithm disagrees with the server's acceptable options" )
ErrObjectRemoved = errors . New ( "the object was removed by the owner" )
ErrObjectValidation = errors . New ( "validation error" )
)
func ( e * ObjectError ) Error ( ) string {
return fmt . Sprintf ( "[%d] %s" , e . Code , e . Message )
}
func ( e * ObjectError ) Unwrap ( ) error {
switch e . Code {
case 404 :
return ErrObjectNotExist
case 409 :
return ErrObjectHashMismatch
case 410 :
return ErrObjectRemoved
case 422 :
return ErrObjectValidation
default :
return errors . New ( e . Message )
}
}
2021-04-09 00:25:57 +02:00
// PointerBlob associates a Git blob with a Pointer.
type PointerBlob struct {
Hash string
Pointer
}
2021-06-06 01:59:27 +02:00
// ErrorResponse describes the error to the client.
type ErrorResponse struct {
Message string
DocumentationURL string ` json:"documentation_url,omitempty" `
RequestID string ` json:"request_id,omitempty" `
}