diff --git a/clean.go b/clean.go new file mode 100644 index 0000000..c0baf77 --- /dev/null +++ b/clean.go @@ -0,0 +1,110 @@ +// Copyright (c) 2015, Daniel Martí +// See LICENSE for licensing information + +package main + +import ( + "fmt" + "os" + "path/filepath" + "syscall" +) + +var cmdClean = &Command{ + UsageLine: "clean", + Short: "Clean index and/or cache", + Long: ` +Clean index and/or cache. +The index basically contains information about available APKs to download. +The cache is where all downloaded APKs are cached. +Usage: + + $ fdroidcl clean + $ fdroidcl clean index + $ fdroidcl clean cache +`[1:], +} + +func init() { + cmdClean.Run = runClean +} + +func runClean(args []string) error { + if len(args) > 1 { + return fmt.Errorf("wrong amount of arguments") + } + if len(args) == 1 && (args[0] != "index" && args[0] != "cache") { + return fmt.Errorf("pass either index or cache as parameter, or no parameter at all") + } + if len(args) == 0 || args[0] == "index" { + err := cleanIndex() + if err != nil { + return err + } + } + if len(args) == 0 || args[0] == "cache" { + err := cleanCache() + if err != nil { + return err + } + } + if len(args) == 1 { + fmt.Printf("Cleaned %s.\n", args[0]) + } else { + fmt.Println("Cleaned index and cache.") + } + return nil +} + +func cleanIndex() error { + cachePath := filepath.Join(mustCache(), "cache-gob") + err := removeFile(cachePath) + if err != nil { + return err + } + err = removeGlob(mustData() + "/*.jar") + if err != nil { + return err + } + err = removeGlob(mustData() + "/*.jar-etag") + if err != nil { + return err + } + return nil +} + +func cleanCache() error { + apksDir := subdir(mustCache(), "apks") + err := os.RemoveAll(apksDir) + if err != nil { + return err + } + return nil +} + +func removeFile(path string) error { + err := os.Remove(path) + if err != nil { + e, ok := err.(*os.PathError) + if ok && e.Err == syscall.ENOENT { + // The file didn't exist, ignore + } else { + return err + } + } + return nil +} + +func removeGlob(glob string) error { + matches, err := filepath.Glob(glob) + if err != nil { + return err + } + for _, value := range matches { + err := removeFile(value) + if err != nil { + return err + } + } + return nil +} diff --git a/main.go b/main.go index 8730372..356aa93 100644 --- a/main.go +++ b/main.go @@ -169,6 +169,7 @@ var commands = []*Command{ cmdList, cmdDefaults, cmdVersion, + cmdClean, } var cmdVersion = &Command{