;;; tissue --- Text based issue tracker ;;; Copyright © 2023 Arun Isaac ;;; ;;; This file is part of tissue. ;;; ;;; tissue is free software: you can redistribute it and/or modify it ;;; under the terms of the GNU General Public License as published by ;;; the Free Software Foundation, either version 3 of the License, or ;;; (at your option) any later version. ;;; ;;; tissue is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;;; General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with tissue. If not, see . (import (srfi srfi-26) (srfi srfi-64) (ice-9 match)) (define (with-variable variable value thunk) "Set VARIABLE to VALUE, run THUNK and restore the old value of VARIABLE. Return the value returned by THUNK." (let ((old-value (variable-ref variable))) (dynamic-wind (cut variable-set! variable value) thunk (cut variable-set! variable old-value)))) (define (with-variables variable-bindings thunk) "Set VARIABLE-BINDINGS, run THUNK and restore the old values of the variables. Return the value returned by THUNK. VARIABLE-BINDINGS is a list of pairs mapping variables to their values." (match variable-bindings (((variable . value) tail ...) (with-variable variable value (cut with-variables tail thunk))) (() (thunk)))) (define-syntax-rule (var@@ module-name variable-name) (module-variable (resolve-module 'module-name) 'variable-name)) (test-begin "git") (test-equal "Infer changes by root commit" '(("foo" . "foo") ("bar" . "bar")) (with-variables (list (cons (var@@ (git) commit-parents) (const (list))) (cons (var@@ (git) commit-tree) (const #t)) (cons (var@@ (git) tree-list) (const (list "foo" "bar")))) (cut (@@ (tissue git) commit-file-changes) #f #f))) (test-end "git")