;;;; package.lisp

(defpackage #:ql-util
  (:documentation
   "Utility functions used in various places.")
  (:use #:cl)
  (:export #:write-line-to-file
           #:without-prompting
           #:press-enter-to-continue
           #:replace-file
           #:copy-file
           #:delete-file-if-exists
           #:ensure-file-exists
           #:split-spaces
           #:first-line
           #:file-size
           #:safely-read
           #:safely-read-file
           #:make-versions-url))

(defpackage #:ql-setup
  (:documentation
   "Functions and variables initialized early in the Quicklisp client
   configuration.")
  (:use #:cl)
  (:export #:qmerge
           #:qenough
           #:*quicklisp-home*))

(defpackage #:ql-config
  (:documentation
   "Getting and setting persistent configuration values.")
  (:use #:cl #:ql-util #:ql-setup)
  (:export #:config-value))

(defpackage #:ql-impl
  (:documentation
   "Configuration of implementation-specific packages and interfaces.")
  (:use #:cl)
  (:export #:*implementation*)
  (:export #:definterface
           #:defimplementation
           #:show-interfaces)
  (:export #:lisp
           #:abcl
           #:allegro
           #:ccl
           #:clasp
           #:clisp
           #:cmucl
           #:cormanlisp
           #:ecl
           #:gcl
           #:lispworks
           #:mkcl
           #:scl
           #:sbcl))

(defpackage #:ql-impl-util
  (:documentation
   "Utility functions that require implementation-specific
   functionality.")
  (:use #:cl #:ql-impl)
  (:export #:call-with-quiet-compilation
           #:add-to-init-file
           #:rename-directory
           #:delete-directory
           #:probe-directory
           #:directory-entries
           #:delete-directory-tree
           #:map-directory-tree
           #:native-namestring
           #:directory-write-date))

(defpackage #:ql-network
  (:documentation
   "Simple, low-level network access.")
  (:use #:cl #:ql-impl)
  (:export #:open-connection
           #:write-octets
           #:read-octets
           #:close-connection
           #:with-connection))

(defpackage #:ql-progress
  (:documentation
   "Displaying a progress bar.")
  (:use #:cl)
  (:export #:make-progress-bar
           #:start-display
           #:update-progress
           #:finish-display))

(defpackage #:ql-http
  (:documentation
   "A simple HTTP client.")
  (:use #:cl #:ql-network #:ql-progress #:ql-config)
  (:export #:*proxy-url*
           #:fetch
           #:http-fetch
           #:*fetch-scheme-functions*
           #:scheme
           #:hostname
           #:port
           #:path
           #:url
           #:*maximum-redirects*
           #:*default-url-defaults*)
  (:export #:fetch-error
           #:unexpected-http-status
           #:unexpected-http-status-code
           #:unexpected-http-status-url
           #:too-many-redirects
           #:too-many-redirects-url
           #:too-many-redirects-count))

(defpackage #:ql-minitar
  (:documentation
   "A simple implementation of unpacking the 'tar' file format.")
  (:use #:cl)
  (:export #:unpack-tarball))

(defpackage #:ql-gunzipper
  (:documentation
   "An implementation of gunzip.")
  (:use #:cl)
  (:export #:gunzip))

(defpackage #:ql-cdb
  (:documentation
   "Read and write CDB files; code adapted from ZCDB.")
  (:use #:cl)
  (:export #:lookup
           #:map-cdb
           #:convert-index-file))

(defpackage #:ql-dist
  (:documentation
   "Generic functions, variables, and classes for interacting with the
   dist system. Documented, exported symbols are intended for public
   use.")
  (:use #:cl
        #:ql-util
        #:ql-http
        #:ql-setup
        #:ql-gunzipper
        #:ql-minitar)
  (:intern #:dist-version
           #:dist-url)
  (:import-from #:ql-impl-util
                #:delete-directory-tree
                #:directory-entries
                #:probe-directory)
  ;; Install/enable protocol
  (:export #:installedp
           #:install
           #:uninstall
           #:ensure-installed
           #:enabledp
           #:enable
           #:disable)
  ;; Preference protocol
  (:export #:preference
           #:preference-file
           #:preference-parent
           #:forget-preference)
  ;; Generic
  (:export #:all-dists
           #:canonical-distinfo-url
           #:enabled-dists
           #:find-dist
           #:find-dist-or-lose
           #:find-system
           #:find-release
           #:dist
           #:system
           #:release
           #:base-directory
           #:relative-to
           #:metadata-name
           #:install-metadata-file
           #:short-description
           #:provided-releases
           #:provided-systems
           #:installed-releases
           #:installed-systems
           #:name)
  ;; Dists
  (:export #:dist
           #:dist-merge
           #:find-system-in-dist
           #:find-release-in-dist
           #:system-index-url
           #:release-index-url
           #:available-versions-url
           #:available-versions
           #:version
           #:subscription-url
           #:new-version-available-p
           #:dist-difference
           #:fetch-dist
           #:initialize-release-index
           #:initialize-system-index
           #:with-consistent-dists)
  ;; Dist updates
  (:export #:available-update
           #:update-release-differences
           #:show-update-report
           #:update-in-place
           #:install-dist
           #:subscription-inhibition-file
           #:inhibit-subscription
           #:uninhibit-subscription
           #:subscription-inhibited-p
           #:subscription-unavailable
           #:subscribedp
           #:subscribe
           #:unsubscribe)
  ;; Releases
  (:export #:release
           #:project-name
           #:system-files
           #:archive-url
           #:archive-size
           #:ensure-archive-file
           #:archive-content-sha1
           #:archive-md5
           #:prefix
           #:local-archive-file
           #:ensure-local-archive-file
           #:check-local-archive-file
           #:invalid-local-archive
           #:invalid-local-archive-file
           #:invalid-local-archive-release
           #:missing-local-archive
           #:badly-sized-local-archive
           #:delete-and-retry)
  ;; Systems
  (:export #:dist
           #:release
           #:preference
           #:system-file-name
           #:required-systems)
  ;; Misc
  (:export #:standard-dist-enumeration-function
           #:*dist-enumeration-functions*
           #:find-asdf-system-file
           #:system-definition-searcher
           #:system-apropos
           #:system-apropos-list
           #:dependency-tree
           #:clean
           #:unknown-dist))

(defpackage #:ql-dist-user
  (:documentation
   "A package that uses QL-DIST; useful for playing around in without
   clobbering any QL-DIST internals.")
  (:use #:cl
        #:ql-dist))

(defpackage #:ql-bundle
  (:documentation
   "A package for supporting the QL:BUNDLE-SYSTEMS function.")
  (:use #:cl #:ql-dist #:ql-impl-util)
  (:shadow #:find-system
           #:find-release)
  (:export #:bundle
           #:requested-systems
           #:ensure-system
           #:ensure-release
           #:write-bundle
           #:add-systems-recursively
           #:object-not-found
           #:system-not-found
           #:system-not-found-system
           #:release-not-found
           #:bundle-directory-exists
           #:bundle-directory-exists-directory))

(defpackage #:quicklisp-client
  (:documentation
   "The Quicklisp client package, intended for end-user Quicklisp
   commands and configuration parameters.")
  (:nicknames #:quicklisp #:ql)
  (:use #:cl
        #:ql-util
        #:ql-impl-util
        #:ql-dist
        #:ql-http
        #:ql-setup
        #:ql-config
        #:ql-minitar
        #:ql-gunzipper)
  (:shadow #:uninstall)
  (:shadowing-import-from #:ql-dist
                          #:dist-version
                          #:dist-url)
  (:export #:dist-version
           #:dist-url)
  (:export #:quickload
           #:*quickload-prompt*
           #:*quickload-verbose*
           #:*quickload-explain*
           #:system-not-found
           #:system-not-found-name
           #:uninstall
           #:uninstall-dist
           #:qmerge
           #:*quicklisp-home*
           #:*initial-dist-url*
           #:*proxy-url*
           #:config-value
           #:setup
           #:provided-systems
           #:system-apropos
           #:system-apropos-list
           #:system-list
           #:client-version
           #:client-url
           #:available-client-versions
           #:install-client
           #:update-client
           #:update-dist
           #:update-all-dists
           #:available-dist-versions
           #:add-to-init-file
           #:use-only-quicklisp-systems
           #:write-asdf-manifest-file
           #:where-is-system
           #:help
           #:register-local-projects
           #:local-projects-searcher
           #:*local-project-directories*
           #:list-local-projects
           #:list-local-systems
           #:who-depends-on
           #:bundle-systems))

(in-package #:quicklisp-client)
