{"size": 7814, "ext": "scrbl", "max_stars_repo_path": "pkgs/racket-doc/scribblings/raco/link.scrbl", "max_stars_repo_name": "lkh01/racket", "max_stars_repo_stars_event_min_datetime": "2018-07-29T04:13:52.000Z", "max_stars_repo_stars_event_max_datetime": "2022-02-14T16:11:17.000Z", "max_issues_repo_path": "pkgs/racket-doc/scribblings/raco/link.scrbl", "max_issues_repo_name": "lkh01/racket", "max_issues_repo_issues_event_min_datetime": "2017-08-25T20:26:37.000Z", "max_issues_repo_issues_event_max_datetime": "2022-02-26T17:48:40.000Z", "max_forks_repo_path": "pkgs/racket-doc/scribblings/raco/link.scrbl", "max_forks_repo_name": "lkh01/racket", "max_forks_repo_forks_event_min_datetime": "2016-04-25T11:47:57.000Z", "max_forks_repo_forks_event_max_datetime": "2017-05-09T14:52:48.000Z"}
{"max_stars_count": 10, "max_issues_count": 15, "max_forks_count": 3, "avg_line_length": 44.908045977, "max_line_length": 86, "alphanum_fraction": 0.6809572562}
#lang scribble/doc
@(require scribble/manual
          scribble/bnf 
          "common.rkt"
          (for-label racket/base
                     racket/contract
                     setup/link
                     setup/dirs))

@title[#:tag "link"]{@exec{raco link}: Library Collection Links}

The @exec{raco link} command inspects and modifies a @tech[#:doc
reference-doc]{collection links file} to display, add, or remove
mappings from collection names to filesystem directories.

Managing links directly is somewhat discouraged. Instead, use the
package manager (see @other-manual['(lib
"pkg/scribblings/pkg.scrbl")]), which installs and manages links
(i.e., it builds on @exec{raco link}) in a way that more gracefully
leads to sharing collections with others. Nevertheless, @exec{raco
link} is available for direct use.

For example, the command

@commandline{raco link maze}

installs a user-specific and version-specific link for the @racket["maze"] collection,
mapping it to the @filepath{maze} subdirectory of the current
directory. Supply multiple directory paths to create multiple links at
once, especially with a command-shell wildcard:

@commandline{raco link *}

By default, the linked collection name is the same as each directory's
name, but the collection name can be set separately for a single
directory with the @DFlag{name} flag.

To remove the link created by the first example above, use

@commandline{raco link --remove maze}

or 

@commandline{raco link -r maze}

Like link-adding mode, removing mode accepts multiple directory paths to
remove multiple links, and all links that match any directory are
removed.  If @DFlag{name} is used with @DFlag{remove}, then only
links matching both the collection name and directory are removed.

Full command-line options:

@itemlist[

 @item{@Flag{l} or @DFlag{list} --- Shows the current link table. If
       any other command-line arguments are provided that modify the
       link table, the table is shown after modifications. If no
       directory arguments are provided, and if none of @Flag{u},
       @DFlag{user}, @Flag{i}, @DFlag{installation}, @Flag{f}, or
       @DFlag{file} are specified, then the link table is shown for
       all user-specific and installation-wide @tech[#:doc
       reference-doc]{collection links files}.}

 @item{@Flag{n} @nonterm{name} or @DFlag{name} @nonterm{name} --- Sets
       the collection name for adding a single link or removing
       matching links.  By default, the collection name for an added
       link is derived from the directory name. When the @Flag{r} or
       @DFlag{remove} flag is also used, only links with a collection
       name matching @nonterm{name} are removed, and if no directory
       arguments are provided, all links with a match to
       @nonterm{name} are removed. This flag is mutually exclusive with
       @Flag{d} and @DFlag{root}.}

 @item{@Flag{d} or @DFlag{root} --- Treats each directory as a
       collection root that contains collection directories, instead of
       a directory for a specific collection. When the @Flag{r} or
       @DFlag{remove} flag is also used, only collection-root links
       that match a directory are removed. This flag is mutually
       exclusive with @Flag{n} and @DFlag{name}.}

 @item{@Flag{D} or @DFlag{static-root} --- Like @Flag{d} or
       @DFlag{root}, but each directory is assumed to have a constant
       set of subdirectories (to improve the use of collection-search
       caches) as long as the links file itself does not change.}

 @item{@Flag{x} @nonterm{regexp} or @DFlag{version-regexp}
       @nonterm{regexp} --- Sets a version regexp that limits the link
       to use only by Racket versions (as reported by
       @racket[version]) matching @nonterm{regexp}. This flag
       is normally used with @Flag{u} or @DFlag{user} with installations
       that have different versions but the same installation name. When the @Flag{r}
       or @DFlag{remove} flag is also used, only links with a
       version regexp matching @nonterm{regexp} are removed.}

 @item{@Flag{r} or @DFlag{remove} --- Selects remove mode instead
       of add mode.}

 @item{@Flag{u} or @DFlag{user} --- Limits listing and removal
       of links to the user-specific @tech[#:doc
       reference-doc]{collection links file} and not the
       installation-wide @tech[#:doc reference-doc]{collection links
       file}. This flag is mutually exclusive with @Flag{i},
       @DFlag{installation}, @Flag{f}, and @DFlag{file}.}

 @item{@Flag{i} or @DFlag{installation} --- Reads and writes links in
       installation-wide @tech[#:doc reference-doc]{collection links
       file} and not the user-specific @tech[#:doc
       reference-doc]{collection links file}. This flag is mutually
       exclusive with @Flag{u}, @DFlag{user}, @Flag{f}, and
       @DFlag{file}.}

 @item{@Flag{f} @nonterm{file} or @DFlag{file} @nonterm{file} ---
       Reads and writes links in @nonterm{file} instead of the
       user-specific @tech[#:doc reference-doc]{collection links
       file}.  This flag is mutually exclusive with @Flag{u},
       @DFlag{user}, @Flag{s}, @DFlag{shared}, @Flag{i}, and @DFlag{installation}.}

 @item{@Flag{v} @nonterm{vers} or @DFlag{version} @nonterm{vers} ---
       Selects @nonterm{vers} as relevant installation name for
       operations on the user-specific @tech[#:doc
       reference-doc]{collection links file}.}

 @item{@DFlag{repair} --- Enables repairs to the existing file content
       when the content is erroneous. The file is repaired by deleting
       individual links when possible.}

]

@; ----------------------------------------

@section{API for Collection Links}

@defmodule[setup/link]

@defproc[(links [dir path?] ...
                [#:user? user? any/c #t]
                [#:user-version user-version string? (get-installation-name)]
                [#:file file (or/c path-string? #f) #f]
                [#:name name (or/c string? #f) #f]
                [#:root? root? any/c #f]
                [#:static-root? static-root? any/c #f]
                [#:version-regexp version-regexp (or/c regexp? #f) #f]
                [#:error error-proc (symbol? string? any/c ... . -> . any) error]
                [#:remove? remove? any/c #f]
                [#:show? show? any/c #f]
                [#:repair? repair? any/c #f]
                [#:with-path? with-path? any/c #f])
          list?]{

A function version of the @exec{raco link} command that always works
on a single file---either @racket[file] if it is a path string, the
user--specific @tech[#:doc reference-doc]{collection links file} if
@racket[user?] is true, or the installation-wide @tech[#:doc
reference-doc]{collection links file} otherwise. If @racket[user?]
is true, then @racket[user-version] determines the relevant
installation name (defaulting to the current installation's name).

The @racket[static-root?] flag value is ignored unless @racket[root?]
is true and @racket[remove?] is false, in which case each given
@racket[dir] is added as a static root if @racket[static-root?] is true.

The @racket[error-proc] argument is called to raise exceptions that
would be fatal to the @exec{raco link} command.

If @racket[remove?] is true, the result is a list of entries that were
removed from the file.  If @racket[remove?] is @racket[#f] but
@racket[root?] is true, the result is a list of paths for collection
roots. If @racket[remove?] and @racket[root?] are both @racket[#f],
the result is a list for top-level collections that are mapped by
@racket[file] and that apply to the running version of Racket; the
list is a list of strings for collection names if @racket[with-path?]
is @racket[#f], or it is a list of pairs of collection-name strings
and complete paths if @racket[with-path?] is true.}
