pkg: repair file:// URL handling for strip modes

When catalog is specified via file:// URL to a local directory with local
package directories that have been stripped in various modes, `raco pkg install`
will incorrectly error out with an incompatible package content error when
a binary strip mode is selected and a file-system error when source strip
mode is selected.

The cause is due to the file:// URL's resolved file path not being passed
along to the helper functions in the various code paths handling the different
strip modes; instead the full original file:// URL is passed along and is
misinterpreted as an actual filesystem path resulting in the observed failure
modes.

The repair is simple; change the relevant argument so the resolved filesystem path
is used instead of the original file:// URL.

Test cases added to test various combinations of strip modes when using
`raco pkg install` and local catalog directory.
This commit is contained in:
Alexander McLin 2018-10-06 19:42:12 -04:00 committed by Matthew Flatt
parent ec837e8eb1
commit aecc786b7f
4 changed files with 174 additions and 3 deletions

View File

@ -0,0 +1,2 @@
#lang info
(define pkg-desc "use this pkg to demonstrate different stripping modes.")

View File

@ -0,0 +1,3 @@
#lang racket/base
(printf "this pkg can be stripped in multiple modes\n")

View File

@ -261,4 +261,170 @@
$ "raco pkg config --set git-checkout-credentials user:bad-password"
$ "raco pkg install pkg-git" =exit> 1
$ "raco pkg config --set git-checkout-credentials user:password"
$ "raco pkg install pkg-git")))))
$ "raco pkg install pkg-git"))
(parameterize ([current-directory test-source-directory])
(with-fake-root
(shelly-case
"install package in default mode using local directory catalog specified via pkg config --set catalogs"
(define tmp-dir (path->directory-path (make-temporary-file "tmp~a" 'directory)))
(define catalog-dir (build-path tmp-dir "catalog"))
(make-directory catalog-dir)
(define pkgs-dir (build-path tmp-dir "pkgs"))
(make-directory pkgs-dir)
(copy-directory/files (build-path "test-pkgs" "pkg-strip") (build-path pkgs-dir "pkg-strip"))
$ (format "racket -l pkg/dirs-catalog ~a ~a" catalog-dir pkgs-dir)
$ "raco pkg install pkg-strip" =exit> 1
$ (format "raco pkg config --set catalogs file:///~a" (path->string catalog-dir))
$ "raco pkg install pkg-strip"
$ "racket -l pkg-strip" =stdout> "this pkg can be stripped in multiple modes\n"
(delete-directory/files tmp-dir)))
(with-fake-root
(shelly-case
"install package in default mode using local directory catalog specified via pkg config --set catalogs"
(define tmp-dir (path->directory-path (make-temporary-file "tmp~a" 'directory)))
(define catalog-dir (build-path tmp-dir "catalog"))
(make-directory catalog-dir)
(define pkgs-dir (build-path tmp-dir "pkgs"))
(make-directory pkgs-dir)
(copy-directory/files (build-path "test-pkgs" "pkg-strip") (build-path pkgs-dir "pkg-strip"))
$ (format "racket -l pkg/dirs-catalog ~a ~a" catalog-dir pkgs-dir)
$ "raco pkg install pkg-strip" =exit> 1
$ (format "raco pkg config --set catalogs file:///~a" (path->string catalog-dir))
$ "raco pkg install pkg-strip"
$ "racket -l pkg-strip" =stdout> "this pkg can be stripped in multiple modes\n"
(delete-directory/files tmp-dir)))
(with-fake-root
(shelly-case
"install package in source mode using local directory catalog specified via pkg config --set catalogs"
(define tmp-dir (path->directory-path (make-temporary-file "tmp~a" 'directory)))
(define catalog-dir (build-path tmp-dir "catalog"))
(make-directory catalog-dir)
(define pkgs-dir (build-path tmp-dir "pkgs"))
(make-directory pkgs-dir)
(copy-directory/files (build-path "test-pkgs" "pkg-strip") (build-path pkgs-dir "pkg-strip"))
$ (format "racket -l pkg/dirs-catalog ~a ~a" catalog-dir pkgs-dir)
$ "raco pkg install --source pkg-strip" =exit> 1
$ (format "raco pkg config --set catalogs file:///~a" (path->string catalog-dir))
$ "raco pkg install --source pkg-strip"
$ "racket -l pkg-strip" =stdout> "this pkg can be stripped in multiple modes\n"
(delete-directory/files tmp-dir)))
(with-fake-root
(shelly-case
"install package in source mode using local directory catalog specified via pkg install --catalog"
(define tmp-dir (path->directory-path (make-temporary-file "tmp~a" 'directory)))
(define catalog-dir (build-path tmp-dir "catalog"))
(make-directory catalog-dir)
(define pkgs-dir (build-path tmp-dir "pkgs"))
(make-directory pkgs-dir)
(copy-directory/files (build-path "test-pkgs" "pkg-strip") (build-path pkgs-dir "pkg-strip"))
$ (format "racket -l pkg/dirs-catalog ~a ~a" catalog-dir pkgs-dir)
$ "raco pkg install --source pkg-strip" =exit> 1
$ (format "raco pkg install --source --catalog file:///~a pkg-strip" (path->string catalog-dir))
$ "racket -l pkg-strip" =stdout> "this pkg can be stripped in multiple modes\n"
(delete-directory/files tmp-dir)))
(with-fake-root
(shelly-case
"install package in binary mode using local directory catalog specified via pkg config --set catalogs"
(define pkg-strip-orig-dir (build-path "test-pkgs" "pkg-strip"))
(define tmp-dir (path->directory-path (make-temporary-file "tmp~a" 'directory)))
(define catalog-dir (build-path tmp-dir "catalog"))
(make-directory catalog-dir)
(define pkgs-dir (build-path tmp-dir "pkgs"))
(make-directory pkgs-dir)
(define pkg-strip-dir (build-path tmp-dir "pkg-strip"))
(define pkg-strip-binary-dir (build-path pkgs-dir "pkg-strip"))
(make-directory pkg-strip-binary-dir)
(copy-directory/files pkg-strip-orig-dir pkg-strip-dir)
(parameterize ([current-directory pkg-strip-dir])
(shelly-begin
$ "raco make info.rkt main.rkt"))
$ (format "racket -e '(require pkg/strip) (generate-stripped-directory (quote binary) ~s ~s)'"
(path->string pkg-strip-dir)
(path->string pkg-strip-binary-dir))
$ (format "racket -l pkg/dirs-catalog ~a ~a" catalog-dir pkgs-dir)
$ "raco pkg install --binary pkg-strip" =exit> 1
$ (format "raco pkg config --set catalogs file:///~a" (path->string catalog-dir))
$ "raco pkg install --binary pkg-strip"
$ "racket -l pkg-strip" =stdout> "this pkg can be stripped in multiple modes\n"
(delete-directory/files tmp-dir)))
(with-fake-root
(shelly-case
"install package in binary mode using local directory catalog specified via pkg install --catalog"
(define pkg-strip-orig-dir (build-path "test-pkgs" "pkg-strip"))
(define tmp-dir (path->directory-path (make-temporary-file "tmp~a" 'directory)))
(define catalog-dir (build-path tmp-dir "catalog"))
(make-directory catalog-dir)
(define pkgs-dir (build-path tmp-dir "pkgs"))
(make-directory pkgs-dir)
(define pkg-strip-dir (build-path tmp-dir "pkg-strip"))
(define pkg-strip-binary-dir (build-path pkgs-dir "pkg-strip"))
(make-directory pkg-strip-binary-dir)
(copy-directory/files pkg-strip-orig-dir pkg-strip-dir)
(parameterize ([current-directory pkg-strip-dir])
(shelly-begin
$ "raco make info.rkt main.rkt"))
$ (format "racket -e '(require pkg/strip) (generate-stripped-directory (quote binary) ~s ~s)'"
(path->string pkg-strip-dir)
(path->string pkg-strip-binary-dir))
$ (format "racket -l pkg/dirs-catalog ~a ~a" catalog-dir pkgs-dir)
$ "raco pkg install --binary pkg-strip" =exit> 1
$ (format "raco pkg install --catalog file:///~a --binary pkg-strip" (path->string catalog-dir))
$ "racket -l pkg-strip" =stdout> "this pkg can be stripped in multiple modes\n"
(delete-directory/files tmp-dir)))
(with-fake-root
(shelly-case
"install package in binary-lib mode using local directory catalog specified via pkg config --set catalogs"
(define pkg-strip-orig-dir (build-path "test-pkgs" "pkg-strip"))
(define tmp-dir (path->directory-path (make-temporary-file "tmp~a" 'directory)))
(define catalog-dir (build-path tmp-dir "catalog"))
(make-directory catalog-dir)
(define pkgs-dir (build-path tmp-dir "pkgs"))
(make-directory pkgs-dir)
(define pkg-strip-dir (build-path tmp-dir "pkg-strip"))
(define pkg-strip-binary-lib-dir (build-path pkgs-dir "pkg-strip"))
(make-directory pkg-strip-binary-lib-dir)
(copy-directory/files pkg-strip-orig-dir pkg-strip-dir)
(parameterize ([current-directory pkg-strip-dir])
(shelly-begin
$ "raco make info.rkt main.rkt"))
$ (format "racket -e '(require pkg/strip) (generate-stripped-directory (quote binary-lib) ~s ~s)'"
(path->string pkg-strip-dir)
(path->string pkg-strip-binary-lib-dir))
$ (format "racket -l pkg/dirs-catalog ~a ~a" catalog-dir pkgs-dir)
$ "raco pkg install --binary-lib pkg-strip" =exit> 1
$ (format "raco pkg config --set catalogs file:///~a" (path->string catalog-dir))
$ "raco pkg install --binary-lib pkg-strip"
$ "racket -l pkg-strip" =stdout> "this pkg can be stripped in multiple modes\n"
(delete-directory/files tmp-dir)))
(with-fake-root
(shelly-case
"install package in binary-lib mode using local directory catalog specified via pkg install --catalog"
(define pkg-strip-orig-dir (build-path "test-pkgs" "pkg-strip"))
(define tmp-dir (path->directory-path (make-temporary-file "tmp~a" 'directory)))
(define catalog-dir (build-path tmp-dir "catalog"))
(make-directory catalog-dir)
(define pkgs-dir (build-path tmp-dir "pkgs"))
(make-directory pkgs-dir)
(define pkg-strip-dir (build-path tmp-dir "pkg-strip"))
(define pkg-strip-binary-lib-dir (build-path pkgs-dir "pkg-strip"))
(make-directory pkg-strip-binary-lib-dir)
(copy-directory/files pkg-strip-orig-dir pkg-strip-dir)
(parameterize ([current-directory pkg-strip-dir])
(shelly-begin
$ "raco make info.rkt main.rkt"))
$ (format "racket -e '(require pkg/strip) (generate-stripped-directory (quote binary-lib) ~s ~s)'"
(path->string pkg-strip-dir)
(path->string pkg-strip-binary-lib-dir))
$ (format "racket -l pkg/dirs-catalog ~a ~a" catalog-dir pkgs-dir)
$ "raco pkg install --binary-lib pkg-strip" =exit> 1
$ (format "raco pkg install --catalog file:///~a --binary-lib pkg-strip" (path->string catalog-dir))
$ "racket -l pkg-strip" =stdout> "this pkg can be stripped in multiple modes\n"
(delete-directory/files tmp-dir)))))))

View File

@ -632,9 +632,9 @@
(if strip-mode
(begin
(unless force-strip?
(check-strip-compatible strip-mode pkg-name pkg pkg-error))
(check-strip-compatible strip-mode pkg-name pkg-path pkg-error))
(make-directory* pkg-dir)
(generate-stripped-directory strip-mode pkg pkg-dir))
(generate-stripped-directory strip-mode pkg-path pkg-dir))
(begin
(make-parent-directory* pkg-dir)
(copy-directory/files pkg-path pkg-dir #:keep-modify-seconds? #t)))