diff options
-rw-r--r-- | internal/cmd/backup.go | 28 | ||||
-rw-r--r-- | internal/db/repo.go | 10 |
2 files changed, 35 insertions, 3 deletions
diff --git a/internal/cmd/backup.go b/internal/cmd/backup.go index 5478979e..316f0aec 100644 --- a/internal/cmd/backup.go +++ b/internal/cmd/backup.go @@ -37,6 +37,7 @@ portable among all supported database engines.`, stringFlag("target", "./", "Target directory path to save backup archive"), stringFlag("archive-name", fmt.Sprintf("gogs-backup-%s.zip", time.Now().Format("20060102150405")), "Name of backup archive"), boolFlag("database-only", "Only dump database"), + boolFlag("exclude-mirror-repos", "Exclude mirror repositories"), boolFlag("exclude-repos", "Exclude repositories"), }, } @@ -122,13 +123,34 @@ func runBackup(c *cli.Context) error { if !c.Bool("exclude-repos") && !c.Bool("database-only") { reposDump := filepath.Join(rootDir, "repositories.zip") log.Info("Dumping repositories in %q", conf.Repository.Root) - if err = zip.PackTo(conf.Repository.Root, reposDump, true); err != nil { - log.Fatal("Failed to dump repositories: %v", err) + if c.Bool("exclude-mirror-repos") { + repos, err := db.GetNonMirrorRepositories() + if err != nil { + log.Fatal("Failed to get non-mirror repositories: %v", err) + } + reposZip, err := zip.Create(reposDump) + if err != nil { + log.Fatal("Failed to create %q: %v", reposDump, err) + } + baseDir := filepath.Base(conf.Repository.Root) + for _, r := range repos { + name := r.FullName() + ".git" + if err := reposZip.AddDir(filepath.Join(baseDir, name), filepath.Join(conf.Repository.Root, name)); err != nil { + log.Fatal("Failed to add %q: %v", name, err) + } + } + if err = reposZip.Close(); err != nil { + log.Fatal("Failed to save %q: %v", reposDump, err) + } + } else { + if err = zip.PackTo(conf.Repository.Root, reposDump, true); err != nil { + log.Fatal("Failed to dump repositories: %v", err) + } } log.Info("Repositories dumped to: %s", reposDump) if err = z.AddFile(_ARCHIVE_ROOT_DIR+"/repositories.zip", reposDump); err != nil { - log.Fatal("Failed to include 'repositories.zip': %v", err) + log.Fatal("Failed to include %q: %v", reposDump, err) } } diff --git a/internal/db/repo.go b/internal/db/repo.go index 8f797e9b..7c27b26a 100644 --- a/internal/db/repo.go +++ b/internal/db/repo.go @@ -1427,6 +1427,16 @@ func GetRepositoriesByForkID(forkID int64) ([]*Repository, error) { return getRepositoriesByForkID(x, forkID) } +func getNonMirrorRepositories(e Engine) ([]*Repository, error) { + repos := make([]*Repository, 0, 10) + return repos, e.Where("is_mirror = ?", false).Find(&repos) +} + +// GetRepositoriesMirror returns only mirror repositories with user. +func GetNonMirrorRepositories() ([]*Repository, error) { + return getNonMirrorRepositories(x) +} + func updateRepository(e Engine, repo *Repository, visibilityChanged bool) (err error) { repo.LowerName = strings.ToLower(repo.Name) |