Advertisement
debetimi

package-manager.clj

Mar 30th, 2014
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (use '[clojure.string :only [split, lower-case]])
  2.  
  3. (def DEPEND "depend")
  4. (def INSTALL "install")
  5. (def REMOVE "remove")
  6. (def UNINSTALL "uninstall")
  7. (def SYS "sys")
  8. (def LIST "list")
  9. (def INFO "info")
  10. (def EXIT "exit")
  11. (def END "end")
  12. (def all-packages (atom {}))
  13. (def installed-packages (atom (sorted-set)))
  14.  
  15. (defn in? [seq elm]
  16.   (some #(= elm %) seq))
  17.  
  18. (defn create
  19.   "makes a package element with provided name, option list of providers
  20.  are packages requried by package, optional list of clients are packages using
  21.  package"
  22.   ([name]
  23.     (create name #{} #{}))
  24.   ([name providers clients]
  25.     {:name name, :providers providers, :clients clients}))
  26.  
  27. (defn add-client
  28.   [package client]
  29.   (create (:name package) (:providers package) (conj (:clients package) client)))
  30.  
  31. (defn remove-client
  32.   [package client]
  33.   (create (:name package) (:providers package) (disj (:clients package) client)))
  34.  
  35. (defn add-provider
  36.   "add a provided to package"
  37.   ([package] package)
  38.   ([package provider]
  39.     (create (:name package) (conj (:providers package) provider) (:clients package)))
  40.   ([package provider & more-providers]
  41.     (reduce add-provider package (cons provider more-providers))))
  42.  
  43. (defn get-providers [package]
  44.   (get (get @all-packages package) :providers ))
  45.  
  46. (defn get-clients [package]
  47.   (get (get @all-packages package) :clients ))
  48.  
  49. (defn get-package [package]
  50.   (get @all-packages package))
  51.  
  52. (defn exists? [package]
  53.   (contains? @all-packages package))
  54.  
  55. (defn dependent? [first second]
  56.   (if (in? (cons first (get-providers first)) second)
  57.     (do (println (str "\t" first) "depends on" second) true)
  58.     (some #(dependent? % second) (get-providers first))))
  59.  
  60. (defn update-sys [package]
  61.   (swap! all-packages assoc (:name package) package))
  62.  
  63. (defn add-sys-package
  64.   "adds a package to all-packages"
  65.   [package & deps]
  66.   (doseq [dep deps]
  67.     (if-not (exists? dep) (update-sys (create dep))))
  68.   (if (not-any? #(dependent? % package) deps)
  69.     (update-sys (apply add-provider (cons (create package) deps)))
  70.     (println "Ignoring command")))
  71.  
  72. (defn print-sys []
  73.   (doseq [[k,v] @all-packages] (println "\t" v)))
  74.  
  75. (defn print-installed []
  76.   (doseq [v @installed-packages] (println "\t" v)))
  77.  
  78. (defn installed? [package]
  79.   (contains? @installed-packages package))
  80.  
  81. (defn install-new [package]
  82.   (do (println "\t installing" package)
  83.     (swap! installed-packages conj package)))
  84.  
  85. (defn install
  86.   [package self-install]
  87.   (if-not (exists? package) (add-sys-package package))
  88.   (if-not (installed? package)
  89.     (do (doseq [provider (get-providers package)] (if-not (installed? provider) (install provider false)))
  90.       (doseq [provider (get-providers package)] (update-sys (add-client (get-package provider) package)))
  91.       (install-new package))
  92.     (do
  93.       (if self-install (update-sys (add-client (get-package package) package)))
  94.       (println "\t" package "is already installed."))))
  95.  
  96. (defn not-needed? [package self-uninstall]
  97.   (def clients
  98.     (if self-uninstall
  99.       (disj (get-clients package) package)
  100.       (get-clients package)))
  101.   (empty? clients))
  102.  
  103. (defn uninstall-package [package]
  104.   (println "\t uninstalling" package)
  105.   (swap! installed-packages disj package))
  106.  
  107. (defn uninstall
  108.   [package self-uninstall]
  109.   (if (installed? package)
  110.     (if (not-needed? package self-uninstall)
  111.       (do (doseq [provider (get-providers package)] (update-sys (remove-client (get-package provider) package)))
  112.         (uninstall-package package)
  113.         (doseq [provider (filter #(not-needed? % false) (get-providers package))] (uninstall provider false)))
  114.       (println "\t" package "is still needed"))
  115.     (println "\t" package "is not installed")))
  116.  
  117. (def run (atom true))
  118.  
  119. (defn stop-run []
  120.   (reset! run false))
  121.  
  122. (defn exit []
  123.   (println "goodbye") (stop-run))
  124.  
  125. (defn runprog []
  126.   (println "starting")
  127.   (reset! run true)
  128.   (while (true? @run)
  129.     (def line (read-line))
  130.     (def command (first (split line #" +")))
  131.     (def args (rest (split line #" +")))
  132.     (condp = (lower-case command)
  133.       DEPEND (apply add-sys-package args)
  134.       LIST (print-installed)
  135.       INSTALL (install (first args) true)
  136.       INFO (println (get-package (first args)))
  137.       REMOVE (uninstall (first args) true)
  138.       UNINSTALL (uninstall (first args) true)
  139.       SYS (print-sys)
  140.       EXIT (exit)
  141.       END (exit)
  142.       ())))
  143.  
  144. (runprog)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement