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…
	
	Add table
		Add a link
		
	
		Reference in a new issue