mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-26 12:27:06 +00:00 
			
		
		
		
	Fix Git LFS object/repo link storage in database and small refactoring (#2803)
This commit is contained in:
		| @@ -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 | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Lauris BH
					Lauris BH