You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							87 lines
						
					
					
						
							1.8 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							87 lines
						
					
					
						
							1.8 KiB
						
					
					
				| package util | |
| 
 | |
| import ( | |
| 	"path/filepath" | |
| 	"strings" | |
| ) | |
| 
 | |
| type FullPath string | |
| 
 | |
| func NewFullPath(dir, name string) FullPath { | |
| 	name = strings.TrimSuffix(name, "/") | |
| 	return FullPath(dir).Child(name) | |
| } | |
| 
 | |
| func (fp FullPath) DirAndName() (string, string) { | |
| 	dir, name := filepath.Split(string(fp)) | |
| 	name = strings.ToValidUTF8(name, "?") | |
| 	if dir == "/" { | |
| 		return dir, name | |
| 	} | |
| 	if len(dir) < 1 { | |
| 		return "/", "" | |
| 	} | |
| 	return dir[:len(dir)-1], name | |
| } | |
| 
 | |
| func (fp FullPath) Name() string { | |
| 	_, name := filepath.Split(string(fp)) | |
| 	name = strings.ToValidUTF8(name, "?") | |
| 	return name | |
| } | |
| 
 | |
| func (fp FullPath) IsLongerFileName(maxFilenameLength uint32) bool { | |
| 	if maxFilenameLength == 0 { | |
| 		return false | |
| 	} | |
| 	return uint32(len([]byte(fp.Name()))) > maxFilenameLength | |
| } | |
| 
 | |
| func (fp FullPath) Child(name string) FullPath { | |
| 	dir := string(fp) | |
| 	noPrefix := name | |
| 	if strings.HasPrefix(name, "/") { | |
| 		noPrefix = name[1:] | |
| 	} | |
| 	if strings.HasSuffix(dir, "/") { | |
| 		return FullPath(dir + noPrefix) | |
| 	} | |
| 	return FullPath(dir + "/" + noPrefix) | |
| } | |
| 
 | |
| // AsInode an in-memory only inode representation | |
| func (fp FullPath) AsInode(unixTime int64) uint64 { | |
| 	inode := uint64(HashStringToLong(string(fp))) | |
| 	inode = inode + uint64(unixTime)*37 | |
| 	return inode | |
| } | |
| 
 | |
| // split, but skipping the root | |
| func (fp FullPath) Split() []string { | |
| 	if fp == "" || fp == "/" { | |
| 		return []string{} | |
| 	} | |
| 	return strings.Split(string(fp)[1:], "/") | |
| } | |
| 
 | |
| func Join(names ...string) string { | |
| 	return filepath.ToSlash(filepath.Join(names...)) | |
| } | |
| 
 | |
| func JoinPath(names ...string) FullPath { | |
| 	return FullPath(Join(names...)) | |
| } | |
| 
 | |
| func (fp FullPath) IsUnder(other FullPath) bool { | |
| 	if other == "/" { | |
| 		return true | |
| 	} | |
| 	return strings.HasPrefix(string(fp), string(other)+"/") | |
| } | |
| 
 | |
| func StringSplit(separatedValues string, sep string) []string { | |
| 	if separatedValues == "" { | |
| 		return nil | |
| 	} | |
| 	return strings.Split(separatedValues, sep) | |
| }
 |