Exclude the current dump file from the dump (#14606)
* Exclude the current dump file from the dump Always prevent the current file from being added to the dump. Fix #13618 Signed-off-by: Andrew Thornton <art27@cantab.net> * Add skip custom directory option Signed-off-by: Andrew Thornton <art27@cantab.net> * placate lint Signed-off-by: Andrew Thornton <art27@cantab.net> Co-authored-by: 6543 <6543@obermui.de>
This commit is contained in:
		
							parent
							
								
									e65cfabda7
								
							
						
					
					
						commit
						3477e616ab
					
				
					 2 changed files with 25 additions and 42 deletions
				
			
		
							
								
								
									
										66
									
								
								cmd/dump.go
									
									
									
									
									
								
							
							
						
						
									
										66
									
								
								cmd/dump.go
									
									
									
									
									
								
							|  | @ -49,38 +49,6 @@ func addFile(w archiver.Writer, filePath string, absPath string, verbose bool) e | ||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func addRecursive(w archiver.Writer, dirPath string, absPath string, verbose bool) error { |  | ||||||
| 	if verbose { |  | ||||||
| 		log.Info("Adding dir  %s\n", dirPath) |  | ||||||
| 	} |  | ||||||
| 	dir, err := os.Open(absPath) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return fmt.Errorf("Could not open directory %s: %s", absPath, err) |  | ||||||
| 	} |  | ||||||
| 	defer dir.Close() |  | ||||||
| 
 |  | ||||||
| 	files, err := dir.Readdir(0) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return fmt.Errorf("Unable to list files in %s: %s", absPath, err) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if err := addFile(w, dirPath, absPath, false); err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	for _, fileInfo := range files { |  | ||||||
| 		if fileInfo.IsDir() { |  | ||||||
| 			err = addRecursive(w, filepath.Join(dirPath, fileInfo.Name()), filepath.Join(absPath, fileInfo.Name()), verbose) |  | ||||||
| 		} else { |  | ||||||
| 			err = addFile(w, filepath.Join(dirPath, fileInfo.Name()), filepath.Join(absPath, fileInfo.Name()), verbose) |  | ||||||
| 		} |  | ||||||
| 		if err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func isSubdir(upper string, lower string) (bool, error) { | func isSubdir(upper string, lower string) (bool, error) { | ||||||
| 	if relPath, err := filepath.Rel(upper, lower); err != nil { | 	if relPath, err := filepath.Rel(upper, lower); err != nil { | ||||||
| 		return false, err | 		return false, err | ||||||
|  | @ -157,6 +125,10 @@ It can be used for backup and capture Gitea server image to send to maintainer`, | ||||||
| 			Name:  "skip-log, L", | 			Name:  "skip-log, L", | ||||||
| 			Usage: "Skip the log dumping", | 			Usage: "Skip the log dumping", | ||||||
| 		}, | 		}, | ||||||
|  | 		cli.BoolFlag{ | ||||||
|  | 			Name:  "skip-custom-dir", | ||||||
|  | 			Usage: "Skip custom directory", | ||||||
|  | 		}, | ||||||
| 		cli.GenericFlag{ | 		cli.GenericFlag{ | ||||||
| 			Name:  "type", | 			Name:  "type", | ||||||
| 			Value: outputTypeEnum, | 			Value: outputTypeEnum, | ||||||
|  | @ -211,6 +183,11 @@ func runDump(ctx *cli.Context) error { | ||||||
| 	} | 	} | ||||||
| 	defer file.Close() | 	defer file.Close() | ||||||
| 
 | 
 | ||||||
|  | 	absFileName, err := filepath.Abs(fileName) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	verbose := ctx.Bool("verbose") | 	verbose := ctx.Bool("verbose") | ||||||
| 	outType := ctx.String("type") | 	outType := ctx.String("type") | ||||||
| 	var iface interface{} | 	var iface interface{} | ||||||
|  | @ -233,7 +210,7 @@ func runDump(ctx *cli.Context) error { | ||||||
| 		log.Info("Skip dumping local repositories") | 		log.Info("Skip dumping local repositories") | ||||||
| 	} else { | 	} else { | ||||||
| 		log.Info("Dumping local repositories... %s", setting.RepoRootPath) | 		log.Info("Dumping local repositories... %s", setting.RepoRootPath) | ||||||
| 		if err := addRecursive(w, "repos", setting.RepoRootPath, verbose); err != nil { | 		if err := addRecursiveExclude(w, "repos", setting.RepoRootPath, []string{absFileName}, verbose); err != nil { | ||||||
| 			fatal("Failed to include repositories: %v", err) | 			fatal("Failed to include repositories: %v", err) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | @ -292,17 +269,21 @@ func runDump(ctx *cli.Context) error { | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	customDir, err := os.Stat(setting.CustomPath) | 	if ctx.IsSet("skip-custom-dir") && ctx.Bool("skip-custom-dir") { | ||||||
| 	if err == nil && customDir.IsDir() { | 		log.Info("Skiping custom directory") | ||||||
| 		if is, _ := isSubdir(setting.AppDataPath, setting.CustomPath); !is { | 	} else { | ||||||
| 			if err := addRecursive(w, "custom", setting.CustomPath, verbose); err != nil { | 		customDir, err := os.Stat(setting.CustomPath) | ||||||
| 				fatal("Failed to include custom: %v", err) | 		if err == nil && customDir.IsDir() { | ||||||
|  | 			if is, _ := isSubdir(setting.AppDataPath, setting.CustomPath); !is { | ||||||
|  | 				if err := addRecursiveExclude(w, "custom", setting.CustomPath, []string{absFileName}, verbose); err != nil { | ||||||
|  | 					fatal("Failed to include custom: %v", err) | ||||||
|  | 				} | ||||||
|  | 			} else { | ||||||
|  | 				log.Info("Custom dir %s is inside data dir %s, skipped", setting.CustomPath, setting.AppDataPath) | ||||||
| 			} | 			} | ||||||
| 		} else { | 		} else { | ||||||
| 			log.Info("Custom dir %s is inside data dir %s, skipped", setting.CustomPath, setting.AppDataPath) | 			log.Info("Custom dir %s doesn't exist, skipped", setting.CustomPath) | ||||||
| 		} | 		} | ||||||
| 	} else { |  | ||||||
| 		log.Info("Custom dir %s doesn't exist, skipped", setting.CustomPath) |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	isExist, err := util.IsExist(setting.AppDataPath) | 	isExist, err := util.IsExist(setting.AppDataPath) | ||||||
|  | @ -325,6 +306,7 @@ func runDump(ctx *cli.Context) error { | ||||||
| 		excludes = append(excludes, setting.LFS.Path) | 		excludes = append(excludes, setting.LFS.Path) | ||||||
| 		excludes = append(excludes, setting.Attachment.Path) | 		excludes = append(excludes, setting.Attachment.Path) | ||||||
| 		excludes = append(excludes, setting.LogRootPath) | 		excludes = append(excludes, setting.LogRootPath) | ||||||
|  | 		excludes = append(excludes, absFileName) | ||||||
| 		if err := addRecursiveExclude(w, "data", setting.AppDataPath, excludes, verbose); err != nil { | 		if err := addRecursiveExclude(w, "data", setting.AppDataPath, excludes, verbose); err != nil { | ||||||
| 			fatal("Failed to include data directory: %v", err) | 			fatal("Failed to include data directory: %v", err) | ||||||
| 		} | 		} | ||||||
|  | @ -358,7 +340,7 @@ func runDump(ctx *cli.Context) error { | ||||||
| 			log.Error("Unable to check if %s exists. Error: %v", setting.LogRootPath, err) | 			log.Error("Unable to check if %s exists. Error: %v", setting.LogRootPath, err) | ||||||
| 		} | 		} | ||||||
| 		if isExist { | 		if isExist { | ||||||
| 			if err := addRecursive(w, "log", setting.LogRootPath, verbose); err != nil { | 			if err := addRecursiveExclude(w, "log", setting.LogRootPath, []string{absFileName}, verbose); err != nil { | ||||||
| 				fatal("Failed to include log: %v", err) | 				fatal("Failed to include log: %v", err) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -253,6 +253,7 @@ in the current directory. | ||||||
|   - `--file name`, `-f name`: Name of the dump file with will be created. Optional. (default: gitea-dump-[timestamp].zip). |   - `--file name`, `-f name`: Name of the dump file with will be created. Optional. (default: gitea-dump-[timestamp].zip). | ||||||
|   - `--tempdir path`, `-t path`: Path to the temporary directory used. Optional. (default: /tmp). |   - `--tempdir path`, `-t path`: Path to the temporary directory used. Optional. (default: /tmp). | ||||||
|   - `--skip-repository`, `-R`: Skip the repository dumping. Optional. |   - `--skip-repository`, `-R`: Skip the repository dumping. Optional. | ||||||
|  |   - `--skip-custom-dir`: Skip dumping of the custom dir. Optional. | ||||||
|   - `--database`, `-d`: Specify the database SQL syntax. Optional. |   - `--database`, `-d`: Specify the database SQL syntax. Optional. | ||||||
|   - `--verbose`, `-V`: If provided, shows additional details. Optional. |   - `--verbose`, `-V`: If provided, shows additional details. Optional. | ||||||
| - Examples: | - Examples: | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue