Skip to content

Commit db70766

Browse files
committed
fix
1 parent 22b92e3 commit db70766

File tree

4 files changed

+35
-19
lines changed

4 files changed

+35
-19
lines changed

go.mod

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ require (
3535
github.com/bohde/codel v0.2.0
3636
github.com/buildkite/terminal-to-html/v3 v3.16.8
3737
github.com/caddyserver/certmagic v0.24.0
38-
github.com/charmbracelet/git-lfs-transfer v0.2.0
38+
github.com/charmbracelet/git-lfs-transfer v0.1.1-0.20251013092601-6327009efd21
3939
github.com/chi-middleware/proxy v1.1.1
4040
github.com/dimiro1/reply v0.0.0-20200315094148-d0136a4c9e21
4141
github.com/djherbis/buffer v1.2.0
@@ -56,7 +56,7 @@ require (
5656
github.com/go-co-op/gocron v1.37.0
5757
github.com/go-enry/go-enry/v2 v2.9.2
5858
github.com/go-git/go-billy/v5 v5.6.2
59-
github.com/go-git/go-git/v5 v5.16.2
59+
github.com/go-git/go-git/v5 v5.16.3
6060
github.com/go-ldap/ldap/v3 v3.4.11
6161
github.com/go-redsync/redsync/v4 v4.13.0
6262
github.com/go-sql-driver/mysql v1.9.3
@@ -121,7 +121,7 @@ require (
121121
golang.org/x/net v0.44.0
122122
golang.org/x/oauth2 v0.30.0
123123
golang.org/x/sync v0.17.0
124-
golang.org/x/sys v0.36.0
124+
golang.org/x/sys v0.37.0
125125
golang.org/x/text v0.30.0
126126
google.golang.org/grpc v1.75.0
127127
google.golang.org/protobuf v1.36.8
@@ -298,9 +298,6 @@ replace github.com/hashicorp/go-version => github.com/6543/go-version v1.3.1
298298

299299
replace github.com/nektos/act => gitea.com/gitea/act v0.261.7-0.20251003180512-ac6e4b751763
300300

301-
// TODO: the only difference is in `PutObject`: the fork doesn't use `NewVerifyingReader(r, sha256.New(), oid, expectedSize)`, need to figure out why
302-
replace github.com/charmbracelet/git-lfs-transfer => gitea.com/gitea/git-lfs-transfer v0.2.0
303-
304301
replace git.sr.ht/~mariusor/go-xsd-duration => gitea.com/gitea/go-xsd-duration v0.0.0-20220703122237-02e73435a078
305302

306303
exclude github.com/gofrs/uuid v3.2.0+incompatible

go.sum

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,6 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
3333
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
3434
gitea.com/gitea/act v0.261.7-0.20251003180512-ac6e4b751763 h1:ohdxegvslDEllZmRNDqpKun6L4Oq81jNdEDtGgHEV2c=
3535
gitea.com/gitea/act v0.261.7-0.20251003180512-ac6e4b751763/go.mod h1:Pg5C9kQY1CEA3QjthjhlrqOC/QOT5NyWNjOjRHw23Ok=
36-
gitea.com/gitea/git-lfs-transfer v0.2.0 h1:baHaNoBSRaeq/xKayEXwiDQtlIjps4Ac/Ll4KqLMB40=
37-
gitea.com/gitea/git-lfs-transfer v0.2.0/go.mod h1:UrXUCm3xLQkq15fu7qlXHUMlrhdlXHoi13KH2Dfiits=
3836
gitea.com/gitea/go-xsd-duration v0.0.0-20220703122237-02e73435a078 h1:BAFmdZpRW7zMQZQDClaCWobRj9uL1MR3MzpCVJvc5s4=
3937
gitea.com/gitea/go-xsd-duration v0.0.0-20220703122237-02e73435a078/go.mod h1:g/V2Hjas6Z1UHUp4yIx6bATpNzJ7DYtD0FG3+xARWxs=
4038
gitea.com/go-chi/binding v0.0.0-20240430071103-39a851e106ed h1:EZZBtilMLSZNWtHHcgq2mt6NSGhJSZBuduAlinMEmso=
@@ -219,6 +217,8 @@ github.com/cention-sany/utf7 v0.0.0-20170124080048-26cad61bd60a h1:MISbI8sU/PSK/
219217
github.com/cention-sany/utf7 v0.0.0-20170124080048-26cad61bd60a/go.mod h1:2GxOXOlEPAMFPfp014mK1SWq8G8BN8o7/dfYqJrVGn8=
220218
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
221219
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
220+
github.com/charmbracelet/git-lfs-transfer v0.1.1-0.20251013092601-6327009efd21 h1:2d64+4Jek9vjYwhY93AjbleiVH+AeWvPwPmDi1mfKFQ=
221+
github.com/charmbracelet/git-lfs-transfer v0.1.1-0.20251013092601-6327009efd21/go.mod h1:fNlYtCHWTRC8MofQERZkVUNUWaOvZeTBqHn/amSbKZI=
222222
github.com/chi-middleware/proxy v1.1.1 h1:4HaXUp8o2+bhHr1OhVy+VjN0+L7/07JDcn6v7YrTjrQ=
223223
github.com/chi-middleware/proxy v1.1.1/go.mod h1:jQwMEJct2tz9VmtCELxvnXoMfa+SOdikvbVJVHv/M+0=
224224
github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs=
@@ -339,8 +339,8 @@ github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UN
339339
github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU=
340340
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4=
341341
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII=
342-
github.com/go-git/go-git/v5 v5.16.2 h1:fT6ZIOjE5iEnkzKyxTHK1W4HGAsPhqEqiSAssSO77hM=
343-
github.com/go-git/go-git/v5 v5.16.2/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8=
342+
github.com/go-git/go-git/v5 v5.16.3 h1:Z8BtvxZ09bYm/yYNgPKCzgWtaRqDTgIKRgIRHBfU6Z8=
343+
github.com/go-git/go-git/v5 v5.16.3/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8=
344344
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
345345
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
346346
github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=
@@ -975,8 +975,8 @@ golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
975975
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
976976
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
977977
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
978-
golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k=
979-
golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
978+
golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=
979+
golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
980980
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
981981
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
982982
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=

modules/lfstransfer/backend/backend.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ func (g *GiteaBackend) Batch(_ string, pointers []transfer.BatchItem, args trans
157157
}
158158

159159
// Download implements transfer.Backend. The returned reader must be closed by the caller.
160-
func (g *GiteaBackend) Download(oid string, args transfer.Args) (io.ReadCloser, int64, error) {
160+
func (g *GiteaBackend) Download(oid string, args transfer.Args) (_ io.ReadCloser, _ int64, retErr error) {
161161
idMapStr, exists := args[argID]
162162
if !exists {
163163
return nil, 0, ErrMissingID
@@ -188,7 +188,15 @@ func (g *GiteaBackend) Download(oid string, args transfer.Args) (io.ReadCloser,
188188
if err != nil {
189189
return nil, 0, fmt.Errorf("failed to get response: %w", err)
190190
}
191-
// no need to close the body here by "defer resp.Body.Close()", see below
191+
// We must return the ReaderCloser but not "ReadAll", to avoid OOM.
192+
// "transfer.Backend" will check io.Closer interface and close the Body reader.
193+
// So only close the Body when error occurs
194+
defer func() {
195+
if retErr != nil {
196+
_ = resp.Body.Close()
197+
}
198+
}()
199+
192200
if resp.StatusCode != http.StatusOK {
193201
return nil, 0, statusCodeToErr(resp.StatusCode)
194202
}
@@ -197,7 +205,6 @@ func (g *GiteaBackend) Download(oid string, args transfer.Args) (io.ReadCloser,
197205
if err != nil {
198206
return nil, 0, fmt.Errorf("failed to parse content length: %w", err)
199207
}
200-
// transfer.Backend will check io.Closer interface and close this Body reader
201208
return resp.Body, respSize, nil
202209
}
203210

tests/integration/git_lfs_ssh_test.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ package integration
55

66
import (
77
"net/url"
8+
"os"
9+
"path/filepath"
810
"slices"
911
"strings"
1012
"sync"
@@ -23,7 +25,8 @@ import (
2325

2426
func TestGitLFSSSH(t *testing.T) {
2527
onGiteaRun(t, func(t *testing.T, u *url.URL) {
26-
dstPath := t.TempDir()
28+
localRepoForUpload := filepath.Join(t.TempDir(), "test-upload")
29+
localRepoForDownload := filepath.Join(t.TempDir(), "test-download")
2730
apiTestContext := NewAPITestContext(t, "user2", "repo1", auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser)
2831

2932
var mu sync.Mutex
@@ -37,7 +40,7 @@ func TestGitLFSSSH(t *testing.T) {
3740
withKeyFile(t, "my-testing-key", func(keyFile string) {
3841
t.Run("CreateUserKey", doAPICreateUserKey(apiTestContext, "test-key", keyFile))
3942
cloneURL := createSSHUrl(apiTestContext.GitPath(), u)
40-
t.Run("Clone", doGitClone(dstPath, cloneURL))
43+
t.Run("CloneOrigin", doGitClone(localRepoForUpload, cloneURL))
4144

4245
cfg, err := setting.CfgProvider.PrepareSaving()
4346
require.NoError(t, err)
@@ -46,10 +49,15 @@ func TestGitLFSSSH(t *testing.T) {
4649
require.NoError(t, cfg.Save())
4750

4851
_, _, cmdErr := gitcmd.NewCommand("config", "lfs.sshtransfer", "always").
49-
WithDir(dstPath).
52+
WithDir(localRepoForUpload).
5053
RunStdString(t.Context())
5154
assert.NoError(t, cmdErr)
52-
lfsCommitAndPushTest(t, dstPath, 10)
55+
pushedFiles := lfsCommitAndPushTest(t, localRepoForUpload, 10)
56+
57+
t.Run("CloneLFS", doGitClone(localRepoForDownload, cloneURL))
58+
content, err := os.ReadFile(filepath.Join(localRepoForDownload, pushedFiles[0]))
59+
assert.NoError(t, err)
60+
assert.Len(t, content, 10)
5361
})
5462

5563
countBatch := slices.ContainsFunc(routerCalls, func(s string) bool {
@@ -58,12 +66,16 @@ func TestGitLFSSSH(t *testing.T) {
5866
countUpload := slices.ContainsFunc(routerCalls, func(s string) bool {
5967
return strings.Contains(s, "PUT /api/internal/repo/user2/repo1.git/info/lfs/objects/")
6068
})
69+
countDownload := slices.ContainsFunc(routerCalls, func(s string) bool {
70+
return strings.Contains(s, "GET /api/internal/repo/user2/repo1.git/info/lfs/objects/")
71+
})
6172
nonAPIRequests := slices.ContainsFunc(routerCalls, func(s string) bool {
6273
fields := strings.Fields(s)
6374
return !strings.HasPrefix(fields[1], "/api/")
6475
})
6576
assert.NotZero(t, countBatch)
6677
assert.NotZero(t, countUpload)
78+
assert.NotZero(t, countDownload)
6779
assert.Zero(t, nonAPIRequests)
6880
})
6981
}

0 commit comments

Comments
 (0)