You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

lfs.go 2.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package models
  2. import (
  3. "errors"
  4. "code.gitea.io/gitea/modules/util"
  5. )
  6. // LFSMetaObject stores metadata for LFS tracked files.
  7. type LFSMetaObject struct {
  8. ID int64 `xorm:"pk autoincr"`
  9. Oid string `xorm:"UNIQUE(s) INDEX NOT NULL"`
  10. Size int64 `xorm:"NOT NULL"`
  11. RepositoryID int64 `xorm:"UNIQUE(s) INDEX NOT NULL"`
  12. Existing bool `xorm:"-"`
  13. CreatedUnix util.TimeStamp `xorm:"created"`
  14. }
  15. // LFSTokenResponse defines the JSON structure in which the JWT token is stored.
  16. // This structure is fetched via SSH and passed by the Git LFS client to the server
  17. // endpoint for authorization.
  18. type LFSTokenResponse struct {
  19. Header map[string]string `json:"header"`
  20. Href string `json:"href"`
  21. }
  22. var (
  23. // ErrLFSObjectNotExist is returned from lfs models functions in order
  24. // to differentiate between database and missing object errors.
  25. ErrLFSObjectNotExist = errors.New("LFS Meta object does not exist")
  26. )
  27. const (
  28. // LFSMetaFileIdentifier is the string appearing at the first line of LFS pointer files.
  29. // https://github.com/git-lfs/git-lfs/blob/master/docs/spec.md
  30. LFSMetaFileIdentifier = "version https://git-lfs.github.com/spec/v1"
  31. // LFSMetaFileOidPrefix appears in LFS pointer files on a line before the sha256 hash.
  32. LFSMetaFileOidPrefix = "oid sha256:"
  33. )
  34. // NewLFSMetaObject stores a given populated LFSMetaObject structure in the database
  35. // if it is not already present.
  36. func NewLFSMetaObject(m *LFSMetaObject) (*LFSMetaObject, error) {
  37. var err error
  38. has, err := x.Get(m)
  39. if err != nil {
  40. return nil, err
  41. }
  42. if has {
  43. m.Existing = true
  44. return m, nil
  45. }
  46. sess := x.NewSession()
  47. defer sess.Close()
  48. if err = sess.Begin(); err != nil {
  49. return nil, err
  50. }
  51. if _, err = sess.Insert(m); err != nil {
  52. return nil, err
  53. }
  54. return m, sess.Commit()
  55. }
  56. // GetLFSMetaObjectByOid selects a LFSMetaObject entry from database by its OID.
  57. // It may return ErrLFSObjectNotExist or a database error. If the error is nil,
  58. // the returned pointer is a valid LFSMetaObject.
  59. func (repo *Repository) GetLFSMetaObjectByOid(oid string) (*LFSMetaObject, error) {
  60. if len(oid) == 0 {
  61. return nil, ErrLFSObjectNotExist
  62. }
  63. m := &LFSMetaObject{Oid: oid, RepositoryID: repo.ID}
  64. has, err := x.Get(m)
  65. if err != nil {
  66. return nil, err
  67. } else if !has {
  68. return nil, ErrLFSObjectNotExist
  69. }
  70. return m, nil
  71. }
  72. // RemoveLFSMetaObjectByOid removes a LFSMetaObject entry from database by its OID.
  73. // It may return ErrLFSObjectNotExist or a database error.
  74. func (repo *Repository) RemoveLFSMetaObjectByOid(oid string) error {
  75. if len(oid) == 0 {
  76. return ErrLFSObjectNotExist
  77. }
  78. sess := x.NewSession()
  79. defer sess.Close()
  80. if err := sess.Begin(); err != nil {
  81. return err
  82. }
  83. m := &LFSMetaObject{Oid: oid, RepositoryID: repo.ID}
  84. if _, err := sess.Delete(m); err != nil {
  85. return err
  86. }
  87. return sess.Commit()
  88. }