More working commands

This commit is contained in:
2026-08-11 13:56:50 +02:00
parent bf8c5b7e89
commit abb70f29ff
6 changed files with 204 additions and 14 deletions
+8 -3
View File
@@ -14,6 +14,7 @@
(git 'init)
(check-true (git-repository?))
(check-equal? (git-current-branch) "master")
(check-equal? (git 'branch-current) "master")
(check-true (git-clean?))
(git 'config "user.name" "Racket Git Test")
@@ -83,7 +84,8 @@
(git 'commit "work change")
(check-equal? (file->string (build-path "sub" "hello.txt")) "work\n")
(git 'checkout "master")
(check-equal? (git 'branch-current) "work")
(git 'switch "master")
(check-equal? (file->string (build-path "sub" "hello.txt")) "changed\n")
(check-equal? (git-current-branch) "master")
(check-not-false (member "work" (git 'branch)))
@@ -92,7 +94,7 @@
(call-with-output-file (build-path "sub" "hello.txt")
#:exists 'truncate/replace
(lambda (out) (displayln "dirty" out)))
(check-exn exn:fail? (lambda () (git 'checkout "work")))
(check-exn exn:fail? (lambda () (git 'switch "work")))
(check-equal? (git-current-branch) "master")
(check-equal? (file->string (build-path "sub" "hello.txt")) "dirty\n")
(call-with-output-file (build-path "sub" "hello.txt")
@@ -107,7 +109,10 @@
(check-equal? (git 'tag) '("v0.1"))
(git 'checkout "v0.1")
(check-false (git-current-branch))
(git 'checkout "master")
(check-false (git 'branch-current))
(check-exn exn:fail? (lambda () (git 'switch "missing")))
(git 'switch "master")
(check-equal? (git 'branch-current) "master")
(git 'tag '-d "v0.1")
(check-equal? (git 'tag) '())
+66
View File
@@ -0,0 +1,66 @@
#lang racket/base
(require rackunit
racket/file
git)
(define tmp (make-temporary-file "racket-git-branch-merge-test~a" 'directory))
(define (write-file path text)
(call-with-output-file path
#:exists 'truncate/replace
(lambda (out) (display text out))))
(dynamic-wind
void
(lambda ()
(parameterize ([current-directory tmp])
(git 'init)
(git 'config "user.name" "Racket Git Test")
(git 'config "user.email" "racket-git-test@example.invalid")
(write-file "README.md" "base\n")
(git 'add "README.md")
(define base (git 'commit "base"))
;; Reproduce the recovery case: create a commit while HEAD is detached,
;; give that commit a branch name, switch back, and merge it.
(git 'checkout base)
(check-false (git 'branch-current))
(write-file "README.md" "base\nrescued\n")
(git 'add "README.md")
(define rescued (git 'commit "detached README change"))
(check-false (git 'branch-current))
(check-equal? (git 'branch-create "rescue-readme") "rescue-readme")
(check-not-false (member "rescue-readme" (git 'branch)))
(git 'switch "master")
(check-equal? (git 'branch-current) "master")
(check-equal? (git 'merge "rescue-readme") rescued)
(check-equal? (git-head) rescued)
(check-equal? (file->string "README.md") "base\nrescued\n")
(check-false (git 'merge "rescue-readme"))
(git 'branch '-d "rescue-readme")
(check-false (member "rescue-readme" (git 'branch)))
;; Also exercise a real two-parent, conflict-free merge.
(git 'branch-create "feature")
(git 'switch "feature")
(write-file "feature.txt" "feature\n")
(git 'add "feature.txt")
(git 'commit "feature change")
(git 'switch "master")
(write-file "master.txt" "master\n")
(git 'add "master.txt")
(git 'commit "master change")
(define merge-id (git 'merge "feature"))
(check-equal? (string-length merge-id) 40)
(check-equal? (file->string "feature.txt") "feature\n")
(check-equal? (file->string "master.txt") "master\n")
(check-true (git-clean?))
(check-equal? (git 'branch-current) "master")
(check-true (>= (length (git 'log 10)) 5))
(git 'branch '-d "feature")))
(lambda ()
(delete-directory/files tmp)))