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.
tokarchuk/v1.17
kakwa 9 years ago
parent f86afb04a2
commit c5a9be9115
  1. 23
      cmd/dump.go

@ -11,6 +11,8 @@ import (
"path" "path"
"time" "time"
"io/ioutil"
"github.com/Unknwon/cae/zip" "github.com/Unknwon/cae/zip"
"github.com/codegangsta/cli" "github.com/codegangsta/cli"
@ -38,16 +40,23 @@ func runDump(ctx *cli.Context) {
models.LoadConfigs() models.LoadConfigs()
models.SetEngine() 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) log.Printf("Dumping local repositories...%s", setting.RepoRootPath)
zip.Verbose = ctx.Bool("verbose") zip.Verbose = ctx.Bool("verbose")
defer os.Remove("gogs-repo.zip") if err := zip.PackTo(setting.RepoRootPath, reposDump, true); err != nil {
if err := zip.PackTo(setting.RepoRootPath, "gogs-repo.zip", true); err != nil {
log.Fatalf("Fail to dump local repositories: %v", err) log.Fatalf("Fail to dump local repositories: %v", err)
} }
log.Printf("Dumping database...") log.Printf("Dumping database...")
defer os.Remove("gogs-db.sql") if err := models.DumpDatabase(dbDump); err != nil {
if err := models.DumpDatabase("gogs-db.sql"); err != nil {
log.Fatalf("Fail to dump database: %v", err) log.Fatalf("Fail to dump database: %v", err)
} }
@ -60,10 +69,10 @@ func runDump(ctx *cli.Context) {
} }
workDir, _ := setting.WorkDir() 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) 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) log.Fatalf("Fail to include gogs-db.sql: %v", err)
} }
if err := z.AddDir("custom", path.Join(workDir, "custom")); err !=nil { 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.Fatalf("Fail to save %s: %v", fileName, err)
} }
log.Printf("Removing tmp work dir: %s", TmpWorkDir)
os.RemoveAll(TmpWorkDir)
log.Println("Finish dumping!") log.Println("Finish dumping!")
} }

Loading…
Cancel
Save