Add size to Save function (#15264)
Fix #15253 Signed-off-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
		
							parent
							
								
									3cc7d27b6f
								
							
						
					
					
						commit
						0bb8bd8190
					
				| 
						 | 
					@ -122,7 +122,7 @@ func TestGetAttachment(t *testing.T) {
 | 
				
			||||||
		t.Run(tc.name, func(t *testing.T) {
 | 
							t.Run(tc.name, func(t *testing.T) {
 | 
				
			||||||
			//Write empty file to be available for response
 | 
								//Write empty file to be available for response
 | 
				
			||||||
			if tc.createFile {
 | 
								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)
 | 
									assert.NoError(t, err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			//Actual test
 | 
								//Actual test
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -85,7 +85,7 @@ func (a *Attachment) LinkedRepository() (*Repository, UnitType, error) {
 | 
				
			||||||
func NewAttachment(attach *Attachment, buf []byte, file io.Reader) (_ *Attachment, err error) {
 | 
					func NewAttachment(attach *Attachment, buf []byte, file io.Reader) (_ *Attachment, err error) {
 | 
				
			||||||
	attach.UUID = gouuid.New().String()
 | 
						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 {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, fmt.Errorf("Create: %v", err)
 | 
							return nil, fmt.Errorf("Create: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -82,7 +82,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
 | 
						// 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
 | 
						// 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 {
 | 
						if err != nil {
 | 
				
			||||||
		log.Error("Whilst putting LFS OID[%s]: Failed to copy to tmpPath: %s Error: %v", meta.Oid, p, err)
 | 
							log.Error("Whilst putting LFS OID[%s]: Failed to copy to tmpPath: %s Error: %v", meta.Oid, p, err)
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -283,7 +283,7 @@ func (g *GiteaLocalUploader) CreateReleases(releases ...*base.Release) error {
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				defer rc.Close()
 | 
									defer rc.Close()
 | 
				
			||||||
				_, err = storage.Attachments.Save(attach.RelativePath(), rc)
 | 
									_, err = storage.Attachments.Save(attach.RelativePath(), rc, int64(*asset.Size))
 | 
				
			||||||
				return err
 | 
									return err
 | 
				
			||||||
			}()
 | 
								}()
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -66,7 +66,7 @@ func (l *LocalStorage) Open(path string) (Object, error) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Save a file
 | 
					// 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)
 | 
						p := filepath.Join(l.dir, path)
 | 
				
			||||||
	if err := os.MkdirAll(filepath.Dir(p), os.ModePerm); err != nil {
 | 
						if err := os.MkdirAll(filepath.Dir(p), os.ModePerm); err != nil {
 | 
				
			||||||
		return 0, err
 | 
							return 0, err
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -131,13 +131,13 @@ func (m *MinioStorage) Open(path string) (Object, error) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Save save a file to minio
 | 
					// 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(
 | 
						uploadInfo, err := m.client.PutObject(
 | 
				
			||||||
		m.ctx,
 | 
							m.ctx,
 | 
				
			||||||
		m.bucket,
 | 
							m.bucket,
 | 
				
			||||||
		m.buildMinioPath(path),
 | 
							m.buildMinioPath(path),
 | 
				
			||||||
		r,
 | 
							r,
 | 
				
			||||||
		-1,
 | 
							size,
 | 
				
			||||||
		minio.PutObjectOptions{ContentType: "application/octet-stream"},
 | 
							minio.PutObjectOptions{ContentType: "application/octet-stream"},
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -65,7 +65,8 @@ type Object interface {
 | 
				
			||||||
// ObjectStorage represents an object storage to handle a bucket and files
 | 
					// ObjectStorage represents an object storage to handle a bucket and files
 | 
				
			||||||
type ObjectStorage interface {
 | 
					type ObjectStorage interface {
 | 
				
			||||||
	Open(path string) (Object, error)
 | 
						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)
 | 
						Stat(path string) (os.FileInfo, error)
 | 
				
			||||||
	Delete(path string) error
 | 
						Delete(path string) error
 | 
				
			||||||
	URL(path, name string) (*url.URL, error)
 | 
						URL(path, name string) (*url.URL, error)
 | 
				
			||||||
| 
						 | 
					@ -80,7 +81,13 @@ func Copy(dstStorage ObjectStorage, dstPath string, srcStorage ObjectStorage, sr
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	defer f.Close()
 | 
						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
 | 
					// 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
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue