Compare commits

...

2 Commits

Author SHA1 Message Date
oscarzhou
2bfb4c0e25 fix(stack/git): clone to non-version project path during auto update 2023-08-17 13:12:42 +12:00
oscarzhou
748c6fa22a fix(filesystem): keep original file copy with SafeCopyDirectory 2023-08-17 11:40:41 +12:00
3 changed files with 18 additions and 8 deletions

View File

@@ -899,18 +899,22 @@ func FileExists(filePath string) (bool, error) {
}
// SafeCopyDirectory copies a directory from src to dst in a safe way.
func (service *Service) SafeMoveDirectory(originalPath, newPath string) error {
func (service *Service) SafeCopyDirectory(originalPath, newPath string) error {
// 1. Backup the source directory to a different folder
backupDir := fmt.Sprintf("%s-%s", filepath.Dir(originalPath), "backup")
err := MoveDirectory(originalPath, backupDir)
err := CopyDir(originalPath, backupDir, false)
if err != nil {
return fmt.Errorf("failed to backup source directory: %w", err)
}
defer func() {
if err != nil {
restoreErr := os.RemoveAll(originalPath)
if err != nil {
log.Warn().Err(restoreErr).Msg("failed to cleanup original directory")
}
// If an error occurred, rollback the backup directory
restoreErr := restoreBackup(originalPath, backupDir)
restoreErr = restoreBackup(originalPath, backupDir)
if restoreErr != nil {
log.Warn().Err(restoreErr).Msg("failed to restore backup during creating versioning folder")
}

View File

@@ -48,10 +48,6 @@ func UpdateGitObject(gitService portainer.GitService, objId string, gitConfig *g
}
toDir := projectPath
if enableVersionFolder {
toDir = filesystem.JoinPaths(projectPath, newHash)
}
cloneParams := &cloneRepositoryParameters{
url: gitConfig.URL,
ref: gitConfig.ReferenceName,
@@ -65,10 +61,20 @@ func UpdateGitObject(gitService portainer.GitService, objId string, gitConfig *g
}
}
// For backward compatibility, we need to clone the repository in the old project path
if err := cloneGitRepository(gitService, cloneParams); err != nil {
return false, "", errors.WithMessagef(err, "failed to do a fresh clone of %v", objId)
}
if enableVersionFolder {
toDir = filesystem.JoinPaths(projectPath, newHash)
cloneParams.toDir = toDir
if err := cloneGitRepository(gitService, cloneParams); err != nil {
return false, "", errors.WithMessagef(err, "failed to do a fresh clone of %v", objId)
}
}
log.Debug().
Str("hash", newHash).
Str("url", gitConfig.URL).

View File

@@ -1412,7 +1412,7 @@ type (
GetEdgeStackProjectPathByVersion(edgeStackIdentifier string, version int, commitHash string) string
StoreEdgeStackFileFromBytesByVersion(edgeStackIdentifier, fileName string, version int, data []byte) (string, error)
FormProjectPathByVersion(projectPath string, version int, commitHash string) string
SafeMoveDirectory(src, dst string) error
SafeCopyDirectory(src, dst string) error
StoreRegistryManagementFileFromBytes(folder, fileName string, data []byte) (string, error)
KeyPairFilesExist() (bool, error)
StoreKeyPair(private, public []byte, privatePEMHeader, publicPEMHeader string) error