Fix content size does not match error when uploading lfs file (#29259)
![image](https://github.com/go-gitea/gitea/assets/38434877/cd726b4d-4771-4547-8aee-ae4e4b56b1d1)
When we update an lfs file by API
`api/v1/repos/{owner}/{repo}/contents/{filepath}`, there will show an
error
```json
{
"message": "Put \"05904d6c7b
\": readfrom tcp [::1]:57300->[::1]:9000: content size does not match",
"url": "http://localhost:3000/api/swagger"
}
```
The reason of this error is
https://github.com/go-gitea/gitea/blob/main/services/repository/files/update.go,
in this file, the `file.ContentReader` been used twice. So when use
`file.ContentReader` in the second time, the `i` of this Reader has been
updated to the length of the content. it will return 0 and an `io.EOF`
error when we try to read cotent from this Reader.
(cherry picked from commit 35d5e4aea4bb02a0b4c7b38ecb2acf612151e891)
This commit is contained in:
parent
f796548225
commit
fb137d1e49
|
@ -425,7 +425,7 @@ func canReadFiles(r *context.Repository) bool {
|
||||||
return r.Permission.CanRead(unit.TypeCode)
|
return r.Permission.CanRead(unit.TypeCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
func base64Reader(s string) (io.Reader, error) {
|
func base64Reader(s string) (io.ReadSeeker, error) {
|
||||||
b, err := base64.StdEncoding.DecodeString(s)
|
b, err := base64.StdEncoding.DecodeString(s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -40,7 +40,7 @@ type ChangeRepoFile struct {
|
||||||
Operation string
|
Operation string
|
||||||
TreePath string
|
TreePath string
|
||||||
FromTreePath string
|
FromTreePath string
|
||||||
ContentReader io.Reader
|
ContentReader io.ReadSeeker
|
||||||
SHA string
|
SHA string
|
||||||
Options *RepoFileOptions
|
Options *RepoFileOptions
|
||||||
}
|
}
|
||||||
|
@ -448,6 +448,10 @@ func CreateOrUpdateFile(ctx context.Context, t *TemporaryUploadRepository, file
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if !exist {
|
if !exist {
|
||||||
|
_, err := file.ContentReader.Seek(0, io.SeekStart)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if err := contentStore.Put(lfsMetaObject.Pointer, file.ContentReader); err != nil {
|
if err := contentStore.Put(lfsMetaObject.Pointer, file.ContentReader); err != nil {
|
||||||
if _, err2 := git_model.RemoveLFSMetaObjectByOid(ctx, repoID, lfsMetaObject.Oid); err2 != nil {
|
if _, err2 := git_model.RemoveLFSMetaObjectByOid(ctx, repoID, lfsMetaObject.Oid); err2 != nil {
|
||||||
return fmt.Errorf("unable to remove failed inserted LFS object %s: %v (Prev Error: %w)", lfsMetaObject.Oid, err2, err)
|
return fmt.Errorf("unable to remove failed inserted LFS object %s: %v (Prev Error: %w)", lfsMetaObject.Oid, err2, err)
|
||||||
|
|
Loading…
Reference in a new issue