mirror of
https://github.com/gilbertchen/duplicacy
synced 2025-12-18 09:13:17 +00:00
Allow a custom location for the filters file
You can now add a key 'filters' in the preferences file that points to the path of the filters file. If this key is not found in the preferences, the default location '.duplicacy/filters' is used. There is a new option '-filters' for the set command that set this key in the preferences, but you can also edit the file directly.
This commit is contained in:
@@ -548,7 +548,13 @@ func setPreference(context *cli.Context) {
|
|||||||
newPreference.DoNotSavePassword = triBool.IsTrue()
|
newPreference.DoNotSavePassword = triBool.IsTrue()
|
||||||
}
|
}
|
||||||
|
|
||||||
newPreference.NobackupFile = context.String("nobackup-file")
|
if context.String("nobackup-file") != "" {
|
||||||
|
newPreference.NobackupFile = context.String("nobackup-file")
|
||||||
|
}
|
||||||
|
|
||||||
|
if context.String("filters") != "" {
|
||||||
|
newPreference.FiltersFile = context.String("filters")
|
||||||
|
}
|
||||||
|
|
||||||
key := context.String("key")
|
key := context.String("key")
|
||||||
value := context.String("value")
|
value := context.String("value")
|
||||||
@@ -731,7 +737,7 @@ func backupRepository(context *cli.Context) {
|
|||||||
uploadRateLimit := context.Int("limit-rate")
|
uploadRateLimit := context.Int("limit-rate")
|
||||||
enumOnly := context.Bool("enum-only")
|
enumOnly := context.Bool("enum-only")
|
||||||
storage.SetRateLimits(0, uploadRateLimit)
|
storage.SetRateLimits(0, uploadRateLimit)
|
||||||
backupManager := duplicacy.CreateBackupManager(preference.SnapshotID, storage, repository, password, preference.NobackupFile)
|
backupManager := duplicacy.CreateBackupManager(preference.SnapshotID, storage, repository, password, preference.NobackupFile, preference.FiltersFile)
|
||||||
duplicacy.SavePassword(*preference, "password", password)
|
duplicacy.SavePassword(*preference, "password", password)
|
||||||
|
|
||||||
backupManager.SetupSnapshotCache(preference.Name)
|
backupManager.SetupSnapshotCache(preference.Name)
|
||||||
@@ -808,7 +814,7 @@ func restoreRepository(context *cli.Context) {
|
|||||||
duplicacy.LOG_INFO("SNAPSHOT_FILTER", "Loaded %d include/exclude pattern(s)", len(patterns))
|
duplicacy.LOG_INFO("SNAPSHOT_FILTER", "Loaded %d include/exclude pattern(s)", len(patterns))
|
||||||
|
|
||||||
storage.SetRateLimits(context.Int("limit-rate"), 0)
|
storage.SetRateLimits(context.Int("limit-rate"), 0)
|
||||||
backupManager := duplicacy.CreateBackupManager(preference.SnapshotID, storage, repository, password, preference.NobackupFile)
|
backupManager := duplicacy.CreateBackupManager(preference.SnapshotID, storage, repository, password, preference.NobackupFile, preference.FiltersFile)
|
||||||
duplicacy.SavePassword(*preference, "password", password)
|
duplicacy.SavePassword(*preference, "password", password)
|
||||||
|
|
||||||
loadRSAPrivateKey(context.String("key"), preference, backupManager, false)
|
loadRSAPrivateKey(context.String("key"), preference, backupManager, false)
|
||||||
@@ -850,7 +856,7 @@ func listSnapshots(context *cli.Context) {
|
|||||||
tag := context.String("t")
|
tag := context.String("t")
|
||||||
revisions := getRevisions(context)
|
revisions := getRevisions(context)
|
||||||
|
|
||||||
backupManager := duplicacy.CreateBackupManager(preference.SnapshotID, storage, repository, password, preference.NobackupFile)
|
backupManager := duplicacy.CreateBackupManager(preference.SnapshotID, storage, repository, password, "", "")
|
||||||
duplicacy.SavePassword(*preference, "password", password)
|
duplicacy.SavePassword(*preference, "password", password)
|
||||||
|
|
||||||
id := preference.SnapshotID
|
id := preference.SnapshotID
|
||||||
@@ -901,7 +907,7 @@ func checkSnapshots(context *cli.Context) {
|
|||||||
tag := context.String("t")
|
tag := context.String("t")
|
||||||
revisions := getRevisions(context)
|
revisions := getRevisions(context)
|
||||||
|
|
||||||
backupManager := duplicacy.CreateBackupManager(preference.SnapshotID, storage, repository, password, preference.NobackupFile)
|
backupManager := duplicacy.CreateBackupManager(preference.SnapshotID, storage, repository, password, "", "")
|
||||||
duplicacy.SavePassword(*preference, "password", password)
|
duplicacy.SavePassword(*preference, "password", password)
|
||||||
|
|
||||||
loadRSAPrivateKey(context.String("key"), preference, backupManager, false)
|
loadRSAPrivateKey(context.String("key"), preference, backupManager, false)
|
||||||
@@ -958,7 +964,7 @@ func printFile(context *cli.Context) {
|
|||||||
snapshotID = context.String("id")
|
snapshotID = context.String("id")
|
||||||
}
|
}
|
||||||
|
|
||||||
backupManager := duplicacy.CreateBackupManager(preference.SnapshotID, storage, repository, password, preference.NobackupFile)
|
backupManager := duplicacy.CreateBackupManager(preference.SnapshotID, storage, repository, password, "", "")
|
||||||
duplicacy.SavePassword(*preference, "password", password)
|
duplicacy.SavePassword(*preference, "password", password)
|
||||||
|
|
||||||
loadRSAPrivateKey(context.String("key"), preference, backupManager, false)
|
loadRSAPrivateKey(context.String("key"), preference, backupManager, false)
|
||||||
@@ -1016,13 +1022,13 @@ func diff(context *cli.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
compareByHash := context.Bool("hash")
|
compareByHash := context.Bool("hash")
|
||||||
backupManager := duplicacy.CreateBackupManager(preference.SnapshotID, storage, repository, password, preference.NobackupFile)
|
backupManager := duplicacy.CreateBackupManager(preference.SnapshotID, storage, repository, password, "", "")
|
||||||
duplicacy.SavePassword(*preference, "password", password)
|
duplicacy.SavePassword(*preference, "password", password)
|
||||||
|
|
||||||
loadRSAPrivateKey(context.String("key"), preference, backupManager, false)
|
loadRSAPrivateKey(context.String("key"), preference, backupManager, false)
|
||||||
|
|
||||||
backupManager.SetupSnapshotCache(preference.Name)
|
backupManager.SetupSnapshotCache(preference.Name)
|
||||||
backupManager.SnapshotManager.Diff(repository, snapshotID, revisions, path, compareByHash, preference.NobackupFile)
|
backupManager.SnapshotManager.Diff(repository, snapshotID, revisions, path, compareByHash, preference.NobackupFile, preference.FiltersFile)
|
||||||
|
|
||||||
runScript(context, preference.Name, "post")
|
runScript(context, preference.Name, "post")
|
||||||
}
|
}
|
||||||
@@ -1061,7 +1067,7 @@ func showHistory(context *cli.Context) {
|
|||||||
|
|
||||||
revisions := getRevisions(context)
|
revisions := getRevisions(context)
|
||||||
showLocalHash := context.Bool("hash")
|
showLocalHash := context.Bool("hash")
|
||||||
backupManager := duplicacy.CreateBackupManager(preference.SnapshotID, storage, repository, password, preference.NobackupFile)
|
backupManager := duplicacy.CreateBackupManager(preference.SnapshotID, storage, repository, password, "", "")
|
||||||
duplicacy.SavePassword(*preference, "password", password)
|
duplicacy.SavePassword(*preference, "password", password)
|
||||||
|
|
||||||
backupManager.SetupSnapshotCache(preference.Name)
|
backupManager.SetupSnapshotCache(preference.Name)
|
||||||
@@ -1124,7 +1130,7 @@ func pruneSnapshots(context *cli.Context) {
|
|||||||
os.Exit(ArgumentExitCode)
|
os.Exit(ArgumentExitCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
backupManager := duplicacy.CreateBackupManager(preference.SnapshotID, storage, repository, password, preference.NobackupFile)
|
backupManager := duplicacy.CreateBackupManager(preference.SnapshotID, storage, repository, password, "", "")
|
||||||
duplicacy.SavePassword(*preference, "password", password)
|
duplicacy.SavePassword(*preference, "password", password)
|
||||||
|
|
||||||
backupManager.SetupSnapshotCache(preference.Name)
|
backupManager.SetupSnapshotCache(preference.Name)
|
||||||
@@ -1164,7 +1170,7 @@ func copySnapshots(context *cli.Context) {
|
|||||||
sourcePassword = duplicacy.GetPassword(*source, "password", "Enter source storage password:", false, false)
|
sourcePassword = duplicacy.GetPassword(*source, "password", "Enter source storage password:", false, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceManager := duplicacy.CreateBackupManager(source.SnapshotID, sourceStorage, repository, sourcePassword, source.NobackupFile)
|
sourceManager := duplicacy.CreateBackupManager(source.SnapshotID, sourceStorage, repository, sourcePassword, "", "")
|
||||||
sourceManager.SetupSnapshotCache(source.Name)
|
sourceManager.SetupSnapshotCache(source.Name)
|
||||||
duplicacy.SavePassword(*source, "password", sourcePassword)
|
duplicacy.SavePassword(*source, "password", sourcePassword)
|
||||||
|
|
||||||
@@ -1199,7 +1205,7 @@ func copySnapshots(context *cli.Context) {
|
|||||||
destinationStorage.SetRateLimits(0, context.Int("upload-limit-rate"))
|
destinationStorage.SetRateLimits(0, context.Int("upload-limit-rate"))
|
||||||
|
|
||||||
destinationManager := duplicacy.CreateBackupManager(destination.SnapshotID, destinationStorage, repository,
|
destinationManager := duplicacy.CreateBackupManager(destination.SnapshotID, destinationStorage, repository,
|
||||||
destinationPassword, destination.NobackupFile)
|
destinationPassword, "", "")
|
||||||
duplicacy.SavePassword(*destination, "password", destinationPassword)
|
duplicacy.SavePassword(*destination, "password", destinationPassword)
|
||||||
destinationManager.SetupSnapshotCache(destination.Name)
|
destinationManager.SetupSnapshotCache(destination.Name)
|
||||||
|
|
||||||
@@ -1883,6 +1889,11 @@ func main() {
|
|||||||
Usage: "use the specified storage instead of the default one",
|
Usage: "use the specified storage instead of the default one",
|
||||||
Argument: "<storage name>",
|
Argument: "<storage name>",
|
||||||
},
|
},
|
||||||
|
cli.StringFlag{
|
||||||
|
Name: "filters",
|
||||||
|
Usage: "specify the path of the filters file containing include/exclude patterns",
|
||||||
|
Argument: "<file path>",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Usage: "Change the options for the default or specified storage",
|
Usage: "Change the options for the default or specified storage",
|
||||||
ArgsUsage: " ",
|
ArgsUsage: " ",
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ type BackupManager struct {
|
|||||||
config *Config // contains a number of options
|
config *Config // contains a number of options
|
||||||
|
|
||||||
nobackupFile string // don't backup directory when this file name is found
|
nobackupFile string // don't backup directory when this file name is found
|
||||||
|
filtersFile string // the path to the filters file
|
||||||
}
|
}
|
||||||
|
|
||||||
func (manager *BackupManager) SetDryRun(dryRun bool) {
|
func (manager *BackupManager) SetDryRun(dryRun bool) {
|
||||||
@@ -44,7 +45,7 @@ func (manager *BackupManager) SetDryRun(dryRun bool) {
|
|||||||
// CreateBackupManager creates a backup manager using the specified 'storage'. 'snapshotID' is a unique id to
|
// CreateBackupManager creates a backup manager using the specified 'storage'. 'snapshotID' is a unique id to
|
||||||
// identify snapshots created for this repository. 'top' is the top directory of the repository. 'password' is the
|
// identify snapshots created for this repository. 'top' is the top directory of the repository. 'password' is the
|
||||||
// master key which can be nil if encryption is not enabled.
|
// master key which can be nil if encryption is not enabled.
|
||||||
func CreateBackupManager(snapshotID string, storage Storage, top string, password string, nobackupFile string) *BackupManager {
|
func CreateBackupManager(snapshotID string, storage Storage, top string, password string, nobackupFile string, filtersFile string) *BackupManager {
|
||||||
|
|
||||||
config, _, err := DownloadConfig(storage, password)
|
config, _, err := DownloadConfig(storage, password)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -67,6 +68,7 @@ func CreateBackupManager(snapshotID string, storage Storage, top string, passwor
|
|||||||
config: config,
|
config: config,
|
||||||
|
|
||||||
nobackupFile: nobackupFile,
|
nobackupFile: nobackupFile,
|
||||||
|
filtersFile: filtersFile,
|
||||||
}
|
}
|
||||||
|
|
||||||
if IsDebugging() {
|
if IsDebugging() {
|
||||||
@@ -198,7 +200,8 @@ func (manager *BackupManager) Backup(top string, quickMode bool, threads int, ta
|
|||||||
defer DeleteShadowCopy()
|
defer DeleteShadowCopy()
|
||||||
|
|
||||||
LOG_INFO("BACKUP_INDEXING", "Indexing %s", top)
|
LOG_INFO("BACKUP_INDEXING", "Indexing %s", top)
|
||||||
localSnapshot, skippedDirectories, skippedFiles, err := CreateSnapshotFromDirectory(manager.snapshotID, shadowTop, manager.nobackupFile)
|
localSnapshot, skippedDirectories, skippedFiles, err := CreateSnapshotFromDirectory(manager.snapshotID, shadowTop,
|
||||||
|
manager.nobackupFile, manager.filtersFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
LOG_ERROR("SNAPSHOT_LIST", "Failed to list the directory %s: %v", top, err)
|
LOG_ERROR("SNAPSHOT_LIST", "Failed to list the directory %s: %v", top, err)
|
||||||
return false
|
return false
|
||||||
@@ -770,7 +773,8 @@ func (manager *BackupManager) Restore(top string, revision int, inPlace bool, qu
|
|||||||
remoteSnapshot := manager.SnapshotManager.DownloadSnapshot(manager.snapshotID, revision)
|
remoteSnapshot := manager.SnapshotManager.DownloadSnapshot(manager.snapshotID, revision)
|
||||||
manager.SnapshotManager.DownloadSnapshotContents(remoteSnapshot, patterns, true)
|
manager.SnapshotManager.DownloadSnapshotContents(remoteSnapshot, patterns, true)
|
||||||
|
|
||||||
localSnapshot, _, _, err := CreateSnapshotFromDirectory(manager.snapshotID, top, manager.nobackupFile)
|
localSnapshot, _, _, err := CreateSnapshotFromDirectory(manager.snapshotID, top, manager.nobackupFile,
|
||||||
|
manager.filtersFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
LOG_ERROR("SNAPSHOT_LIST", "Failed to list the repository: %v", err)
|
LOG_ERROR("SNAPSHOT_LIST", "Failed to list the repository: %v", err)
|
||||||
return false
|
return false
|
||||||
|
|||||||
@@ -239,7 +239,7 @@ func TestBackupManager(t *testing.T) {
|
|||||||
time.Sleep(time.Duration(delay) * time.Second)
|
time.Sleep(time.Duration(delay) * time.Second)
|
||||||
|
|
||||||
SetDuplicacyPreferencePath(testDir + "/repository1/.duplicacy")
|
SetDuplicacyPreferencePath(testDir + "/repository1/.duplicacy")
|
||||||
backupManager := CreateBackupManager("host1", storage, testDir, password, "")
|
backupManager := CreateBackupManager("host1", storage, testDir, password, "", "")
|
||||||
backupManager.SetupSnapshotCache("default")
|
backupManager.SetupSnapshotCache("default")
|
||||||
|
|
||||||
SetDuplicacyPreferencePath(testDir + "/repository1/.duplicacy")
|
SetDuplicacyPreferencePath(testDir + "/repository1/.duplicacy")
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ type Preference struct {
|
|||||||
DoNotSavePassword bool `json:"no_save_password"`
|
DoNotSavePassword bool `json:"no_save_password"`
|
||||||
NobackupFile string `json:"nobackup_file"`
|
NobackupFile string `json:"nobackup_file"`
|
||||||
Keys map[string]string `json:"keys"`
|
Keys map[string]string `json:"keys"`
|
||||||
|
FiltersFile string `json:"filters"`
|
||||||
}
|
}
|
||||||
|
|
||||||
var preferencePath string
|
var preferencePath string
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ func CreateEmptySnapshot(id string) (snapshto *Snapshot) {
|
|||||||
|
|
||||||
// CreateSnapshotFromDirectory creates a snapshot from the local directory 'top'. Only 'Files'
|
// CreateSnapshotFromDirectory creates a snapshot from the local directory 'top'. Only 'Files'
|
||||||
// will be constructed, while 'ChunkHashes' and 'ChunkLengths' can only be populated after uploading.
|
// will be constructed, while 'ChunkHashes' and 'ChunkLengths' can only be populated after uploading.
|
||||||
func CreateSnapshotFromDirectory(id string, top string, nobackupFile string) (snapshot *Snapshot, skippedDirectories []string,
|
func CreateSnapshotFromDirectory(id string, top string, nobackupFile string, filtersFile string) (snapshot *Snapshot, skippedDirectories []string,
|
||||||
skippedFiles []string, err error) {
|
skippedFiles []string, err error) {
|
||||||
|
|
||||||
snapshot = &Snapshot{
|
snapshot = &Snapshot{
|
||||||
@@ -69,7 +69,10 @@ func CreateSnapshotFromDirectory(id string, top string, nobackupFile string) (sn
|
|||||||
|
|
||||||
var patterns []string
|
var patterns []string
|
||||||
|
|
||||||
patterns = ProcessFilters()
|
if filtersFile == "" {
|
||||||
|
filtersFile = joinPath(GetDuplicacyPreferencePath(), "filters")
|
||||||
|
}
|
||||||
|
patterns = ProcessFilters(filtersFile)
|
||||||
|
|
||||||
directories := make([]*Entry, 0, 256)
|
directories := make([]*Entry, 0, 256)
|
||||||
directories = append(directories, CreateEntry("", 0, 0, 0))
|
directories = append(directories, CreateEntry("", 0, 0, 0))
|
||||||
@@ -121,8 +124,8 @@ func AppendPattern(patterns []string, new_pattern string) (new_patterns []string
|
|||||||
new_patterns = append(patterns, new_pattern)
|
new_patterns = append(patterns, new_pattern)
|
||||||
return new_patterns
|
return new_patterns
|
||||||
}
|
}
|
||||||
func ProcessFilters() (patterns []string) {
|
func ProcessFilters(filtersFile string) (patterns []string) {
|
||||||
patterns = ProcessFilterFile(joinPath(GetDuplicacyPreferencePath(), "filters"), make([]string, 0))
|
patterns = ProcessFilterFile(filtersFile, make([]string, 0))
|
||||||
|
|
||||||
LOG_DEBUG("REGEX_DEBUG", "There are %d compiled regular expressions stored", len(RegexMap))
|
LOG_DEBUG("REGEX_DEBUG", "There are %d compiled regular expressions stored", len(RegexMap))
|
||||||
|
|
||||||
|
|||||||
@@ -1299,7 +1299,7 @@ func (manager *SnapshotManager) PrintFile(snapshotID string, revision int, path
|
|||||||
|
|
||||||
// Diff compares two snapshots, or two revision of a file if the file argument is given.
|
// Diff compares two snapshots, or two revision of a file if the file argument is given.
|
||||||
func (manager *SnapshotManager) Diff(top string, snapshotID string, revisions []int,
|
func (manager *SnapshotManager) Diff(top string, snapshotID string, revisions []int,
|
||||||
filePath string, compareByHash bool, nobackupFile string) bool {
|
filePath string, compareByHash bool, nobackupFile string, filtersFile string) bool {
|
||||||
|
|
||||||
LOG_DEBUG("DIFF_PARAMETERS", "top: %s, id: %s, revision: %v, path: %s, compareByHash: %t",
|
LOG_DEBUG("DIFF_PARAMETERS", "top: %s, id: %s, revision: %v, path: %s, compareByHash: %t",
|
||||||
top, snapshotID, revisions, filePath, compareByHash)
|
top, snapshotID, revisions, filePath, compareByHash)
|
||||||
@@ -1312,7 +1312,7 @@ func (manager *SnapshotManager) Diff(top string, snapshotID string, revisions []
|
|||||||
if len(revisions) <= 1 {
|
if len(revisions) <= 1 {
|
||||||
// Only scan the repository if filePath is not provided
|
// Only scan the repository if filePath is not provided
|
||||||
if len(filePath) == 0 {
|
if len(filePath) == 0 {
|
||||||
rightSnapshot, _, _, err = CreateSnapshotFromDirectory(snapshotID, top, nobackupFile)
|
rightSnapshot, _, _, err = CreateSnapshotFromDirectory(snapshotID, top, nobackupFile, filtersFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
LOG_ERROR("SNAPSHOT_LIST", "Failed to list the directory %s: %v", top, err)
|
LOG_ERROR("SNAPSHOT_LIST", "Failed to list the directory %s: %v", top, err)
|
||||||
return false
|
return false
|
||||||
|
|||||||
Reference in New Issue
Block a user