|
|
|
@ -7,6 +7,7 @@ package cmd |
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
"fmt" |
|
|
|
|
"io" |
|
|
|
|
"os" |
|
|
|
|
"path" |
|
|
|
|
"path/filepath" |
|
|
|
@ -25,10 +26,21 @@ import ( |
|
|
|
|
"github.com/urfave/cli" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
func addFile(w archiver.Writer, filePath, absPath string, verbose bool) error { |
|
|
|
|
func addReader(w archiver.Writer, r io.ReadCloser, info os.FileInfo, customName string, verbose bool) error { |
|
|
|
|
if verbose { |
|
|
|
|
log.Info("Adding file %s\n", filePath) |
|
|
|
|
log.Info("Adding file %s", customName) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return w.Write(archiver.File{ |
|
|
|
|
FileInfo: archiver.FileInfo{ |
|
|
|
|
FileInfo: info, |
|
|
|
|
CustomName: customName, |
|
|
|
|
}, |
|
|
|
|
ReadCloser: r, |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func addFile(w archiver.Writer, filePath, absPath string, verbose bool) error { |
|
|
|
|
file, err := os.Open(absPath) |
|
|
|
|
if err != nil { |
|
|
|
|
return err |
|
|
|
@ -39,13 +51,7 @@ func addFile(w archiver.Writer, filePath, absPath string, verbose bool) error { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return w.Write(archiver.File{ |
|
|
|
|
FileInfo: archiver.FileInfo{ |
|
|
|
|
FileInfo: fileInfo, |
|
|
|
|
CustomName: filePath, |
|
|
|
|
}, |
|
|
|
|
ReadCloser: file, |
|
|
|
|
}) |
|
|
|
|
return addReader(w, file, fileInfo, filePath, verbose) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func isSubdir(upper, lower string) (bool, error) { |
|
|
|
@ -136,6 +142,10 @@ It can be used for backup and capture Gitea server image to send to maintainer`, |
|
|
|
|
Name: "skip-attachment-data", |
|
|
|
|
Usage: "Skip attachment data", |
|
|
|
|
}, |
|
|
|
|
cli.BoolFlag{ |
|
|
|
|
Name: "skip-package-data", |
|
|
|
|
Usage: "Skip package data", |
|
|
|
|
}, |
|
|
|
|
cli.GenericFlag{ |
|
|
|
|
Name: "type", |
|
|
|
|
Value: outputTypeEnum, |
|
|
|
@ -241,13 +251,7 @@ func runDump(ctx *cli.Context) error { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return w.Write(archiver.File{ |
|
|
|
|
FileInfo: archiver.FileInfo{ |
|
|
|
|
FileInfo: info, |
|
|
|
|
CustomName: path.Join("data", "lfs", objPath), |
|
|
|
|
}, |
|
|
|
|
ReadCloser: object, |
|
|
|
|
}) |
|
|
|
|
return addReader(w, object, info, path.Join("data", "lfs", objPath), verbose) |
|
|
|
|
}); err != nil { |
|
|
|
|
fatal("Failed to dump LFS objects: %v", err) |
|
|
|
|
} |
|
|
|
@ -326,6 +330,7 @@ func runDump(ctx *cli.Context) error { |
|
|
|
|
excludes = append(excludes, setting.RepoRootPath) |
|
|
|
|
excludes = append(excludes, setting.LFS.Path) |
|
|
|
|
excludes = append(excludes, setting.Attachment.Path) |
|
|
|
|
excludes = append(excludes, setting.Packages.Path) |
|
|
|
|
excludes = append(excludes, setting.LogRootPath) |
|
|
|
|
excludes = append(excludes, absFileName) |
|
|
|
|
if err := addRecursiveExclude(w, "data", setting.AppDataPath, excludes, verbose); err != nil { |
|
|
|
@ -341,17 +346,24 @@ func runDump(ctx *cli.Context) error { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return w.Write(archiver.File{ |
|
|
|
|
FileInfo: archiver.FileInfo{ |
|
|
|
|
FileInfo: info, |
|
|
|
|
CustomName: path.Join("data", "attachments", objPath), |
|
|
|
|
}, |
|
|
|
|
ReadCloser: object, |
|
|
|
|
}) |
|
|
|
|
return addReader(w, object, info, path.Join("data", "attachments", objPath), verbose) |
|
|
|
|
}); err != nil { |
|
|
|
|
fatal("Failed to dump attachments: %v", err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ctx.IsSet("skip-package-data") && ctx.Bool("skip-package-data") { |
|
|
|
|
log.Info("Skip dumping package data") |
|
|
|
|
} else if err := storage.Packages.IterateObjects(func(objPath string, object storage.Object) error { |
|
|
|
|
info, err := object.Stat() |
|
|
|
|
if err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return addReader(w, object, info, path.Join("data", "packages", objPath), verbose) |
|
|
|
|
}); err != nil { |
|
|
|
|
fatal("Failed to dump packages: %v", err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Doesn't check if LogRootPath exists before processing --skip-log intentionally,
|
|
|
|
|
// ensuring that it's clear the dump is skipped whether the directory's initialized
|
|
|
|
|
// yet or not.
|
|
|
|
|