71 lines
2.4 KiB
Racket
71 lines
2.4 KiB
Racket
#lang racket/base
|
|
|
|
(require rackunit
|
|
racket/file
|
|
git)
|
|
|
|
|
|
(check-equal? (git 'version) "0.2.11")
|
|
(check-equal? (git-version) "0.2.11")
|
|
|
|
(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)))
|