-// backupData stages a session snapshot, then copies the data under snapshot's
-// write locks. Compression runs after the locks are released.
-func backupData(ctx context.Context, dir, path string, whatsapp *WhatsApp, snapshot func(context.Context, func() error) error) (size int64, err error) {
- if !filepath.IsAbs(path) {
- return 0, errors.New("backup path must be absolute")
- }
-
- stage, err := os.MkdirTemp("", "onechat-backup-*")
- if err != nil {
- return 0, fmt.Errorf("create backup directory: %w", err)
- }
-
- defer func() {
- err = errors.Join(err, os.RemoveAll(stage))
- }()
-
- err = whatsapp.BackupSession(ctx, filepath.Join(stage, whatsappDirName, whatsappSessionFileName))
- if err != nil {
- return 0, fmt.Errorf("copy WhatsApp session: %w", err)
- }
-
- err = snapshot(ctx, func() error {
- return backupCopy(ctx, dir, stage, path)
- })
- if err != nil {
- return 0, fmt.Errorf("copy data directory: %w", err)
- }
-
- size, err = backupArchive(ctx, stage, path)
- if err != nil {
- return 0, fmt.Errorf("archive backup: %w", err)
- }
-
- return size, nil
-}
-