mirror of
https://github.com/correl/melpa.git
synced 2024-12-18 19:21:32 +00:00
Merge branch 'master' of https://github.com/milkypostman/melpa
This commit is contained in:
commit
d065b30eaa
88 changed files with 809 additions and 293 deletions
367
README.md
367
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 `<NAME>-pkg.el` which contains *description*,
|
||||
*version*, and *requires* information determined by searching
|
||||
`<NAME>-pkg.el`, `<NAME>.el`, and `<NAME>-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.
|
||||
|
||||
<!-- * Package must be actively developed and not otherwise included in a -->
|
||||
<!-- different ELPA archive. Packages that are better suited for -->
|
||||
<!-- [marmalade](http://marmalade-repo.org/) -->
|
||||
|
||||
* 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 `<NAME>` 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 <NAME>
|
||||
|
||||
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
|
||||
(<package-name>
|
||||
:fetcher [git|github|bzr|hg|darcs|svn|wiki]
|
||||
[:url "<repo url>"]
|
||||
[:repo "github-user/repo-name"]
|
||||
[:files ("<file1>", ...)])
|
||||
```
|
||||
```
|
||||
|
||||
`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 <NAME>`. 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 `<NAME>-pkg.el` is automatically generated and contains
|
||||
*description*, *version*, and *requires* information determined by
|
||||
searching `<NAME>-pkg.el`, `<NAME>.el`, and `<NAME>-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.
|
||||
|
||||
<!-- extra padding??? -->
|
||||
|
||||
- `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.
|
||||
|
||||
|
|
2
buildpkg
2
buildpkg
|
@ -4,4 +4,4 @@
|
|||
|
||||
(require 'package-build)
|
||||
|
||||
(mapc 'package-build-archive argv)
|
||||
(mapc 'package-build-archive (mapcar 'intern argv))
|
||||
|
|
|
@ -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|
|
||||
|
|
|
@ -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;
|
||||
|
|
17
melpa
17
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
|
||||
|
|
27
missing.el
Executable file
27
missing.el
Executable file
|
@ -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<)))
|
||||
|
||||
|
||||
|
409
package-build.el
409
package-build.el
|
@ -1,6 +1,7 @@
|
|||
;;; package-build.el --- Tools for curating the package archive
|
||||
|
||||
;; Copyright (C) 2011 Donald Ephraim Curtis <dcurtis@milkbox.net>
|
||||
;; Copyright (C) 2011-2012 Donald Ephraim Curtis <dcurtis@milkbox.net>
|
||||
;; Copyright (C) 2012 Steve Purcell <steve@sanityinc.com>
|
||||
;; Copyright (C) 2009 Phil Hagelberg <technomancy@gmail.com>
|
||||
|
||||
;; Author: Donald Ephraim Curtis <dcurtis@milkbox.net>
|
||||
|
@ -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)
|
||||
|
|
4
recipes/.dir-locals.el
Normal file
4
recipes/.dir-locals.el
Normal file
|
@ -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))))))
|
|
@ -1,3 +1,3 @@
|
|||
(auto-complete :repo "m2ym/auto-complete" :fetcher github :files
|
||||
("*.el" "dict/*"))
|
||||
("*.el" "dict"))
|
||||
|
||||
|
|
4
recipes/autopair
Normal file
4
recipes/autopair
Normal file
|
@ -0,0 +1,4 @@
|
|||
(autopair
|
||||
:fetcher svn
|
||||
:url "http://autopair.googlecode.com/svn/trunk/"
|
||||
:files ("autopair.el"))
|
3
recipes/color-theme-buffer-local
Normal file
3
recipes/color-theme-buffer-local
Normal file
|
@ -0,0 +1,3 @@
|
|||
(color-theme-buffer-local :fetcher github
|
||||
:repo "vic/color-theme-buffer-local"
|
||||
:files ("color-theme-buffer-local.el"))
|
2
recipes/disk
Normal file
2
recipes/disk
Normal file
|
@ -0,0 +1,2 @@
|
|||
(disk :fetcher wiki)
|
||||
|
1
recipes/egg
Normal file
1
recipes/egg
Normal file
|
@ -0,0 +1 @@
|
|||
(egg :repo "byplayer/egg" :fetcher github)
|
|
@ -1,3 +1,3 @@
|
|||
(elscreen
|
||||
:repo shosti/elscreen
|
||||
:repo "shosti/elscreen"
|
||||
:fetcher github)
|
||||
|
|
3
recipes/emacs-setup
Normal file
3
recipes/emacs-setup
Normal file
|
@ -0,0 +1,3 @@
|
|||
(emacs-setup
|
||||
:fetcher github
|
||||
:repo "echosa/emacs-setup")
|
3
recipes/erlang
Normal file
3
recipes/erlang
Normal file
|
@ -0,0 +1,3 @@
|
|||
(erlang :repo "erlang/otp"
|
||||
:fetcher github
|
||||
:files ("lib/tools/emacs/*.el"))
|
1
recipes/escreen
Normal file
1
recipes/escreen
Normal file
|
@ -0,0 +1 @@
|
|||
(escreen :repo "emacsmirror/escreen" :fetcher github)
|
|
@ -1,3 +1,5 @@
|
|||
(ess :repo "milkypostman/ESS" :fetcher github :files
|
||||
("*.el" "lisp/*.el" "etc/*"))
|
||||
("*.el" ("lisp" "lisp/*.el") ("etc" "etc/*")))
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
(evil-surround :repo "timcharper/evil-surround" :fetcher github)
|
||||
|
|
@ -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")))
|
||||
|
||||
|
|
|
@ -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"))
|
||||
|
||||
|
|
4
recipes/gnuplot
Normal file
4
recipes/gnuplot
Normal file
|
@ -0,0 +1,4 @@
|
|||
(gnuplot
|
||||
:repo "bruceravel/gnuplot-mode"
|
||||
:fetcher github
|
||||
:files ("gnuplot.el" "gnuplot-gui.el"))
|
1
recipes/helm-git
Normal file
1
recipes/helm-git
Normal file
|
@ -0,0 +1 @@
|
|||
(helm-git :repo "maio/helm-git" :fetcher github)
|
|
@ -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"))
|
||||
|
||||
|
|
|
@ -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"))
|
||||
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
(inflections :repo "milkypostman/jump.el" :fetcher github :files
|
||||
("inflections.el"))
|
||||
(inflections :repo "milkypostman/jump.el"
|
||||
:fetcher github
|
||||
:files ("inflections.el"))
|
||||
|
||||
|
|
3
recipes/inkpot-theme
Normal file
3
recipes/inkpot-theme
Normal file
|
@ -0,0 +1,3 @@
|
|||
(inkpot-theme
|
||||
:repo "siovan/emacs24-inkpot"
|
||||
:fetcher github)
|
3
recipes/jabber-mode
Normal file
3
recipes/jabber-mode
Normal file
|
@ -0,0 +1,3 @@
|
|||
(jabber-mode
|
||||
:url "git://emacs-jabber.git.sourceforge.net/gitroot/emacs-jabber/emacs-jabber"
|
||||
:fetcher git)
|
1
recipes/jade-mode
Normal file
1
recipes/jade-mode
Normal file
|
@ -0,0 +1 @@
|
|||
(jade-mode :fetcher github :repo "brianc/jade-mode" :files ("jade-mode.el"))
|
3
recipes/latex-pretty-symbols
Normal file
3
recipes/latex-pretty-symbols
Normal file
|
@ -0,0 +1,3 @@
|
|||
(latex-pretty-symbols
|
||||
:url "https://bitbucket.org/mortiferus/latex-pretty-symbols.el"
|
||||
:fetcher hg)
|
3
recipes/load-theme-buffer-local
Normal file
3
recipes/load-theme-buffer-local
Normal file
|
@ -0,0 +1,3 @@
|
|||
(load-theme-buffer-local :fetcher github
|
||||
:repo "vic/color-theme-buffer-local"
|
||||
:files ("load-theme-buffer-local.el"))
|
|
@ -1,3 +1,3 @@
|
|||
(lua-mode
|
||||
:repo "immerrr/lua-mode"
|
||||
:fetcher github)
|
||||
:fetcher github)
|
||||
|
|
|
@ -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"))
|
||||
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
(melpa :repo "milkypostman/melpa" :fetcher github :files
|
||||
("melpa.el"))
|
||||
(melpa :repo "milkypostman/melpa"
|
||||
:fetcher github
|
||||
:files ("melpa.el"))
|
||||
|
||||
|
|
1
recipes/minimap
Normal file
1
recipes/minimap
Normal file
|
@ -0,0 +1 @@
|
|||
(minimap :url "git://randomsample.de/minimap.git" :fetcher git)
|
3
recipes/mysql2sqlite
Normal file
3
recipes/mysql2sqlite
Normal file
|
@ -0,0 +1,3 @@
|
|||
(mysql2sqlite
|
||||
:fetcher github
|
||||
:repo "echosa/emacs-mysql2sqlite")
|
|
@ -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"))
|
||||
|
||||
|
|
1
recipes/outline-magic
Normal file
1
recipes/outline-magic
Normal file
|
@ -0,0 +1 @@
|
|||
(outline-magic :fetcher wiki)
|
|
@ -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"))
|
||||
|
||||
|
|
|
@ -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"))
|
||||
|
||||
|
|
4
recipes/pony-mode
Normal file
4
recipes/pony-mode
Normal file
|
@ -0,0 +1,4 @@
|
|||
(pony-mode
|
||||
:repo "davidmiller/pony-mode"
|
||||
:fetcher github
|
||||
:files ("src/*.el" "snippets"))
|
|
@ -1,3 +1,4 @@
|
|||
(popup :repo "m2ym/popup-el" :fetcher github :files
|
||||
("popup.el"))
|
||||
(popup :repo "m2ym/popup-el"
|
||||
:fetcher github
|
||||
:files ("popup.el"))
|
||||
|
||||
|
|
1
recipes/prelude-c
Normal file
1
recipes/prelude-c
Normal file
|
@ -0,0 +1 @@
|
|||
(prelude-c :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-c.el"))
|
1
recipes/prelude-clojure
Normal file
1
recipes/prelude-clojure
Normal file
|
@ -0,0 +1 @@
|
|||
(prelude-clojure :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-clojure.el"))
|
1
recipes/prelude-coffee
Normal file
1
recipes/prelude-coffee
Normal file
|
@ -0,0 +1 @@
|
|||
(prelude-coffee :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-coffee.el"))
|
1
recipes/prelude-common-lisp
Normal file
1
recipes/prelude-common-lisp
Normal file
|
@ -0,0 +1 @@
|
|||
(prelude-common-lisp :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-common-lisp.el"))
|
1
recipes/prelude-css
Normal file
1
recipes/prelude-css
Normal file
|
@ -0,0 +1 @@
|
|||
(prelude-css :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-css.el"))
|
1
recipes/prelude-emacs-lisp
Normal file
1
recipes/prelude-emacs-lisp
Normal file
|
@ -0,0 +1 @@
|
|||
(prelude-emacs-lisp :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-emacs-lisp.el"))
|
1
recipes/prelude-haskell
Normal file
1
recipes/prelude-haskell
Normal file
|
@ -0,0 +1 @@
|
|||
(prelude-haskell :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-haskell.el"))
|
1
recipes/prelude-js
Normal file
1
recipes/prelude-js
Normal file
|
@ -0,0 +1 @@
|
|||
(prelude-js :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-js.el"))
|
1
recipes/prelude-latex
Normal file
1
recipes/prelude-latex
Normal file
|
@ -0,0 +1 @@
|
|||
(prelude-latex :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-latex.el"))
|
1
recipes/prelude-lisp
Normal file
1
recipes/prelude-lisp
Normal file
|
@ -0,0 +1 @@
|
|||
(prelude-lisp :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-lisp.el"))
|
1
recipes/prelude-mediawiki
Normal file
1
recipes/prelude-mediawiki
Normal file
|
@ -0,0 +1 @@
|
|||
(prelude-mediawiki :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-mediawiki.el"))
|
1
recipes/prelude-perl
Normal file
1
recipes/prelude-perl
Normal file
|
@ -0,0 +1 @@
|
|||
(prelude-perl :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-perl.el"))
|
1
recipes/prelude-programming
Normal file
1
recipes/prelude-programming
Normal file
|
@ -0,0 +1 @@
|
|||
(prelude-programming :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-programming.el"))
|
1
recipes/prelude-ruby
Normal file
1
recipes/prelude-ruby
Normal file
|
@ -0,0 +1 @@
|
|||
(prelude-ruby :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-ruby.el"))
|
1
recipes/prelude-scheme
Normal file
1
recipes/prelude-scheme
Normal file
|
@ -0,0 +1 @@
|
|||
(prelude-scheme :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-scheme.el"))
|
1
recipes/prelude-scss
Normal file
1
recipes/prelude-scss
Normal file
|
@ -0,0 +1 @@
|
|||
(prelude-scss :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-scss.el"))
|
1
recipes/prelude-xml
Normal file
1
recipes/prelude-xml
Normal file
|
@ -0,0 +1 @@
|
|||
(prelude-xml :repo "bbatsov/prelude-modules" :fetcher github :files ("prelude-xml.el"))
|
|
@ -1,2 +1 @@
|
|||
(pretty-mode :repo "emacsmirror/pretty-mode" :fetcher github)
|
||||
|
||||
(pretty-mode :fetcher wiki)
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
(projectile :repo "bbatsov/projectile" :fetcher github :files
|
||||
("projectile.el"))
|
||||
(projectile :repo "bbatsov/projectile"
|
||||
:fetcher github
|
||||
:files ("projectile.el"))
|
||||
|
||||
|
|
4
recipes/pyregexp
Normal file
4
recipes/pyregexp
Normal file
|
@ -0,0 +1,4 @@
|
|||
(pyregexp :repo "benma/pyregexp"
|
||||
:fetcher github
|
||||
:files ("pyregexp.el" "pyregexp.py"))
|
||||
|
1
recipes/python-magic
Normal file
1
recipes/python-magic
Normal file
|
@ -0,0 +1 @@
|
|||
(python-magic :fetcher wiki)
|
|
@ -1,2 +1,2 @@
|
|||
(rainbow-delimiters :fetcher wiki)
|
||||
(rainbow-delimiters :fetcher github :repo "jlr/rainbow-delimiters")
|
||||
|
||||
|
|
|
@ -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"))
|
||||
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
(ruby-interpolation
|
||||
:repo "leoc/ruby-interpolation.el"
|
||||
:fetcher github)
|
||||
:fetcher github)
|
||||
|
|
|
@ -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"))
|
||||
|
||||
|
|
1
recipes/ruby-tools
Normal file
1
recipes/ruby-tools
Normal file
|
@ -0,0 +1 @@
|
|||
(ruby-tools :repo "rejeep/ruby-tools" :fetcher github)
|
|
@ -1,3 +1,4 @@
|
|||
(slime :repo "nablaone/slime" :fetcher github :files
|
||||
("slime.el"))
|
||||
(slime :repo "nablaone/slime"
|
||||
:fetcher github
|
||||
:files ("slime.el"))
|
||||
|
||||
|
|
|
@ -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"))
|
||||
|
||||
|
|
1
recipes/smooth-scrolling
Normal file
1
recipes/smooth-scrolling
Normal file
|
@ -0,0 +1 @@
|
|||
(smooth-scrolling :repo "jbondeson/smooth-scrolling" :fetcher github)
|
|
@ -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"))
|
||||
|
||||
|
|
|
@ -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"))
|
||||
|
||||
|
|
|
@ -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"))
|
||||
|
||||
|
|
|
@ -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"))
|
||||
|
||||
|
|
|
@ -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"))
|
||||
|
||||
|
|
|
@ -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"))
|
||||
|
||||
|
|
1
recipes/stylus-mode
Normal file
1
recipes/stylus-mode
Normal file
|
@ -0,0 +1 @@
|
|||
(stylus-mode :fetcher github :repo "brianc/jade-mode" :files ("stylus-mode.el"))
|
2
recipes/surround
Normal file
2
recipes/surround
Normal file
|
@ -0,0 +1,2 @@
|
|||
(surround :repo "timcharper/evil-surround" :fetcher github)
|
||||
|
1
recipes/sws-mode
Normal file
1
recipes/sws-mode
Normal file
|
@ -0,0 +1 @@
|
|||
(sws-mode :fetcher github :repo "brianc/jade-mode" :files ("sws-mode.el"))
|
1
recipes/tango-2-theme
Normal file
1
recipes/tango-2-theme
Normal file
|
@ -0,0 +1 @@
|
|||
(tango-2-theme :repo "2024464" :fetcher github)
|
1
recipes/tidy
Normal file
1
recipes/tidy
Normal file
|
@ -0,0 +1 @@
|
|||
(tidy :fetcher wiki)
|
|
@ -1,2 +1,2 @@
|
|||
(vimgolf :repo "timvisher/vimgolf" :fetcher github)
|
||||
(vimgolf :repo "timvisher/vimgolf" :fetcher github :files ("emacs/vimgolf.el"))
|
||||
|
||||
|
|
|
@ -1 +1 @@
|
|||
(melpa :repo "bnbeckwith/writegood-mode" :fetcher github)
|
||||
(writegood-mode :repo "bnbeckwith/writegood-mode" :fetcher github)
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
(yari :repo "hron/yari.el" :fetcher github :files
|
||||
("yari.el"))
|
||||
(yari :repo "hron/yari.el"
|
||||
:fetcher github
|
||||
:files ("yari.el"))
|
||||
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
(yasnippet :repo "capitaomorte/yasnippet" :fetcher github :files
|
||||
("*.el" "snippets"))
|
||||
(yasnippet :repo "capitaomorte/yasnippet"
|
||||
:fetcher github
|
||||
:files ("*.el" "snippets"))
|
||||
|
||||
|
|
|
@ -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"))
|
||||
|
||||
|
|
4
recipes/zf-mode
Normal file
4
recipes/zf-mode
Normal file
|
@ -0,0 +1,4 @@
|
|||
(zf-mode
|
||||
:fetcher github
|
||||
:repo "echosa/zf-mode"
|
||||
:files ("*.el" "ZFMode" "bundled"))
|
Loading…
Reference in a new issue