mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Introduce path Clean/Join helper functions (#23495)
Since #23493 has conflicts with latest commits, this PR is my proposal for fixing #23371 Details are in the comments And refactor the `modules/options` module, to make it always use "filepath" to access local files. Benefits: * No need to do `util.CleanPath(strings.ReplaceAll(p, "\\", "/"))), "/")` any more (not only one before) * The function behaviors are clearly defined
This commit is contained in:
		@@ -5,11 +5,11 @@ package storage
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
	"code.gitea.io/gitea/modules/util"
 | 
			
		||||
@@ -41,13 +41,19 @@ func NewLocalStorage(ctx context.Context, cfg interface{}) (ObjectStorage, error
 | 
			
		||||
	}
 | 
			
		||||
	config := configInterface.(LocalStorageConfig)
 | 
			
		||||
 | 
			
		||||
	if !filepath.IsAbs(config.Path) {
 | 
			
		||||
		return nil, fmt.Errorf("LocalStorageConfig.Path should have been prepared by setting/storage.go and should be an absolute path, but not: %q", config.Path)
 | 
			
		||||
	}
 | 
			
		||||
	log.Info("Creating new Local Storage at %s", config.Path)
 | 
			
		||||
	if err := os.MkdirAll(config.Path, os.ModePerm); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if config.TemporaryPath == "" {
 | 
			
		||||
		config.TemporaryPath = config.Path + "/tmp"
 | 
			
		||||
		config.TemporaryPath = filepath.Join(config.Path, "tmp")
 | 
			
		||||
	}
 | 
			
		||||
	if !filepath.IsAbs(config.TemporaryPath) {
 | 
			
		||||
		return nil, fmt.Errorf("LocalStorageConfig.TemporaryPath should be an absolute path, but not: %q", config.TemporaryPath)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &LocalStorage{
 | 
			
		||||
@@ -58,7 +64,7 @@ func NewLocalStorage(ctx context.Context, cfg interface{}) (ObjectStorage, error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (l *LocalStorage) buildLocalPath(p string) string {
 | 
			
		||||
	return filepath.Join(l.dir, util.CleanPath(strings.ReplaceAll(p, "\\", "/")))
 | 
			
		||||
	return util.FilePathJoinAbs(l.dir, p)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Open a file
 | 
			
		||||
@@ -128,10 +134,7 @@ func (l *LocalStorage) URL(path, name string) (*url.URL, error) {
 | 
			
		||||
 | 
			
		||||
// IterateObjects iterates across the objects in the local storage
 | 
			
		||||
func (l *LocalStorage) IterateObjects(prefix string, fn func(path string, obj Object) error) error {
 | 
			
		||||
	dir := l.dir
 | 
			
		||||
	if prefix != "" {
 | 
			
		||||
		dir = filepath.Join(l.dir, util.CleanPath(prefix))
 | 
			
		||||
	}
 | 
			
		||||
	dir := l.buildLocalPath(prefix)
 | 
			
		||||
	return filepath.WalkDir(dir, func(path string, d os.DirEntry, err error) error {
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user