diff --git a/cmd/restore.go b/cmd/restore.go index 39f53e9..af1a8e2 100644 --- a/cmd/restore.go +++ b/cmd/restore.go @@ -200,6 +200,10 @@ func runRestoreSingle(cmd *cobra.Command, args []string) error { if targetDB == "" { return fmt.Errorf("cannot determine database name, please specify --target") } + } else { + // If target was explicitly provided, also strip common file extensions + // in case user included them in the target name + targetDB = stripFileExtensions(targetDB) } // Safety checks @@ -445,16 +449,30 @@ type archiveInfo struct { DBName string } +// stripFileExtensions removes common backup file extensions from a name +func stripFileExtensions(name string) string { + // Remove extensions (handle double extensions like .sql.gz.sql.gz) + for { + oldName := name + name = strings.TrimSuffix(name, ".tar.gz") + name = strings.TrimSuffix(name, ".dump.gz") + name = strings.TrimSuffix(name, ".sql.gz") + name = strings.TrimSuffix(name, ".dump") + name = strings.TrimSuffix(name, ".sql") + // If no change, we're done + if name == oldName { + break + } + } + return name +} + // extractDBNameFromArchive extracts database name from archive filename func extractDBNameFromArchive(filename string) string { base := filepath.Base(filename) // Remove extensions - base = strings.TrimSuffix(base, ".tar.gz") - base = strings.TrimSuffix(base, ".dump.gz") - base = strings.TrimSuffix(base, ".sql.gz") - base = strings.TrimSuffix(base, ".dump") - base = strings.TrimSuffix(base, ".sql") + base = stripFileExtensions(base) // Remove timestamp patterns (YYYYMMDD_HHMMSS) parts := strings.Split(base, "_") diff --git a/internal/tui/archive_browser.go b/internal/tui/archive_browser.go index 9358140..931cdde 100644 --- a/internal/tui/archive_browser.go +++ b/internal/tui/archive_browser.go @@ -359,16 +359,30 @@ func (m ArchiveBrowserModel) filterArchives(archives []ArchiveInfo) []ArchiveInf return filtered } +// stripFileExtensions removes common backup file extensions from a name +func stripFileExtensions(name string) string { + // Remove extensions (handle double extensions like .sql.gz.sql.gz) + for { + oldName := name + name = strings.TrimSuffix(name, ".tar.gz") + name = strings.TrimSuffix(name, ".dump.gz") + name = strings.TrimSuffix(name, ".sql.gz") + name = strings.TrimSuffix(name, ".dump") + name = strings.TrimSuffix(name, ".sql") + // If no change, we're done + if name == oldName { + break + } + } + return name +} + // extractDBNameFromFilename extracts database name from archive filename func extractDBNameFromFilename(filename string) string { base := filepath.Base(filename) // Remove extensions - base = strings.TrimSuffix(base, ".tar.gz") - base = strings.TrimSuffix(base, ".dump.gz") - base = strings.TrimSuffix(base, ".sql.gz") - base = strings.TrimSuffix(base, ".dump") - base = strings.TrimSuffix(base, ".sql") + base = stripFileExtensions(base) // Remove timestamp patterns (YYYYMMDD_HHMMSS) parts := strings.Split(base, "_")