mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Backport #15264 This PR proposes an alternative solution to #15255 - just add the size to the save function. Yes it is less apparently clean but it may be more correct. Close #15255 Fix #15253 Signed-off-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
		@@ -122,7 +122,7 @@ func TestGetAttachment(t *testing.T) {
 | 
			
		||||
		t.Run(tc.name, func(t *testing.T) {
 | 
			
		||||
			//Write empty file to be available for response
 | 
			
		||||
			if tc.createFile {
 | 
			
		||||
				_, err := storage.Attachments.Save(models.AttachmentRelativePath(tc.uuid), strings.NewReader("hello world"))
 | 
			
		||||
				_, err := storage.Attachments.Save(models.AttachmentRelativePath(tc.uuid), strings.NewReader("hello world"), -1)
 | 
			
		||||
				assert.NoError(t, err)
 | 
			
		||||
			}
 | 
			
		||||
			//Actual test
 | 
			
		||||
 
 | 
			
		||||
@@ -99,7 +99,7 @@ func (a *Attachment) LinkedRepository() (*Repository, UnitType, error) {
 | 
			
		||||
func NewAttachment(attach *Attachment, buf []byte, file io.Reader) (_ *Attachment, err error) {
 | 
			
		||||
	attach.UUID = gouuid.New().String()
 | 
			
		||||
 | 
			
		||||
	size, err := storage.Attachments.Save(attach.RelativePath(), io.MultiReader(bytes.NewReader(buf), file))
 | 
			
		||||
	size, err := storage.Attachments.Save(attach.RelativePath(), io.MultiReader(bytes.NewReader(buf), file), -1)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("Create: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -74,7 +74,7 @@ func (s *ContentStore) Put(meta *models.LFSMetaObject, r io.Reader) error {
 | 
			
		||||
 | 
			
		||||
	// now pass the wrapped reader to Save - if there is a size mismatch or hash mismatch then
 | 
			
		||||
	// the errors returned by the newHashingReader should percolate up to here
 | 
			
		||||
	written, err := s.Save(p, wrappedRd)
 | 
			
		||||
	written, err := s.Save(p, wrappedRd, meta.Size)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error("Whilst putting LFS OID[%s]: Failed to copy to tmpPath: %s Error: %v", meta.Oid, p, err)
 | 
			
		||||
		return err
 | 
			
		||||
 
 | 
			
		||||
@@ -295,7 +295,8 @@ func (g *GiteaLocalUploader) CreateReleases(downloader base.Downloader, releases
 | 
			
		||||
					}
 | 
			
		||||
					rc = resp.Body
 | 
			
		||||
				}
 | 
			
		||||
				_, err = storage.Attachments.Save(attach.RelativePath(), rc)
 | 
			
		||||
				defer rc.Close()
 | 
			
		||||
				_, err = storage.Attachments.Save(attach.RelativePath(), rc, int64(*asset.Size))
 | 
			
		||||
				return err
 | 
			
		||||
			}()
 | 
			
		||||
			if err != nil {
 | 
			
		||||
 
 | 
			
		||||
@@ -65,7 +65,7 @@ func (l *LocalStorage) Open(path string) (Object, error) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Save a file
 | 
			
		||||
func (l *LocalStorage) Save(path string, r io.Reader) (int64, error) {
 | 
			
		||||
func (l *LocalStorage) Save(path string, r io.Reader, size int64) (int64, error) {
 | 
			
		||||
	p := filepath.Join(l.dir, path)
 | 
			
		||||
	if err := os.MkdirAll(filepath.Dir(p), os.ModePerm); err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
 
 | 
			
		||||
@@ -129,13 +129,13 @@ func (m *MinioStorage) Open(path string) (Object, error) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Save save a file to minio
 | 
			
		||||
func (m *MinioStorage) Save(path string, r io.Reader) (int64, error) {
 | 
			
		||||
func (m *MinioStorage) Save(path string, r io.Reader, size int64) (int64, error) {
 | 
			
		||||
	uploadInfo, err := m.client.PutObject(
 | 
			
		||||
		m.ctx,
 | 
			
		||||
		m.bucket,
 | 
			
		||||
		m.buildMinioPath(path),
 | 
			
		||||
		r,
 | 
			
		||||
		-1,
 | 
			
		||||
		size,
 | 
			
		||||
		minio.PutObjectOptions{ContentType: "application/octet-stream"},
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
 
 | 
			
		||||
@@ -65,7 +65,8 @@ type Object interface {
 | 
			
		||||
// ObjectStorage represents an object storage to handle a bucket and files
 | 
			
		||||
type ObjectStorage interface {
 | 
			
		||||
	Open(path string) (Object, error)
 | 
			
		||||
	Save(path string, r io.Reader) (int64, error)
 | 
			
		||||
	// Save store a object, if size is unknown set -1
 | 
			
		||||
	Save(path string, r io.Reader, size int64) (int64, error)
 | 
			
		||||
	Stat(path string) (os.FileInfo, error)
 | 
			
		||||
	Delete(path string) error
 | 
			
		||||
	URL(path, name string) (*url.URL, error)
 | 
			
		||||
@@ -80,7 +81,13 @@ func Copy(dstStorage ObjectStorage, dstPath string, srcStorage ObjectStorage, sr
 | 
			
		||||
	}
 | 
			
		||||
	defer f.Close()
 | 
			
		||||
 | 
			
		||||
	return dstStorage.Save(dstPath, f)
 | 
			
		||||
	size := int64(-1)
 | 
			
		||||
	fsinfo, err := f.Stat()
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		size = fsinfo.Size()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return dstStorage.Save(dstPath, f, size)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SaveFrom saves data to the ObjectStorage with path p from the callback
 | 
			
		||||
@@ -94,7 +101,7 @@ func SaveFrom(objStorage ObjectStorage, p string, callback func(w io.Writer) err
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	_, err := objStorage.Save(p, pr)
 | 
			
		||||
	_, err := objStorage.Save(p, pr, -1)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user