Skip to content

Commit

Permalink
multiple dependency branches fix #18 fix #26
Browse files Browse the repository at this point in the history
  • Loading branch information
edvorg committed May 30, 2016
1 parent 166e190 commit 3df738a
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 30 deletions.
62 changes: 37 additions & 25 deletions req-package.el
Expand Up @@ -345,6 +345,8 @@
(defvar req-package-loaders (make-hash-table :size 200 :test 'equal)
"Package symbol -> loader function to load package by.")

(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
Expand All @@ -365,9 +367,11 @@
(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)))
(if (equal 0 DEPS-LEFT)
(cons dependent memo)
memo)))
nil
(gethash pkg req-package-required-by nil))))
(gethash (car pkg) req-package-required-by nil))))
(-each EVALS (lambda (pkg)
(puthash pkg -1 req-package-deps-left)
(req-package-eval pkg)))))
Expand All @@ -380,16 +384,19 @@

(defun req-package-gen-eval (package init config rest)
"Generate eval for PACKAGE."
(append (list 'use-package package)
(list :init init)
(list :config config)
rest))

(defun req-package-insert (PKG LOADER EVAL)
(let* ((DEPS-LEFT (gethash PKG req-package-deps-left 0)))
(req-package--log-debug "package requested: %s %s" PKG ARGS)
(puthash PKG LOADER req-package-loaders)
(let* ((package (car package)))
(append (list 'use-package package)
(list :init init)
(list :config config)
rest)))

(defun req-package-schedule (PKG LOADER 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 (car PKG) LOADER req-package-loaders)
(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 () (eval EVAL)))
Expand All @@ -400,8 +407,9 @@
(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)))
(puthash req (gethash req req-package-deps-left 0) req-package-deps-left)
(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)))))))))
Expand All @@ -420,32 +428,36 @@
(DEPS (-flatten (car SPLIT1)))
(LOADER (caar SPLIT2))
(INIT (cons 'progn (car SPLIT3)))
(PKG (list PKG DEPS))
(CONFIG (req-package-patch-config PKG (cons 'progn (car SPLIT4))))
(FORCE (caar SPLIT5))
(DEP-INIT (caar SPLIT6))
(DEP-CONFIG (caar SPLIT7))
(REST (cadr SPLIT7))
(EVAL (req-package-gen-eval PKG INIT CONFIG REST)))
(if (and LOADER
(not (ht-get (req-package-providers-get-map) LOADER)))
(if (and LOADER (not (ht-get (req-package-providers-get-map) LOADER)))
(req-package--log-error "unable to find loader %s for package %s" LOADER PKG)
(if FORCE
(progn ;; load avoiding dependency management
(req-package--log-debug "package force-requested: %s %s" PKG ARGS)
(req-package--log-debug "package force-requested: %s %s" PKG EVAL)
(req-package-handle-loading PKG
(lambda ()
(req-package-providers-prepare PKG LOADER)
(eval EVAL))))
(req-package-insert PKG LOADER EVAL)))))
(lambda ()
(req-package-providers-prepare (car PKG) LOADER)
(eval EVAL))))
(req-package-schedule PKG LOADER EVAL)))))

(defun req-package-finish ()
"Start loading process, call this after all req-package invocations."
(req-package-cycles-detect req-package-required-by)
;; (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-deps-left))
(maphash (lambda (key value)
(req-package-providers-prepare key (gethash key req-package-loaders nil)))
req-package-deps-left)
(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-providers-prepare req (gethash req req-package-loaders nil)))
req-package-branches)
(maphash (lambda (key value)
(when (equal (gethash key req-package-deps-left 0) 0)
(puthash key -1 req-package-deps-left)
Expand Down
10 changes: 5 additions & 5 deletions test/req-package-test.el
Expand Up @@ -35,12 +35,12 @@
(expect '(5) (car (req-package-args-extract-arg :config'(:config 5 :init 6) nil)))
(expect '(6 :hello) (car (req-package-args-extract-arg :init '(:config 5 :world :init 6 :hello) nil)))
(expect '(:world 5) (car (req-package-args-extract-arg :config'(:config :world 5 :init 6 :hello) nil)))
(desc "req-package-patch-config should include req-package-loaded callback in :config")
(expect '(progn (req-package-handle-loading (quote foo) (lambda nil nil)) (req-package-loaded (quote foo)))
(req-package-patch-config 'foo '()))
;; (desc "req-package-patch-config should include req-package-loaded callback in :config")
(expect '(progn (req-package-handle-loading (quote (foo nil)) (lambda nil nil)) (req-package-loaded (quote (foo nil))))
(req-package-patch-config '(foo nil) '()))
(desc "req-package-gen-eval should generate valid use-package form")
(expect '(use-package bar :init nil :config nil)
(req-package-gen-eval 'bar nil nil nil))
(req-package-gen-eval '(bar nil) nil nil nil))
(desc "req-package-handle-loading should return eval value")
(expect 1
(req-package-handle-loading 'foo (lambda () 1)))
Expand All @@ -53,7 +53,7 @@
(expect "joker"
(with-mock
(stub gethash => "joker")
(req-package-eval 'evil)))
(req-package-eval '(evil niil))))
(desc "req-package-hooks-add-execute should return hook value if invoked")
(expect "loaded"
(with-mock
Expand Down

0 comments on commit 3df738a

Please sign in to comment.