2020-08-18 07:23:45 +03:00
// Copyright 2020 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 storage
import (
"context"
"errors"
"fmt"
"io"
"net/url"
2020-09-29 12:05:13 +03:00
"os"
2020-08-18 07:23:45 +03:00
"code.gitea.io/gitea/modules/setting"
)
var (
// ErrURLNotSupported represents url is not supported
ErrURLNotSupported = errors . New ( "url method not supported" )
2020-09-29 12:05:13 +03:00
// ErrIterateObjectsNotSupported represents IterateObjects not supported
ErrIterateObjectsNotSupported = errors . New ( "iterateObjects method not supported" )
2020-08-18 07:23:45 +03:00
)
2020-09-08 18:45:10 +03:00
// Object represents the object on the storage
type Object interface {
io . ReadCloser
io . Seeker
2020-09-29 12:05:13 +03:00
Stat ( ) ( os . FileInfo , error )
2020-09-08 18:45:10 +03:00
}
2020-08-18 07:23:45 +03:00
// ObjectStorage represents an object storage to handle a bucket and files
type ObjectStorage interface {
2020-09-08 18:45:10 +03:00
Open ( path string ) ( Object , error )
2020-08-18 07:23:45 +03:00
Save ( path string , r io . Reader ) ( int64 , error )
2020-09-29 12:05:13 +03:00
Stat ( path string ) ( os . FileInfo , error )
2020-08-18 07:23:45 +03:00
Delete ( path string ) error
URL ( path , name string ) ( * url . URL , error )
2020-09-29 12:05:13 +03:00
IterateObjects ( func ( path string , obj Object ) error ) error
2020-08-18 07:23:45 +03:00
}
// Copy copys a file from source ObjectStorage to dest ObjectStorage
func Copy ( dstStorage ObjectStorage , dstPath string , srcStorage ObjectStorage , srcPath string ) ( int64 , error ) {
f , err := srcStorage . Open ( srcPath )
if err != nil {
return 0 , err
}
defer f . Close ( )
return dstStorage . Save ( dstPath , f )
}
var (
// Attachments represents attachments storage
Attachments ObjectStorage
2020-09-08 18:45:10 +03:00
// LFS represents lfs storage
LFS ObjectStorage
2020-08-18 07:23:45 +03:00
)
// Init init the stoarge
func Init ( ) error {
2020-09-08 18:45:10 +03:00
if err := initAttachments ( ) ; err != nil {
return err
}
return initLFS ( )
}
2020-09-29 12:05:13 +03:00
func initStorage ( storageCfg setting . Storage ) ( ObjectStorage , error ) {
2020-08-18 07:23:45 +03:00
var err error
2020-09-29 12:05:13 +03:00
var s ObjectStorage
switch storageCfg . Type {
case setting . LocalStorageType :
s , err = NewLocalStorage ( storageCfg . Path )
case setting . MinioStorageType :
minio := storageCfg . Minio
s , err = NewMinioStorage (
2020-08-18 07:23:45 +03:00
context . Background ( ) ,
minio . Endpoint ,
minio . AccessKeyID ,
minio . SecretAccessKey ,
minio . Bucket ,
minio . Location ,
minio . BasePath ,
minio . UseSSL ,
)
default :
2020-09-29 12:05:13 +03:00
return nil , fmt . Errorf ( "Unsupported attachment store type: %s" , storageCfg . Type )
2020-08-18 07:23:45 +03:00
}
if err != nil {
2020-09-29 12:05:13 +03:00
return nil , err
2020-08-18 07:23:45 +03:00
}
2020-09-29 12:05:13 +03:00
return s , nil
2020-08-18 07:23:45 +03:00
}
2020-09-08 18:45:10 +03:00
2020-09-29 12:05:13 +03:00
func initAttachments ( ) ( err error ) {
Attachments , err = initStorage ( setting . Attachment . Storage )
return
}
2020-09-08 18:45:10 +03:00
2020-09-29 12:05:13 +03:00
func initLFS ( ) ( err error ) {
LFS , err = initStorage ( setting . LFS . Storage )
return
2020-09-08 18:45:10 +03:00
}