From c5a9be91152de507ade9a98674d9eadfc6d1198b Mon Sep 17 00:00:00 2001 From: kakwa Date: Sat, 28 Nov 2015 14:07:51 +0100 Subject: [PATCH] Using a tmp dir to generate db and repo dumps Using a tmp dir makes gogs dump more robust to concurrent runs. It also permits an easier cleaning of the tmp files (gogs-db.sql and gog-repo.zip) by just removing the tmp dir. As a side effect, it partially fix bugs on workdir. Previously, 'gogs dump' created the archives in the current directory, and tried to include these archives from the directory where the gogs binary lies. ex: if gogs binary is in /usr/bin/gogs, and gogs dump is run from /tmp/, /tmp/gog-repo.zip is created, but gogs dump tried to include /usr/bin/gogs-repo.zip. --- cmd/dump.go | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/cmd/dump.go b/cmd/dump.go index 279099dac..0c07f36cf 100644 --- a/cmd/dump.go +++ b/cmd/dump.go @@ -11,6 +11,8 @@ import ( "path" "time" + "io/ioutil" + "github.com/Unknwon/cae/zip" "github.com/codegangsta/cli" @@ -38,16 +40,23 @@ func runDump(ctx *cli.Context) { models.LoadConfigs() models.SetEngine() + TmpWorkDir, err := ioutil.TempDir(os.TempDir(), "gogs-dump-") + if err != nil { + log.Fatalf("Fail to create tmp work directory: %v", err) + } + log.Printf("Creating tmp work dir: %s", TmpWorkDir) + + reposDump := path.Join(TmpWorkDir, "gogs-repo.zip") + dbDump := path.Join(TmpWorkDir, "gogs-db.sql") + log.Printf("Dumping local repositories...%s", setting.RepoRootPath) zip.Verbose = ctx.Bool("verbose") - defer os.Remove("gogs-repo.zip") - if err := zip.PackTo(setting.RepoRootPath, "gogs-repo.zip", true); err != nil { + if err := zip.PackTo(setting.RepoRootPath, reposDump, true); err != nil { log.Fatalf("Fail to dump local repositories: %v", err) } log.Printf("Dumping database...") - defer os.Remove("gogs-db.sql") - if err := models.DumpDatabase("gogs-db.sql"); err != nil { + if err := models.DumpDatabase(dbDump); err != nil { log.Fatalf("Fail to dump database: %v", err) } @@ -60,10 +69,10 @@ func runDump(ctx *cli.Context) { } workDir, _ := setting.WorkDir() - if err := z.AddFile("gogs-repo.zip", path.Join(workDir, "gogs-repo.zip")); err !=nil { + if err := z.AddFile("gogs-repo.zip", reposDump); err !=nil { log.Fatalf("Fail to include gogs-repo.zip: %v", err) } - if err := z.AddFile("gogs-db.sql", path.Join(workDir, "gogs-db.sql")); err !=nil { + if err := z.AddFile("gogs-db.sql", dbDump); err !=nil { log.Fatalf("Fail to include gogs-db.sql: %v", err) } if err := z.AddDir("custom", path.Join(workDir, "custom")); err !=nil { @@ -78,5 +87,7 @@ func runDump(ctx *cli.Context) { log.Fatalf("Fail to save %s: %v", fileName, err) } + log.Printf("Removing tmp work dir: %s", TmpWorkDir) + os.RemoveAll(TmpWorkDir) log.Println("Finish dumping!") }