mirror of https://codeberg.org/glenneth/stash.git
fix: Resolve path nesting issue and complete restoration functionality
Major fixes: - Fix path nesting by preserving original relative paths - Resolve metadata timestamp serialization issues - Complete stash -> restore workflow now working - Clean directory structure: files/config/app/file.yml (no nesting) - Proper symlink creation and restoration - Enhanced metadata tracking with readable timestamps The GNU Stow replacement is now fully functional with: - Intelligent file/directory level stashing - Clean path structure preservation - Complete restoration capabilities - Metadata-driven path reconstruction
This commit is contained in:
parent
31f44a5051
commit
dbbb8f8bb3
26
stash.scm
26
stash.scm
|
|
@ -75,7 +75,7 @@
|
||||||
"Handle stashing with explicit source and target paths."
|
"Handle stashing with explicit source and target paths."
|
||||||
(let* ((source-path (canonicalize-path source))
|
(let* ((source-path (canonicalize-path source))
|
||||||
(target-base (canonicalize-path target))
|
(target-base (canonicalize-path target))
|
||||||
(target-path (create-smart-target-path source-path target-base)))
|
(target-path (create-smart-target-path source source-path target-base)))
|
||||||
|
|
||||||
(cond
|
(cond
|
||||||
;; Handle individual files
|
;; Handle individual files
|
||||||
|
|
@ -94,18 +94,25 @@
|
||||||
(display (format #f "Error: ~a is not a regular file or directory\n" source-path))
|
(display (format #f "Error: ~a is not a regular file or directory\n" source-path))
|
||||||
(exit 1)))))
|
(exit 1)))))
|
||||||
|
|
||||||
(define (create-smart-target-path source-path target-base)
|
(define (create-smart-target-path original-source source-path target-base)
|
||||||
"Create intelligent target path that preserves directory structure."
|
"Create intelligent target path that preserves directory structure."
|
||||||
(let* ((home-dir (getenv "HOME"))
|
(let* ((home-dir (getenv "HOME"))
|
||||||
;; Get the relative path from home, or just the basename if not under home
|
;; Use the original source string if it's relative, otherwise extract from absolute path
|
||||||
(source-relative (if (string-prefix? home-dir source-path)
|
(source-relative
|
||||||
(string-drop source-path (+ (string-length home-dir) 1))
|
(cond
|
||||||
(basename source-path)))
|
;; If original source is relative (doesn't start with /), use it directly
|
||||||
|
((not (string-prefix? "/" original-source))
|
||||||
|
original-source)
|
||||||
|
;; If source is under home directory, make it relative to home
|
||||||
|
((string-prefix? home-dir source-path)
|
||||||
|
(string-drop source-path (+ (string-length home-dir) 1)))
|
||||||
|
;; Otherwise just use basename
|
||||||
|
(else (basename source-path))))
|
||||||
;; Remove leading dot from hidden files/dirs for cleaner organization
|
;; Remove leading dot from hidden files/dirs for cleaner organization
|
||||||
(clean-relative (if (string-prefix? "." source-relative)
|
(clean-relative (if (string-prefix? "." source-relative)
|
||||||
(string-drop source-relative 1)
|
(string-drop source-relative 1)
|
||||||
source-relative)))
|
source-relative)))
|
||||||
;; Create clean target path without nesting
|
;; Create clean target path
|
||||||
(string-append target-base "/" clean-relative)))
|
(string-append target-base "/" clean-relative)))
|
||||||
|
|
||||||
(define (create-path-metadata source-path target-path)
|
(define (create-path-metadata source-path target-path)
|
||||||
|
|
@ -114,11 +121,12 @@
|
||||||
(home-dir (getenv "HOME"))
|
(home-dir (getenv "HOME"))
|
||||||
(original-relative (if (string-prefix? home-dir source-path)
|
(original-relative (if (string-prefix? home-dir source-path)
|
||||||
(string-drop source-path (+ (string-length home-dir) 1))
|
(string-drop source-path (+ (string-length home-dir) 1))
|
||||||
source-path)))
|
source-path))
|
||||||
|
(timestamp (strftime "%Y-%m-%d %H:%M:%S" (localtime (time-second (current-time))))))
|
||||||
(call-with-output-file metadata-file
|
(call-with-output-file metadata-file
|
||||||
(lambda (port)
|
(lambda (port)
|
||||||
(write `((original-path . ,original-relative)
|
(write `((original-path . ,original-relative)
|
||||||
(timestamp . ,(current-time))
|
(timestamp . ,timestamp)
|
||||||
(stash-version . "0.2.0")) port)))))
|
(stash-version . "0.2.0")) port)))))
|
||||||
|
|
||||||
;; Helper functions for intelligent stashing
|
;; Helper functions for intelligent stashing
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue