raco pkg: handle bad collection strings

Also, add `setup/collection-name`, which provides functions for
checking collection-name syntax.

Closes PR 13886
This commit is contained in:
Matthew Flatt 2013-08-31 11:02:23 -06:00
parent a30d80a9c4
commit 95368d238e
6 changed files with 68 additions and 7 deletions

View File

@ -11,6 +11,7 @@
setup/dirs
setup/getinfo
setup/main-collects
setup/collection-name
setup/path-to-relative
setup/xref scribble/xref
;; info -- no bindings from this are used
@ -1406,6 +1407,32 @@ compatibility.}
function).
}
@; ------------------------------------------------------------------------
@section[#:tag "collection-names"]{API for Collection Names}
@defmodule[setup/collection-name]
@defproc[(collection-name? [v any/c]) boolean?]{
Returns @racket[#t] if @racket[v] is a string that is syntactically
valid as a collection name, which means that it is one or more
@litchar{/}-separated strings for which
@racket[collection-name-element?] returns true.}
@defproc[(collection-name-element? [v any/c]) boolean?]{
Returns @racket[#t] if @racket[v] is a string that is syntactically
valid as a top-level collection name or as a part of a collection
name, which means that it is non-empty and contains only ASCII
letters, ASCII digits, @litchar{-}, @litchar{+}, @litchar{_}, and
@litchar{%}, where a @litchar{%} is allowed only when followed by two
lowercase hexadecimal digits, and the digits must form a number that
is not the ASCII value of a letter, digit, @litchar{-}, @litchar{+},
or @litchar{_}.}
@; ------------------------------------------------------------------------
@section[#:tag "xref"]{API for Cross-References for Installed Manuals}

View File

@ -0,0 +1,17 @@
#lang racket/base
(require rackunit
setup/collection-name)
(check-equal? #t (collection-name-element? "racket"))
(check-equal? #t (collection-name-element? "racket%21"))
(check-equal? #f (collection-name-element? "racket.rkt"))
(check-equal? #f (collection-name-element? "racket!"))
(check-equal? #f (collection-name-element? "rac/ket"))
(check-equal? #t (collection-name? "racket"))
(check-equal? #t (collection-name? "rac/ket"))
(check-equal? #t (collection-name? "racket/%21"))
(check-equal? #f (collection-name? "racket.rkt"))
(check-equal? #f (collection-name? "racket!"))
(check-equal? #f (collection-name? "racket/"))
(check-equal? #f (collection-name? "/racket"))

View File

@ -10,6 +10,7 @@
setup/pack
setup/unpack
setup/dirs
setup/collection-name
racket/port
racket/list
racket/function
@ -1604,16 +1605,17 @@
(if (not i)
pkg-name
(let ([s (i 'collection (lambda () 'use-pkg-name))])
(unless (or (string? s)
(unless (or (collection-name-element? s)
(eq? s 'multi)
(eq? s 'use-pkg-name))
(log-error (format (~a "bad `collection' definition in \"info.rkt\n"
(log-error (format (~a "bad `collection' definition in \"info.rkt\";\n"
" definition will be ignored\n"
" path: ~a\n"
" found: ~e\n"
" expected: (or/c string? 'multi 'use-pkg-name)")
" expected: (or/c collection-name-element? 'multi 'use-pkg-name)")
(build-path dir "info.rkt")
s)))
(or (and (string? s)
(or (and (collection-name-element? s)
s)
(and (eq? s 'use-pkg-name)
pkg-name)))))

View File

@ -1,6 +1,7 @@
Version 5.90.0.9
Allow hash table chaperones and impersonators to Support efficient
hash-clear and hash-clear!
setup/collection-name: added
Version 5.90.0.6
Added path<?, symbol<?

View File

@ -0,0 +1,14 @@
#lang racket/base
(provide collection-name?
collection-name-element?)
(define (collection-name? name)
(and (string? name)
(andmap collection-name-element? (regexp-split #rx"/" name))))
(define (collection-name-element? name)
(and (string? name)
(regexp-match #rx"^[a-zA-z0-9+_%-]+$" name)
;; Using `module-path?' checks that "%" is used apprrpriately:
(module-path? name)))

View File

@ -1,7 +1,8 @@
#lang racket/base
(require racket/file
racket/path
setup/dirs)
setup/dirs
setup/collection-name)
(provide links)
@ -20,8 +21,7 @@
#:with-path? [with-path? #f]
. dirs)
(define (check-name name)
(unless (and (regexp-match #rx"^[a-zA-z0-9+_%-]+$" name)
(module-path? name))
(unless (collection-name-element? name)
(error 'links "name is not valid as a top-level collection name: ~e"
name)))