Skip to content

Commit 82fc50f

Browse files
lafrikslunny
authored andcommitted
Fix Git LFS object/repo link storage in database and small refactoring (#2803)
1 parent 513375c commit 82fc50f

File tree

2 files changed

+38
-59
lines changed

2 files changed

+38
-59
lines changed

models/lfs.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,12 @@ func NewLFSMetaObject(m *LFSMetaObject) (*LFSMetaObject, error) {
7070
// GetLFSMetaObjectByOid selects a LFSMetaObject entry from database by its OID.
7171
// It may return ErrLFSObjectNotExist or a database error. If the error is nil,
7272
// the returned pointer is a valid LFSMetaObject.
73-
func GetLFSMetaObjectByOid(oid string) (*LFSMetaObject, error) {
73+
func (repo *Repository) GetLFSMetaObjectByOid(oid string) (*LFSMetaObject, error) {
7474
if len(oid) == 0 {
7575
return nil, ErrLFSObjectNotExist
7676
}
7777

78-
m := &LFSMetaObject{Oid: oid}
78+
m := &LFSMetaObject{Oid: oid, RepositoryID: repo.ID}
7979
has, err := x.Get(m)
8080
if err != nil {
8181
return nil, err
@@ -87,7 +87,7 @@ func GetLFSMetaObjectByOid(oid string) (*LFSMetaObject, error) {
8787

8888
// RemoveLFSMetaObjectByOid removes a LFSMetaObject entry from database by its OID.
8989
// It may return ErrLFSObjectNotExist or a database error.
90-
func RemoveLFSMetaObjectByOid(oid string) error {
90+
func (repo *Repository) RemoveLFSMetaObjectByOid(oid string) error {
9191
if len(oid) == 0 {
9292
return ErrLFSObjectNotExist
9393
}
@@ -98,8 +98,7 @@ func RemoveLFSMetaObjectByOid(oid string) error {
9898
return err
9999
}
100100

101-
m := &LFSMetaObject{Oid: oid}
102-
101+
m := &LFSMetaObject{Oid: oid, RepositoryID: repo.ID}
103102
if _, err := sess.Delete(m); err != nil {
104103
return err
105104
}

modules/lfs/server.go

Lines changed: 34 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,11 @@ func ObjectOidHandler(ctx *context.Context) {
8686

8787
if ctx.Req.Method == "GET" || ctx.Req.Method == "HEAD" {
8888
if MetaMatcher(ctx.Req) {
89-
GetMetaHandler(ctx)
89+
getMetaHandler(ctx)
9090
return
9191
}
9292
if ContentMatcher(ctx.Req) || len(ctx.Params("filename")) > 0 {
93-
GetContentHandler(ctx)
93+
getContentHandler(ctx)
9494
return
9595
}
9696
} else if ctx.Req.Method == "PUT" && ContentMatcher(ctx.Req) {
@@ -100,26 +100,35 @@ func ObjectOidHandler(ctx *context.Context) {
100100

101101
}
102102

103-
// GetContentHandler gets the content from the content store
104-
func GetContentHandler(ctx *context.Context) {
105-
106-
rv := unpack(ctx)
107-
108-
meta, err := models.GetLFSMetaObjectByOid(rv.Oid)
103+
func getAuthenticatedRepoAndMeta(ctx *context.Context, rv *RequestVars, requireWrite bool) (*models.LFSMetaObject, *models.Repository) {
104+
repositoryString := rv.User + "/" + rv.Repo
105+
repository, err := models.GetRepositoryByRef(repositoryString)
109106
if err != nil {
107+
log.Debug("Could not find repository: %s - %s", repositoryString, err)
110108
writeStatus(ctx, 404)
111-
return
109+
return nil, nil
112110
}
113111

114-
repository, err := models.GetRepositoryByID(meta.RepositoryID)
112+
if !authenticate(ctx, repository, rv.Authorization, requireWrite) {
113+
requireAuth(ctx)
114+
return nil, nil
115+
}
115116

117+
meta, err := repository.GetLFSMetaObjectByOid(rv.Oid)
116118
if err != nil {
117119
writeStatus(ctx, 404)
118-
return
120+
return nil, nil
119121
}
120122

121-
if !authenticate(ctx, repository, rv.Authorization, false) {
122-
requireAuth(ctx)
123+
return meta, repository
124+
}
125+
126+
// getContentHandler gets the content from the content store
127+
func getContentHandler(ctx *context.Context) {
128+
rv := unpack(ctx)
129+
130+
meta, _ := getAuthenticatedRepoAndMeta(ctx, rv, false)
131+
if meta == nil {
123132
return
124133
}
125134

@@ -160,26 +169,12 @@ func GetContentHandler(ctx *context.Context) {
160169
logRequest(ctx.Req, statusCode)
161170
}
162171

163-
// GetMetaHandler retrieves metadata about the object
164-
func GetMetaHandler(ctx *context.Context) {
165-
172+
// getMetaHandler retrieves metadata about the object
173+
func getMetaHandler(ctx *context.Context) {
166174
rv := unpack(ctx)
167175

168-
meta, err := models.GetLFSMetaObjectByOid(rv.Oid)
169-
if err != nil {
170-
writeStatus(ctx, 404)
171-
return
172-
}
173-
174-
repository, err := models.GetRepositoryByID(meta.RepositoryID)
175-
176-
if err != nil {
177-
writeStatus(ctx, 404)
178-
return
179-
}
180-
181-
if !authenticate(ctx, repository, rv.Authorization, false) {
182-
requireAuth(ctx)
176+
meta, _ := getAuthenticatedRepoAndMeta(ctx, rv, false)
177+
if meta == nil {
183178
return
184179
}
185180

@@ -210,7 +205,6 @@ func PostHandler(ctx *context.Context) {
210205

211206
repositoryString := rv.User + "/" + rv.Repo
212207
repository, err := models.GetRepositoryByRef(repositoryString)
213-
214208
if err != nil {
215209
log.Debug("Could not find repository: %s - %s", repositoryString, err)
216210
writeStatus(ctx, 404)
@@ -222,7 +216,6 @@ func PostHandler(ctx *context.Context) {
222216
}
223217

224218
meta, err := models.NewLFSMetaObject(&models.LFSMetaObject{Oid: rv.Oid, Size: rv.Size, RepositoryID: repository.ID})
225-
226219
if err != nil {
227220
writeStatus(ctx, 404)
228221
return
@@ -281,19 +274,18 @@ func BatchHandler(ctx *context.Context) {
281274
return
282275
}
283276

284-
meta, err := models.GetLFSMetaObjectByOid(object.Oid)
285-
286277
contentStore := &ContentStore{BasePath: setting.LFS.ContentPath}
278+
279+
meta, err := repository.GetLFSMetaObjectByOid(object.Oid)
287280
if err == nil && contentStore.Exists(meta) { // Object is found and exists
288281
responseObjects = append(responseObjects, Represent(object, meta, true, false))
289282
continue
290283
}
291284

292285
// Object is not found
293286
meta, err = models.NewLFSMetaObject(&models.LFSMetaObject{Oid: object.Oid, Size: object.Size, RepositoryID: repository.ID})
294-
295287
if err == nil {
296-
responseObjects = append(responseObjects, Represent(object, meta, meta.Existing, true))
288+
responseObjects = append(responseObjects, Represent(object, meta, meta.Existing, !contentStore.Exists(meta)))
297289
}
298290
}
299291

@@ -310,30 +302,18 @@ func BatchHandler(ctx *context.Context) {
310302
func PutHandler(ctx *context.Context) {
311303
rv := unpack(ctx)
312304

313-
meta, err := models.GetLFSMetaObjectByOid(rv.Oid)
314-
315-
if err != nil {
316-
writeStatus(ctx, 404)
317-
return
318-
}
319-
320-
repository, err := models.GetRepositoryByID(meta.RepositoryID)
321-
322-
if err != nil {
323-
writeStatus(ctx, 404)
324-
return
325-
}
326-
327-
if !authenticate(ctx, repository, rv.Authorization, true) {
328-
requireAuth(ctx)
305+
meta, repository := getAuthenticatedRepoAndMeta(ctx, rv, true)
306+
if meta == nil {
329307
return
330308
}
331309

332310
contentStore := &ContentStore{BasePath: setting.LFS.ContentPath}
333311
if err := contentStore.Put(meta, ctx.Req.Body().ReadCloser()); err != nil {
334-
models.RemoveLFSMetaObjectByOid(rv.Oid)
335312
ctx.Resp.WriteHeader(500)
336313
fmt.Fprintf(ctx.Resp, `{"message":"%s"}`, err)
314+
if err = repository.RemoveLFSMetaObjectByOid(rv.Oid); err != nil {
315+
log.Error(4, "RemoveLFSMetaObjectByOid: %v", err)
316+
}
337317
return
338318
}
339319

0 commit comments

Comments
 (0)