diff --git a/README.md b/README.md index 11149ca9..e9699919 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,7 @@ code using simple recipes. (Think of it as a server-side version of [el-get](https://github.com/dimitri/el-get), or even [homebrew](https://github.com/mxcl/homebrew).) -Packages are updated when changes are made to the MELPA repository, -or at least daily. +Packages are updated hourly. If you just want to browse and install packages, check out the [archive index page](http://melpa.milkbox.net/) for instructions. @@ -15,85 +14,115 @@ If you just want to browse and install packages, check out the Adding packages is as simple as submitting a pull request; read on for details. -### About the name +## Table of Contents -*MELPA* is *Milkypostman's ELPA* or *Milkypostman's Experimental Lisp - Package Archive* if you're not into the whole brevity thing. +* [Usage](#usage) +* [Contributing](#contributing-new-packages) +* [Package Format](#package-format) +* [Server Scripts](#server-scripts) +* [API](#api) +* [MELPA Package](#melpa-package) +* [About](#about) -## Scripts -* `buildpkg` -- Create an archive of the package(s) passed as -arguments to the script. Built packages are put in the `packages/` -folder with version corresponding to the newest HEAD revision -available; given according to the `%Y%m%d` format. +## Usage -* `melpa` -- All the logic for generating everything in the repository -based on the recipe files. By default this will clean the `packages/` directory, -build all packages -listed under `recipes/`, and compile the `index.html` file for the [melpa] -website front page. +To use the MELPA repository, add it to `package-archives` before the +call to `package-initialize` in your `init.el` file. -The following arguments are accepted: + (add-to-list 'package-archives + '("melpa" . "http://melpa.milkbox.net/packages/") t) + +Since `package.el` doesn't allow locking packages to certain version, +we also provide a package `melpa.el` which contains code to allow +restricting packages to specific repositories. This allows someone to +blacklist packages that come from a specific repository, or blacklist +all packages from a repository and only whitelist certain packages. -clear -: clean out the `packages/` directory +See the [MELPA Package](#melpa-package) section below or +[Installing](http://melpa.milkbox.net/#installing) section on the +MELPA homepage. -build -: build all packages in `pkglist` - -index -: build the `index.html` file - -validate -: naively validate that the correct number of packages were built. - -Note that these scripts require an Emacs with `package.el` installed, -such as Emacs 24. If you have an older version of Emacs, you can get a -suitable `package.el` [here](http://bit.ly/pkg-el23). - -[melpa]: http://melpa.milkbox.net - -## Code - -The `package-build.el` file contains all the heavy lifting. The -scripts above call the `package-build-archive` function from the -command-line to actually build the package(s). - -Use `(package-build-all)` to build all melpa packages. - -Alternatively you can -load this file from within Emacs and issues commands from there. - -The `package-build.el` automatically generates any required -information for the package. For multi-file packages this include -generating the file `-pkg.el` which contains *description*, -*version*, and *requires* information determined by searching -`-pkg.el`, `.el`, and `-pkg.el.in` if they exist in -the repository. ## Contributing New Packages +For submitting new packages we ask you following the following +guidelines, + +* Upstream source must be stored in an authoritative + [SCM](http://en.wikipedia.org/wiki/Software_configuration_management) + repository or on the Emacswiki. + + + + + +* Submit one pull request per recipe. You can create multiple + branches and create a pull request for each branch. + +* Recipes should try to minimize the size of the resulting package by + specifying only files relevant to the package. See the + [Package Format](#package-format) section for more information on + specifying package files. + +* The package name should match the name of the feature provided. See + the `package` function for more information. + +* Packages should adhere to the `package.el` format as specified by + `(info "(elisp) Packaging")`. More information on this format is + provided by the + [marmalade package manual](http://marmalade-repo.org/doc-files/package.5.html). + + + +### Testing + +Let `` denote the name of the recipe to submit. + +1. Fork the MELPA repository. +2. Add your new file under the directory specified by +`package-build-recipes-dir` (default: `recipes/` directory where +`package-build` was loaded). +3. Confirm your package build properly by running + + ./buildpkg + +4. Install the file you built by running `package-install-file` from +within Emacs and specifying the newly built package in the directory +specified by `package-build-archive-dir` (default: `packages/` +directory where `package-build` was loaded). + +### Submitting + +After verifying the entry works properly please open a pull request on +Github. Consider the [hub](https://github.com/defunkt/hub) +command-line utility by [defunkt](http://chriswanstrath.com/) which +helps simplify this process. + + +## Package Format + Packages are specified by files in the `recipes` directory. You can contribute a new package by adding a new file under `recipes` using the following form, ```elisp -(name +( :fetcher [git|github|bzr|hg|darcs|svn|wiki] [:url ""] [:repo "github-user/repo-name"] [:files ("", ...)]) -``` +``` -`name` -: a lisp symbol that has the same name as the package being specified. +- `package-name` +a lisp symbol that has the same name as the package being specified. -`:url` -: specifies the URL of the version control repository. *required for +- `:url` +specifies the URL of the version control repository. *required for the `git`, `bzr`, `hg`, `darcs` and `svn` fetchers* -`:fetcher` -: specifies the type of repository that `:url` points to. Right now +- `:fetcher` +specifies the type of repository that `:url` points to. Right now package-build supports [git][git], [github][github], [bazaar (bzr)][bzr], [mercurial (hg)][hg], [subversion (svn)][svn], [darcs][darcs], and @@ -109,12 +138,13 @@ differs from the package name being built. In the case of the `github` fetcher, use `:repo` instead of `:url`; the git URL will then be deduced. -`:files` -: optional property specifying the explicit files used to build the +- `:files` +optional property specifying the explicit files used to build the package. Automatically populated by matching all `.el` files in the root of the repository. This is necessary when there are multiple `.el` files in the repository but the package should only be built -from a subset. +from a subset. *Any file in any path in the repository is copied to +the root of the package* [git]: http://git-scm.com/ [github]: https://github.com/ @@ -163,16 +193,157 @@ directory of the repository. The `starter-kit-bindings` repository is contained in the `modules/` subdirectory and thus needs the packages files specified explicitly. -### Submitting the Package -You should first fork the MELPA repository, add your new file under -`recipes`, and confirm your new package builds properly by running -`buildpkg `. You can install the package that you built by -running the interactive command `package-install-file` in Emacs, and -specifying the newly built package which should be in the `packages/` -subdirectory under the melpa directory. +### Multiple Files in Multiple Directories + +There are special cases when we need +There are special cases where creation of the package comes from many +different sub-directories in the repository and the destination +sub-directories need to be explicitly set. + +Consider the `flymake-perlcritic` recipe, + +```elisp +(flymake-perlcritic :repo "illusori/emacs-flymake-perlcritic" + :fetcher github + :files ("*.el" ("bin" "bin/flymake_perlcritic"))) +``` + +which will result in a package structure of, + +``` +flymake-perlcritic-YYYMMDD +|-- bin +| `-- flymake_perlcritic +|-- flymake-perlcritic-pkg.el +`-- flymake-perlcritic.el +``` + +Notice that specifying an entry in `:files` that is a list takes the +first element to be the destination directory. These can be embedded +further, such as the following---hypothetical---entry for `:files`, + +```elisp +("*.el" ("snippets" + ("html-mode" "snippets/html-mode/*") + ("python-mode" "snippets/python-mode/*"))) +``` + +which would result in a package with `*.el` in something like, + +``` +package-YYYYMMDD +|-- snippets +| |-- html-mode +| | |-- div +| | `-- html +| `-- python-mode +| |-- for +| `-- main +`-- package.el +``` + +But a better solution, given that we probably want to copy the +*entire* `snippets` directory to the root of the package, we could +just specify that directory. Consider the `pony-mode` recipe, + +```elisp +(pony-mode + :repo "davidmiller/pony-mode" + :fetcher github + :files ("src/*.el" "snippets")) +``` + +which generates the package, + +``` +pony-mode-YYYYMMDD +|-- pony-mode-pkg.el +|-- pony-mode.el +|-- pony-tpl.el +`-- snippets + |-- html-mode + | |-- bl + | |-- ex + | |-- for + | |-- if + | |-- loa + | |-- sup + | |-- testc + | `-- {{ + `-- python-mode + |-- auth-view + |-- bn + |-- model + |-- modelform + |-- render-to + |-- testc + `-- view +``` + + +## Build Scripts + +The scripts described here + +* `buildpkg` -- Create an archive of the package(s) passed as +arguments to the script. Built packages are put in the `packages/` +folder with version corresponding to the newest HEAD revision +available; given according to the `%Y%m%d` format. + +* `melpa` -- All the logic for generating everything in the repository +based on the recipe files. By default build all packages listed under +`recipes/`, and compile the `index.html` file for the [melpa] website. + + The following arguments are accepted: + + clear : clean out the `packages/` directory + + build : build all packages in `pkglist` + + index : build the `index.html` file + + validate :naively validate that the correct number of packages were built. + + Note that these scripts require an Emacs with `package.el` installed, + such as Emacs 24. If you have an older version of Emacs, you can get a + suitable `package.el` [here](http://bit.ly/pkg-el23). + +[melpa]: http://melpa.milkbox.net + +## API + +All repository code is contained in the `package-build.el`. + +### Functions + +- `(package-build-all)` : build packages for all recipes in the +directory specified by `package-build-recipes-dir`. + + +- `(package-build-archive NAME)` : interactive elisp function to build +a single archive. NAME is a symbol for the package to be built. +Packages are staged in the directory specified by +`package-build-working-dir` and built packages are placed in the +directory specified by `package-build-archive-dir`. Packages are +versioned based on the most recent commit date to package files based +on commits to upstream package repository. For multi-file packages, +the file `-pkg.el` is automatically generated and contains +*description*, *version*, and *requires* information determined by +searching `-pkg.el`, `.el`, and `-pkg.el.in`, if +they exist in the repository. + +### Variables + +- `package-build-working-dir` : Staging area containing package +repositories and package directories being built. + +- `package-build-archive-dir` : Location to store `archive-contents` and +any built packages. + +- `package-build-recipes-dir` : Directory containing MELPA compatible +recipes. See [Package Format](#package-format) section for more details. -After verifying the entry works properly please open a pull request on Github. ## Configuration @@ -181,3 +352,61 @@ This can be configured using the `package-build-archive-dir` variable. Repositories are checked out to the `working/` directory by default. This can be configured using the `package-build-working-dir` variable. + +## MELPA Package + +The `melpa.el` package---available in MELPA--allows creating a +whitelist or blacklist of packages for a specific repository. This +allows for disabling all packages from a specific repository and only +enabling certain packages, or simply blacklist a certain subset of packages. + +### Configuring + +By default there are two variables that can be customized to specify +which packages will be enabled (whitelist packages only) or excluded +(blacklist of packages) + + +- `package-archive-enable-alist` : Optional Alist of enabled packages + used by `package-filter`. The format is (ARCHIVE . PACKAGE ...), + where ARCHIVE is a string matching an archive name in + `package-archives`, PACKAGE is a symbol of a package in ARCHIVE to + enable. If no ARCHIVE exists in the alist, all packages are + enabled. + + If no ARCHIVE exists in the alist, all packages are enabled. + + + +- `package-archive-exclude-alist` : Alist of packages excluded by + `package-filter`. The format is (ARCHIVE . PACKAGE ...), where + ARCHIVE is a string matching an archive name in + `package-archives`, PACKAGE is a symbol of a package in that + archive to exclude. Any specified package is excluded regardless + of the value of `package-archive-enable-alist` + + + If a particular ARCHIVE has an entry in +`package-archive-enable-alist` then only packages + + + +### Manual Installation + +You can install the package manually by pasting this into yoru `*scratch*` buffer and evaluating it. + + (progn + (switch-to-buffer + (url-retrieve-synchronously + "https://raw.github.com/milkypostman/melpa/master/melpa.el")) + (package-install-from-buffer (package-buffer-info) 'single)) + + + + + +## About + +*MELPA* is *Milkypostman's ELPA* or *Milkypostman's Experimental Lisp + Package Archive* if you're not into the whole brevity thing. + diff --git a/buildpkg b/buildpkg index 0c7518d6..b03337d8 100755 --- a/buildpkg +++ b/buildpkg @@ -4,4 +4,4 @@ (require 'package-build) -(mapc 'package-build-archive argv) +(mapc 'package-build-archive (mapcar 'intern argv)) diff --git a/html/index.erb b/html/index.erb index bcbcff91..4abe5060 100644 --- a/html/index.erb +++ b/html/index.erb @@ -1,23 +1,21 @@ %% MELPA +*MELPA* or *Milkypostman's ELPA* or *Milkypostman's Experimental Lisp Package Repository* if you're not into the whole brevity thing. + [ [Packages](#current-list-of-packages) ] [ [Installing](#installing) ] [ [Known Issues](#known-issues) ] [ [Updating Packages](#updating-packages) ] [ [Development](#development) ] -*MELPA* or *Milkypostman's ELPA* or *Milkypostman's Experimental Lisp Package Repository* if you're not into the whole brevity thing. - -> a repository for development versions of Emacs packages (hot from the repo). - -**Last Update:** *<%= Time.now.strftime("%Y.%m.%d %H:%M") %>* +**Last Update:** *<%= Time.now.strftime("%Y.%m.%d %H:%M %z") %>* ## Current List of Packages <% def parse str # credit to: http://stackoverflow.com/q/3128406/154508 - tokens = str.scan(/#{Regexp.escape("(")}|#{Regexp.escape(")")}|[a-zA-Z0-9\'\-\_\+]+/) + tokens = str.scan(/#{Regexp.escape("(")}|#{Regexp.escape(")")}|"(?:\\.|[^"])+"|[a-zA-Z0-9\'\-\_\+]+/) stack = [[]] @@ -27,6 +25,8 @@ stack << [] when ")" stack[-2] << stack.pop + when /^"(.*)\"$/ + stack[-1] << $1 else stack[-1] << tok end @@ -36,17 +36,24 @@ end - headers = ["Package", "Version", "Description"] + headers = ["Package", "Version", "Description", "Source"] data = parse(File.open("../packages/archive-contents").read)[1..-1] data.map! do |row| - [row[0], row[1][0], row[3..-2].join(" ")] + pkgname = row[0] + pkgurl = "packages/#{row[0]}-#{row[1]}." + (row[-1] == "single" ? "el" : "tar") + recipe_url = "https://github.com/milkypostman/melpa/blob/master/recipes/#{pkgname}" + descr, source = row[3..-2].join(" "), "other" + if descr =~ /(.*?)(\s*-\*-.*?)?\s*\[source:\s*(\w+)\]\s*/ + descr, source = $1, $3 + end + ["[#{pkgname}](#{pkgurl})", row[1][0], descr, "[#{source}](#{recipe_url})"] end data.sort! - colwidth = [0,0,0] + colwidth = [0,0,0, 9] data.map do |row| row.to_enum(:each_with_index).map do |e,i| diff --git a/html/style.css b/html/style.css index a9f0adf5..a0d6d9e3 100644 --- a/html/style.css +++ b/html/style.css @@ -53,7 +53,9 @@ pre code { pre { background: #000; color: #fff; - padding: 15px;} + padding: 15px; +} + hr { border: 0; width: 80%; @@ -78,6 +80,14 @@ td, th { padding: 2px 7px 2px 7px; } +tr { + color: #ddd; +} + +td:first-child a { + color: #fff; +} + tr.header { color: #000; background-color: #fad; diff --git a/melpa b/melpa index 976454bd..bfc4b144 100755 --- a/melpa +++ b/melpa @@ -7,6 +7,7 @@ cd ${BASEDIR} || exit 1 function melpa_clear_packages { echo "*** Clearing the packages folder..." + date rm -rf packages/* echo } @@ -14,12 +15,14 @@ function melpa_clear_packages { function melpa_build_pkglist { echo "*** Building all packages..." + date emacs --batch -l package-build.el --eval "(package-build-all)" echo } function melpa_generate_html { - echo "*** Building html" + echo "*** Building html..." + date cd html || return 1 erb index.erb > index.md pandoc --template=template.html --css=style.css -s --mathml -t html --smart index.md > index.html @@ -31,15 +34,8 @@ function trim { echo $1 } -function melpa_validate { - NUMPACKAGES=$(trim `ls recipes/* | wc -l`) - NUMBUILT=$(trim `ls packages/*.{el,tar} | wc -l`) - - echo "${NUMBUILT}/${NUMPACKAGES} packages built" -} - function print_usage { - echo "usage: $0 [-h | -?] [clear | build | html | validate]" + echo "usage: $0 [-h | -?] [clear | build | html ]" } args=`getopt h $*` @@ -66,7 +62,7 @@ done if [[ "$#" == "0" ]]; then - set -- clear build index validate + set -- build index fi for i; do @@ -74,7 +70,6 @@ for i; do clear ) melpa_clear_packages ;; build ) melpa_build_pkglist ;; html | index ) melpa_generate_html ;; - validate ) melpa_validate ;; esac shift done diff --git a/missing.el b/missing.el new file mode 100755 index 00000000..93fd0fbb --- /dev/null +++ b/missing.el @@ -0,0 +1,27 @@ +#!/usr/bin/env emacs --script + +(defun difference (left right) + "compare two lists" + (let ((caleft (car left)) + (caright (car right))) + (cond + ((not left) right) + ((not right) left) + ((string< caleft caright) + (cons caleft (difference (cdr left) right))) + ((string< caright caleft) + (cons caright (difference left (cdr right)))) + (t (difference (cdr left) (cdr right)))))) + +(defun stripstuff (fn) + "strip the date and extension" + (string-match "\\\(.*\\\)-[0-9]+\.\\\(el$\\\|tar$\\\)" fn) + (match-string 1 fn)) + +(mapc 'message + (difference + (sort (directory-files "recipes/" nil "[^.].*") 'string<) + (sort (mapcar 'stripstuff (directory-files "packages/" nil "[^.].*\\\(el$\\\|tar$\\\)")) 'string<))) + + + diff --git a/package-build.el b/package-build.el index 512e01d2..6e192969 100644 --- a/package-build.el +++ b/package-build.el @@ -1,6 +1,7 @@ ;;; package-build.el --- Tools for curating the package archive -;; Copyright (C) 2011 Donald Ephraim Curtis +;; Copyright (C) 2011-2012 Donald Ephraim Curtis +;; Copyright (C) 2012 Steve Purcell ;; Copyright (C) 2009 Phil Hagelberg ;; Author: Donald Ephraim Curtis @@ -8,11 +9,6 @@ ;; Version: 0.1 ;; Keywords: tools -;; -;; Credits: -;; Steve Purcell -;; - ;; This file is not (yet) part of GNU Emacs. ;; However, it is distributed under the same license. @@ -36,7 +32,7 @@ ;; This file allows a curator to publish an archive of Emacs packages. ;; The archive is generated from an index, which contains a list of -;; projects and repositories from which to get them. The term +;; projects and repositories from which to get them. The term ;; "package" here is used to mean a specific version of a project that ;; is prepared for download and installation. @@ -71,13 +67,35 @@ ;;; Internal functions -(defun pb/find-parse-time (regex) - "Find REGEX in current buffer and format as a proper time version." +(defun pb/parse-time (str) + "Parse STR as a time, and format as a YYYYMMDD string." + (message (format "%s\n" (substring-no-properties str))) (format-time-string "%Y%m%d" (date-to-time - (print (progn (re-search-backward regex) - (match-string-no-properties 1)))))) + (substring-no-properties str)))) + +(defun pb/string-match-all (regex str &optional group) + "Find every match for `REGEX' within `STR', returning the full match string or group `GROUP'." + (let (result + (pos 0) + (group (or group 0))) + (while (string-match regex str pos) + (push (match-string group str) result) + (setq pos (match-end group))) + result)) + +(defun pb/find-parse-time (regex &optional bound) + "Find REGEX in current buffer and format as a time version, optionally looking only as far as BOUND." + (pb/parse-time (progn (re-search-backward regex bound) + (match-string-no-properties 1)))) + +(defun pb/find-parse-time-latest (regex &optional bound) + "Find the latest timestamp matching REGEX, optionally looking only as far as BOUND." + (let* ((text (buffer-substring-no-properties + (or bound (point-min)) (point))) + (times (mapcar 'pb/parse-time (pb/string-match-all regex text 1)))) + (car (nreverse (sort times 'string<))))) (defun pb/run-process (dir prog &rest args) "In DIR (or `default-directory' if unset) run command PROG with ARGS. @@ -88,6 +106,14 @@ Output is written to the current buffer." (error "Program '%s' with args '%s' exited with non-zero status %d" prog args exit-code))))) +(defun pb/run-process-match (regex dir prog &rest args) + "Find match for REGEX when - in DIR, or `default-directory' if unset - we run PROG with ARGS." + (with-temp-buffer + (apply 'pb/run-process dir prog args) + (goto-char (point-min)) + (re-search-forward regex) + (match-string-no-properties 1))) + (defun pb/checkout (name config cwd) "Check out source for package NAME with CONFIG under working dir CWD. @@ -95,7 +121,10 @@ In turn, this function uses the :fetcher option in the config to choose a source-specific fetcher function, which it calls with the same arguments." (let ((repo-type (plist-get config :fetcher))) - (print repo-type) + (message (format "%s " repo-type)) + (unless (eq 'wiki repo-type) + (message (format "%s\n" + (or (plist-get config :repo) (plist-get config :url))))) (funcall (intern (format "pb/checkout-%s" repo-type)) name config cwd))) @@ -123,19 +152,23 @@ seconds; the server cuts off after 10 requests in 20 seconds.") (defun pb/grab-wiki-file (filename) "Download FILENAME from emacswiki, returning its last-modified time." - (let* ((download-url (format "http://www.emacswiki.org/emacs/download/%s" filename)) - (wiki-url (format "http://www.emacswiki.org/emacs/%s" filename))) + (let* ((download-url + (format "http://www.emacswiki.org/emacs/download/%s" filename)) + (wiki-url + (format "http://www.emacswiki.org/emacs/%s" filename))) (pb/with-wiki-rate-limit (url-copy-file download-url filename t)) + (when (zerop (nth 7 (file-attributes filename))) + (error "Wiki file %s was empty - has it been removed?" filename)) (with-current-buffer (pb/with-wiki-rate-limit (url-retrieve-synchronously wiki-url)) + (message (format "%s\n" download-url)) (pb/find-parse-time "Last edited \\([0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\} [0-9]\\{2\\}:[0-9]\\{2\\} [A-Z]\\{3\\}\\)")))) (defun pb/checkout-wiki (name config dir) "Checkout package NAME with config CONFIG from the EmacsWiki into DIR." (with-current-buffer (get-buffer-create "*package-build-checkout*") - (message dir) (unless (file-exists-p dir) (make-directory dir)) (let ((files (or (plist-get config :files) @@ -145,11 +178,7 @@ seconds; the server cuts off after 10 requests in 20 seconds.") (defun pb/darcs-repo (dir) "Get the current darcs repo for DIR." - (with-temp-buffer - (pb/run-process dir "darcs" "show" "repo") - (goto-char (point-min)) - (re-search-forward "Default Remote: \\(.*\\)") - (match-string-no-properties 1))) + (pb/run-process-match "Default Remote: \\(.*\\)" dir "darcs" "show" "repo")) (defun pb/checkout-darcs (name config dir) "Check package NAME with config CONFIG out of darcs into DIR." @@ -158,51 +187,60 @@ seconds; the server cuts off after 10 requests in 20 seconds.") (cond ((and (file-exists-p (expand-file-name "_darcs" dir)) (string-equal (pb/darcs-repo dir) repo)) - (print "checkout directory exists, updating...") + (pb/princ-exists dir) (pb/run-process dir "darcs" "pull")) (t (when (file-exists-p dir) (delete-directory dir t nil)) - (print "cloning repository") + (pb/princ-checkout repo dir) (pb/run-process nil "darcs" "get" repo dir))) - (pb/run-process dir "darcs" "changes" "--last" "1") + (apply 'pb/run-process dir "darcs" "changes" "--max-count" "1" + (pb/expand-source-file-list dir config)) (pb/find-parse-time "\\([a-zA-Z]\\{3\\} [a-zA-Z]\\{3\\} \\( \\|[0-9]\\)[0-9] [0-9]\\{2\\}:[0-9]\\{2\\}:[0-9]\\{2\\} [A-Za-z]\\{3\\} [0-9]\\{4\\}\\)")))) (defun pb/svn-repo (dir) - "Get the current svn repo for DIR." - (with-temp-buffer - (pb/run-process dir "svn" "info") - (goto-char (point-min)) - (re-search-forward "URL: \\(.*\\)") - (match-string-no-properties 1))) + "Get the current svn repo for DIR." + (pb/run-process-match "URL: \\(.*\\)" dir "svn" "info")) + +(defun pb/trim (str &optional chr) + "Return a copy of STR without any trailing CHR (or space if unspecified)." + (if (equal (elt str (1- (length str))) (or chr ? )) + (substring str 0 (1- (length str))) + str)) + +(defun pb/princ-exists (dir) + "Print a message that the contents of DIR will be updated." + (message (format "updating %s\n" dir))) + +(defun pb/princ-checkout (repo dir) + "Print a message that REPO will be checked out into DIR." + (message (format "cloning %s to %s\n" repo dir))) (defun pb/checkout-svn (name config dir) "Check package NAME with config CONFIG out of svn into DIR." - (let ((repo (plist-get config :url))) - (with-current-buffer (get-buffer-create "*package-build-checkout*") - (goto-char (point-max)) + (with-current-buffer (get-buffer-create "*package-build-checkout*") + (let ((repo (pb/trim (plist-get config :url) ?/)) + (bound (goto-char (point-max)))) (cond ((and (file-exists-p (expand-file-name ".svn" dir)) (string-equal (pb/svn-repo dir) repo)) - (print "checkout directory exists, updating...") + (pb/princ-exists dir) (pb/run-process dir "svn" "up")) (t (when (file-exists-p dir) (delete-directory dir t nil)) - (print "cloning repository") + (pb/princ-checkout repo dir) (pb/run-process nil "svn" "checkout" repo dir))) - (pb/run-process dir "svn" "info") - (pb/find-parse-time - "\\([0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\} [0-9]\\{2\\}:[0-9]\\{2\\}:[0-9]\\{2\\}\\)")))) + (apply 'pb/run-process dir "svn" "info" + (pb/expand-source-file-list dir config)) + (or (pb/find-parse-time-latest "Last Changed Date: \\([0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\} [0-9]\\{2\\}:[0-9]\\{2\\}:[0-9]\\{2\\}\\)" bound) + (error "No valid timestamps found!"))))) (defun pb/git-repo (dir) "Get the current git repo for DIR." - (with-temp-buffer - (pb/run-process dir "git" "remote" "show" "origin") - (goto-char (point-min)) - (re-search-forward "Fetch URL: \\(.*\\)") - (match-string-no-properties 1))) + (pb/run-process-match + "Fetch URL: \\(.*\\)" dir "git" "remote" "show" "-n" "origin")) (defun pb/checkout-git (name config dir) "Check package NAME with config CONFIG out of git into DIR." @@ -213,16 +251,17 @@ seconds; the server cuts off after 10 requests in 20 seconds.") (cond ((and (file-exists-p (expand-file-name ".git" dir)) (string-equal (pb/git-repo dir) repo)) - (print "checkout directory exists, updating...") + (pb/princ-exists dir) (pb/run-process dir "git" "pull")) (t (when (file-exists-p dir) (delete-directory dir t nil)) - (print (format "cloning %s to %s" repo dir)) + (pb/princ-checkout repo dir) (pb/run-process nil "git" "clone" repo dir))) (when commit (pb/run-process dir "git" "checkout" commit)) - (pb/run-process dir "git" "show" "-s" "--format='\%ci'" "HEAD") + (apply 'pb/run-process dir "git" "log" "-n1" "--pretty=format:'\%ci'" + (pb/expand-source-file-list dir config)) (pb/find-parse-time "\\([0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\} [0-9]\\{2\\}:[0-9]\\{2\\}:[0-9]\\{2\\}\\)")))) @@ -231,40 +270,37 @@ seconds; the server cuts off after 10 requests in 20 seconds.") (let* ((url (format "git://github.com/%s.git" (plist-get config :repo)))) (pb/checkout-git name (plist-put (copy-sequence config) :url url) dir))) +(defun pb/bzr-expand-repo (repo) + "Get REPO expanded name." + (pb/run-process-match "\\(?:branch root\\|repository branch\\): \\(.*\\)" nil "bzr" "info" repo)) + (defun pb/bzr-repo (dir) "Get the current bzr repo for DIR." - (with-temp-buffer - (pb/run-process dir "bzr" "info") - (goto-char (point-min)) - (re-search-forward "parent branch: \\(.*\\)") - (match-string-no-properties 1))) + (pb/run-process-match "parent branch: \\(.*\\)" dir "bzr" "info")) (defun pb/checkout-bzr (name config dir) "Check package NAME with config CONFIG out of bzr into DIR." - (let ((repo (plist-get config :url))) + (let ((repo (pb/bzr-expand-repo (plist-get config :url)))) (with-current-buffer (get-buffer-create "*package-build-checkout*") (goto-char (point-max)) (cond ((and (file-exists-p (expand-file-name ".bzr" dir)) (string-equal (pb/bzr-repo dir) repo)) - (print "checkout directory exists, updating...") + (pb/princ-exists dir) (pb/run-process dir "bzr" "merge")) (t (when (file-exists-p dir) (delete-directory dir t nil)) - (print "cloning repository") + (pb/princ-checkout repo dir) (pb/run-process nil "bzr" "branch" repo dir))) - (pb/run-process dir "bzr" "info" "-vv") + (apply 'pb/run-process dir "bzr" "log" "-l1" + (pb/expand-source-file-list dir config)) (pb/find-parse-time "\\([0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\} [0-9]\\{2\\}:[0-9]\\{2\\}:[0-9]\\{2\\}\\)")))) (defun pb/hg-repo (dir) "Get the current hg repo for DIR." - (with-temp-buffer - (pb/run-process dir "hg" "paths") - (goto-char (point-min)) - (re-search-forward "default = \\(.*\\)") - (match-string-no-properties 1))) + (pb/run-process-match "default = \\(.*\\)" dir "hg" "paths")) (defun pb/checkout-hg (name config dir) "Check package NAME with config CONFIG out of hg into DIR." @@ -274,15 +310,16 @@ seconds; the server cuts off after 10 requests in 20 seconds.") (cond ((and (file-exists-p (expand-file-name ".hg" dir)) (string-equal (pb/hg-repo dir) repo)) - (print "checkout directory exists, updating...") + (pb/princ-exists dir) (pb/run-process dir "hg" "pull") (pb/run-process dir "hg" "update")) (t (when (file-exists-p dir) (delete-directory dir t nil)) - (print "cloning repository") + (pb/princ-checkout repo dir) (pb/run-process nil "hg" "clone" repo dir))) - (pb/run-process dir "hg" "tip" "--style" "compact") + (apply 'pb/run-process dir "hg" "log" "--style" "compact" "-l1" + (pb/expand-source-file-list dir config)) (pb/find-parse-time "\\([0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\} [0-9]\\{2\\}:[0-9]\\{2\\}\\)")))) @@ -305,21 +342,13 @@ seconds; the server cuts off after 10 requests in 20 seconds.") pkg-file)) (defun pb/read-from-file (file-name) - "Read and return the Lisp data stored in FILE-NAME, or nil if no such file exists." + "Read and return the Lisp data stored in FILE-NAME,or nil if no such file exists." (when (file-exists-p file-name) (with-temp-buffer (insert-file-contents-literally file-name) (goto-char (point-min)) (read (current-buffer))))) -(defun pb/get-config (pkg-name) - "Get the configuration information for the given PKG-NAME." - (pb/read-from-file (format "epkgs/%s/.config" pkg-name))) - -(defun pb/get-master (pkg-name) - "Get the configuration information for the given PKG-NAME." - (pb/read-from-file (format "epkgs/%s/master" pkg-name))) - (defun pb/create-tar (file dir &optional files) "Create a tar FILE containing the contents of DIR, or just FILES if non-nil. @@ -342,36 +371,39 @@ The file is written to `package-build-working-dir'." "Get a vector of package info from the docstrings in FILE-PATH." (when (file-exists-p file-path) (ignore-errors - (save-window-excursion - (find-file file-path) - ;; next two lines are a hack for some packages that aren't + (with-temp-buffer + (insert-file-contents file-path) + ;; next few lines are a hack for some packages that aren't ;; commented properly. + (goto-char (point-min)) + (forward-line) + (insert ";;; Version: 0") + (newline) (goto-char (point-max)) - (insert (concat "\n;;; " - (file-name-nondirectory file-path) " ends here")) + (newline) + (insert ";;; " (file-name-nondirectory file-path) " ends here") (flet ((package-strip-rcs-id (str) "0")) (package-buffer-info)))))) (defun pb/get-pkg-file-info (file-path) "Get a vector of package info from \"-pkg.el\" file FILE-PATH." (when (file-exists-p file-path) - (let ((pkgfile-info (cdr (pb/read-from-file file-path)))) - (vector - (nth 0 pkgfile-info) - (mapcar - (lambda (elt) - (list (car elt) (version-to-list (cadr elt)))) - (eval (nth 3 pkgfile-info))) - (nth 2 pkgfile-info) - (nth 1 pkgfile-info))))) + (let ((package-def (pb/read-from-file file-path))) + (if (eq 'define-package (car package-def)) + (let ((pkgfile-info (cdr package-def))) + (vector + (nth 0 pkgfile-info) + (mapcar + (lambda (elt) + (list (car elt) (version-to-list (cadr elt)))) + (eval (nth 3 pkgfile-info))) + (nth 2 pkgfile-info) + (nth 1 pkgfile-info))) + (error "No define-package found in %s" file-path))))) -(defun pb/expand-file-list (dir files) - "In DIR, expand FILES, some of which may be shell-style wildcards." - (let ((default-directory dir)) - (mapcan 'file-expand-wildcards files))) (defun pb/merge-package-info (pkg-info name version config) - "Return a version of PKG-INFO updated with NAME and VERSION. + "Return a version of PKG-INFO updated with NAME, VERSION and info from CONFIG. If PKG-INFO is nil, an empty one is created." (let* ((merged (or (copy-seq pkg-info) (vector name nil "No description available." version)))) @@ -405,50 +437,126 @@ If PKG-INFO is nil, an empty one is created." desc type))))) +(defun pb/archive-file-name (archive-entry) + "Return the path of the file in which the package for ARCHIVE-ENTRY is stored." + (expand-file-name (format "%s-%s.%s" + (car archive-entry) + (car (aref (cdr archive-entry) 0)) + (if (eq 'single (aref (cdr archive-entry) 3)) + "el" + "tar")) + package-build-archive-dir)) + +(defun pb/remove-archive (archive-entry) + "Remove ARCHIVE-ENTRY from archive-contents, and delete associated file. +Note that the working directory (if present) is not deleted by +this function, since the archive list may contain another version +of the same-named package which is to be kept." + (print (format "Removing archive: %s" archive-entry)) + (let ((archive-file (pb/archive-file-name archive-entry))) + (when (file-exists-p archive-file) + (delete-file archive-file))) + (setq package-build-archive-alist + (remove archive-entry package-build-archive-alist)) + (pb/dump-archive-contents)) + (defun pb/read-recipes () "Return a list of data structures for all recipes in `package-build-recipes-dir'." (mapcar 'pb/read-from-file (directory-files package-build-recipes-dir t "^[^.]"))) + +(defun pb/expand-file-specs (dir specs &optional subdir) + "In DIR, expand SPECS, optionally under SUBDIR. +The result is a list of (SOURCE . DEST), where SOURCE is a source +file path and DEST is the relative path to which it should be copied." + (let ((default-directory dir) + (prefix (if subdir + (format "%s/" subdir) + ""))) + (mapcan + (lambda (entry) + (if (consp entry) + (pb/expand-file-specs dir + (cdr entry) + (concat prefix (car entry))) + (mapcar (lambda (f) + (cons f (concat prefix (file-name-nondirectory f)))) + (or (file-expand-wildcards entry) + (error "No matching file(s) found in %s: %s" + dir + entry))))) + specs))) + +(defun pb/expand-config-file-list (dir config) + "In DIR, expand the :files for CONFIG using 'pb/expand-file-specs." + (pb/expand-file-specs dir (or (plist-get config :files) (list "*.el")))) + +(defun pb/expand-source-file-list (dir config) + "Shorthand way to expand paths in DIR for source files listed in CONFIG." + (mapcar 'car (pb/expand-config-file-list dir config))) + +(defun pb/copy-package-files (files source-dir target-dir) + "Copy FILES from SOURCE-DIR to TARGET-DIR. +FILES is a list of (SOURCE . DEST) relative filepath pairs." + (loop for (source-file . dest-file) in files + do (pb/copy-file + (expand-file-name source-file source-dir) + (expand-file-name dest-file target-dir)))) + +(defun pb/copy-file (file newname) + "Copy FILE to NEWNAME and create parent directories for NEWNAME if they don't exist." + (let ((newdir (file-name-directory newname))) + (unless (file-exists-p newdir) + (make-directory newdir t))) + (cond + ((file-regular-p file) + (message "%s -> %s" file newname) + (copy-file file newname)) + ((file-directory-p file) + (message "%s => %s" file newname) + (copy-directory file newname)))) + + +(defun pb/package-name-completing-read () + "Prompt for a package name, returning a symbol." + (intern (completing-read "Package: " package-build-alist))) + ;;; Public interface - -(defun package-build-archive (file-name) - "Build a package archive for package FILE-NAME." - (interactive (list (completing-read "Package: " - (mapc 'car package-build-alist)))) - - (let* ((name (intern file-name)) +(defun package-build-archive (name) + "Build a package archive for package NAME." + (interactive (list (pb/package-name-completing-read))) + (let* ((file-name (symbol-name name)) (cfg (or (cdr (assoc name package-build-alist)) (error "Cannot find package %s" file-name))) (pkg-cwd (file-name-as-directory (expand-file-name file-name package-build-working-dir)))) + (message (format "\n;;; %s\n" file-name)) (let* ((version (pb/checkout name cfg pkg-cwd)) - (files (pb/expand-file-list pkg-cwd - (or (plist-get cfg :files) - (list "*.el")))) + (files (pb/expand-config-file-list pkg-cwd cfg)) (default-directory package-build-working-dir)) (cond ((not version) - (print (format "Unable to check out repository for %s" name))) + (message "Unable to check out repository for %s" name)) ((= 1 (length files)) - (let* ((pkgsrc (expand-file-name (car files) pkg-cwd)) - (pkgdst (expand-file-name - (concat file-name "-" version ".el") - package-build-archive-dir)) + (let* ((pkg-source (expand-file-name (caar files) pkg-cwd)) + (pkg-target (expand-file-name + (concat file-name "-" version ".el") + package-build-archive-dir)) (pkg-info (pb/merge-package-info - (pb/get-package-info pkgsrc) + (pb/get-package-info pkg-source) file-name version cfg))) - (print pkg-info) - (when (file-exists-p pkgdst) - (delete-file pkgdst t)) - (copy-file pkgsrc pkgdst) + (when (file-exists-p pkg-target) + (delete-file pkg-target t)) + (copy-file pkg-source pkg-target) (pb/add-to-archive-contents pkg-info 'single))) - (t + ((< 1 (length files)) (let* ((pkg-dir (concat file-name "-" version)) + ;; TODO: What if the upstream "-pkg.el" file is in a subdir? (pkg-file (concat file-name "-pkg.el")) (pkg-info (pb/merge-package-info @@ -461,54 +569,75 @@ If PKG-INFO is nil, an empty one is created." version cfg))) - (print pkg-info) - (copy-directory file-name pkg-dir) + (when (file-exists-p pkg-dir) + (delete-directory pkg-dir t nil)) - (pb/write-pkg-file (expand-file-name - pkg-file - (file-name-as-directory - (expand-file-name - pkg-dir - package-build-working-dir))) + (pb/copy-package-files files pkg-cwd pkg-dir) + + (pb/write-pkg-file (expand-file-name pkg-file + (file-name-as-directory + (expand-file-name + pkg-dir + package-build-working-dir))) pkg-info) - (when files - (add-to-list 'files pkg-file)) - (pb/create-tar (expand-file-name (concat file-name "-" version ".tar") package-build-archive-dir) pkg-dir - files) + (append (mapcar 'cdr files) (list pkg-file))) (delete-directory pkg-dir t nil) - (pb/add-to-archive-contents pkg-info 'tar)))) - (pb/dump-archive-contents)))) + (pb/add-to-archive-contents pkg-info 'tar))) -(defun package-build-archives (&rest pkgs) - "Build archives for packages PKGS." - (interactive) - (mapc 'package-build-archive pkgs)) + (t (error "Unable to find files matching recipe patterns"))) + (pb/dump-archive-contents) + file-name))) -(defun package-build-archives-ignore-errors (&rest pkgs) - "Build archives for packages PKGS. Ignore errors." - (interactive) - (mapc (lambda (pkg) (ignore-errors (package-build-archive pkg))) pkgs)) +(defun package-build-archive-ignore-errors (pkg) + "Build archive for package PKG, ignoring any errors." + (interactive (list (pb/package-name-completing-read))) + (let* ((debug-on-error t) + (debug-on-signal t) + (pb/debugger-return nil) + (debugger (lambda (&rest args) + (setq pb/debugger-return (with-output-to-string + (backtrace)))))) + (condition-case err + (package-build-archive pkg) + ('error + (message "%s" (error-message-string err)) + nil)))) (defun package-build-all () "Build all packages in the `package-build-alist'." (interactive) - (apply 'package-build-archives-ignore-errors - (mapcar 'symbol-name (mapcar 'car package-build-alist)))) + (let ((failed (loop for pkg in (mapcar 'car package-build-alist) + when (not (package-build-archive-ignore-errors pkg)) + collect pkg))) + (if (not failed) + (princ "\nSuccessfully Compiled All Packages\n") + (princ "\nFailed to Build the Following Packages\n") + (princ (mapconcat 'symbol-name failed "\n")))) + (package-build-cleanup)) + +(defun package-build-cleanup () + "Remove previously-built packages that no longer have recipes." + (interactive) + (let* ((known-package-names (mapcar 'car package-build-alist)) + (stale-archives (loop for built in package-build-archive-alist + when (not (memq (car built) known-package-names)) + collect built))) + (mapc 'pb/remove-archive stale-archives))) (defun package-build-initialize () "Load the recipe and archive-contents files." (interactive) - (setq - package-build-alist (pb/read-recipes) - package-build-archive-alist (cdr (pb/read-from-file - (expand-file-name "archive-contents" - package-build-archive-dir))))) + (setq package-build-alist (pb/read-recipes) + package-build-archive-alist + (cdr (pb/read-from-file + (expand-file-name "archive-contents" + package-build-archive-dir))))) (package-build-initialize) diff --git a/recipes/.dir-locals.el b/recipes/.dir-locals.el new file mode 100644 index 00000000..38e1fd1a --- /dev/null +++ b/recipes/.dir-locals.el @@ -0,0 +1,4 @@ +((nil . ((eval . (when (and (buffer-file-name) + (file-regular-p (buffer-file-name)) + (string-match-p "^[^.]" (buffer-file-name))) + (emacs-lisp-mode)))))) diff --git a/recipes/auto-complete b/recipes/auto-complete index 004fc91e..d4b9caed 100644 --- a/recipes/auto-complete +++ b/recipes/auto-complete @@ -1,3 +1,3 @@ (auto-complete :repo "m2ym/auto-complete" :fetcher github :files - ("*.el" "dict/*")) + ("*.el" "dict")) diff --git a/recipes/autopair b/recipes/autopair new file mode 100644 index 00000000..5493cefe --- /dev/null +++ b/recipes/autopair @@ -0,0 +1,4 @@ +(autopair + :fetcher svn + :url "http://autopair.googlecode.com/svn/trunk/" + :files ("autopair.el")) diff --git a/recipes/color-theme-buffer-local b/recipes/color-theme-buffer-local new file mode 100644 index 00000000..275f71cf --- /dev/null +++ b/recipes/color-theme-buffer-local @@ -0,0 +1,3 @@ +(color-theme-buffer-local :fetcher github + :repo "vic/color-theme-buffer-local" + :files ("color-theme-buffer-local.el")) diff --git a/recipes/disk b/recipes/disk new file mode 100644 index 00000000..38474c5b --- /dev/null +++ b/recipes/disk @@ -0,0 +1,2 @@ +(disk :fetcher wiki) + diff --git a/recipes/egg b/recipes/egg new file mode 100644 index 00000000..4aa41a85 --- /dev/null +++ b/recipes/egg @@ -0,0 +1 @@ +(egg :repo "byplayer/egg" :fetcher github) diff --git a/recipes/elscreen b/recipes/elscreen index 5877084c..10501d95 100644 --- a/recipes/elscreen +++ b/recipes/elscreen @@ -1,3 +1,3 @@ (elscreen - :repo shosti/elscreen + :repo "shosti/elscreen" :fetcher github) diff --git a/recipes/emacs-setup b/recipes/emacs-setup new file mode 100644 index 00000000..1c2b6ea1 --- /dev/null +++ b/recipes/emacs-setup @@ -0,0 +1,3 @@ +(emacs-setup + :fetcher github + :repo "echosa/emacs-setup") diff --git a/recipes/erlang b/recipes/erlang new file mode 100644 index 00000000..5b4f30f8 --- /dev/null +++ b/recipes/erlang @@ -0,0 +1,3 @@ +(erlang :repo "erlang/otp" + :fetcher github + :files ("lib/tools/emacs/*.el")) diff --git a/recipes/escreen b/recipes/escreen new file mode 100644 index 00000000..8ec5b680 --- /dev/null +++ b/recipes/escreen @@ -0,0 +1 @@ +(escreen :repo "emacsmirror/escreen" :fetcher github) diff --git a/recipes/ess b/recipes/ess index e43f32d1..e99748dc 100644 --- a/recipes/ess +++ b/recipes/ess @@ -1,3 +1,5 @@ (ess :repo "milkypostman/ESS" :fetcher github :files - ("*.el" "lisp/*.el" "etc/*")) + ("*.el" ("lisp" "lisp/*.el") ("etc" "etc/*"))) + + diff --git a/recipes/evil-surround b/recipes/evil-surround deleted file mode 100644 index 2938b855..00000000 --- a/recipes/evil-surround +++ /dev/null @@ -1,2 +0,0 @@ -(evil-surround :repo "timcharper/evil-surround" :fetcher github) - diff --git a/recipes/flymake-perlcritic b/recipes/flymake-perlcritic index d824230e..033eaefa 100644 --- a/recipes/flymake-perlcritic +++ b/recipes/flymake-perlcritic @@ -1,3 +1,4 @@ -(flymake-perlcritic :repo "illusori/emacs-flymake-perlcritic" :fetcher github :files - ("*.el" "bin/flymake_perlcritic")) +(flymake-perlcritic :repo "illusori/emacs-flymake-perlcritic" + :fetcher github + :files ("*.el" ("bin" "bin/flymake_perlcritic"))) diff --git a/recipes/git-blame b/recipes/git-blame index 57def06b..f6e266c1 100644 --- a/recipes/git-blame +++ b/recipes/git-blame @@ -1,3 +1,4 @@ -(git-blame :repo "tsgates/git-emacs" :fetcher github :files - ("git-blame.el")) +(git-blame :repo "tsgates/git-emacs" + :fetcher github + :files ("git-blame.el")) diff --git a/recipes/gnuplot b/recipes/gnuplot new file mode 100644 index 00000000..6824e042 --- /dev/null +++ b/recipes/gnuplot @@ -0,0 +1,4 @@ +(gnuplot + :repo "bruceravel/gnuplot-mode" + :fetcher github + :files ("gnuplot.el" "gnuplot-gui.el")) diff --git a/recipes/helm-git b/recipes/helm-git new file mode 100644 index 00000000..84f6e34b --- /dev/null +++ b/recipes/helm-git @@ -0,0 +1 @@ +(helm-git :repo "maio/helm-git" :fetcher github) diff --git a/recipes/helm-projectile b/recipes/helm-projectile index e7134c60..547e5d78 100644 --- a/recipes/helm-projectile +++ b/recipes/helm-projectile @@ -1,3 +1,4 @@ -(helm-projectile :repo "bbatsov/projectile" :fetcher github :files - ("helm-projectile.el")) +(helm-projectile :repo "bbatsov/projectile" + :fetcher github + :files ("helm-projectile.el")) diff --git a/recipes/icicles b/recipes/icicles index 38dd8f71..aa45f027 100644 --- a/recipes/icicles +++ b/recipes/icicles @@ -1,3 +1,16 @@ -(icicles :fetcher wiki :files - ("icicles.el" "icicles-chg.el" "icicles-cmd1.el" "icicles-cmd2.el" "icicles-doc1.el" "icicles-doc2.el" "icicles-face.el" "icicles-fn.el" "icicles-mac.el" "icicles-mcmd.el" "icicles-mode.el" "icicles-opt.el" "icicles-var.el")) +(icicles + :fetcher wiki + :files ("icicles.el" + "icicles-chg.el" + "icicles-cmd1.el" + "icicles-cmd2.el" + "icicles-doc1.el" + "icicles-doc2.el" + "icicles-face.el" + "icicles-fn.el" + "icicles-mac.el" + "icicles-mcmd.el" + "icicles-mode.el" + "icicles-opt.el" + "icicles-var.el")) diff --git a/recipes/inflections b/recipes/inflections index 0e3b1bce..f5d5b3c7 100644 --- a/recipes/inflections +++ b/recipes/inflections @@ -1,3 +1,4 @@ -(inflections :repo "milkypostman/jump.el" :fetcher github :files - ("inflections.el")) +(inflections :repo "milkypostman/jump.el" + :fetcher github + :files ("inflections.el")) diff --git a/recipes/inkpot-theme b/recipes/inkpot-theme new file mode 100644 index 00000000..6aa48dcf --- /dev/null +++ b/recipes/inkpot-theme @@ -0,0 +1,3 @@ +(inkpot-theme + :repo "siovan/emacs24-inkpot" + :fetcher github) diff --git a/recipes/jabber-mode b/recipes/jabber-mode new file mode 100644 index 00000000..eb4cb72a --- /dev/null +++ b/recipes/jabber-mode @@ -0,0 +1,3 @@ +(jabber-mode + :url "git://emacs-jabber.git.sourceforge.net/gitroot/emacs-jabber/emacs-jabber" + :fetcher git) diff --git a/recipes/jade-mode b/recipes/jade-mode new file mode 100644 index 00000000..0ba63da0 --- /dev/null +++ b/recipes/jade-mode @@ -0,0 +1 @@ +(jade-mode :fetcher github :repo "brianc/jade-mode" :files ("jade-mode.el")) diff --git a/recipes/latex-pretty-symbols b/recipes/latex-pretty-symbols new file mode 100644 index 00000000..f69731a1 --- /dev/null +++ b/recipes/latex-pretty-symbols @@ -0,0 +1,3 @@ +(latex-pretty-symbols + :url "https://bitbucket.org/mortiferus/latex-pretty-symbols.el" + :fetcher hg) diff --git a/recipes/load-theme-buffer-local b/recipes/load-theme-buffer-local new file mode 100644 index 00000000..619c93a1 --- /dev/null +++ b/recipes/load-theme-buffer-local @@ -0,0 +1,3 @@ +(load-theme-buffer-local :fetcher github + :repo "vic/color-theme-buffer-local" + :files ("load-theme-buffer-local.el")) diff --git a/recipes/lua-mode b/recipes/lua-mode index 571c3d77..bb2c9e31 100644 --- a/recipes/lua-mode +++ b/recipes/lua-mode @@ -1,3 +1,3 @@ (lua-mode :repo "immerrr/lua-mode" - :fetcher github) + :fetcher github) diff --git a/recipes/markdown-mode+ b/recipes/markdown-mode+ index 72d12f6c..c03063d1 100644 --- a/recipes/markdown-mode+ +++ b/recipes/markdown-mode+ @@ -1,3 +1,5 @@ -(markdown-mode+ :repo "milkypostman/markdown-mode-plus" :fetcher github :files - ("markdown-mode+.el" "HTML as Markdown in Emacs.applescript")) +(markdown-mode+ :repo "milkypostman/markdown-mode-plus" + :fetcher github + :files ("markdown-mode+.el" + "HTML as Markdown in Emacs.applescript")) diff --git a/recipes/melpa b/recipes/melpa index bacfc1a7..5dd5534f 100644 --- a/recipes/melpa +++ b/recipes/melpa @@ -1,3 +1,4 @@ -(melpa :repo "milkypostman/melpa" :fetcher github :files - ("melpa.el")) +(melpa :repo "milkypostman/melpa" + :fetcher github + :files ("melpa.el")) diff --git a/recipes/minimap b/recipes/minimap new file mode 100644 index 00000000..da731368 --- /dev/null +++ b/recipes/minimap @@ -0,0 +1 @@ +(minimap :url "git://randomsample.de/minimap.git" :fetcher git) diff --git a/recipes/mysql2sqlite b/recipes/mysql2sqlite new file mode 100644 index 00000000..25ded13c --- /dev/null +++ b/recipes/mysql2sqlite @@ -0,0 +1,3 @@ +(mysql2sqlite + :fetcher github + :repo "echosa/emacs-mysql2sqlite") diff --git a/recipes/org-toodledo b/recipes/org-toodledo index 65ba440d..2bbc294f 100644 --- a/recipes/org-toodledo +++ b/recipes/org-toodledo @@ -1,3 +1,4 @@ -(org-toodledo :repo "christopherjwhite/org-toodledo" :fetcher github :files - ("http-post-simple.el" "org-toodledo.el" "w3mexcerpt.el")) +(org-toodledo :repo "christopherjwhite/org-toodledo" + :fetcher github + :files ("http-post-simple.el" "org-toodledo.el" "w3mexcerpt.el")) diff --git a/recipes/outline-magic b/recipes/outline-magic new file mode 100644 index 00000000..f8441e55 --- /dev/null +++ b/recipes/outline-magic @@ -0,0 +1 @@ +(outline-magic :fetcher wiki) diff --git a/recipes/paredit b/recipes/paredit index 25847ccb..80c941d2 100644 --- a/recipes/paredit +++ b/recipes/paredit @@ -1,3 +1,4 @@ -(paredit :url "http://mumble.net/~campbell/emacs/paredit" :fetcher darcs :files - ("paredit.el")) +(paredit :url "http://mumble.net/~campbell/emacs/paredit" + :fetcher darcs + :files ("paredit.el")) diff --git a/recipes/pkgbuild-mode b/recipes/pkgbuild-mode index d91df694..e35496ea 100644 --- a/recipes/pkgbuild-mode +++ b/recipes/pkgbuild-mode @@ -1,3 +1,4 @@ -(pkgbuild-mode :repo "juergenhoetzel/pkgbuild-mode" :fetcher github :files - ("pkgbuild-mode.el")) +(pkgbuild-mode :repo "juergenhoetzel/pkgbuild-mode" + :fetcher github + :files ("pkgbuild-mode.el")) diff --git a/recipes/pony-mode b/recipes/pony-mode new file mode 100644 index 00000000..b2b2b036 --- /dev/null +++ b/recipes/pony-mode @@ -0,0 +1,4 @@ +(pony-mode + :repo "davidmiller/pony-mode" + :fetcher github + :files ("src/*.el" "snippets")) diff --git a/recipes/popup b/recipes/popup index 9af7e322..04c63770 100644 --- a/recipes/popup +++ b/recipes/popup @@ -1,3 +1,4 @@ -(popup :repo "m2ym/popup-el" :fetcher github :files - ("popup.el")) +(popup :repo "m2ym/popup-el" + :fetcher github + :files ("popup.el")) diff --git a/recipes/prelude-c b/recipes/prelude-c new file mode 100644 index 00000000..99bccc67 --- /dev/null +++ b/recipes/prelude-c @@ -0,0 +1 @@ +(prelude-c :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-c.el")) \ No newline at end of file diff --git a/recipes/prelude-clojure b/recipes/prelude-clojure new file mode 100644 index 00000000..6b748dac --- /dev/null +++ b/recipes/prelude-clojure @@ -0,0 +1 @@ +(prelude-clojure :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-clojure.el")) \ No newline at end of file diff --git a/recipes/prelude-coffee b/recipes/prelude-coffee new file mode 100644 index 00000000..08a4b3c5 --- /dev/null +++ b/recipes/prelude-coffee @@ -0,0 +1 @@ +(prelude-coffee :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-coffee.el")) \ No newline at end of file diff --git a/recipes/prelude-common-lisp b/recipes/prelude-common-lisp new file mode 100644 index 00000000..b8500af6 --- /dev/null +++ b/recipes/prelude-common-lisp @@ -0,0 +1 @@ +(prelude-common-lisp :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-common-lisp.el")) \ No newline at end of file diff --git a/recipes/prelude-css b/recipes/prelude-css new file mode 100644 index 00000000..a3f7f667 --- /dev/null +++ b/recipes/prelude-css @@ -0,0 +1 @@ +(prelude-css :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-css.el")) \ No newline at end of file diff --git a/recipes/prelude-emacs-lisp b/recipes/prelude-emacs-lisp new file mode 100644 index 00000000..36326c93 --- /dev/null +++ b/recipes/prelude-emacs-lisp @@ -0,0 +1 @@ +(prelude-emacs-lisp :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-emacs-lisp.el")) \ No newline at end of file diff --git a/recipes/prelude-haskell b/recipes/prelude-haskell new file mode 100644 index 00000000..81b72fdd --- /dev/null +++ b/recipes/prelude-haskell @@ -0,0 +1 @@ +(prelude-haskell :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-haskell.el")) \ No newline at end of file diff --git a/recipes/prelude-js b/recipes/prelude-js new file mode 100644 index 00000000..22b9115a --- /dev/null +++ b/recipes/prelude-js @@ -0,0 +1 @@ +(prelude-js :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-js.el")) \ No newline at end of file diff --git a/recipes/prelude-latex b/recipes/prelude-latex new file mode 100644 index 00000000..9abf72ca --- /dev/null +++ b/recipes/prelude-latex @@ -0,0 +1 @@ +(prelude-latex :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-latex.el")) \ No newline at end of file diff --git a/recipes/prelude-lisp b/recipes/prelude-lisp new file mode 100644 index 00000000..250385ad --- /dev/null +++ b/recipes/prelude-lisp @@ -0,0 +1 @@ +(prelude-lisp :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-lisp.el")) \ No newline at end of file diff --git a/recipes/prelude-mediawiki b/recipes/prelude-mediawiki new file mode 100644 index 00000000..9b787beb --- /dev/null +++ b/recipes/prelude-mediawiki @@ -0,0 +1 @@ +(prelude-mediawiki :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-mediawiki.el")) \ No newline at end of file diff --git a/recipes/prelude-perl b/recipes/prelude-perl new file mode 100644 index 00000000..9538c316 --- /dev/null +++ b/recipes/prelude-perl @@ -0,0 +1 @@ +(prelude-perl :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-perl.el")) \ No newline at end of file diff --git a/recipes/prelude-programming b/recipes/prelude-programming new file mode 100644 index 00000000..27a690df --- /dev/null +++ b/recipes/prelude-programming @@ -0,0 +1 @@ +(prelude-programming :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-programming.el")) \ No newline at end of file diff --git a/recipes/prelude-ruby b/recipes/prelude-ruby new file mode 100644 index 00000000..3312a825 --- /dev/null +++ b/recipes/prelude-ruby @@ -0,0 +1 @@ +(prelude-ruby :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-ruby.el")) \ No newline at end of file diff --git a/recipes/prelude-scheme b/recipes/prelude-scheme new file mode 100644 index 00000000..34a69f16 --- /dev/null +++ b/recipes/prelude-scheme @@ -0,0 +1 @@ +(prelude-scheme :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-scheme.el")) \ No newline at end of file diff --git a/recipes/prelude-scss b/recipes/prelude-scss new file mode 100644 index 00000000..1085869c --- /dev/null +++ b/recipes/prelude-scss @@ -0,0 +1 @@ +(prelude-scss :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-scss.el")) \ No newline at end of file diff --git a/recipes/prelude-xml b/recipes/prelude-xml new file mode 100644 index 00000000..eb795070 --- /dev/null +++ b/recipes/prelude-xml @@ -0,0 +1 @@ +(prelude-xml :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-xml.el")) \ No newline at end of file diff --git a/recipes/pretty-mode b/recipes/pretty-mode index ef9bbdef..9e660586 100644 --- a/recipes/pretty-mode +++ b/recipes/pretty-mode @@ -1,2 +1 @@ -(pretty-mode :repo "emacsmirror/pretty-mode" :fetcher github) - +(pretty-mode :fetcher wiki) diff --git a/recipes/projectile b/recipes/projectile index f2c29d5e..6bfd5454 100644 --- a/recipes/projectile +++ b/recipes/projectile @@ -1,3 +1,4 @@ -(projectile :repo "bbatsov/projectile" :fetcher github :files - ("projectile.el")) +(projectile :repo "bbatsov/projectile" + :fetcher github + :files ("projectile.el")) diff --git a/recipes/pyregexp b/recipes/pyregexp new file mode 100644 index 00000000..e0d84a97 --- /dev/null +++ b/recipes/pyregexp @@ -0,0 +1,4 @@ +(pyregexp :repo "benma/pyregexp" + :fetcher github + :files ("pyregexp.el" "pyregexp.py")) + diff --git a/recipes/python-magic b/recipes/python-magic new file mode 100644 index 00000000..2dbb48f3 --- /dev/null +++ b/recipes/python-magic @@ -0,0 +1 @@ +(python-magic :fetcher wiki) \ No newline at end of file diff --git a/recipes/rainbow-delimiters b/recipes/rainbow-delimiters index db93ea4a..52d627b9 100644 --- a/recipes/rainbow-delimiters +++ b/recipes/rainbow-delimiters @@ -1,2 +1,2 @@ -(rainbow-delimiters :fetcher wiki) +(rainbow-delimiters :fetcher github :repo "jlr/rainbow-delimiters") diff --git a/recipes/ruby-compilation b/recipes/ruby-compilation index ce6e96b0..9eb1ac47 100644 --- a/recipes/ruby-compilation +++ b/recipes/ruby-compilation @@ -1,3 +1,4 @@ -(ruby-compilation :repo "eschulte/rinari" :fetcher github :files - ("util/ruby-compilation.el")) +(ruby-compilation :repo "eschulte/rinari" + :fetcher github + :files ("util/ruby-compilation.el")) diff --git a/recipes/ruby-interpolation b/recipes/ruby-interpolation index e0a83496..b267cbe1 100644 --- a/recipes/ruby-interpolation +++ b/recipes/ruby-interpolation @@ -1,3 +1,3 @@ (ruby-interpolation :repo "leoc/ruby-interpolation.el" - :fetcher github) + :fetcher github) diff --git a/recipes/ruby-mode b/recipes/ruby-mode index 5c11e9cb..7a0ea746 100644 --- a/recipes/ruby-mode +++ b/recipes/ruby-mode @@ -1,3 +1,4 @@ -(ruby-mode :url "http://svn.ruby-lang.org/repos/ruby/trunk/misc" :fetcher svn :files - ("ruby-mode.el")) +(ruby-mode :url "http://svn.ruby-lang.org/repos/ruby/trunk/misc" + :fetcher svn + :files ("ruby-mode.el")) diff --git a/recipes/ruby-tools b/recipes/ruby-tools new file mode 100644 index 00000000..8bb7d81d --- /dev/null +++ b/recipes/ruby-tools @@ -0,0 +1 @@ +(ruby-tools :repo "rejeep/ruby-tools" :fetcher github) diff --git a/recipes/slime b/recipes/slime index c5aeca93..51f121cc 100644 --- a/recipes/slime +++ b/recipes/slime @@ -1,3 +1,4 @@ -(slime :repo "nablaone/slime" :fetcher github :files - ("slime.el")) +(slime :repo "nablaone/slime" + :fetcher github + :files ("slime.el")) diff --git a/recipes/slime-ritz b/recipes/slime-ritz index 0ec5170e..4b55d853 100644 --- a/recipes/slime-ritz +++ b/recipes/slime-ritz @@ -1,3 +1,4 @@ -(slime-ritz :repo "pallet/ritz" :fetcher github :files - ("src/main/elisp/slime-ritz.el")) +(slime-ritz :repo "pallet/ritz" + :fetcher github + :files ("src/main/elisp/slime-ritz.el")) diff --git a/recipes/smooth-scrolling b/recipes/smooth-scrolling new file mode 100644 index 00000000..5b2c7dc0 --- /dev/null +++ b/recipes/smooth-scrolling @@ -0,0 +1 @@ +(smooth-scrolling :repo "jbondeson/smooth-scrolling" :fetcher github) diff --git a/recipes/starter-kit-bindings b/recipes/starter-kit-bindings index 2a60a963..2096e04a 100644 --- a/recipes/starter-kit-bindings +++ b/recipes/starter-kit-bindings @@ -1,3 +1,4 @@ -(starter-kit-bindings :repo "technomancy/emacs-starter-kit" :fetcher github :files - ("modules/starter-kit-bindings.el")) +(starter-kit-bindings :repo "technomancy/emacs-starter-kit" + :fetcher github + :files ("modules/starter-kit-bindings.el")) diff --git a/recipes/starter-kit-eshell b/recipes/starter-kit-eshell index a4c0824e..278fdc2e 100644 --- a/recipes/starter-kit-eshell +++ b/recipes/starter-kit-eshell @@ -1,3 +1,4 @@ -(starter-kit-eshell :repo "technomancy/emacs-starter-kit" :fetcher github :files - ("modules/starter-kit-eshell.el")) +(starter-kit-eshell :repo "technomancy/emacs-starter-kit" + :fetcher github + :files ("modules/starter-kit-eshell.el")) diff --git a/recipes/starter-kit-js b/recipes/starter-kit-js index 73fb788c..55721b13 100644 --- a/recipes/starter-kit-js +++ b/recipes/starter-kit-js @@ -1,3 +1,4 @@ -(starter-kit-js :repo "technomancy/emacs-starter-kit" :fetcher github :files - ("modules/starter-kit-js.el")) +(starter-kit-js :repo "technomancy/emacs-starter-kit" + :fetcher github + :files ("modules/starter-kit-js.el")) diff --git a/recipes/starter-kit-lisp b/recipes/starter-kit-lisp index 4dca7073..db39ae18 100644 --- a/recipes/starter-kit-lisp +++ b/recipes/starter-kit-lisp @@ -1,3 +1,4 @@ -(starter-kit-lisp :repo "technomancy/emacs-starter-kit" :fetcher github :files - ("modules/starter-kit-lisp.el")) +(starter-kit-lisp :repo "technomancy/emacs-starter-kit" + :fetcher github + :files ("modules/starter-kit-lisp.el")) diff --git a/recipes/starter-kit-perl b/recipes/starter-kit-perl index f5d0d904..3f2b934b 100644 --- a/recipes/starter-kit-perl +++ b/recipes/starter-kit-perl @@ -1,3 +1,4 @@ -(starter-kit-perl :repo "technomancy/emacs-starter-kit" :fetcher github :files - ("modules/starter-kit-perl.el")) +(starter-kit-perl :repo "technomancy/emacs-starter-kit" + :fetcher github + :files ("modules/starter-kit-perl.el")) diff --git a/recipes/starter-kit-ruby b/recipes/starter-kit-ruby index ffb347a5..b9c0a43a 100644 --- a/recipes/starter-kit-ruby +++ b/recipes/starter-kit-ruby @@ -1,3 +1,4 @@ -(starter-kit-ruby :repo "technomancy/emacs-starter-kit" :fetcher github :files - ("modules/starter-kit-ruby.el")) +(starter-kit-ruby :repo "technomancy/emacs-starter-kit" + :fetcher github + :files ("modules/starter-kit-ruby.el")) diff --git a/recipes/stylus-mode b/recipes/stylus-mode new file mode 100644 index 00000000..52ff8e2f --- /dev/null +++ b/recipes/stylus-mode @@ -0,0 +1 @@ +(stylus-mode :fetcher github :repo "brianc/jade-mode" :files ("stylus-mode.el")) diff --git a/recipes/surround b/recipes/surround new file mode 100644 index 00000000..93bb0aba --- /dev/null +++ b/recipes/surround @@ -0,0 +1,2 @@ +(surround :repo "timcharper/evil-surround" :fetcher github) + diff --git a/recipes/sws-mode b/recipes/sws-mode new file mode 100644 index 00000000..3c02c545 --- /dev/null +++ b/recipes/sws-mode @@ -0,0 +1 @@ +(sws-mode :fetcher github :repo "brianc/jade-mode" :files ("sws-mode.el")) diff --git a/recipes/tango-2-theme b/recipes/tango-2-theme new file mode 100644 index 00000000..c7ece185 --- /dev/null +++ b/recipes/tango-2-theme @@ -0,0 +1 @@ +(tango-2-theme :repo "2024464" :fetcher github) diff --git a/recipes/tidy b/recipes/tidy new file mode 100644 index 00000000..d29035c6 --- /dev/null +++ b/recipes/tidy @@ -0,0 +1 @@ +(tidy :fetcher wiki) diff --git a/recipes/vimgolf b/recipes/vimgolf index ce48f02c..5b7b0da7 100644 --- a/recipes/vimgolf +++ b/recipes/vimgolf @@ -1,2 +1,2 @@ -(vimgolf :repo "timvisher/vimgolf" :fetcher github) +(vimgolf :repo "timvisher/vimgolf" :fetcher github :files ("emacs/vimgolf.el")) diff --git a/recipes/writegood-mode b/recipes/writegood-mode index 05bf1a3d..01c04e72 100644 --- a/recipes/writegood-mode +++ b/recipes/writegood-mode @@ -1 +1 @@ -(melpa :repo "bnbeckwith/writegood-mode" :fetcher github) +(writegood-mode :repo "bnbeckwith/writegood-mode" :fetcher github) diff --git a/recipes/yari b/recipes/yari index 7e255f9b..7edebeae 100644 --- a/recipes/yari +++ b/recipes/yari @@ -1,3 +1,4 @@ -(yari :repo "hron/yari.el" :fetcher github :files - ("yari.el")) +(yari :repo "hron/yari.el" + :fetcher github + :files ("yari.el")) diff --git a/recipes/yasnippet b/recipes/yasnippet index e0b7abda..b01ed1c7 100644 --- a/recipes/yasnippet +++ b/recipes/yasnippet @@ -1,3 +1,4 @@ -(yasnippet :repo "capitaomorte/yasnippet" :fetcher github :files - ("*.el" "snippets")) +(yasnippet :repo "capitaomorte/yasnippet" + :fetcher github + :files ("*.el" "snippets")) diff --git a/recipes/zenburn-theme b/recipes/zenburn-theme index 7d930884..e6caf7fc 100644 --- a/recipes/zenburn-theme +++ b/recipes/zenburn-theme @@ -1,3 +1,4 @@ -(zenburn-theme :repo "bbatsov/zenburn-emacs" :fetcher github :files - ("zenburn-theme.el")) +(zenburn-theme :repo "bbatsov/zenburn-emacs" + :fetcher github + :files ("zenburn-theme.el")) diff --git a/recipes/zf-mode b/recipes/zf-mode new file mode 100644 index 00000000..2da2bb14 --- /dev/null +++ b/recipes/zf-mode @@ -0,0 +1,4 @@ +(zf-mode + :fetcher github + :repo "echosa/zf-mode" + :files ("*.el" "ZFMode" "bundled"))