added several commands

This commit is contained in:
2026-08-11 20:50:08 +02:00
parent 1c7d71ab07
commit c45f666f23
14 changed files with 403 additions and 2781 deletions
+63
View File
@@ -56,10 +56,65 @@
(check-equal? (git 'diff) "")
(check-equal? (git 'diff '--cached) "")
;; Grep always returns structured entries. -n, -l, and -c affect only
;; dgit presentation; -i and -v affect matching.
(define grep-hello (git 'grep "hello"))
(check-equal? grep-hello
(list (git-grep-entry "sub/hello.txt" 1 "hello")))
(check-equal? (git 'grep '-n "hello") grep-hello)
(check-equal? (git 'grep '-l "hello") grep-hello)
(check-equal? (git 'grep '-c "hello") grep-hello)
(check-equal? (git 'grep '-i "HELLO") grep-hello)
(check-false
(for/or ([entry (in-list (git 'grep '-v "hello"))])
(and (string=? (git-grep-entry-path entry) "sub/hello.txt")
(string=? (git-grep-entry-line entry) "hello"))))
(define grep-output (open-output-string))
(parameterize ([current-output-port grep-output])
(dgit 'grep '-n "hello"))
(check-equal? (get-output-string grep-output)
"sub/hello.txt:1:hello\n")
(define grep-files-output (open-output-string))
(parameterize ([current-output-port grep-files-output])
(dgit 'grep '-l "hello"))
(check-equal? (get-output-string grep-files-output)
"sub/hello.txt\n")
(define grep-count-output (open-output-string))
(parameterize ([current-output-port grep-count-output])
(dgit 'grep '-c "hello"))
(check-equal? (get-output-string grep-count-output)
"sub/hello.txt:1\n")
;; `restore --staged` removes a path from the index without deleting the
;; worktree file. Once the path is ignored, it disappears from status.
(call-with-output-file "staged.txt"
#:exists 'truncate/replace
(lambda (out) (displayln "staged" out)))
(git 'add "staged.txt")
(call-with-output-file ".gitignore"
#:exists 'append
(lambda (out) (displayln "staged.txt" out)))
(check-not-false
(member "A staged.txt" (git-status-lines)))
(git 'restore '--staged "staged.txt")
(check-false
(member "?? staged.txt" (git-status-lines)))
(check-true (file-exists? "staged.txt"))
;; Restore the tracked .gitignore from the index and remove the now
;; untracked test file, returning to a clean repository.
(git 'restore ".gitignore")
(delete-file "staged.txt")
(check-true (git-clean?))
(call-with-output-file (build-path "sub" "hello.txt")
#:exists 'truncate/replace
(lambda (out) (displayln "changed" out)))
(define worktree-diff (git 'diff))
(check-equal? (git 'grep "hello" 'HEAD)
(list (git-grep-entry "sub/hello.txt" 1 "hello")))
(check-equal? (git 'grep "changed")
(list (git-grep-entry "sub/hello.txt" 1 "changed")))
(check-true (regexp-match? #rx"-hello" worktree-diff))
(check-true (regexp-match? #rx"[+]changed" worktree-diff))
(check-equal? (git 'diff '--cached) "")
@@ -74,6 +129,14 @@
(define cached-diff (git 'diff '--cached))
(check-true (regexp-match? #rx"-hello" cached-diff))
(check-true (regexp-match? #rx"[+]changed" cached-diff))
;; Path reset restores the index from HEAD but keeps the worktree edit.
(git 'reset 'HEAD "--" "sub/hello.txt")
(check-equal? (git 'diff '--cached) "")
(check-true (regexp-match? #rx"[+]changed" (git 'diff)))
(check-not-false
(member " M sub/hello.txt" (git-status-lines)))
(git 'add "sub/hello.txt")
(git 'commit "prepare branches")
(git 'checkout '-b "work")