diff --git a/cmd/dump.go b/cmd/dump.go index 5c31ac66de..d0f2be6b4b 100644 --- a/cmd/dump.go +++ b/cmd/dump.go @@ -11,6 +11,7 @@ import ( "log" "os" "path" + "path/filepath" "time" "code.gitea.io/gitea/models" @@ -53,6 +54,7 @@ func runDump(ctx *cli.Context) error { setting.CustomConf = ctx.String("config") } setting.NewContext() + setting.NewServices() // cannot access session settings otherwise models.LoadConfigs() models.SetEngine() @@ -107,6 +109,20 @@ func runDump(ctx *cli.Context) error { } else { log.Printf("Custom dir %s doesn't exist, skipped", setting.CustomPath) } + + log.Printf("Packing data directory...%s", setting.AppDataPath) + var sessionAbsPath string + if setting.SessionConfig.Provider == "file" { + if len(setting.SessionConfig.ProviderConfig) == 0 { + setting.SessionConfig.ProviderConfig = "data/sessions" + } + sessionAbsPath, _ = filepath.Abs(setting.SessionConfig.ProviderConfig) + } + + if err := zipAddDirectoryExclude(z, "data", setting.AppDataPath, sessionAbsPath); err != nil { + log.Fatalf("Fail to include data directory: %v", err) + } + if err := z.AddDir("log", setting.LogRootPath); err != nil { log.Fatalf("Fail to include log: %v", err) } @@ -129,3 +145,40 @@ func runDump(ctx *cli.Context) error { return nil } + +// zipAddDirectoryExclude zips absPath to specified zipPath inside z excluding excludeAbsPath +func zipAddDirectoryExclude(zip *zip.ZipArchive, zipPath, absPath string, excludeAbsPath string) error { + absPath, err := filepath.Abs(absPath) + if err != nil { + return err + } + dir, err := os.Open(absPath) + if err != nil { + return err + } + defer dir.Close() + + zip.AddEmptyDir(zipPath) + + files, err := dir.Readdir(0) + if err != nil { + return err + } + for _, file := range files { + currentAbsPath := path.Join(absPath, file.Name()) + currentZipPath := path.Join(zipPath, file.Name()) + if file.IsDir() { + if currentAbsPath != excludeAbsPath { + if err = zipAddDirectoryExclude(zip, currentZipPath, currentAbsPath, excludeAbsPath); err != nil { + return err + } + } + + } else { + if err = zip.AddFile(currentZipPath, currentAbsPath); err != nil { + return err + } + } + } + return nil +}