2024-04-11 17:10:16 +02:00
|
|
|
package gitannex
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"strings"
|
2024-08-04 16:43:49 +02:00
|
|
|
|
|
|
|
"github.com/rclone/rclone/fs/fspath"
|
2024-04-11 17:10:16 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
type layoutMode string
|
|
|
|
|
|
|
|
// All layout modes from git-annex-remote-rclone are supported.
|
|
|
|
const (
|
|
|
|
layoutModeLower layoutMode = "lower"
|
|
|
|
layoutModeDirectory layoutMode = "directory"
|
|
|
|
layoutModeNodir layoutMode = "nodir"
|
|
|
|
layoutModeMixed layoutMode = "mixed"
|
|
|
|
layoutModeFrankencase layoutMode = "frankencase"
|
|
|
|
layoutModeUnknown layoutMode = ""
|
|
|
|
)
|
|
|
|
|
|
|
|
func allLayoutModes() []layoutMode {
|
|
|
|
return []layoutMode{
|
|
|
|
layoutModeLower,
|
|
|
|
layoutModeDirectory,
|
|
|
|
layoutModeNodir,
|
|
|
|
layoutModeMixed,
|
|
|
|
layoutModeFrankencase,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func parseLayoutMode(mode string) layoutMode {
|
|
|
|
for _, knownMode := range allLayoutModes() {
|
|
|
|
if mode == string(knownMode) {
|
|
|
|
return knownMode
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return layoutModeUnknown
|
|
|
|
}
|
|
|
|
|
|
|
|
type queryDirhashFunc func(msg string) (string, error)
|
|
|
|
|
|
|
|
func buildFsString(queryDirhash queryDirhashFunc, mode layoutMode, key, remoteName, prefix string) (string, error) {
|
2024-08-04 16:43:49 +02:00
|
|
|
remoteName = strings.TrimSuffix(remoteName, ":") + ":"
|
|
|
|
remoteString := fspath.JoinRootPath(remoteName, prefix)
|
|
|
|
|
2024-04-11 17:10:16 +02:00
|
|
|
if mode == layoutModeNodir {
|
2024-08-04 16:43:49 +02:00
|
|
|
return remoteString, nil
|
2024-04-11 17:10:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
var dirhash string
|
|
|
|
var err error
|
|
|
|
switch mode {
|
|
|
|
case layoutModeLower, layoutModeDirectory:
|
|
|
|
dirhash, err = queryDirhash("DIRHASH-LOWER " + key)
|
|
|
|
case layoutModeMixed, layoutModeFrankencase:
|
|
|
|
dirhash, err = queryDirhash("DIRHASH " + key)
|
|
|
|
default:
|
|
|
|
panic("unreachable")
|
|
|
|
}
|
|
|
|
if err != nil {
|
|
|
|
return "", fmt.Errorf("buildFsString failed to query dirhash: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
switch mode {
|
|
|
|
case layoutModeLower:
|
2024-08-04 16:43:49 +02:00
|
|
|
return fmt.Sprintf("%s/%s", remoteString, dirhash), nil
|
2024-04-11 17:10:16 +02:00
|
|
|
case layoutModeDirectory:
|
2024-08-04 16:43:49 +02:00
|
|
|
return fmt.Sprintf("%s/%s%s", remoteString, dirhash, key), nil
|
2024-04-11 17:10:16 +02:00
|
|
|
case layoutModeMixed:
|
2024-08-04 16:43:49 +02:00
|
|
|
return fmt.Sprintf("%s/%s", remoteString, dirhash), nil
|
2024-04-11 17:10:16 +02:00
|
|
|
case layoutModeFrankencase:
|
2024-08-04 16:43:49 +02:00
|
|
|
return fmt.Sprintf("%s/%s", remoteString, strings.ToLower(dirhash)), nil
|
2024-04-11 17:10:16 +02:00
|
|
|
default:
|
|
|
|
panic("unreachable")
|
|
|
|
}
|
|
|
|
}
|