File opensuse-lfs-associate-objects-on-download.patch of Package gitea

see https://github.com/go-gitea/gitea/issues/17715
see https://github.com/openSUSE/openSUSE-git/issues/72

From e7b46e325cde2e79739067a441bcc0e4f3fecfa3 Mon Sep 17 00:00:00 2001
From: Adam Majer <adamm@zombino.com>
Date: Sun, 8 Dec 2024 19:46:29 +0100
Subject: [PATCH] Associate on download

---
 models/git/lfs.go      |  2 +-
 services/lfs/server.go | 21 +++++++++++++++++++++
 2 files changed, 22 insertions(+), 1 deletion(-)

Index: gitea-1.23.1/models/git/lfs.go
===================================================================
--- gitea-1.23.1.orig/models/git/lfs.go
+++ gitea-1.23.1/models/git/lfs.go
@@ -236,7 +236,7 @@ func CountLFSMetaObjects(ctx context.Con
 
 // LFSObjectAccessible checks if a provided Oid is accessible to the user
 func LFSObjectAccessible(ctx context.Context, user *user_model.User, oid string) (bool, error) {
-	if user.IsAdmin {
+	if user != nil && user.IsAdmin {
 		count, err := db.GetEngine(ctx).Count(&LFSMetaObject{Pointer: lfs.Pointer{Oid: oid}})
 		return count > 0, err
 	}
Index: gitea-1.23.1/services/lfs/server.go
===================================================================
--- gitea-1.23.1.orig/services/lfs/server.go
+++ gitea-1.23.1/services/lfs/server.go
@@ -251,6 +251,27 @@ func BatchHandler(ctx *context.Context)
 			responseObject = buildObjectResponse(rc, p, false, !exists, err)
 		} else {
 			var err *lfs_module.ObjectError
+
+			if exists && meta == nil {
+				accessible, accessibleErr := git_model.LFSObjectAccessible(ctx, ctx.Doer, p.Oid)
+				if accessibleErr != nil {
+					log.Error("Unable to check if LFS MetaObject [%s] is accessible. Error: %v", p.Oid, err)
+					writeStatus(ctx, http.StatusInternalServerError)
+					return
+				}
+				if accessible {
+					var newMetaObjErr error
+					meta, newMetaObjErr = git_model.NewLFSMetaObject(ctx, repository.ID, p)
+					if newMetaObjErr != nil {
+						log.Error("Unable to create LFS MetaObject [%s] for %s/%s. Error: %v", p.Oid, rc.User, rc.Repo, err)
+						writeStatus(ctx, http.StatusInternalServerError)
+						return
+					}
+				} else {
+					exists = false
+				}
+			}
+
 			if !exists || meta == nil {
 				err = &lfs_module.ObjectError{
 					Code:    http.StatusNotFound,
openSUSE Build Service is sponsored by