Add Size column to attachment (#3734)
* Add size column to attachment Migrate attachments by calculating file sizes Signed-off-by: Jonas Franz <info@jonasfranz.software> * Calculate attachment size on creation Signed-off-by: Jonas Franz <info@jonasfranz.software> * Log error instead of returning error Signed-off-by: Jonas Franz <info@jonasfranz.software>
This commit is contained in:
		
							parent
							
								
									d877bf7e15
								
							
						
					
					
						commit
						3e06490d38
					
				
					 4 changed files with 57 additions and 23 deletions
				
			
		|  | @ -11,7 +11,6 @@ import ( | |||
| 	"os" | ||||
| 	"path" | ||||
| 
 | ||||
| 	"code.gitea.io/gitea/modules/log" | ||||
| 	"code.gitea.io/gitea/modules/setting" | ||||
| 	"code.gitea.io/gitea/modules/util" | ||||
| 	api "code.gitea.io/sdk/gitea" | ||||
|  | @ -29,6 +28,7 @@ type Attachment struct { | |||
| 	CommentID     int64 | ||||
| 	Name          string | ||||
| 	DownloadCount int64          `xorm:"DEFAULT 0"` | ||||
| 	Size          int64          `xorm:"DEFAULT 0"` | ||||
| 	CreatedUnix   util.TimeStamp `xorm:"created"` | ||||
| } | ||||
| 
 | ||||
|  | @ -44,13 +44,12 @@ func (a *Attachment) IncreaseDownloadCount() error { | |||
| 
 | ||||
| // APIFormat converts models.Attachment to api.Attachment
 | ||||
| func (a *Attachment) APIFormat() *api.Attachment { | ||||
| 	size, _ := a.Size() | ||||
| 	return &api.Attachment{ | ||||
| 		ID:            a.ID, | ||||
| 		Name:          a.Name, | ||||
| 		Created:       a.CreatedUnix.AsTime(), | ||||
| 		DownloadCount: a.DownloadCount, | ||||
| 		Size:          size, | ||||
| 		Size:          a.Size, | ||||
| 		UUID:          a.UUID, | ||||
| 		DownloadURL:   a.DownloadURL(), | ||||
| 	} | ||||
|  | @ -67,25 +66,6 @@ func (a *Attachment) LocalPath() string { | |||
| 	return AttachmentLocalPath(a.UUID) | ||||
| } | ||||
| 
 | ||||
| // Size returns the file's size of the attachment
 | ||||
| func (a *Attachment) Size() (int64, error) { | ||||
| 	fi, err := os.Stat(a.LocalPath()) | ||||
| 	if err != nil { | ||||
| 		return 0, err | ||||
| 	} | ||||
| 	return fi.Size(), nil | ||||
| } | ||||
| 
 | ||||
| // MustSize returns the result of a.Size() by ignoring errors
 | ||||
| func (a *Attachment) MustSize() int64 { | ||||
| 	size, err := a.Size() | ||||
| 	if err != nil { | ||||
| 		log.Error(4, "size: %v", err) | ||||
| 		return 0 | ||||
| 	} | ||||
| 	return size | ||||
| } | ||||
| 
 | ||||
| // DownloadURL returns the download url of the attached file
 | ||||
| func (a *Attachment) DownloadURL() string { | ||||
| 	return fmt.Sprintf("%sattachments/%s", setting.AppURL, a.UUID) | ||||
|  | @ -115,6 +95,13 @@ func NewAttachment(name string, buf []byte, file multipart.File) (_ *Attachment, | |||
| 		return nil, fmt.Errorf("Copy: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	// Update file size
 | ||||
| 	var fi os.FileInfo | ||||
| 	if fi, err = fw.Stat(); err != nil { | ||||
| 		return nil, fmt.Errorf("file size: %v", err) | ||||
| 	} | ||||
| 	attach.Size = fi.Size() | ||||
| 
 | ||||
| 	if _, err := x.Insert(attach); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  |  | |||
|  | @ -174,6 +174,8 @@ var migrations = []Migration{ | |||
| 	NewMigration("add merge whitelist for protected branches", addProtectedBranchMergeWhitelist), | ||||
| 	// v60 -> v61
 | ||||
| 	NewMigration("add is_fsck_enabled column for repos", addFsckEnabledToRepo), | ||||
| 	// v61 -> v62
 | ||||
| 	NewMigration("add size column for attachments", addSizeToAttachment), | ||||
| } | ||||
| 
 | ||||
| // Migrate database to current version
 | ||||
|  |  | |||
							
								
								
									
										45
									
								
								models/migrations/v61.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								models/migrations/v61.go
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,45 @@ | |||
| // Copyright 2018 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package migrations | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"path" | ||||
| 
 | ||||
| 	"code.gitea.io/gitea/modules/log" | ||||
| 	"code.gitea.io/gitea/modules/setting" | ||||
| 
 | ||||
| 	"github.com/go-xorm/xorm" | ||||
| ) | ||||
| 
 | ||||
| func addSizeToAttachment(x *xorm.Engine) error { | ||||
| 	type Attachment struct { | ||||
| 		ID   int64  `xorm:"pk autoincr"` | ||||
| 		UUID string `xorm:"uuid UNIQUE"` | ||||
| 		Size int64  `xorm:"DEFAULT 0"` | ||||
| 	} | ||||
| 	if err := x.Sync2(new(Attachment)); err != nil { | ||||
| 		return fmt.Errorf("Sync2: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	attachments := make([]Attachment, 0, 100) | ||||
| 	if err := x.Find(&attachments); err != nil { | ||||
| 		return fmt.Errorf("query attachments: %v", err) | ||||
| 	} | ||||
| 	for _, attach := range attachments { | ||||
| 		localPath := path.Join(setting.AttachmentPath, attach.UUID[0:1], attach.UUID[1:2], attach.UUID) | ||||
| 		fi, err := os.Stat(localPath) | ||||
| 		if err != nil { | ||||
| 			log.Error(4, "calculate file size of attachment[UUID: %s]: %v", attach.UUID, err) | ||||
| 			continue | ||||
| 		} | ||||
| 		attach.Size = fi.Size() | ||||
| 		if _, err := x.ID(attach.ID).Cols("size").Update(attach); err != nil { | ||||
| 			return fmt.Errorf("update size column: %v", err) | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | @ -79,7 +79,7 @@ | |||
| 									<li> | ||||
| 										<a target="_blank" rel="noopener" href="{{AppSubUrl}}/attachments/{{.UUID}}"> | ||||
| 											<strong><span class="ui image octicon octicon-package" title='{{.Name}}'></span> {{.Name}}</strong> | ||||
| 											<span class="ui text grey right">{{.MustSize | FileSize}}</span> | ||||
| 											<span class="ui text grey right">{{.Size | FileSize}}</span> | ||||
| 										</a> | ||||
| 									</li> | ||||
| 									{{end}} | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue