#lang racket/base (require rackunit racket/file git) (define tmp (make-temporary-file "racket-git-remote-test~a" 'directory)) (define origin (build-path tmp "origin.git")) (define a (build-path tmp "a")) (define b (build-path tmp "b")) (define (configure!) (git config "user.name" "Racket Git Test") (git config "user.email" "racket-git-test@example.invalid")) (dynamic-wind void (lambda () (git-init origin #:bare? #t) (make-directory a) (parameterize ([current-directory a]) (git init) (configure!) (call-with-output-file "value.txt" #:exists 'truncate/replace (lambda (out) (displayln "one" out))) (git add "value.txt") (git commit "one") (git remote add "origin" (path->string origin)) (check-equal? (git remote) '("origin")) (check-equal? (git remote get-url "origin") (path->string origin)) (git push)) (git-clone (path->string origin) b) (parameterize ([current-directory b]) (configure!) (check-equal? (git-current-branch) "master") (call-with-output-file "value.txt" #:exists 'truncate/replace (lambda (out) (displayln "two" out))) (git add "value.txt") (git commit "two") (git push) (git tag "v2") (git push-tag "v2")) (parameterize ([current-directory a]) (check-equal? (file->string "value.txt") "one\n") (check-equal? (string-length (git pull)) 40) (check-equal? (file->string "value.txt") "two\n") (check-true (git-clean?)) (git fetch) (check-equal? (git tag) '("v2")) (call-with-output-file "local.txt" #:exists 'truncate/replace (lambda (out) (displayln "local" out))) (git add "local.txt") (git commit "local change")) (parameterize ([current-directory b]) (call-with-output-file "remote.txt" #:exists 'truncate/replace (lambda (out) (displayln "remote" out))) (git add "remote.txt") (git commit "remote change") (git push)) (parameterize ([current-directory a]) (define before (git-head)) (check-exn #rx"non-fast-forward" (lambda () (git pull))) (check-equal? (git-head) before) (check-true (file-exists? "local.txt")) (check-false (file-exists? "remote.txt")))) (lambda () (delete-directory/files tmp)))