#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)))