branch: externals/vc-jj
commit 785b82d5f56e162cabc7b3f9d4c3cd154efcee80
Author: Rudi Schlatte <[email protected]>
Commit: Rudi Schlatte <[email protected]>
Simplify `vc-jj-state', fix failing test
We need to call jj two times to get complete vc state in all cases;
add a comment explaining what info we get from each call.
Remove all internal status-checking functions, inline their uses.
---
vc-jj-tests.el | 4 +--
vc-jj.el | 85 +++++++++++++++++++++-------------------------------------
2 files changed, 33 insertions(+), 56 deletions(-)
diff --git a/vc-jj-tests.el b/vc-jj-tests.el
index e67401899a..e2283fc909 100644
--- a/vc-jj-tests.el
+++ b/vc-jj-tests.el
@@ -146,8 +146,8 @@ is needed."
(should (eq (vc-jj-state "subdir/subdir-ignored.txt") 'added))
(vc-jj-ignore "root-ignored.txt")
(vc-jj-ignore "subdir/subdir-ignored.txt")
- (should (eq (vc-jj-state "root-ignored.txt") nil))
- (should (eq (vc-jj-state "subdir/subdir-ignored.txt") nil))
+ (should (eq (vc-jj-state "root-ignored.txt") 'ignored))
+ (should (eq (vc-jj-state "subdir/subdir-ignored.txt") 'ignored))
(vc-jj-ignore "root-ignored.txt" nil t)
(vc-jj-ignore "subdir/subdir-ignored.txt" nil t)
(should (eq (vc-jj-state "root-ignored.txt") 'added))
diff --git a/vc-jj.el b/vc-jj.el
index 3d61943a15..2968aa45fc 100644
--- a/vc-jj.el
+++ b/vc-jj.el
@@ -77,43 +77,6 @@ NIL otherwise."
(append (list "--no-pager" "--color" "never")
flags)))
-(defun vc-jj--file-tracked (file)
- (with-temp-buffer
- (and (vc-jj--call-jj "file" "list" "--" file)
- (not (= (point-min) (point-max))))))
-
-(defun vc-jj--file-modified (file)
- (with-temp-buffer
- (and (vc-jj--call-jj "diff" "--summary" "--" file)
- (not (= (point-min) (point-max)))
- (progn (goto-char (point-min)) (looking-at-p "M ")))))
-
-(defun vc-jj--file-added (file)
- (with-temp-buffer
- (and (vc-jj--call-jj "diff" "--summary" "--" file)
- (not (= (point-min) (point-max)))
- (progn (goto-char (point-min)) (looking-at-p "A ")))))
-
-(defun vc-jj--file-conflicted (file)
- (with-temp-buffer
- (and (vc-jj--call-jj "resolve" "--list" "--" file)
- (not (= (point-min) (point-max)))
- (progn (goto-char (point-min)) (looking-at-p file)))))
-
-(defun vc-jj--file-state (file)
- (let ((s (with-output-to-string
- (vc-jj-command standard-output 0 file
- "diff" "--summary" "--" file))))
- (when s
- ;; for [T]racked. returns nothing cleanly if file has no changes
- (if (zerop (length s))
- "T"
- ;; HACK: if the file is not tracked, it doesnt error and still returns
- ;; 0, but prints an error msg, which starts with "Warning...". it wont
- ;; match M or A, which means it's untracked. Ugly, but saves us from
- ;; running multiple commands for every file
- (substring s 0 1)))))
-
;;;###autoload (defun vc-jj-registered (file)
;;;###autoload "Return non-nil if FILE is registered with jj."
;;;###autoload (if (and (vc-find-root file ".jj") ; Short cut.
@@ -123,29 +86,42 @@ NIL otherwise."
;;;###autoload (vc-jj-registered file))))
(defun vc-jj-registered (file)
+ "Check whether FILE is registered with jj."
(when (executable-find vc-jj-program)
(unless (not (file-exists-p default-directory))
(with-demoted-errors "Error: %S"
- (when-let* ((root (vc-jj-root file)))
- (let* ((default-directory root)
- (relative (file-relative-name file)))
- (vc-jj--file-tracked relative)))))))
+ (when-let* ((default-directory (vc-jj-root file))
+ (relative (file-relative-name file)))
+ (with-temp-buffer
+ (and (vc-jj--call-jj "file" "list" "--" file)
+ (not (= (point-min) (point-max))))))))))
(defun vc-jj-state (file)
"JJ implementation of `vc-state' for FILE."
+ ;; We need to run two commands for the complete state:
+ ;;
+ ;; - "jj file list -T 'conflict' FILE" gets us conflicted (output
+ ;; "true"), ignored (no output) or tracked (output "false", but
+ ;; could be added or modified)
+ ;;
+ ;; - "jj diff --summary FILE" gets us modified (output starts with
+ ;; "M ") or added (output starts with "A "), but no output could
+ ;; be conflicted, ignored or unchanged
(when-let* ((default-directory (vc-jj-root file))
- (relative (file-relative-name file))
- (state (vc-jj--file-state relative)))
+ ;; (relative (file-relative-name file)) ;; done by
`vc-do-command'
+ (conflicted-ignored
+ (with-output-to-string
+ (vc-jj-command standard-output 0 file "file" "list" "-T"
"conflict" "--")))
+ (modified-added
+ (with-output-to-string (vc-jj-command standard-output 0 file
+ "diff" "--summary"
"--"))))
(cond
- ((vc-jj--file-conflicted relative)
- 'conflict)
- ((equal "M" state)
- 'edited)
- ((equal "A" state)
- 'added)
- (state
- 'up-to-date)
- (t nil))))
+ ((string-empty-p conflicted-ignored) 'ignored)
+ ((string= conflicted-ignored "true") 'conflict)
+ ((string-prefix-p "M " modified-added) 'edited)
+ ((string-prefix-p "A " modified-added) 'added)
+ ((string= conflicted-ignored "false") 'up-to-date)
+ (t nil))))
(defun vc-jj-dir-status-files (dir _files update-function)
"Calculate a list of (FILE STATE EXTRA) entries for DIR.
@@ -385,7 +361,7 @@ For jj, modify `.gitignore' and call `jj untrack' or `jj
track'."
(defvar vc-jj-diff-switches '("--git"))
(defun vc-jj-diff (files &optional rev1 rev2 buffer _async)
- "Display diffs for FILES between two revisions."
+ "Display diffs for FILES between revisions REV1 and REV2."
;; TODO: handle async
(setq buffer (get-buffer-create (or buffer "*vc-diff*")))
(cond
@@ -399,7 +375,8 @@ For jj, modify `.gitignore' and call `jj untrack' or `jj
track'."
(with-current-buffer buffer
(erase-buffer))
(apply #'call-process vc-jj-program nil buffer nil "diff" "--from" rev1
"--to" rev2 args)
- (if (seq-some #'vc-jj--file-modified files)
+ (if (seq-some (lambda (line) (string-prefix-p "M " line))
+ (apply #'process-lines vc-jj-program "diff" "--summary" "--"
files))
1
0)))