Skip to content

Commit 183c6d2

Browse files
committed
do not fetch existing files with the same size & lint files
1 parent d35bfcc commit 183c6d2

File tree

8 files changed

+138
-123
lines changed

8 files changed

+138
-123
lines changed

integrations/lfs_getobject_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import (
1616
"testing"
1717

1818
"code.gitea.io/gitea/models"
19-
"code.gitea.io/gitea/modules/lfs"
2019
"code.gitea.io/gitea/modules/setting"
2120
"code.gitea.io/gitea/modules/storage"
2221
"code.gitea.io/gitea/routers/routes"
@@ -50,7 +49,7 @@ func storeObjectInRepo(t *testing.T, repositoryID int64, content *[]byte) string
5049
lfsID++
5150
lfsMetaObject, err = models.NewLFSMetaObject(lfsMetaObject)
5251
assert.NoError(t, err)
53-
contentStore := &lfs.ContentStore{ObjectStorage: storage.LFS}
52+
contentStore := &models.ContentStore{ObjectStorage: storage.LFS}
5453
exist, err := contentStore.Exists(lfsMetaObject)
5554
assert.NoError(t, err)
5655
if !exist {

models/lfs.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ import (
1111
"fmt"
1212
"io"
1313
"path"
14-
"time"
15-
"strings"
1614
"strconv"
15+
"strings"
16+
"time"
1717

18-
"code.gitea.io/gitea/modules/timeutil"
1918
"code.gitea.io/gitea/modules/setting"
2019
"code.gitea.io/gitea/modules/storage"
20+
"code.gitea.io/gitea/modules/timeutil"
2121

2222
"xorm.io/builder"
2323
)

models/repo.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -215,12 +215,12 @@ type Repository struct {
215215
NumClosedProjects int `xorm:"NOT NULL DEFAULT 0"`
216216
NumOpenProjects int `xorm:"-"`
217217

218-
IsPrivate bool `xorm:"INDEX"`
219-
IsEmpty bool `xorm:"INDEX"`
220-
IsArchived bool `xorm:"INDEX"`
221-
IsMirror bool `xorm:"INDEX"`
222-
LFS bool `yaml:"lfs"`
223-
LFSServer string `yaml:"lfs_server"`
218+
IsPrivate bool `xorm:"INDEX"`
219+
IsEmpty bool `xorm:"INDEX"`
220+
IsArchived bool `xorm:"INDEX"`
221+
IsMirror bool `xorm:"INDEX"`
222+
LFS bool `xorm:"INDEX"`
223+
LFSServer string `xorm:"TEXT"`
224224
*Mirror `xorm:"-"`
225225
Status RepositoryStatus `xorm:"NOT NULL DEFAULT 0"`
226226

modules/lfs/server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ package lfs
77
import (
88
"encoding/base64"
99
"encoding/json"
10+
"errors"
1011
"fmt"
1112
"io"
1213
"net/http"
1314
"path"
1415
"regexp"
1516
"strconv"
1617
"strings"
17-
"errors"
1818

1919
"code.gitea.io/gitea/models"
2020
"code.gitea.io/gitea/modules/context"

modules/lfsclient/client.go

Lines changed: 80 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -5,149 +5,138 @@
55
package lfsclient
66

77
import (
8+
"bytes"
9+
"context"
810
"encoding/json"
9-
"bytes"
1011
"fmt"
1112
"io"
1213
"net/http"
13-
"context"
1414
"strconv"
1515

1616
"code.gitea.io/gitea/models"
1717
"code.gitea.io/gitea/modules/log"
18-
"code.gitea.io/gitea/modules/storage"
1918
)
2019

2120
const (
2221
metaMediaType = "application/vnd.git-lfs+json"
2322
)
2423

24+
// BatchRequest encodes json object using in a lfs batch api request
2525
type BatchRequest struct {
2626
Operation string `json:"operation"`
2727
Transfers []string `json:"transfers,omitempty"`
28-
Ref *Reference `json:"ref,omitempty"`
29-
Objects []*models.LFSMetaObjectBasic `json:"objects"`
28+
Ref *Reference `json:"ref,omitempty"`
29+
Objects []*models.LFSMetaObjectBasic `json:"objects"`
3030
}
3131

32+
// Reference is a reference field of BatchRequest
3233
type Reference struct {
33-
Name string `json:"name"`
34+
Name string `json:"name"`
3435
}
3536

37+
// packbatch packs lfs batch request to json encoded as bytes
3638
func packbatch(operation string, transfers []string, ref *Reference, metaObjects []*models.LFSMetaObject) (*bytes.Buffer, error) {
37-
metaObjectsBasic := []*models.LFSMetaObjectBasic{}
39+
metaObjectsBasic := []*models.LFSMetaObjectBasic{}
3840
for _, meta := range metaObjects {
39-
metaBasic := &models.LFSMetaObjectBasic{meta.Oid, meta.Size}
41+
metaBasic := &models.LFSMetaObjectBasic{Oid: meta.Oid, Size: meta.Size}
4042
metaObjectsBasic = append(metaObjectsBasic, metaBasic)
4143
}
4244

43-
reqobj := &BatchRequest{operation, transfers, ref, metaObjectsBasic}
45+
reqobj := &BatchRequest{operation, transfers, ref, metaObjectsBasic}
4446

45-
buf := &bytes.Buffer{}
46-
if err := json.NewEncoder(buf).Encode(reqobj); err != nil {
47-
return buf, fmt.Errorf("Failed to encode BatchRequest as json. Error: %v", err)
47+
buf := &bytes.Buffer{}
48+
if err := json.NewEncoder(buf).Encode(reqobj); err != nil {
49+
return buf, fmt.Errorf("Failed to encode BatchRequest as json. Error: %v", err)
4850
}
49-
return buf, nil
51+
return buf, nil
5052
}
5153

54+
// BasicTransferAdapter makes request to lfs server and returns io.ReadCLoser
5255
func BasicTransferAdapter(ctx context.Context, client *http.Client, href string, size int64) (io.ReadCloser, error) {
53-
req, err := http.NewRequestWithContext(ctx, http.MethodGet, href, nil)
54-
if err != nil {
56+
req, err := http.NewRequestWithContext(ctx, http.MethodGet, href, nil)
57+
if err != nil {
5558
return nil, err
5659
}
5760
req.Header.Set("Content-type", "application/octet-stream")
5861
req.Header.Set("Content-Length", strconv.Itoa(int(size)))
5962

60-
resp, err := client.Do(req)
61-
if err != nil {
62-
select {
63-
case <-ctx.Done():
64-
return nil, ctx.Err()
65-
default:
66-
}
67-
return nil, err
68-
}
69-
defer resp.Body.Close()
70-
71-
if resp.StatusCode != http.StatusOK {
72-
return nil, fmt.Errorf("Failed to query BasicTransferAdapter with response: %s", resp.Status)
63+
resp, err := client.Do(req)
64+
if err != nil {
65+
select {
66+
case <-ctx.Done():
67+
return nil, ctx.Err()
68+
default:
69+
}
70+
return nil, err
71+
}
72+
defer resp.Body.Close()
73+
74+
if resp.StatusCode != http.StatusOK {
75+
return nil, fmt.Errorf("Failed to query BasicTransferAdapter with response: %s", resp.Status)
7376
}
74-
return resp.Body, nil
77+
return resp.Body, nil
7578
}
7679

77-
func FetchLFSFilesToContentStore(ctx context.Context, metaObjects []*models.LFSMetaObject, userName string, repo *models.Repository, LFSServer string) error {
78-
client := http.DefaultClient
80+
// FetchLFSFilesToContentStore downloads []LFSMetaObject from lfsServer to ContentStore
81+
func FetchLFSFilesToContentStore(ctx context.Context, metaObjects []*models.LFSMetaObject, userName string, repo *models.Repository, lfsServer string, contentStore *models.ContentStore) error {
82+
client := http.DefaultClient
7983

80-
rv, err := packbatch("download", nil, nil, metaObjects)
81-
if err != nil {
82-
return err
83-
}
84-
batchAPIURL := LFSServer + "/objects/batch"
85-
req, err := http.NewRequestWithContext(ctx, http.MethodGet, batchAPIURL, rv)
86-
if err != nil {
84+
rv, err := packbatch("download", nil, nil, metaObjects)
85+
if err != nil {
86+
return err
87+
}
88+
batchAPIURL := lfsServer + "/objects/batch"
89+
req, err := http.NewRequestWithContext(ctx, http.MethodGet, batchAPIURL, rv)
90+
if err != nil {
8791
return err
8892
}
8993
req.Header.Set("Content-type", metaMediaType)
9094
req.Header.Set("Accept", metaMediaType)
9195

92-
resp, err := client.Do(req)
93-
if err != nil {
94-
select {
95-
case <-ctx.Done():
96-
return ctx.Err()
97-
default:
98-
}
99-
return err
100-
}
101-
defer resp.Body.Close()
102-
103-
if resp.StatusCode != http.StatusOK {
104-
return fmt.Errorf("Failed to query Batch with response: %s", resp.Status)
96+
resp, err := client.Do(req)
97+
if err != nil {
98+
select {
99+
case <-ctx.Done():
100+
return ctx.Err()
101+
default:
102+
}
103+
return err
105104
}
105+
defer resp.Body.Close()
106106

107-
var respBatch models.BatchResponse
108-
err = json.NewDecoder(resp.Body).Decode(&respBatch)
109-
if err != nil {
110-
return err
111-
}
107+
if resp.StatusCode != http.StatusOK {
108+
return fmt.Errorf("Failed to query Batch with response: %s", resp.Status)
109+
}
112110

113-
if len(respBatch.Transfer) == 0 {
114-
respBatch.Transfer = "basic"
111+
var respBatch models.BatchResponse
112+
err = json.NewDecoder(resp.Body).Decode(&respBatch)
113+
if err != nil {
114+
return err
115115
}
116116

117-
contentStore := &models.ContentStore{ObjectStorage: storage.LFS}
117+
if len(respBatch.Transfer) == 0 {
118+
respBatch.Transfer = "basic"
119+
}
118120

119-
for _, rep := range respBatch.Objects {
120-
rc, err := BasicTransferAdapter(ctx, client, rep.Actions["download"].Href, rep.Size)
121+
for _, rep := range respBatch.Objects {
122+
rc, err := BasicTransferAdapter(ctx, client, rep.Actions["download"].Href, rep.Size)
123+
if err != nil {
124+
log.Error("Unable to use BasicTransferAdapter. Error: %v", err)
125+
return err
126+
}
127+
meta, err := repo.GetLFSMetaObjectByOid(rep.Oid)
121128
if err != nil {
122-
log.Error("Unable to use BasicTransferAdapter. Error: %v", err)
123-
return err
124-
}
125-
meta, err := repo.GetLFSMetaObjectByOid(rep.Oid)
126-
if err != nil {
127-
log.Error("Unable to get LFS OID[%s] Error: %v", rep.Oid, err)
128-
return err
129-
}
130-
131-
// put LFS file to contentStore
132-
exist, err := contentStore.Exists(meta)
133-
if err != nil {
134-
log.Error("Unable to check if LFS OID[%s] exist on %s/%s. Error: %v", meta.Oid, userName, repo.Name, err)
135-
return err
136-
}
137-
138-
if exist {
139-
// remove collision
140-
if _, err := repo.RemoveLFSMetaObjectByOid(meta.Oid); err != nil {
141-
return fmt.Errorf("Error whilst removing matched LFS object %s: %v", meta.Oid, err)
142-
}
143-
}
144-
145-
if err := contentStore.Put(meta, rc); err != nil {
146-
if _, err2 := repo.RemoveLFSMetaObjectByOid(meta.Oid); err2 != nil {
147-
return fmt.Errorf("Error whilst removing failed inserted LFS object %s: %v (Prev Error: %v)", meta.Oid, err2, err)
148-
}
149-
return err
150-
}
151-
}
129+
log.Error("Unable to get LFS OID[%s] Error: %v", rep.Oid, err)
130+
return err
131+
}
132+
133+
// put LFS file to contentStore
134+
if err := contentStore.Put(meta, rc); err != nil {
135+
if _, err2 := repo.RemoveLFSMetaObjectByOid(meta.Oid); err2 != nil {
136+
return fmt.Errorf("Error whilst removing failed inserted LFS object %s: %v (Prev Error: %v)", meta.Oid, err2, err)
137+
}
138+
return err
139+
}
140+
}
152141
return nil
153142
}

0 commit comments

Comments
 (0)