;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2012 Nikita Karetnikov ;;; Copyright © 2013, 2014 Ludovic Courtès ;;; Copyright © 2016, 2019 Efraim Flashner ;;; ;;; This file is part of GNU Guix. ;;; ;;; GNU Guix 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. ;;; ;;; GNU Guix 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 GNU Guix. If not, see . (define-module (gnu packages ed) #:use-module (guix licenses) #:use-module (guix packages) #:use-module (guix download) #:use-module (guix build-system gnu) #:use-module (gnu packages compression)) (define-public ed (package (name "ed") (version "1.16") (source (origin (method url-fetch) (uri (string-append "mirror://gnu/ed/ed-" version ".tar.lz")) (sha256 (base32 "0b4b1lwizvng9bvpcjnmpj2i80xz9xw2w8nfff27b2h4mca7mh6g")))) (build-system gnu-build-system) (native-inputs `(("lzip" ,lzip))) (arguments '(#:configure-flags '("CC=gcc") #:phases (modify-phases %standard-phases (add-before 'patch-source-shebangs 'patch-test-suite (lambda _ (substitute* "testsuite/check.sh" (("/bin/sh") (which "sh"))) #t))))) (home-page "https://www.gnu.org/software/ed/") (synopsis "Line-oriented text editor") (description "Ed is a line-oriented text editor: rather than offering an overview of a document, ed performs editing one line at a time. It can be executed both interactively and via shell scripts. Its method of command input allows complex tasks to be performed in an automated way. GNU ed offers several extensions over the standard utility.") (license gpl3+))) fold-port-matches, trickier" (reverse '("Guix" "guix" "Guix" "guiX" "Guix")) (call-with-input-string "Guix, guix, GuiGuixguiX, Guix" (lambda (port) (fold-port-matches cons '() (list (char-set #\G #\g) (char-set #\u) (char-set #\i) (char-set #\x #\X)) port)))) (test-equal "fold-port-matches, with unmatched chars" '("Guix" #\, #\space "guix" #\, #\space #\G #\u #\i "Guix" "guiX" #\, #\space "Guix") (call-with-input-string "Guix, guix, GuiGuixguiX, Guix" (lambda (port) (reverse (fold-port-matches cons '() (list (char-set #\G #\g) (char-set #\u) (char-set #\i) (char-set #\x #\X)) port cons))))) (test-equal "wrap-program, one input, multiple calls" "hello world\n" (call-with-temporary-directory (lambda (directory) (let ((bash (search-bootstrap-binary "bash" (%current-system))) (foo (string-append directory "/foo"))) (call-with-output-file foo (lambda (p) (format p "#!~a~%echo \"${GUIX_FOO} ${GUIX_BAR}\"~%" bash))) (chmod foo #o777) ;; wrap-program uses `which' to find bash for the wrapper shebang, but ;; it can't know about the bootstrap bash in the store, since it's not ;; named "bash". Help it out a bit by providing a symlink it this ;; package's output. (with-environment-variable "PATH" (dirname bash) (wrap-program foo `("GUIX_FOO" prefix ("hello"))) (wrap-program foo `("GUIX_BAR" prefix ("world"))) ;; The bootstrap Bash is linked against an old libc and would abort ;; with an assertion failure when trying to load incompatible locale ;; data. (unsetenv "LOCPATH") (let* ((pipe (open-input-pipe foo)) (str (get-string-all pipe))) (with-directory-excursion directory (for-each delete-file '("foo" ".foo-real"))) (and (zero? (close-pipe pipe)) str))))))) (test-assert "invoke/quiet, success" (begin (invoke/quiet "true") #t)) (test-assert "invoke/quiet, failure" (guard (c ((message-condition? c) (string-contains (condition-message c) "This is an error."))) (invoke/quiet "sh" "-c" "echo This is an error. ; false") #f)) (test-assert "invoke/quiet, failure, message on stderr" (guard (c ((message-condition? c) (string-contains (condition-message c) "This is another error."))) (invoke/quiet "sh" "-c" "echo This is another error. >&2 ; false") #f)) (test-end)