mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-11-28 12:16:17 +01:00
Fix Git LFS object/repo link storage in database and small refactoring (#2803)
This commit is contained in:
parent
513375c429
commit
82fc50f4ee
2 changed files with 44 additions and 65 deletions
|
@ -70,12 +70,12 @@ func NewLFSMetaObject(m *LFSMetaObject) (*LFSMetaObject, error) {
|
||||||
// GetLFSMetaObjectByOid selects a LFSMetaObject entry from database by its OID.
|
// GetLFSMetaObjectByOid selects a LFSMetaObject entry from database by its OID.
|
||||||
// It may return ErrLFSObjectNotExist or a database error. If the error is nil,
|
// It may return ErrLFSObjectNotExist or a database error. If the error is nil,
|
||||||
// the returned pointer is a valid LFSMetaObject.
|
// the returned pointer is a valid LFSMetaObject.
|
||||||
func GetLFSMetaObjectByOid(oid string) (*LFSMetaObject, error) {
|
func (repo *Repository) GetLFSMetaObjectByOid(oid string) (*LFSMetaObject, error) {
|
||||||
if len(oid) == 0 {
|
if len(oid) == 0 {
|
||||||
return nil, ErrLFSObjectNotExist
|
return nil, ErrLFSObjectNotExist
|
||||||
}
|
}
|
||||||
|
|
||||||
m := &LFSMetaObject{Oid: oid}
|
m := &LFSMetaObject{Oid: oid, RepositoryID: repo.ID}
|
||||||
has, err := x.Get(m)
|
has, err := x.Get(m)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -87,7 +87,7 @@ func GetLFSMetaObjectByOid(oid string) (*LFSMetaObject, error) {
|
||||||
|
|
||||||
// RemoveLFSMetaObjectByOid removes a LFSMetaObject entry from database by its OID.
|
// RemoveLFSMetaObjectByOid removes a LFSMetaObject entry from database by its OID.
|
||||||
// It may return ErrLFSObjectNotExist or a database error.
|
// It may return ErrLFSObjectNotExist or a database error.
|
||||||
func RemoveLFSMetaObjectByOid(oid string) error {
|
func (repo *Repository) RemoveLFSMetaObjectByOid(oid string) error {
|
||||||
if len(oid) == 0 {
|
if len(oid) == 0 {
|
||||||
return ErrLFSObjectNotExist
|
return ErrLFSObjectNotExist
|
||||||
}
|
}
|
||||||
|
@ -98,8 +98,7 @@ func RemoveLFSMetaObjectByOid(oid string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
m := &LFSMetaObject{Oid: oid}
|
m := &LFSMetaObject{Oid: oid, RepositoryID: repo.ID}
|
||||||
|
|
||||||
if _, err := sess.Delete(m); err != nil {
|
if _, err := sess.Delete(m); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,11 +86,11 @@ func ObjectOidHandler(ctx *context.Context) {
|
||||||
|
|
||||||
if ctx.Req.Method == "GET" || ctx.Req.Method == "HEAD" {
|
if ctx.Req.Method == "GET" || ctx.Req.Method == "HEAD" {
|
||||||
if MetaMatcher(ctx.Req) {
|
if MetaMatcher(ctx.Req) {
|
||||||
GetMetaHandler(ctx)
|
getMetaHandler(ctx)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if ContentMatcher(ctx.Req) || len(ctx.Params("filename")) > 0 {
|
if ContentMatcher(ctx.Req) || len(ctx.Params("filename")) > 0 {
|
||||||
GetContentHandler(ctx)
|
getContentHandler(ctx)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
} else if ctx.Req.Method == "PUT" && ContentMatcher(ctx.Req) {
|
} else if ctx.Req.Method == "PUT" && ContentMatcher(ctx.Req) {
|
||||||
|
@ -100,26 +100,35 @@ func ObjectOidHandler(ctx *context.Context) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetContentHandler gets the content from the content store
|
func getAuthenticatedRepoAndMeta(ctx *context.Context, rv *RequestVars, requireWrite bool) (*models.LFSMetaObject, *models.Repository) {
|
||||||
func GetContentHandler(ctx *context.Context) {
|
repositoryString := rv.User + "/" + rv.Repo
|
||||||
|
repository, err := models.GetRepositoryByRef(repositoryString)
|
||||||
|
if err != nil {
|
||||||
|
log.Debug("Could not find repository: %s - %s", repositoryString, err)
|
||||||
|
writeStatus(ctx, 404)
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if !authenticate(ctx, repository, rv.Authorization, requireWrite) {
|
||||||
|
requireAuth(ctx)
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
meta, err := repository.GetLFSMetaObjectByOid(rv.Oid)
|
||||||
|
if err != nil {
|
||||||
|
writeStatus(ctx, 404)
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return meta, repository
|
||||||
|
}
|
||||||
|
|
||||||
|
// getContentHandler gets the content from the content store
|
||||||
|
func getContentHandler(ctx *context.Context) {
|
||||||
rv := unpack(ctx)
|
rv := unpack(ctx)
|
||||||
|
|
||||||
meta, err := models.GetLFSMetaObjectByOid(rv.Oid)
|
meta, _ := getAuthenticatedRepoAndMeta(ctx, rv, false)
|
||||||
if err != nil {
|
if meta == nil {
|
||||||
writeStatus(ctx, 404)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
repository, err := models.GetRepositoryByID(meta.RepositoryID)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
writeStatus(ctx, 404)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if !authenticate(ctx, repository, rv.Authorization, false) {
|
|
||||||
requireAuth(ctx)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -160,26 +169,12 @@ func GetContentHandler(ctx *context.Context) {
|
||||||
logRequest(ctx.Req, statusCode)
|
logRequest(ctx.Req, statusCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetMetaHandler retrieves metadata about the object
|
// getMetaHandler retrieves metadata about the object
|
||||||
func GetMetaHandler(ctx *context.Context) {
|
func getMetaHandler(ctx *context.Context) {
|
||||||
|
|
||||||
rv := unpack(ctx)
|
rv := unpack(ctx)
|
||||||
|
|
||||||
meta, err := models.GetLFSMetaObjectByOid(rv.Oid)
|
meta, _ := getAuthenticatedRepoAndMeta(ctx, rv, false)
|
||||||
if err != nil {
|
if meta == nil {
|
||||||
writeStatus(ctx, 404)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
repository, err := models.GetRepositoryByID(meta.RepositoryID)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
writeStatus(ctx, 404)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if !authenticate(ctx, repository, rv.Authorization, false) {
|
|
||||||
requireAuth(ctx)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -210,7 +205,6 @@ func PostHandler(ctx *context.Context) {
|
||||||
|
|
||||||
repositoryString := rv.User + "/" + rv.Repo
|
repositoryString := rv.User + "/" + rv.Repo
|
||||||
repository, err := models.GetRepositoryByRef(repositoryString)
|
repository, err := models.GetRepositoryByRef(repositoryString)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Debug("Could not find repository: %s - %s", repositoryString, err)
|
log.Debug("Could not find repository: %s - %s", repositoryString, err)
|
||||||
writeStatus(ctx, 404)
|
writeStatus(ctx, 404)
|
||||||
|
@ -222,7 +216,6 @@ func PostHandler(ctx *context.Context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
meta, err := models.NewLFSMetaObject(&models.LFSMetaObject{Oid: rv.Oid, Size: rv.Size, RepositoryID: repository.ID})
|
meta, err := models.NewLFSMetaObject(&models.LFSMetaObject{Oid: rv.Oid, Size: rv.Size, RepositoryID: repository.ID})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
writeStatus(ctx, 404)
|
writeStatus(ctx, 404)
|
||||||
return
|
return
|
||||||
|
@ -281,9 +274,9 @@ func BatchHandler(ctx *context.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
meta, err := models.GetLFSMetaObjectByOid(object.Oid)
|
|
||||||
|
|
||||||
contentStore := &ContentStore{BasePath: setting.LFS.ContentPath}
|
contentStore := &ContentStore{BasePath: setting.LFS.ContentPath}
|
||||||
|
|
||||||
|
meta, err := repository.GetLFSMetaObjectByOid(object.Oid)
|
||||||
if err == nil && contentStore.Exists(meta) { // Object is found and exists
|
if err == nil && contentStore.Exists(meta) { // Object is found and exists
|
||||||
responseObjects = append(responseObjects, Represent(object, meta, true, false))
|
responseObjects = append(responseObjects, Represent(object, meta, true, false))
|
||||||
continue
|
continue
|
||||||
|
@ -291,9 +284,8 @@ func BatchHandler(ctx *context.Context) {
|
||||||
|
|
||||||
// Object is not found
|
// Object is not found
|
||||||
meta, err = models.NewLFSMetaObject(&models.LFSMetaObject{Oid: object.Oid, Size: object.Size, RepositoryID: repository.ID})
|
meta, err = models.NewLFSMetaObject(&models.LFSMetaObject{Oid: object.Oid, Size: object.Size, RepositoryID: repository.ID})
|
||||||
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
responseObjects = append(responseObjects, Represent(object, meta, meta.Existing, true))
|
responseObjects = append(responseObjects, Represent(object, meta, meta.Existing, !contentStore.Exists(meta)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -310,30 +302,18 @@ func BatchHandler(ctx *context.Context) {
|
||||||
func PutHandler(ctx *context.Context) {
|
func PutHandler(ctx *context.Context) {
|
||||||
rv := unpack(ctx)
|
rv := unpack(ctx)
|
||||||
|
|
||||||
meta, err := models.GetLFSMetaObjectByOid(rv.Oid)
|
meta, repository := getAuthenticatedRepoAndMeta(ctx, rv, true)
|
||||||
|
if meta == nil {
|
||||||
if err != nil {
|
|
||||||
writeStatus(ctx, 404)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
repository, err := models.GetRepositoryByID(meta.RepositoryID)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
writeStatus(ctx, 404)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if !authenticate(ctx, repository, rv.Authorization, true) {
|
|
||||||
requireAuth(ctx)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
contentStore := &ContentStore{BasePath: setting.LFS.ContentPath}
|
contentStore := &ContentStore{BasePath: setting.LFS.ContentPath}
|
||||||
if err := contentStore.Put(meta, ctx.Req.Body().ReadCloser()); err != nil {
|
if err := contentStore.Put(meta, ctx.Req.Body().ReadCloser()); err != nil {
|
||||||
models.RemoveLFSMetaObjectByOid(rv.Oid)
|
|
||||||
ctx.Resp.WriteHeader(500)
|
ctx.Resp.WriteHeader(500)
|
||||||
fmt.Fprintf(ctx.Resp, `{"message":"%s"}`, err)
|
fmt.Fprintf(ctx.Resp, `{"message":"%s"}`, err)
|
||||||
|
if err = repository.RemoveLFSMetaObjectByOid(rv.Oid); err != nil {
|
||||||
|
log.Error(4, "RemoveLFSMetaObjectByOid: %v", err)
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue