(require 'seq) (setq warning-minimum-log-level :debug) (setq warning-minimum-level :debug) (bind-key "" 'replay-debbugs-step0) (bind-key "" 'replay-debbugs-step1) (defun replay-debbugs-step0 () (interactive) (let ((case-fold-search nil) (default-directory (expand-file-name "~/src/debbugs"))) (shell-command "rm -rf *") (shell-command "tar -x --strip=1 -f ~/Downloads/debbugs.gnu.tar") ;; These files are redundant, and seem to have a too new timestamp. (delete-file "Debbugs/Status.pm.BAK") (delete-file "Debbugs/MIME.pm.BAK") ;; This is an empty file. (delete-file "templates/en_US/mail/process_archived_bug.tmpl.BAK")) (bind-key "" 'replay-debbugs-step1)) (defvar replay-debbugs-file-versions-list nil) (defun replay-debbugs-basename (filename) (if (string-match "\\(?:[.]v[0-9]+\\|[.][A-Z]+\\|[.]old\\|[.]new\\|~\\|[.]~[0-9]+~\\)\\'" filename) (substring filename 0 (match-beginning 0)) filename)) (defun replay-debbugs-step1 () (interactive) (let ((case-fold-search nil) (default-directory (expand-file-name "~/src/debbugs")) (all-files nil)) (dolist (flist (seq-group-by #'replay-debbugs-basename (process-lines "git" "ls-files" "--modified" "--others"))) (let ((fname (pop flist))) (setq flist (cl-sort (mapcar (lambda (f) (cons f (file-attribute-modification-time (file-attributes f)))) flist) #'time-less-p :key #'cdr)) (when (and (assoc fname flist) (file-exists-p fname)) (rename-file fname (concat fname ".FINAL")) (setcar (assoc fname flist) (concat fname ".FINAL"))) (push flist all-files))) (setq replay-debbugs-file-versions-list (cl-sort (apply #'append all-files) #'time-less-p :key #'cdr)) (bind-key "" 'replay-debbugs-step2))) (defun replay-debbugs-step2 () (interactive) (pcase-let* ((case-fold-search nil) (default-directory (expand-file-name "~/src/debbugs")) (`(,file . ,timestamp) (car replay-debbugs-file-versions-list)) (base (replay-debbugs-basename file))) (copy-file file base t t t t) (let ((msg (if (not (member base (process-lines "git" "ls-files" "--modified" "--others"))) "Nothing to do for %S" (magit-stage-file base) (setq magit-commit-arguments (list (format-time-string "--date=%F %T" timestamp))) "Staged %S"))) (delete-file file) (message msg (pop replay-debbugs-file-versions-list)))))