summaryrefslogtreecommitdiff
path: root/elpa/req-package-20180605.1141/req-package.el
diff options
context:
space:
mode:
authormattkae <mattkae@protonmail.com>2022-05-11 09:23:58 -0400
committermattkae <mattkae@protonmail.com>2022-05-11 09:23:58 -0400
commit3f4a0d5370ae6c34afe180df96add3b8522f4af1 (patch)
treeae901409e02bde8ee278475f8cf6818f8f680a60 /elpa/req-package-20180605.1141/req-package.el
initial commit
Diffstat (limited to 'elpa/req-package-20180605.1141/req-package.el')
-rw-r--r--elpa/req-package-20180605.1141/req-package.el494
1 files changed, 494 insertions, 0 deletions
diff --git a/elpa/req-package-20180605.1141/req-package.el b/elpa/req-package-20180605.1141/req-package.el
new file mode 100644
index 0000000..d209d50
--- /dev/null
+++ b/elpa/req-package-20180605.1141/req-package.el
@@ -0,0 +1,494 @@
+;;; req-package.el --- A use-package wrapper for package runtime dependencies management
+
+;; Copyright (C) 2013-2018 Edward Knyshov
+
+;; Author: Edward Knyshov <edvorg@gmail.com>
+;; Created: 25 Dec 2013
+;; Version: 1.3
+;; Package-Requires: ((use-package "1.0") (dash "2.7.0") (log4e "0.2.0") (ht "0"))
+;; Keywords: dotemacs startup speed config package
+;; X-URL: https://github.com/edvorg/req-package
+
+;; This program 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, or (at
+;; your option) any later version.
+
+;; This program 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; Table of Contents
+;; ─────────────────
+
+;; 1 req-package
+;; .. 1.1 Description
+;; .. 1.2 Usage
+;; .. 1.3 Logging
+;; .. 1.4 Migrate from use-package
+;; .. 1.5 Note
+;; .. 1.6 Contribute
+;; .. 1.7 Changelog
+;; ..... 1.7.1 `v1.3'
+;; ..... 1.7.2 `v1.2'
+;; ..... 1.7.3 `v1.1'
+;; ..... 1.7.4 `v1.0'
+;; ..... 1.7.5 `v0.9'
+;; ..... 1.7.6 `v0.8'
+;; ..... 1.7.7 `v0.7'
+;; ..... 1.7.8 `v0.6'
+;; ..... 1.7.9 `v0.5'
+;; ..... 1.7.10 `v0.4.2'
+;; ..... 1.7.11 `v0.4.1'
+;; ..... 1.7.12 `v0.4-all-cycles'
+;; ..... 1.7.13 `v0.3-cycles'
+;; ..... 1.7.14 `v0.2-auto-fetch'
+
+
+;; 1 req-package
+;; ═════════════
+
+;; [file:https://img.shields.io/badge/license-GPL_3-green.svg]
+;; [file:http://melpa.org/packages/req-package-badge.svg]
+;; [file:http://stable.melpa.org/packages/req-package-badge.svg]
+;; [file:https://travis-ci.org/edvorg/req-package.svg]
+;; [file:https://coveralls.io/repos/edvorg/req-package/badge.svg?branch=develop&service=github]
+
+
+;; [file:https://img.shields.io/badge/license-GPL_3-green.svg]
+;; http://www.gnu.org/licenses/gpl-3.0.txt
+
+;; [file:http://melpa.org/packages/req-package-badge.svg]
+;; http://melpa.org/#/req-package
+
+;; [file:http://stable.melpa.org/packages/req-package-badge.svg]
+;; http://stable.melpa.org/#/req-package
+
+;; [file:https://travis-ci.org/edvorg/req-package.svg]
+;; https://travis-ci.org/edvorg/req-package
+
+;; [file:https://coveralls.io/repos/edvorg/req-package/badge.svg?branch=develop&service=github]
+;; https://coveralls.io/github/edvorg/req-package?branch=develop
+
+;; 1.1 Description
+;; ───────────────
+
+;; `req-package' provides dependency management for use-package. This
+;; allows to write simple and modular configs. Migration from
+;; use-package is simple and syntax is almost same.
+
+
+;; 1.2 Usage
+;; ─────────
+
+;; Load req-package:
+
+;; ┌────
+;; │ (require 'req-package)
+;; │
+;; │ (req-package use-package-el-get ;; prepare el-get support for use-package (optional)
+;; │ :force t ;; load package immediately, no dependency resolution
+;; │ :config
+;; │ (add-to-list 'el-get-recipe-path "~/.emacs.d/el-get/el-get/recipes")
+;; │ (el-get 'sync)
+;; │ (use-package-el-get-setup))
+;; └────
+
+;; Define required packages with dependencies using `:require'. Use
+;; `:force t' if you want to avoid dependency management and load right
+;; now. Use `:el-get t' or `:el-get package-name' if you want to install
+;; from el-get (Requires `use-package-el-get' package setup like
+;; described above).
+
+;; ┌────
+;; │ ;; init-dired.el
+;; │
+;; │ (req-package dired) ;; this form is optional as it doesn't have any configuration
+;; │
+;; │ (req-package dired-single
+;; │ :require dired ;; depends on dired
+;; │ :config (...))
+;; │
+;; │ (req-package dired-isearch
+;; │ :require dired ;; depends on dired
+;; │ :config (...))
+;; │
+;; │ ;; init-lua.el
+;; │
+;; │ (req-package lua-mode
+;; │ :config (...))
+;; │
+;; │ (req-package flymake-lua
+;; │ :require flymake lua-mode
+;; │ :config (...))
+;; │
+;; │ ;; init-flymake.el
+;; │
+;; │ (req-package flymake
+;; │ :config (...))
+;; │
+;; │ (req-package flymake-cursor
+;; │ :require flymake
+;; │ :config (...))
+;; │
+;; │ (req-package flymake-custom
+;; │ :require flymake
+;; │ :load-path "/path/to/file/directory"
+;; │ :config (...))
+;; └────
+
+;; Solve dependencies, install and load packages in right order:
+
+;; ┌────
+;; │ ;; order doesn't matter here
+;; │ (require 'init-dired)
+;; │ (require 'init-lua)
+;; │ (require 'init-flymake)
+;; │ (req-package-finish)
+;; └────
+
+
+;; 1.3 Logging
+;; ───────────
+
+;; You can use `req-package--log-open-log' to see, what is happening with
+;; your configuration. You can choose log level in `req-package' group
+;; by `req-package-log-level' custom. These log levels are supported:
+;; `fatal', `error', `warn', `info', `debug', `trace'.
+
+
+;; 1.4 Migrate from use-package
+;; ────────────────────────────
+
+;; Just replace all `(use-package ...)' with `(req-package [:require
+;; DEPS] ...)' and add `(req-package-finish)' at the end of your
+;; configuration file. There is a `:force' keyword which simulates plain
+;; old use-package behavior.
+
+
+;; 1.5 Note
+;; ────────
+
+;; More complex req-package usage example can be found at
+;; [https://github.com/edvorg/emacs-configs].
+
+;; Use `load-dir' package to load all `*.el' files in a dir (e.g
+;; `~/.emacs.d/init.d')
+
+
+;; 1.6 Contribute
+;; ──────────────
+
+;; Please, pull-request your changes to `develop' branch. Master is used
+;; for automatic *release* package builds by travis-ci.
+
+
+;; 1.7 Changelog
+;; ─────────────
+
+;; 1.7.1 `v1.3'
+;; ╌╌╌╌╌╌╌╌╌╌╌╌
+
+;; • :el-get keyword support moved to separate package
+;; [use-package-el-get]
+
+
+;; [use-package-el-get] https://github.com/edvorg/use-package-el-get
+
+
+;; 1.7.2 `v1.2'
+;; ╌╌╌╌╌╌╌╌╌╌╌╌
+
+;; • add :el-get keyword
+
+
+;; 1.7.3 `v1.1'
+;; ╌╌╌╌╌╌╌╌╌╌╌╌
+
+;; • due to use-package being mature enough drop providers system
+
+
+;; 1.7.4 `v1.0'
+;; ╌╌╌╌╌╌╌╌╌╌╌╌
+
+;; • once you called `req-package-finish' you are able reload package
+;; just by reload `req-package' form
+;; • proper errors handling. see `req-package--log-open-log' for messages
+;; • smart add-hook which invokes function if mode is loaded
+;; • refactor providers system
+;; • no need to use progn in :init and :config sections
+;; • no need to use list literal in :require section
+;; • `:loader' keyword now accepts loaders as keywords or as functions.
+;; e.g. `:el-get', `:elpa', `:built-in', `:path' and `my-loader-fn'
+;; • `req-package-force' replaced with `:force' keyword
+
+
+;; 1.7.5 `v0.9'
+;; ╌╌╌╌╌╌╌╌╌╌╌╌
+
+;; • `:loader' keyword support
+
+
+;; 1.7.6 `v0.8'
+;; ╌╌╌╌╌╌╌╌╌╌╌╌
+
+;; • bugfixes
+
+
+;; 1.7.7 `v0.7'
+;; ╌╌╌╌╌╌╌╌╌╌╌╌
+
+;; • fixed some issues with packages installation. all packages will be
+;; installed at bootstrap time
+;; • custom package providers support by `req-package-providers'
+;; • priority feature for cross provider packages loading. you can
+;; choose, what to try first - elpa, el-get, or something else
+
+
+;; 1.7.8 `v0.6'
+;; ╌╌╌╌╌╌╌╌╌╌╌╌
+
+;; • `el-get' support
+
+
+;; 1.7.9 `v0.5'
+;; ╌╌╌╌╌╌╌╌╌╌╌╌
+
+;; • Major system refactoring.
+;; • Fixed bugs with defered loading.
+;; • Significant performance optimization.
+;; • `max-specpdl-size', `max-lisp-eval-depth' issues completely solved.
+;; • Flexible `:require' keyword parsing.
+
+
+;; 1.7.10 `v0.4.2'
+;; ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
+
+;; • Bug fixes.
+
+
+;; 1.7.11 `v0.4.1'
+;; ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
+
+;; • Various tweaks and bug fixes.
+
+
+;; 1.7.12 `v0.4-all-cycles'
+;; ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
+
+;; • All cycles of your dependencies will be printed now.
+;; • Also there are more handy log messages and some bug fixes.
+
+
+;; 1.7.13 `v0.3-cycles'
+;; ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
+
+;; • There are nice error messages about cycled dependencies now.
+;; • Cycles printed in a way: `pkg1 -> [pkg2 -> ...] pkg1'.
+;; • It means there is a cycle around `pkg1'.
+
+
+;; 1.7.14 `v0.2-auto-fetch'
+;; ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
+
+;; • There is no need of explicit `:ensure' in your code now.
+;; • When you req-package it adds `:ensure' if package is available in
+;; your repos.
+;; • Also package deps `:ensure''d automatically too.
+;; • Just write `(req-package pkg1 :require pkg2)' and all you need will
+;; be installed.
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+(require 'package)
+
+(defun req-package-bootstrap (package)
+ "Refresh package archives, check PACKAGE presence and install if it's not installed."
+ (if (null (require package nil t))
+ (progn (let* ((ARCHIVES (if (null package-archive-contents)
+ (progn (package-refresh-contents)
+ package-archive-contents)
+ package-archive-contents))
+ (AVAIL (assoc package ARCHIVES)))
+ (if AVAIL
+ (package-install package))))))
+
+(req-package-bootstrap 'use-package)
+(req-package-bootstrap 'dash)
+(req-package-bootstrap 'log4e)
+(req-package-bootstrap 'ht)
+
+(require 'use-package)
+(require 'dash)
+(require 'log4e)
+(require 'ht)
+
+(require 'req-package-hooks)
+(require 'req-package-args)
+(require 'req-package-cycles)
+
+(defgroup req-package nil
+ "A package loading system"
+ :group 'emacs)
+
+(defcustom req-package-log-level 'info
+ "Minimal log level, may be any level supported by log4e."
+ :group 'req-package)
+
+(defvar req-package-required-by (make-hash-table :size 200 :test 'equal)
+ "Package symbol -> list of packages dependent on it.")
+
+(defvar req-package-deps-left (make-hash-table :size 200 :test 'equal)
+ "Package symbol -> loaded dependencies counter.")
+
+(defvar req-package-evals (make-hash-table :size 200 :test 'equal)
+ "Package symbol -> loading code prepared for evaluation.")
+
+(defvar req-package-branches (make-hash-table :size 200 :test 'equal))
+
+(defun req-package-patch-config (pkg form)
+ "Wrap package PKG :config FORM into progn with callbacks."
+ (list 'progn
+ (list 'req-package-handle-loading (list 'quote pkg) (list 'lambda () form))
+ (list 'req-package-loaded (list 'quote pkg))))
+
+(defun req-package-eval-form (EVAL)
+ "Logs, macroexpands and evaluates EVAL form."
+ (req-package--log-trace "eval %s" EVAL)
+ (eval (macroexpand-all EVAL)))
+
+(defun req-package-eval (pkg)
+ "Evaluate package PKG request."
+ (let* ((DEFAULT (req-package-gen-eval pkg (list 'progn) (req-package-patch-config pkg nil) nil))
+ (EVAL (gethash pkg req-package-evals DEFAULT))
+ (PKG pkg))
+ (req-package-handle-loading PKG (lambda () (req-package-eval-form EVAL)))))
+
+(defun req-package-loaded (pkg)
+ "Called after package PKG loaded to continue dependency graph traverse."
+ (req-package--log-info "package loaded: %s" pkg)
+ (let* ((EVALS (-reduce-from
+ (lambda (memo dependent)
+ (let* ((DEPS-LEFT (- (gethash dependent req-package-deps-left 0) 1)))
+ (puthash dependent DEPS-LEFT req-package-deps-left)
+ (if (equal 0 DEPS-LEFT)
+ (cons dependent memo)
+ memo)))
+ nil
+ (gethash (car pkg) req-package-required-by nil))))
+ (-each EVALS (lambda (pkg)
+ (puthash pkg -1 req-package-deps-left)
+ (req-package-eval pkg)))))
+
+(defun req-package-handle-loading (pkg f)
+ "Error handle for package PKG loading process by calling F."
+ (condition-case-unless-debug e
+ (funcall f)
+ (error (req-package--log-error (format "Unable to load package %s -- %s" pkg e)))))
+
+(defun req-package-gen-eval (package init config rest)
+ "Generate eval for PACKAGE."
+ (let* ((package (car package)))
+ (append (list 'use-package package)
+ (list :init init)
+ (list :config config)
+ rest)))
+
+(defun req-package-schedule (PKG DEPS EVAL)
+ (let* ((DEPS-LEFT (gethash PKG req-package-deps-left 0))
+ (BRANCHES (ht-get req-package-branches (car PKG))))
+ (req-package--log-debug "package requested: %s %s" PKG EVAL)
+ (puthash PKG EVAL req-package-evals)
+ (ht-set req-package-branches (car PKG) (cons PKG BRANCHES))
+ (if (= DEPS-LEFT -1)
+ (progn ;; package already been loaded before, just eval again
+ (req-package-handle-loading PKG (lambda () (req-package-eval-form EVAL)))
+ DEPS-LEFT)
+ (progn ;; insert package in dependency graph
+ (puthash PKG 0 req-package-deps-left)
+ (-each DEPS
+ (lambda (req)
+ (let* ((REQUIRED-BY (gethash req req-package-required-by nil))
+ (DEPS-LEFT (gethash PKG req-package-deps-left 0))
+ (REQ-DEPS-LEFT (gethash req req-package-deps-left 0))
+ (BRANCHES (ht-get req-package-branches req)))
+ (ht-set req-package-branches req BRANCHES)
+ (when (not (equal -1 REQ-DEPS-LEFT))
+ (puthash req (cons PKG REQUIRED-BY) req-package-required-by)
+ (puthash PKG (+ DEPS-LEFT 1) req-package-deps-left)))))))))
+
+(defmacro req-package (pkg &rest args)
+ "Add package PKG with ARGS to target list."
+ `(let* ((PKG ',pkg)
+ (ARGS ',args)
+ (SPLIT1 (req-package-args-extract-arg :require ARGS nil))
+ (SPLIT2 (req-package-args-extract-arg :init (cadr SPLIT1) nil))
+ (SPLIT3 (req-package-args-extract-arg :config (cadr SPLIT2) nil))
+ (SPLIT4 (req-package-args-extract-arg :force (cadr SPLIT3) nil))
+ (DEPS (-flatten (car SPLIT1)))
+ (INIT (cons 'progn (car SPLIT2)))
+ (PKG (list PKG DEPS))
+ (CONFIG (req-package-patch-config PKG (cons 'progn (car SPLIT3))))
+ (FORCE (caar SPLIT4))
+ (REST (cadr SPLIT4))
+ (EVAL (req-package-gen-eval PKG INIT CONFIG REST)))
+ (if FORCE
+ (progn ;; load avoiding dependency management
+ (req-package--log-debug "package force-requested: %s %s" PKG EVAL)
+ (req-package-handle-loading PKG (lambda () (req-package-eval-form EVAL))))
+ (req-package-schedule PKG DEPS EVAL))))
+
+(defmacro req-package-force (pkg &rest args)
+ `(let* ((PKG ',pkg)
+ (ARGS ',args))
+ (eval (macroexpand-all (apply 'list 'req-package PKG :force t ARGS)))))
+
+(defun req-package-finish ()
+ "Start loading process, call this after all req-package invocations."
+ ;; (req-package-cycles-detect req-package-required-by) ;; FIXME
+ (req-package--log-debug "package requests finished: %s packages are waiting"
+ (hash-table-count req-package-branches))
+ (maphash (lambda (req branches)
+ (when (not branches)
+ (let* ((REQ-PKG (list req nil))
+ (CURRENT (gethash REQ-PKG req-package-deps-left 0)))
+ (puthash REQ-PKG CURRENT req-package-deps-left))))
+ req-package-branches)
+ (maphash (lambda (key value)
+ (when (equal (gethash key req-package-deps-left 0) 0)
+ (puthash key -1 req-package-deps-left)
+ (req-package-eval key)))
+ req-package-deps-left))
+
+(put 'req-package 'lisp-indent-function 'defun)
+(put 'req-package-force 'lisp-indent-function 'defun)
+(put 'req-package-hooks-add-execute 'lisp-indent-function 'defun)
+(put 'req-package-hooks-add-execute-impl 'lisp-indent-function 'defun)
+
+(defconst req-package-font-lock-keywords
+ '(("(\\(req-package\\|req-package-force\\)\\_>[ \t']*\\(\\(?:\\sw\\|\\s_\\)+\\)?"
+ (1 font-lock-keyword-face)
+ (2 font-lock-constant-face nil t))))
+
+(font-lock-add-keywords 'emacs-lisp-mode req-package-font-lock-keywords)
+
+(log4e:deflogger "req-package" "%t [%l] %m" "%H:%M:%S")
+(req-package--log-set-level req-package-log-level)
+(req-package--log-enable-logging)
+(req-package--log-clear-log)
+
+(provide 'req-package)
+
+;; Local Variables:
+;; indent-tabs-mode: nil
+;; End:
+;;; req-package.el ends here