MCPcopy
hub / github.com/wavetermdev/waveterm / MakeFileBackup

Function MakeFileBackup

pkg/filebackup/filebackup.go:28–88  ·  view source on GitHub ↗
(absFilePath string)

Source from the content-addressed store, hash-verified

26}
27
28func MakeFileBackup(absFilePath string) (string, error) {
29 fileInfo, err := os.Stat(absFilePath)
30 if err != nil {
31 return "", fmt.Errorf("failed to stat file for backup: %w", err)
32 }
33
34 fileData, err := os.ReadFile(absFilePath)
35 if err != nil {
36 return "", fmt.Errorf("failed to read file for backup: %w", err)
37 }
38
39 dir := filepath.Dir(absFilePath)
40 basename := filepath.Base(absFilePath)
41
42 hash := sha256.Sum256([]byte(dir))
43 dirHash8 := hex.EncodeToString(hash[:])[:8]
44
45 uuidV7, err := uuid.NewV7()
46 if err != nil {
47 return "", fmt.Errorf("failed to generate UUID: %w", err)
48 }
49 uuidStr := uuidV7.String()
50
51 now := time.Now()
52 dateStr := now.Format("2006-01-02")
53
54 backupDir := filepath.Join(wavebase.GetWaveCachesDir(), "waveai-backups", dateStr)
55 err = os.MkdirAll(backupDir, 0700)
56 if err != nil {
57 return "", fmt.Errorf("failed to create backup directory: %w", err)
58 }
59
60 backupName := fmt.Sprintf("%s.%s.%s.bak", basename, dirHash8, uuidStr)
61 backupPath := filepath.Join(backupDir, backupName)
62
63 err = os.WriteFile(backupPath, fileData, 0600)
64 if err != nil {
65 return "", fmt.Errorf("failed to write backup file: %w", err)
66 }
67
68 metadata := BackupMetadata{
69 FullPath: absFilePath,
70 Timestamp: now.Format(time.RFC3339),
71 Perm: fmt.Sprintf("%04o", fileInfo.Mode().Perm()),
72 }
73
74 metadataJSON, err := json.MarshalIndent(metadata, "", " ")
75 if err != nil {
76 return "", fmt.Errorf("failed to marshal backup metadata: %w", err)
77 }
78
79 metadataName := fmt.Sprintf("%s.%s.%s.json", basename, dirHash8, uuidStr)
80 metadataPath := filepath.Join(backupDir, metadataName)
81
82 err = os.WriteFile(metadataPath, metadataJSON, 0600)
83 if err != nil {
84 return "", fmt.Errorf("failed to write backup metadata: %w", err)
85 }

Callers 3

writeTextFileCallbackFunction · 0.92
editTextFileCallbackFunction · 0.92
deleteTextFileCallbackFunction · 0.92

Calls 6

GetWaveCachesDirFunction · 0.92
StatMethod · 0.80
ReadFileMethod · 0.80
WriteFileMethod · 0.80
ModeMethod · 0.80
StringMethod · 0.45

Tested by

no test coverage detected