emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/cpio-mode 899620e 2/2: Merge remote-tracking branch 'cp


From: Stefan Monnier
Subject: [elpa] externals/cpio-mode 899620e 2/2: Merge remote-tracking branch 'cpio-mode/master' into externals/cpio-mode
Date: Sat, 14 Nov 2020 17:40:42 -0500 (EST)

branch: externals/cpio-mode
commit 899620e76f6e3a5701834d1ee0b399bfe26e36bb
Merge: 76ac5a1 9f13e94
Author: Stefan Monnier <monnier@iro.umontreal.ca>
Commit: Stefan Monnier <monnier@iro.umontreal.ca>

    Merge remote-tracking branch 'cpio-mode/master' into externals/cpio-mode
---
 cpio-entry-contents-mode.el | 264 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 264 insertions(+)

diff --git a/cpio-entry-contents-mode.el b/cpio-entry-contents-mode.el
new file mode 100644
index 0000000..8a6adab
--- /dev/null
+++ b/cpio-entry-contents-mode.el
@@ -0,0 +1,264 @@
+;;; cpio-entry-contents-mode.el --- minor mode for editing a cpio-entry's 
contents. -*- coding: utf-8 -*-
+
+;; COPYRIGHT
+;;
+;; Copyright © 2019 Free Software Foundation, Inc.
+;; All rights reserved.
+;;
+;; This program is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+;;
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+;; Author: Douglas Lewan <d.lewan2000@gmail.com>
+;; Maintainer: Douglas Lewan <d.lewan2000@gmail.com>
+;; Created: 2017 Dec 06
+;; Version: 0.16β
+;; Keywords: files
+
+;;; Commentary:
+
+;; This file contains code for editing and saving
+;; the contents of entries in a cpio-archive.
+
+;;; Documentation:
+
+;;; Code:
+
+;;
+;; Hacks
+;;
+
+(defun entry-setup (arg &optional name depth)
+  "Set up buffers and windows for working on entry NAME.
+If NAME is not given, then use 'aa'."
+  (interactive "P")
+  (if (and (called-interactively-p 'interactive)
+          arg)
+      (setq name (read-string "Name? ")))
+  (unless name (setq name "aa"))
+  (unless depth (setq depth 0))
+  (let* ((fname "entry-setup")
+        (short-archive-name "alphabet_small.crc.cpio")
+        (archive-name (if (string-match "alphabet/" default-directory)
+                          (concat default-directory short-archive-name)
+                        (concat default-directory "test_data/alphabet/" 
short-archive-name)))
+        (cpio-archive-buffer)
+        (cpio-dired-buffer)
+        (cpio-entry-contents-buffer)
+        (cpio-dired-contents-mode-buffer))
+    ;; Make sure we have a clean copy of the archive.
+    (with-current-buffer (find-file-noselect archive-name)
+      (shell-command "make crc" nil nil)
+      (kill-buffer))
+    (with-current-buffer (setq cpio-archive-buffer (find-file-noselect 
archive-name))
+      (cpio-mode)
+      (setq cpio-dired-buffer (current-buffer)))
+    (unless (with-current-buffer cpio-archive-buffer (cpio-entry-exists-p 
name))
+      (if (> depth 1)
+         (error "%s(): Going too deep." fname)
+       (entry-setup nil name (1+ depth)))
+      (setq cpio-dired-buffer (current-buffer)))
+
+    ;; Get the entry
+    (switch-to-buffer cpio-dired-buffer)
+    (cpio-dired-goto-entry name)
+    (cpio-dired-find-entry)
+    (setq cpio-entry-contents-buffer (current-buffer))
+    (switch-to-buffer cpio-dired-buffer)
+
+    ;; Set up windows.
+    (delete-other-windows)
+    (split-window-right)
+    (split-window)
+    (other-window 1)
+    (switch-to-buffer cpio-archive-buffer)
+    (other-window 1)
+    (split-window)
+    (switch-to-buffer cpio-entry-contents-buffer)
+    (other-window 1)
+    (setq cpio-dired-contents-mode-buffer (switch-to-buffer 
"cpio-entry-contents-mode.el"))
+    (other-window 2)))
+
+
+;;
+;; Dependencies
+;;
+
+;;;;;;;;;;;;;;;;
+;; Things to make the byte compiler happy.
+(defvar cpio-entry-name)
+(defvar *cpio-catalog-entry-contents-start-idx*)
+(declare-function cpio-contents-start "cpio-mode.el")
+(declare-function cpio-delete-archive-entry "cpio-mode.el")
+(declare-function cpio-dired-find-entry "cpio-dired.el")
+(declare-function cpio-dired-goto-entry "cpio-dired.el")
+(declare-function cpio-entry "cpio-mode.el")
+(declare-function cpio-entry-attrs "cpio-mode.el")
+(declare-function cpio-entry-exists-p "cpio-mode.el")
+(declare-function cpio-entry-header-start "cpio-mode.el")
+(declare-function cpio-insert-padded-contents "cpio-mode.el")
+(declare-function cpio-make-header-string "cpio-mode.el")
+(declare-function cpio-mode "cpio-mode.el")
+(declare-function cpio-present-ala-dired "cpio-dired.el")
+(declare-function cpio-set-entry-modified "cpio-mode.el")
+(declare-function cpio-set-entry-size "cpio-mode.el")
+(declare-function cpio-entry-exists-p "cpio-mode.el")
+(declare-function cpio-dired-goto-entry "cpio-dired.el")
+(declare-function cpio-dired-find-entry "cpio-dired.el")
+;; EO things for the byte compiler.
+;;;;;;;;;;;;;;;;
+
+
+
+;;
+;; Vars
+;;
+
+
+;;
+;; Library
+;;
+
+
+
+;;
+;; Commands
+;;
+(defun cpio-entry-contents-save ()
+  "Save the contents of the current buffer in it's cpio archive."
+  (interactive)
+  (let ((fname "cpio-entry-contents-save")
+       (name cpio-entry-name)
+       (entry (cpio-entry cpio-entry-name))
+       (attrs (cpio-entry-attrs cpio-entry-name))
+       (header-string)
+       (size (buffer-size))
+       (new-contents (buffer-string))
+       (dired-buffer-name))
+    (unless (cpio-entry-contents-buffer-p)
+      (error "%s(): You're not in a cpio entry contents buffer." fname))
+
+    (with-current-buffer *cab-parent*
+      ;; 1. Delete the entry's head and contents (plus padding) in the parent 
buffer.
+      (cpio-delete-archive-entry entry)
+      ;; 2. Update the entry size in the entry.
+      (cpio-set-entry-size attrs size)
+      ;; 3. Write the new contents in the archive buffer (plus padding).
+      (goto-char (cpio-contents-start name))
+      (cpio-insert-padded-contents new-contents)
+      ;; 4. Build the entry header.
+      (setq header-string (cpio-make-header-string attrs))
+      ;; 5. Write the header in the archive buffer (plus padding).
+      (goto-char (cpio-entry-header-start entry))
+      (with-writable-buffer
+       (insert header-string))
+      (aset entry *cpio-catalog-entry-contents-start-idx* (point-marker))
+
+      (setq dired-buffer-name (cpio-dired-buffer-name (buffer-file-name))))
+    ;; 6. Mark the contents buffer as unmodified.
+    (set-buffer-modified-p nil)
+    ;; 6a. But mark the entry in the archive modified.
+    (cpio-set-entry-modified entry)
+    ;; 7. Update the dired-like interface.
+    (with-current-buffer dired-buffer-name
+      (save-excursion
+       (cpio-dired-goto-entry name)
+       (with-writable-buffer
+        (delete-region (line-beginning-position) (line-end-position))
+        (insert (cpio-dired-format-entry attrs)))))
+    (message "Saved into cpio archive buffer `%s'.  Be sure to save that 
buffer!"
+             (file-name-nondirectory (buffer-file-name *cab-parent*)))))
+
+(defun cpio-entry-contents-buffer-p ()
+  "Return non-NIL if the current buffer is an entry contents buffer."
+  (let ((fname "cpio-entry-contents-buffer-p"))
+    (member 'cpio-entry-contents-mode (current-minor-modes))))
+
+(defun cpio-entry-contents-kill (&optional buffer-or-name)
+  "Kill the buffer specified by BUFFER-OR-NAME.
+A name denotes the name of an entry in the cpio archive."
+  (interactive "P")
+  (unless buffer-or-name (setq buffer-or-name (current-buffer)))
+  (let ((fname "cpio-entry-contents-kill")
+       (buffer (if (bufferp buffer-or-name)
+                   buffer-or-name
+                 (get-buffer-create buffer-or-name))))
+    (if (and (buffer-modified-p buffer)
+            (yes-or-no-p "Buffer is modified. Really kill? "))
+       (kill-buffer buffer))))
+
+(defun cpio-entry-contents-revert-buffer ()
+  "Discard any changes to the current CPIO archive entry and
+reload the [current] entry contents."
+  (interactive)
+  (let ((fname "cpio-entry-contents-revert-buffer"))
+    (unless (cpio-entry-contents-buffer-p)
+      (error "%s(): You're not in an entry contetnts buffer." fname))
+    (with-writable-buffer
+     (erase-buffer)
+     (cpio-find-entry cpio-entry-name)
+     (set-auto-mode 'keep-mode-if-same))))
+
+
+;;
+;; Mode definition
+;;
+(defvar *cpio-entry-contents-mode-map* (make-sparse-keymap)
+  "Keymap for cpio-entry-contents-mode.")
+(setq *cpio-entry-contents-mode-map* (make-sparse-keymap))
+
+
+(defun cpio-entry-contents-make-keymap ()
+  "Define the keys that cpio-entry-contents-mode must override."
+  (let ((fname "cpio-entry-contents-make-keymap"))
+    (define-key *cpio-entry-contents-mode-map* "\C-x\C-s" 
'cpio-entry-contents-save)
+    (define-key *cpio-entry-contents-mode-map* "\C-x\C-k" 
'cpio-entry-contents-kill)
+    ;; HEREHERE Does the following make sense any more?
+    (define-key *cpio-entry-contents-mode-map* "\M-,"     
'cpio-tags-loop-continue)))
+
+(define-minor-mode cpio-entry-contents-mode
+  "Minor mode for working with an entry's contents from a cpio archive.
+This mode is automatically invoked when the contents of a cpio entry are
+prepared for editing."
+  nil
+  " entry contents"
+  :keymap *cpio-entry-contents-mode-map*
+  :global nil
+  :lighter "(cpio entry)"
+  ;; Major modes kill local variables.
+  ;; Keep the ones we need for cpio entry contents.
+  (let ((cab-parent *cab-parent*)
+       (entry-name cpio-entry-name)
+       (attrs (cpio-entry-attrs cpio-entry-name))
+       (local-buffer-file-name buffer-file-name))
+    ;; For some reason (decode-coding-region) seems to need a writable buffer.
+    ;; (with-writable-buffer
+    ;; (decode-coding-region (cpio-entry-contents-start (cpio-entry 
entry-name))
+    ;;                 (cpio-entry-contents-end (cpio-entry entry-name))
+    ;;                 nil)))
+    ;; (point-min) (point-max) nil)
+    ;; (set-buffer-file-coding-system last-coding-system-used t)
+
+    ;; (normal-mode)
+    (set-auto-mode 'keep-mode-if-same)
+    (setq *cab-parent* cab-parent)
+    (setq cpio-entry-name entry-name)
+    ;; Why was I doing this?
+    ;; (setq buffer-file-name local-buffer-file-name)
+    (setq cpio-entry-contents-mode t)))
+
+(cpio-entry-contents-make-keymap)
+
+
+(provide 'cpio-entry-contents-mode)
+;;; cpio-entry-contents-mode.el ends here
+



reply via email to

[Prev in Thread] Current Thread [Next in Thread]