Function: majutsu-file-revert-buffer

majutsu-file-revert-buffer is a natively compiled function defined in majutsu-file.el.

Signature

(majutsu-file-revert-buffer IGNORE-AUTO NOCONFIRM)

Documentation

Revert the current blob buffer content.

If revision metadata moved, preserve location heuristically:
- same change-id + same commit-id: keep current location
- same change-id + different commit-id: offset line across revisions
- different change-id: jump to beginning

Source Code

;; Defined in /nix/store/jagqw3nms546pad0gxi5f3wsckk6pji7-emacs-packages-deps/share/emacs/site-lisp/majutsu-file.el
(defun majutsu-file-revert-buffer (_ignore-auto noconfirm)
  "Revert the current blob buffer content.
If revision metadata moved, preserve location heuristically:
- same change-id + same commit-id: keep current location
- same change-id + different commit-id: offset line across revisions
- different change-id: jump to beginning"
  (let* ((local-drift (and majutsu-buffer-blob-content-hash
                           (not (equal majutsu-buffer-blob-content-hash
                                       (majutsu-file--current-content-hash)))))
         (modified (or (buffer-modified-p) local-drift)))
    (when (or noconfirm
              (not modified)
              (y-or-n-p "Revert blob buffer? "))
      (unless majutsu-buffer-blob-root
        (user-error "Not in a blob buffer"))
      (when majutsu-blob-edit-mode
        (user-error "Finish or abort blob edit mode before refresh"))
      (let* ((inhibit-read-only t)
             (default-directory majutsu-buffer-blob-root)
             (path majutsu-buffer-blob-path)
             (line (line-number-at-pos))
             (col (current-column))
             (old-change (or majutsu-buffer-blob-change-id majutsu-buffer-blob-revision))
             (old-commit majutsu-buffer-blob-commit-id)
             (rev-info (or (majutsu-file--resolve-single-rev-info majutsu-buffer-blob-revset)
                           (user-error "Revset no longer resolves to a single revision")))
             (new-change (plist-get rev-info :change-id))
             (new-commit (plist-get rev-info :commit-id))
             (target-line line)
             (target-col col)
             (reload-needed t))
        (cond
         ((and (equal old-change new-change)
               majutsu-buffer-blob-content-hash
               (equal old-commit new-commit)
               (not modified))
          ;; Nothing changed remotely and nothing changed locally.
          (setq reload-needed nil))
         ((and old-change old-commit
               (equal old-change new-change)
               new-commit)
          (setq target-line
                (or (condition-case nil
                        (majutsu-diff-visit--offset
                         majutsu-buffer-blob-root path old-commit new-commit line)
                      (error line))
                    line)))
         ((not (equal old-change new-change))
          (setq target-line 1
                target-col 0)))
        (if (not reload-needed)
            nil
          (erase-buffer)
          (majutsu-jj-insert "file" "show" "-r"
                             (or new-commit (majutsu-file--normalize-revset majutsu-buffer-blob-revset))
                             (majutsu-jj-fileset-quote path))
          (let ((buffer-file-name (expand-file-name path default-directory))
                (after-change-major-mode-hook
                 (seq-difference after-change-major-mode-hook
                                 '(global-diff-hl-mode-enable-in-buffer
                                   global-diff-hl-mode-enable-in-buffers)
                                 #'eq)))
            (normal-mode (not enable-local-variables)))
          (setq majutsu-buffer-blob-revision new-change)
          (setq majutsu-buffer-blob-change-id new-change)
          (setq majutsu-buffer-blob-commit-id new-commit)
          (majutsu-file--refresh-buffer-name)
          (setq buffer-read-only t)
          (set-buffer-modified-p nil)
          (setq-local majutsu-buffer-blob-content-hash (majutsu-file--current-content-hash))
          (majutsu-blob-mode 1)
          (majutsu-file--goto-line-col (or target-line 1) (or target-col 0)))))))