diff options
author | Royce Remer <royceremer@gmail.com> | 2024-06-28 10:42:57 +0200 |
---|---|---|
committer | Earl Warren <contact@earl-warren.org> | 2024-06-29 07:56:18 +0200 |
commit | 45181ee9453467b2e9a213888c9018a78894820f (patch) | |
tree | befdc671ba89c5ab405ad56e159c29a661cf03b5 /modules/lfs | |
parent | Fix web notification icon not updated once you read all notifications (#31447) (diff) | |
download | forgejo-45181ee9453467b2e9a213888c9018a78894820f.tar.xz forgejo-45181ee9453467b2e9a213888c9018a78894820f.zip |
Support legacy _links LFS batch responses (#31513)
Support legacy _links LFS batch response.
Fixes #31512.
This is backwards-compatible change to the LFS client so that, upon
mirroring from an upstream which has a batch api, it can download
objects whether the responses contain the `_links` field or its
successor the `actions` field. When Gitea must fallback to the legacy
`_links` field a logline is emitted at INFO level which looks like this:
```
...s/lfs/http_client.go:188:performOperation() [I] <LFSPointer ee95d0a27ccdfc7c12516d4f80dcf144a5eaf10d0461d282a7206390635cdbee:160> is using a deprecated batch schema response!
```
I've only run `test-backend` with this code, but added a new test to
cover this case. Additionally I have a fork with this change deployed
which I've confirmed syncs LFS from Gitea<-Artifactory (which has legacy
`_links`) as well as from Gitea<-Gitea (which has the modern `actions`).
Signed-off-by: Royce Remer <royceremer@gmail.com>
(cherry picked from commit df805d6ed0458dbec258d115238fde794ed4d0ce)
Diffstat (limited to 'modules/lfs')
-rw-r--r-- | modules/lfs/http_client.go | 4 | ||||
-rw-r--r-- | modules/lfs/http_client_test.go | 16 | ||||
-rw-r--r-- | modules/lfs/shared.go | 1 |
3 files changed, 21 insertions, 0 deletions
diff --git a/modules/lfs/http_client.go b/modules/lfs/http_client.go index f5ddd38b09..7ee2449b0e 100644 --- a/modules/lfs/http_client.go +++ b/modules/lfs/http_client.go @@ -181,6 +181,10 @@ func (c *HTTPClient) performOperation(ctx context.Context, objects []Pointer, dc } else { link, ok := object.Actions["download"] if !ok { + // no actions block in response, try legacy response schema + link, ok = object.Links["download"] + } + if !ok { log.Debug("%+v", object) return errors.New("missing action 'download'") } diff --git a/modules/lfs/http_client_test.go b/modules/lfs/http_client_test.go index 7431132f76..ec90f5375d 100644 --- a/modules/lfs/http_client_test.go +++ b/modules/lfs/http_client_test.go @@ -59,6 +59,17 @@ func lfsTestRoundtripHandler(req *http.Request) *http.Response { }, }, } + } else if strings.Contains(url, "legacy-batch-request-download") { + batchResponse = &BatchResponse{ + Transfer: "dummy", + Objects: []*ObjectResponse{ + { + Links: map[string]*Link{ + "download": {}, + }, + }, + }, + } } else if strings.Contains(url, "valid-batch-request-upload") { batchResponse = &BatchResponse{ Transfer: "dummy", @@ -229,6 +240,11 @@ func TestHTTPClientDownload(t *testing.T) { endpoint: "https://unknown-actions-map.io", expectederror: "missing action 'download'", }, + // case 11 + { + endpoint: "https://legacy-batch-request-download.io", + expectederror: "", + }, } for n, c := range cases { diff --git a/modules/lfs/shared.go b/modules/lfs/shared.go index 80f4fed00d..675d2328b7 100644 --- a/modules/lfs/shared.go +++ b/modules/lfs/shared.go @@ -47,6 +47,7 @@ type BatchResponse struct { type ObjectResponse struct { Pointer Actions map[string]*Link `json:"actions,omitempty"` + Links map[string]*Link `json:"_links,omitempty"` Error *ObjectError `json:"error,omitempty"` } |