aboutsummaryrefslogtreecommitdiffstats
path: root/cmd
diff options
context:
space:
mode:
authorkakwa <carpentier.pf@gmail.com>2015-11-28 14:07:51 +0100
committerkakwa <carpentier.pf@gmail.com>2015-11-28 14:07:51 +0100
commitc5a9be91152de507ade9a98674d9eadfc6d1198b (patch)
tree93138ace1d57a1d238a87755395ae9c7a7c325e3 /cmd
parentf86afb04a2af72c53443e38899ea4c2a87bd581d (diff)
downloadgitea-c5a9be91152de507ade9a98674d9eadfc6d1198b.tar.gz
gitea-c5a9be91152de507ade9a98674d9eadfc6d1198b.zip
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.
Diffstat (limited to 'cmd')
-rw-r--r--cmd/dump.go23
1 files changed, 17 insertions, 6 deletions
diff --git a/cmd/dump.go b/cmd/dump.go
index 279099dac8..0c07f36cf0 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!")
}