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.
This commit is contained in:
parent
f86afb04a2
commit
c5a9be9115
1 changed files with 17 additions and 6 deletions
23
cmd/dump.go
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!")
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue