Full Code of technomancy/leiningen for AI

main 40227328d4a9 cached
297 files
1.0 MB
295.0k tokens
4 symbols
1 requests
Download .txt
Showing preview only (1,134K chars total). Download the full file or copy to clipboard to get everything.
Repository: technomancy/leiningen
Branch: main
Commit: 40227328d4a9
Files: 297
Total size: 1.0 MB

Directory structure:
gitextract_s64bzl69/

├── .build.yml
├── .circleci/
│   └── config.yml
├── .gitattributes
├── .github/
│   └── README.md
├── .gitignore
├── CONTRIBUTING.md
├── COPYING
├── NEWS.md
├── README.md
├── bash_completion.bash
├── bin/
│   ├── bump
│   ├── issues.clj
│   ├── lein
│   ├── lein-pkg
│   ├── lein.bat
│   ├── lein.cmd
│   ├── lein.ps1
│   └── release
├── doc/
│   ├── BEGINNER_MISTAKES.md
│   ├── DEPLOY.md
│   ├── FAQ.md
│   ├── GPG.md
│   ├── MANAGED_DEPS.md
│   ├── MIXED_PROJECTS.md
│   ├── PLUGINS.md
│   ├── PROFILES.md
│   ├── TEMPLATES.md
│   ├── TUTORIAL.md
│   ├── ja/
│   │   ├── PLUGINS_ja.md
│   │   ├── TUTORIAL_ja.md
│   │   └── lein_ja.1
│   └── lein.1
├── lein-pprint/
│   ├── README.md
│   ├── project.clj
│   ├── src/
│   │   └── leiningen/
│   │       └── pprint.clj
│   └── test/
│       └── leiningen/
│           └── test/
│               └── pprint.clj
├── leiningen-core/
│   ├── README.md
│   ├── dev-resources/
│   │   ├── checkouts/
│   │   │   ├── lib1/
│   │   │   │   └── project.clj
│   │   │   └── lib2/
│   │   │       └── project.clj
│   │   ├── p1.clj
│   │   ├── p2.clj
│   │   ├── p3.clj
│   │   ├── p4.clj
│   │   ├── p5.clj
│   │   ├── profile-metadata.clj
│   │   └── replace-repositories.clj
│   ├── project.clj
│   ├── src/
│   │   └── leiningen/
│   │       └── core/
│   │           ├── classpath.clj
│   │           ├── eval.clj
│   │           ├── main.clj
│   │           ├── pedantic.clj
│   │           ├── project.clj
│   │           ├── ssl.clj
│   │           ├── user.clj
│   │           └── utils.clj
│   └── test/
│       ├── leiningen/
│       │   ├── bluuugh.clj
│       │   ├── core/
│       │   │   └── test/
│       │   │       ├── classpath.clj
│       │   │       ├── eval.clj
│       │   │       ├── helper.clj
│       │   │       ├── main.clj
│       │   │       ├── mirrors.clj
│       │   │       ├── pedantic.clj
│       │   │       ├── project.clj
│       │   │       ├── user.clj
│       │   │       └── utils.clj
│       │   ├── fixed_and_var_args.clj
│       │   ├── one_or_two.clj
│       │   ├── sirius.clj
│       │   ├── var_args.clj
│       │   └── zero.clj
│       └── resources/
│           └── profiles-empty.clj
├── pcmpl-lein.el
├── project.clj
├── resources/
│   ├── leiningen/
│   │   ├── bootclasspath-deps.clj
│   │   └── new/
│   │       ├── app/
│   │       │   ├── CHANGELOG.md
│   │       │   ├── LICENSE
│   │       │   ├── README.md
│   │       │   ├── core.clj
│   │       │   ├── gitignore
│   │       │   ├── hgignore
│   │       │   ├── intro.md
│   │       │   ├── project.clj
│   │       │   └── test.clj
│   │       ├── default/
│   │       │   ├── CHANGELOG.md
│   │       │   ├── LICENSE
│   │       │   ├── README.md
│   │       │   ├── core.clj
│   │       │   ├── gitignore
│   │       │   ├── hgignore
│   │       │   ├── intro.md
│   │       │   ├── project.clj
│   │       │   └── test.clj
│   │       ├── plugin/
│   │       │   ├── CHANGELOG.md
│   │       │   ├── LICENSE
│   │       │   ├── README.md
│   │       │   ├── gitignore
│   │       │   ├── hgignore
│   │       │   ├── name.clj
│   │       │   └── project.clj
│   │       └── template/
│   │           ├── CHANGELOG.md
│   │           ├── LICENSE
│   │           ├── README.md
│   │           ├── foo.clj
│   │           ├── gitignore
│   │           ├── hgignore
│   │           ├── project.clj
│   │           └── temp.clj
│   └── repl-welcome
├── sample.project.clj
├── src/
│   └── leiningen/
│       ├── change.clj
│       ├── check.clj
│       ├── classpath.clj
│       ├── clean.clj
│       ├── compile.clj
│       ├── deploy.clj
│       ├── deps.clj
│       ├── do.clj
│       ├── help.clj
│       ├── install.clj
│       ├── jar.clj
│       ├── javac.clj
│       ├── new/
│       │   ├── app.clj
│       │   ├── default.clj
│       │   ├── plugin.clj
│       │   ├── template.clj
│       │   └── templates.clj
│       ├── new.clj
│       ├── plugin.clj
│       ├── pom.clj
│       ├── release.clj
│       ├── repl.clj
│       ├── retest.clj
│       ├── run.clj
│       ├── search.clj
│       ├── show_profiles.clj
│       ├── static_classpath.clj
│       ├── test.clj
│       ├── trampoline.clj
│       ├── uberjar.clj
│       ├── update_in.clj
│       ├── upgrade.clj
│       ├── vcs.clj
│       ├── version.clj
│       └── with_profile.clj
├── test/
│   ├── .gnupg/
│   │   ├── gpg.conf
│   │   ├── pubring.kbx
│   │   └── trustdb.gpg
│   ├── leiningen/
│   │   ├── echo.clj
│   │   ├── project.clj
│   │   └── test/
│   │       ├── change.clj
│   │       ├── check.clj
│   │       ├── clean.clj
│   │       ├── compile.clj
│   │       ├── deploy.clj
│   │       ├── deps.clj
│   │       ├── do.clj
│   │       ├── help.clj
│   │       ├── helper.clj
│   │       ├── install.clj
│   │       ├── jar.clj
│   │       ├── javac.clj
│   │       ├── jvm_opts.clj
│   │       ├── new/
│   │       │   └── templates.clj
│   │       ├── new.clj
│   │       ├── pom.clj
│   │       ├── release.clj
│   │       ├── repl.clj
│   │       ├── run.clj
│   │       ├── search.clj
│   │       ├── static_classpath.clj
│   │       ├── test.clj
│   │       ├── uberjar.clj
│   │       ├── update_in.clj
│   │       ├── vcs.clj
│   │       └── with_profile.clj
│   ├── sample-connect-string
│   └── sample-connect-string-http
├── test_projects/
│   ├── .ssh/
│   │   ├── allowed_signers
│   │   ├── id_rsa
│   │   ├── id_rsa.pub
│   │   └── verify
│   ├── README.txt
│   ├── bad-require/
│   │   ├── .gitignore
│   │   ├── project.clj
│   │   └── src/
│   │       └── bad_require/
│   │           └── core.clj
│   ├── data-readers-backwards-compatibility/
│   │   └── project.clj
│   ├── file-not-found-thrower/
│   │   ├── .gitignore
│   │   ├── project.clj
│   │   └── src/
│   │       └── file_not_found_thrower/
│   │           └── core.clj
│   ├── java-main/
│   │   ├── .gitignore
│   │   ├── project.clj
│   │   └── src/
│   │       └── java/
│   │           └── my/
│   │               └── java/
│   │                   └── Main.java
│   ├── jvm-opts/
│   │   └── project.clj
│   ├── leaky-composite/
│   │   └── project.clj
│   ├── lein-test-exit-code/
│   │   ├── project.clj
│   │   └── test/
│   │       └── lein_test_exit_code/
│   │           └── core_test.clj
│   ├── lein-test-reload-bug/
│   │   ├── project.clj
│   │   └── test/
│   │       └── lein_test_reload_bug/
│   │           ├── a_deftype.clj
│   │           ├── b_protocol.clj
│   │           └── core_test.clj
│   ├── managed-deps/
│   │   └── project.clj
│   ├── managed-deps-snapshot/
│   │   └── project.clj
│   ├── more-gen-classes/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── doc/
│   │   │   └── intro.md
│   │   ├── project.clj
│   │   └── src/
│   │       └── more_gen_classes/
│   │           ├── bar.clj
│   │           ├── baz.clj
│   │           └── foo.clj
│   ├── native/
│   │   ├── .gitignore
│   │   └── project.clj
│   ├── overlapped-sourcepaths/
│   │   ├── project.clj
│   │   └── src/
│   │       └── foo
│   ├── preserve-eval-meta/
│   │   ├── .gitignore
│   │   ├── project.clj
│   │   └── src/
│   │       └── preserve_eval_meta/
│   │           └── core.clj
│   ├── provided/
│   │   ├── project.clj
│   │   └── src/
│   │       └── provided/
│   │           └── core/
│   │               └── Example.java
│   ├── reflector/
│   │   ├── .gitignore
│   │   ├── project.clj
│   │   └── src/
│   │       └── reflector/
│   │           ├── classy.clj
│   │           └── main.clj
│   ├── sample/
│   │   ├── .nrepl-port
│   │   ├── checkouts/
│   │   │   └── sample2/
│   │   │       ├── .gitignore
│   │   │       ├── README
│   │   │       ├── project.clj
│   │   │       ├── src/
│   │   │       │   └── sample2/
│   │   │       │       ├── alt.clj
│   │   │       │       └── core.clj
│   │   │       └── test/
│   │   │           └── sample2/
│   │   │               └── core_test.clj
│   │   ├── project.clj
│   │   ├── src/
│   │   │   └── nom/
│   │   │       └── nom/
│   │   │           ├── check.clj
│   │   │           └── nom.clj
│   │   └── test/
│   │       └── test_nom_nom_nom.clj
│   ├── sample-bad-user/
│   │   ├── project.clj
│   │   ├── src/
│   │   │   └── nom/
│   │   │       └── nom/
│   │   │           ├── check.clj
│   │   │           └── nom.clj
│   │   └── test/
│   │       └── user.clj
│   ├── sample-deploy/
│   │   ├── deploy-me-0.1.0-SNAPSHOT-fat.jarr
│   │   └── project.clj
│   ├── sample-failing/
│   │   ├── project.clj
│   │   ├── src/
│   │   │   └── nom/
│   │   │       └── nom/
│   │   │           └── nom.clj
│   │   └── test/
│   │       └── sample/
│   │           └── unreadable.clj
│   ├── sample-fixture-error/
│   │   ├── project.clj
│   │   └── test/
│   │       ├── test_a.clj
│   │       ├── test_b.clj
│   │       └── test_c.clj
│   ├── sample-no-aot/
│   │   ├── dev-resources/
│   │   │   └── dev.clj
│   │   ├── project.clj
│   │   ├── src/
│   │   │   └── nom/
│   │   │       └── nom/
│   │   │           └── nom.clj
│   │   └── test/
│   │       ├── namespace.clj
│   │       └── selectors.clj
│   ├── sample-ordered-aot/
│   │   ├── project.clj
│   │   └── src/
│   │       └── sample_ordered_aot/
│   │           ├── baz.clj
│   │           └── foo.clj
│   ├── sample-profile-meta/
│   │   └── project.clj
│   ├── sample-reader-cond/
│   │   ├── project.clj
│   │   ├── src/
│   │   │   └── nom/
│   │   │       └── nom/
│   │   │           ├── clj.clj
│   │   │           └── cljc.cljc
│   │   └── test/
│   │       ├── clj_test.clj
│   │       ├── cljc_test.cljc
│   │       └── selectors.clj
│   ├── tricky-name/
│   │   ├── .gitignore
│   │   ├── project.clj
│   │   └── src/
│   │       └── org/
│   │           └── domain/
│   │               └── tricky_name/
│   │                   ├── brunch.clj
│   │                   ├── core.clj
│   │                   └── munch.clj
│   ├── uberjar-components-merging/
│   │   ├── components1.xml
│   │   ├── components2.xml
│   │   └── expected-components.xml
│   ├── uberjar-merging/
│   │   ├── project.clj
│   │   └── resources/
│   │       └── data_readers.clj
│   ├── with-aliases/
│   │   └── project.clj
│   ├── with-aliases2/
│   │   └── project.clj
│   ├── with-classifiers/
│   │   └── project.clj
│   ├── with-pom-plugins/
│   │   └── project.clj
│   └── with-resources/
│       ├── project.clj
│       └── resources/
│           └── nested/
│               └── dir/
│                   └── sample.txt
├── web/
│   ├── .htaccess
│   ├── 404.html
│   ├── Makefile
│   ├── _foot.html
│   ├── grench.html
│   ├── img/
│   │   └── favicon/
│   │       ├── browserconfig.xml
│   │       └── manifest.json
│   ├── index.html
│   ├── robots.txt
│   ├── stylesheets/
│   │   ├── base.css
│   │   ├── grench.css
│   │   ├── htmlize.css
│   │   ├── layout.css
│   │   ├── lein.css
│   │   └── skeleton.css
│   ├── template.html
│   └── wiki/
│       ├── .gitignore
│       ├── .htaccess
│       └── Makefile
└── zsh_completion.zsh

================================================
FILE CONTENTS
================================================

================================================
FILE: .build.yml
================================================
# -*- js -*-
{
    "image": "debian/stable",
    "packages": ["gnupg", "leiningen", "openssh-client"],
    "sources": ["https://codeberg.org/leiningen/leiningen"],
    "tasks": [{"build": "cd leiningen/leiningen-core && lein bootstrap && cd .. && bin/lein test"}],
}


================================================
FILE: .circleci/config.yml
================================================
# -*- js -*-
{
  "version": 2.1,
  "executors": {
    "clojure": {
      "docker": [{"image": "clojure:<< parameters.java_version >>-lein"}],
      "parameters": {
        "java_version": {
          "description": "Java version",
          "default": "openjdk-17",
          "type": "string"
        }
      },
      "working_directory": "~/leiningen"
    }
  },
  "jobs": {
    "build": {
      "executor": "clojure",
      "parameters": {
        "java_version": {
          "description": "Java version",
          "default": "<< parameters.java_version >>",
          "type": "string"
        }
      },
      "steps": [
        "checkout",
        {
          "run": "apt update -qq && apt install -y gnupg openssh-client"
        },
        {
          "restore_cache": {
            "key": "leiningen-{{ checksum \"project.clj\" }}-{{ checksum \"leiningen-core/project.clj\" }}"
          }
        },
        {
          "run": {
            "name": "Bootstrap leiningen-core",
            "working_directory": "~/leiningen/leiningen-core",
            "command": "lein bootstrap"
          }
        },
        {
          "run": {
            "name": "Test Leiningen",
            "command": "bin/lein test"
          }
        },
        {
          "save_cache": {
            "paths": ["~/.m2/repository"],
            "key": "leiningen-{{ checksum \"project.clj\" }}-{{ checksum \"leiningen-core/project.clj\" }}"
          }
        }
      ]
    }
  },
  "workflows": {
    "test-with-matrix": {
      "jobs": [
        {"build": {"name": "openjdk17", "java_version": "openjdk-17"}},
        {"build": {"name": "openjdk21", "java_version": "openjdk-21"}}
      ]
    }
  }
}


================================================
FILE: .gitattributes
================================================
#disable autocrlf for all .bat files since they already have CRLF in raw format
*.bat -crlf


================================================
FILE: .github/README.md
================================================
# Hello Github User!

The Leiningen project is in the process of [moving off
Github](https://sfconservancy.org/GiveUpGitHub/).

This repository will continue to be sporadically updated as a mirror
for a while as we work to complete the move, but please switch your
git remotes over to https://codeberg.org/leiningen/leiningen

Codeberg works just like Github, and you can even use your Github
account to log in there, but it is operated like a user-owned
cooperative with a [democratic governance model](https://join.codeberg.org/)
instead of being an extractive arm of an unaccountable abusive megacorp.

As usual, you can join the `#leiningen` IRC channel on
[Libera.Chat](https://libera.chat) to discuss issues.

Any use of this project's code by Github Copilot, past or present, is done
without our permission. We do not consent to Github's use of this project's
code in training Copilot or any other language model.

## For your consideration

I get it, Github is what *everyone* uses. But it's never been a good
idea to allow one company to have a monopoly, and it's an even worse
idea when that company has a history of abusing their monopoly.

If you haven't taken a look at Github alternatives, now's a great time
to evaluate a new home for your project! If you took a look at Gitlab
a few years ago and were put off by its clunkiness and bugs, you
should know that there are much better alternatives now.

[Codeberg](https://codeberg.org/) is perhaps the most polished
alternative, but [Sourcehut](https://git.sr.ht/) is also quite nice
for minimalists, and if you're adventurous you could try running your
own [Forgejo](https://forgejo.org/). Or maybe you [don't even need a
forge](https://www.chiark.greenend.org.uk/~sgtatham/quasiblog/git-no-forge/)?


================================================
FILE: .gitignore
================================================
**/target
*.bak
*.swp
*.class
*asc
*jar
*~
.lein*
/.classpath
/.nrepl-port
/.prepl-port
/.project
/.settings
/hs_err_pid*.log
/lein.man
/lein_ja.man
/leiningen-core/.lein-plugins/checksum
/leiningen-core/.nrepl-port
/leiningen-core/.prepl-port
/leiningen-core/dev-resources/target
/lein-pprint/.nrepl-port
/lein-pprint/.prepl-port
/logs
/scratch.clj
/scratch
/target
/wiki
TAGS
test_projects/*/target
pom.xml
deps.txt
profiles.clj
/test/.gnupg/crls.d/DIR.txt
/test_projects/sample/project.clj.sig
/web/deploy.html
/web/faq.html
/web/plugins.html
/web/profiles.html
/web/templates.html
/web/tutorial.html


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing

Leiningen is the most widely-contributed-to Clojure project a the time
of this writing. We welcome potential contributors and do our best to
try to make it easy to help out.

Discussion occurs primarily in the #leiningen channel on [Libera
chat](https://libera.chat).

Please report issues on the
[issue tracker](https://codeberg.org/leiningen/leiningen/issues). Issues used
to be reported in the [GitHub tracker](https://github.com/technomancy/leiningen/issues)
so you may want to check there to see if things have already been reported.

Code submissions should be sent as [pull
requests](https://codeberg.org/leiningen/leiningen/pulls). Please
use topic branches when sending pull requests rather than committing
directly to `main` in order to minimize unnecessary merge commit
clutter. Direct pull requests towards the `main` branch, not the
stable branch.

You can add a 1-line summary of your change to `NEWS.md` if it's a
user-visible issue that affects more than a handful of people.

Please note that it is ethically unacceptable to submit patches (to
this project or any other) which you did not author yourself without
giving clear attribution to the original author. Note that this
includes submitting changes generated by most so-called "artificial
intelligence" language models as these systems often make it
impossible to even identify (much less credit) the original author.

Note: the canonical repository for Leiningen is [on
Codeberg](https://codeberg.org/leiningen/leiningen) but we maintain [a
mirror on GitHub](https://github.com/technomancy/leiningen) for the
time being in order to ease the transition. Please update your links
and git remotes.

## Codebase

The definitions of the various tasks reside in `src/leiningen` in the
top-level project. The underlying mechanisms for things like
`project.clj` parsing, classpath calculation, and subprocess launching
are implemented inside the `leiningen-core` subproject.

See the
[readme for the leiningen-core library](https://codeberg.org/leiningen/leiningen/src/main/leiningen-core/README.md)
and `doc/PLUGINS.md` for more details on how Leiningen's codebase is
structured.

Try to be aware of the conventions in the existing code, except the
one where we don't write tests. Make a reasonable attempt to avoid
lines longer than 80 columns or function bodies longer than 20
lines. Don't use `when` unless it's for side-effects. Don't introduce
new protocols. Use `^:internal` metadata to mark vars which can't be
private but shouldn't be considered part of the public API.

## Bootstrapping

You don't need to "build" Leiningen per se, but when you're developing on a
checkout you will need to get its dependencies in place and compile some of the
tasks. Assuming you are in Leiningen's project root, you can do that like this:

```bash
$ cd leiningen-core
$ lein bootstrap # or lein.bat on Windows.
```

The `lein` command is a stable release of Leiningen on your `$PATH` – preferably
the newest one. If you don't have a stable `lein` installed, simply check out
the `stable` branch and copy `bin/lein` to somewhere on your `$PATH`, then
switch your branch back.

If you want to use your development copy for everyday usage, symlink
`bin/lein` to somewhere on your `$PATH`. You'll want to rename your
stable installation to keep them from interfering; typically you can
name that `lein2` or `lein-stable`.

When dependencies in Leiningen change, you may have to do `rm .lein-classpath`
in the project root, though in most cases this will be done automatically. If
dependencies in leiningen-core change, you have to redo the `lein bootstrap`
step mentioned earlier.

Using `bin/lein` alone from the main branch without a full checkout
is not supported. If you want to just grab a shell script to work
with, use the `stable` branch.

You can also bootstrap using [Maven](https://maven.apache.org/) to work
around the chicken/egg bootstrapping problem if you cannot or do not want to
install a stable Leiningen build.

```bash
$ cd leiningen-core
$ mvn install
$ mvn dependency:build-classpath -Dmdep.outputFile=cp.txt
```

### Uberjar from main

Since a development version is not uberjared, it can be rather slow compared to
a stable release. If this is annoying and you depend on a recent fix or
enhancement, you can build an uberjar from main as follows:

```bash
# NB! You have to use *bin*/lein to build the uberjar
$ bin/lein uberjar
# ^ Last line printed from this command will tell the location of the standalone
$ cp target/leiningen-2.5.2-SNAPSHOT-standalone.jar $HOME/.lein/self-installs
$ cp bin/lein $HOME/bin/lein-main
```

Here, 2.5.2-SNAPSHOT is the version we've built, and we have `$HOME/bin` on our
$PATH.

Note that changes on main won't be visible in the uberjared version unless you
overwrite both the lein script and a freshly created uberjar.

## Tests

Before you submit a pull request, we would be very happy if you ensure
that the changes you've done doesn't break any of the existing test cases. While
there is a test suite, it's not terribly thorough, so don't put too much trust
in it. Patches which add test coverage for the functionality they change are
especially welcome.

To run the test cases, run `bin/lein test` in the root directory: This will test
both `leiningen-core` and `leiningen` itself. Do not attempt to run the tests
with a stable version of Leiningen, as the namespaces conflict and you may end
up with errors during the test run.


================================================
FILE: COPYING
================================================
Source code distributed under the Eclipse Public License - v 1.0:

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF
THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.

1. DEFINITIONS

"Contribution" means:

a) in the case of the initial Contributor, the initial code and
documentation distributed under this Agreement, and

b) in the case of each subsequent Contributor:

i) changes to the Program, and

ii) additions to the Program;

where such changes and/or additions to the Program originate from and
are distributed by that particular Contributor. A Contribution
'originates' from a Contributor if it was added to the Program by such
Contributor itself or anyone acting on such Contributor's
behalf. Contributions do not include additions to the Program which:
(i) are separate modules of software distributed in conjunction with
the Program under their own license agreement, and (ii) are not
derivative works of the Program.

"Contributor" means any person or entity that distributes the Program.

"Licensed Patents" mean patent claims licensable by a Contributor
which are necessarily infringed by the use or sale of its Contribution
alone or when combined with the Program.

"Program" means the Contributions distributed in accordance with this
Agreement.

"Recipient" means anyone who receives the Program under this
Agreement, including all Contributors.

2. GRANT OF RIGHTS

a) Subject to the terms of this Agreement, each Contributor hereby
grants Recipient a non-exclusive, worldwide, royalty-free copyright
license to reproduce, prepare derivative works of, publicly display,
publicly perform, distribute and sublicense the Contribution of such
Contributor, if any, and such derivative works, in source code and
object code form.

b) Subject to the terms of this Agreement, each Contributor hereby
grants Recipient a non-exclusive, worldwide, royalty-free patent
license under Licensed Patents to make, use, sell, offer to sell,
import and otherwise transfer the Contribution of such Contributor, if
any, in source code and object code form.  This patent license shall
apply to the combination of the Contribution and the Program if, at
the time the Contribution is added by the Contributor, such addition
of the Contribution causes such combination to be covered by the
Licensed Patents. The patent license shall not apply to any other
combinations which include the Contribution. No hardware per se is
licensed hereunder.

c) Recipient understands that although each Contributor grants the
licenses to its Contributions set forth herein, no assurances are
provided by any Contributor that the Program does not infringe the
patent or other intellectual property rights of any other entity. Each
Contributor disclaims any liability to Recipient for claims brought by
any other entity based on infringement of intellectual property rights
or otherwise. As a condition to exercising the rights and licenses
granted hereunder, each Recipient hereby assumes sole responsibility
to secure any other intellectual property rights needed, if any. For
example, if a third party patent license is required to allow
Recipient to distribute the Program, it is Recipient's responsibility
to acquire that license before distributing the Program.

d) Each Contributor represents that to its knowledge it has sufficient
copyright rights in its Contribution, if any, to grant the copyright
license set forth in this Agreement.

3. REQUIREMENTS

A Contributor may choose to distribute the Program in object code form
under its own license agreement, provided that:

a) it complies with the terms and conditions of this Agreement; and

b) its license agreement:

i) effectively disclaims on behalf of all Contributors all warranties
and conditions, express and implied, including warranties or
conditions of title and non-infringement, and implied warranties or
conditions of merchantability and fitness for a particular purpose;

ii) effectively excludes on behalf of all Contributors all liability
for damages, including direct, indirect, special, incidental and
consequential damages, such as lost profits;

iii) states that any provisions which differ from this Agreement are
offered by that Contributor alone and not by any other party; and

iv) states that source code for the Program is available from such
Contributor, and informs licensees how to obtain it in a reasonable
manner on or through a medium customarily used for software exchange.

When the Program is made available in source code form:

a) it must be made available under this Agreement; and

b) a copy of this Agreement must be included with each copy of the Program.

Contributors may not remove or alter any copyright notices contained
within the Program.

Each Contributor must identify itself as the originator of its
Contribution, if any, in a manner that reasonably allows subsequent
Recipients to identify the originator of the Contribution.

4. COMMERCIAL DISTRIBUTION

Commercial distributors of software may accept certain
responsibilities with respect to end users, business partners and the
like. While this license is intended to facilitate the commercial use
of the Program, the Contributor who includes the Program in a
commercial product offering should do so in a manner which does not
create potential liability for other Contributors. Therefore, if a
Contributor includes the Program in a commercial product offering,
such Contributor ("Commercial Contributor") hereby agrees to defend
and indemnify every other Contributor ("Indemnified Contributor")
against any losses, damages and costs (collectively "Losses") arising
from claims, lawsuits and other legal actions brought by a third party
against the Indemnified Contributor to the extent caused by the acts
or omissions of such Commercial Contributor in connection with its
distribution of the Program in a commercial product offering.  The
obligations in this section do not apply to any claims or Losses
relating to any actual or alleged intellectual property
infringement. In order to qualify, an Indemnified Contributor must: a)
promptly notify the Commercial Contributor in writing of such claim,
and b) allow the Commercial Contributor to control, and cooperate with
the Commercial Contributor in, the defense and any related settlement
negotiations. The Indemnified Contributor may participate in any such
claim at its own expense.

For example, a Contributor might include the Program in a commercial
product offering, Product X. That Contributor is then a Commercial
Contributor. If that Commercial Contributor then makes performance
claims, or offers warranties related to Product X, those performance
claims and warranties are such Commercial Contributor's responsibility
alone. Under this section, the Commercial Contributor would have to
defend claims against the other Contributors related to those
performance claims and warranties, and if a court requires any other
Contributor to pay any damages as a result, the Commercial Contributor
must pay those damages.

5. NO WARRANTY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
responsible for determining the appropriateness of using and
distributing the Program and assumes all risks associated with its
exercise of rights under this Agreement , including but not limited to
the risks and costs of program errors, compliance with applicable
laws, damage to or loss of data, programs or equipment, and
unavailability or interruption of operations.

6. DISCLAIMER OF LIABILITY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

7. GENERAL

If any provision of this Agreement is invalid or unenforceable under
applicable law, it shall not affect the validity or enforceability of
the remainder of the terms of this Agreement, and without further
action by the parties hereto, such provision shall be reformed to the
minimum extent necessary to make such provision valid and enforceable.

If Recipient institutes patent litigation against any entity
(including a cross-claim or counterclaim in a lawsuit) alleging that
the Program itself (excluding combinations of the Program with other
software or hardware) infringes such Recipient's patent(s), then such
Recipient's rights granted under Section 2(b) shall terminate as of
the date such litigation is filed.

All Recipient's rights under this Agreement shall terminate if it
fails to comply with any of the material terms or conditions of this
Agreement and does not cure such failure in a reasonable period of
time after becoming aware of such noncompliance. If all Recipient's
rights under this Agreement terminate, Recipient agrees to cease use
and distribution of the Program as soon as reasonably
practicable. However, Recipient's obligations under this Agreement and
any licenses granted by Recipient relating to the Program shall
continue and survive.

Everyone is permitted to copy and distribute copies of this Agreement,
but in order to avoid inconsistency the Agreement is copyrighted and
may only be modified in the following manner. The Agreement Steward
reserves the right to publish new versions (including revisions) of
this Agreement from time to time. No one other than the Agreement
Steward has the right to modify this Agreement. The Eclipse Foundation
is the initial Agreement Steward. The Eclipse Foundation may assign
the responsibility to serve as the Agreement Steward to a suitable
separate entity. Each new version of the Agreement will be given a
distinguishing version number. The Program (including Contributions)
may always be distributed subject to the version of the Agreement
under which it was received. In addition, after a new version of the
Agreement is published, Contributor may elect to distribute the
Program (including its Contributions) under the new version. Except as
expressly stated in Sections 2(a) and 2(b) above, Recipient receives
no rights or licenses to the intellectual property of any Contributor
under this Agreement, whether expressly, by implication, estoppel or
otherwise. All rights in the Program not expressly granted under this
Agreement are reserved.

This Agreement is governed by the laws of the State of New York and
the intellectual property laws of the United States of America. No
party to this Agreement will bring a legal action under this Agreement
more than one year after the cause of action arose. Each party waives
its rights to a jury trial in any resulting litigation.



Images distributed under the Creative Commons Attribution + ShareAlike
License version 3.0:

THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS
CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS
PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE
WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS
PROHIBITED.

BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND
AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS
LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU
THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH
TERMS AND CONDITIONS.

1. Definitions

    "Adaptation" means a work based upon the Work, or upon the Work
    and other pre-existing works, such as a translation, adaptation,
    derivative work, arrangement of music or other alterations of a
    literary or artistic work, or phonogram or performance and
    includes cinematographic adaptations or any other form in which
    the Work may be recast, transformed, or adapted including in any
    form recognizably derived from the original, except that a work
    that constitutes a Collection will not be considered an Adaptation
    for the purpose of this License. For the avoidance of doubt, where
    the Work is a musical work, performance or phonogram, the
    synchronization of the Work in timed-relation with a moving image
    ("synching") will be considered an Adaptation for the purpose of
    this License.

    "Collection" means a collection of literary or artistic works,
    such as encyclopedias and anthologies, or performances, phonograms
    or broadcasts, or other works or subject matter other than works
    listed in Section 1(f) below, which, by reason of the selection
    and arrangement of their contents, constitute intellectual
    creations, in which the Work is included in its entirety in
    unmodified form along with one or more other contributions, each
    constituting separate and independent works in themselves, which
    together are assembled into a collective whole. A work that
    constitutes a Collection will not be considered an Adaptation (as
    defined below) for the purposes of this License.

    "Creative Commons Compatible License" means a license that is
    listed at https://creativecommons.org/compatiblelicenses that has
    been approved by Creative Commons as being essentially equivalent
    to this License, including, at a minimum, because that license:
    (i) contains terms that have the same purpose, meaning and effect
    as the License Elements of this License; and, (ii) explicitly
    permits the relicensing of adaptations of works made available
    under that license under this License or a Creative Commons
    jurisdiction license with the same License Elements as this
    License.

    "Distribute" means to make available to the public the original
    and copies of the Work or Adaptation, as appropriate, through sale
    or other transfer of ownership.

    "License Elements" means the following high-level license
    attributes as selected by Licensor and indicated in the title of
    this License: Attribution, ShareAlike.

    "Licensor" means the individual, individuals, entity or entities
    that offer(s) the Work under the terms of this License.

    "Original Author" means, in the case of a literary or artistic
    work, the individual, individuals, entity or entities who created
    the Work or if no individual or entity can be identified, the
    publisher; and in addition (i) in the case of a performance the
    actors, singers, musicians, dancers, and other persons who act,
    sing, deliver, declaim, play in, interpret or otherwise perform
    literary or artistic works or expressions of folklore; (ii) in the
    case of a phonogram the producer being the person or legal entity
    who first fixes the sounds of a performance or other sounds; and,
    (iii) in the case of broadcasts, the organization that transmits
    the broadcast.

    "Work" means the literary and/or artistic work offered under the
    terms of this License including without limitation any production
    in the literary, scientific and artistic domain, whatever may be
    the mode or form of its expression including digital form, such as
    a book, pamphlet and other writing; a lecture, address, sermon or
    other work of the same nature; a dramatic or dramatico-musical
    work; a choreographic work or entertainment in dumb show; a
    musical composition with or without words; a cinematographic work
    to which are assimilated works expressed by a process analogous to
    cinematography; a work of drawing, painting, architecture,
    sculpture, engraving or lithography; a photographic work to which
    are assimilated works expressed by a process analogous to
    photography; a work of applied art; an illustration, map, plan,
    sketch or three-dimensional work relative to geography,
    topography, architecture or science; a performance; a broadcast; a
    phonogram; a compilation of data to the extent it is protected as
    a copyrightable work; or a work performed by a variety or circus
    performer to the extent it is not otherwise considered a literary
    or artistic work.

    "You" means an individual or entity exercising rights under this
    License who has not previously violated the terms of this License
    with respect to the Work, or who has received express permission
    from the Licensor to exercise rights under this License despite a
    previous violation.

    "Publicly Perform" means to perform public recitations of the Work
    and to communicate to the public those public recitations, by any
    means or process, including by wire or wireless means or public
    digital performances; to make available to the public Works in
    such a way that members of the public may access these Works from
    a place and at a place individually chosen by them; to perform the
    Work to the public by any means or process and the communication
    to the public of the performances of the Work, including by public
    digital performance; to broadcast and rebroadcast the Work by any
    means including signs, sounds or images.

    "Reproduce" means to make copies of the Work by any means
    including without limitation by sound or visual recordings and the
    right of fixation and reproducing fixations of the Work, including
    storage of a protected performance or phonogram in digital form or
    other electronic medium.

2. Fair Dealing Rights. Nothing in this License is intended to reduce,
limit, or restrict any uses free from copyright or rights arising from
limitations or exceptions that are provided for in connection with the
copyright protection under copyright law or other applicable laws.

3. License Grant. Subject to the terms and conditions of this License,
Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
perpetual (for the duration of the applicable copyright) license to
exercise the rights in the Work as stated below:

    to Reproduce the Work, to incorporate the Work into one or more
    Collections, and to Reproduce the Work as incorporated in the
    Collections;

    to create and Reproduce Adaptations provided that any such
    Adaptation, including any translation in any medium, takes
    reasonable steps to clearly label, demarcate or otherwise identify
    that changes were made to the original Work. For example, a
    translation could be marked "The original work was translated from
    English to Spanish," or a modification could indicate "The
    original work has been modified.";

    to Distribute and Publicly Perform the Work including as
    incorporated in Collections; and,

    to Distribute and Publicly Perform Adaptations.

    For the avoidance of doubt:

        Non-waivable Compulsory License Schemes. In those
        jurisdictions in which the right to collect royalties through
        any statutory or compulsory licensing scheme cannot be waived,
        the Licensor reserves the exclusive right to collect such
        royalties for any exercise by You of the rights granted under
        this License;

        Waivable Compulsory License Schemes. In those jurisdictions in
        which the right to collect royalties through any statutory or
        compulsory licensing scheme can be waived, the Licensor waives
        the exclusive right to collect such royalties for any exercise
        by You of the rights granted under this License; and,

        Voluntary License Schemes. The Licensor waives the right to
        collect royalties, whether individually or, in the event that
        the Licensor is a member of a collecting society that
        administers voluntary licensing schemes, via that society,
        from any exercise by You of the rights granted under this
        License.

The above rights may be exercised in all media and formats whether now
known or hereafter devised. The above rights include the right to make
such modifications as are technically necessary to exercise the rights
in other media and formats. Subject to Section 8(f), all rights not
expressly granted by Licensor are hereby reserved.

4. Restrictions. The license granted in Section 3 above is expressly
made subject to and limited by the following restrictions:

    You may Distribute or Publicly Perform the Work only under the
    terms of this License. You must include a copy of, or the Uniform
    Resource Identifier (URI) for, this License with every copy of the
    Work You Distribute or Publicly Perform. You may not offer or
    impose any terms on the Work that restrict the terms of this
    License or the ability of the recipient of the Work to exercise
    the rights granted to that recipient under the terms of the
    License. You may not sublicense the Work. You must keep intact all
    notices that refer to this License and to the disclaimer of
    warranties with every copy of the Work You Distribute or Publicly
    Perform. When You Distribute or Publicly Perform the Work, You may
    not impose any effective technological measures on the Work that
    restrict the ability of a recipient of the Work from You to
    exercise the rights granted to that recipient under the terms of
    the License. This Section 4(a) applies to the Work as incorporated
    in a Collection, but this does not require the Collection apart
    from the Work itself to be made subject to the terms of this
    License. If You create a Collection, upon notice from any Licensor
    You must, to the extent practicable, remove from the Collection
    any credit as required by Section 4(c), as requested. If You
    create an Adaptation, upon notice from any Licensor You must, to
    the extent practicable, remove from the Adaptation any credit as
    required by Section 4(c), as requested.

    You may Distribute or Publicly Perform an Adaptation only under
    the terms of: (i) this License; (ii) a later version of this
    License with the same License Elements as this License; (iii) a
    Creative Commons jurisdiction license (either this or a later
    license version) that contains the same License Elements as this
    License (e.g., Attribution-ShareAlike 3.0 US)); (iv) a Creative
    Commons Compatible License. If you license the Adaptation under
    one of the licenses mentioned in (iv), you must comply with the
    terms of that license. If you license the Adaptation under the
    terms of any of the licenses mentioned in (i), (ii) or (iii) (the
    "Applicable License"), you must comply with the terms of the
    Applicable License generally and the following provisions: (I) You
    must include a copy of, or the URI for, the Applicable License
    with every copy of each Adaptation You Distribute or Publicly
    Perform; (II) You may not offer or impose any terms on the
    Adaptation that restrict the terms of the Applicable License or
    the ability of the recipient of the Adaptation to exercise the
    rights granted to that recipient under the terms of the Applicable
    License; (III) You must keep intact all notices that refer to the
    Applicable License and to the disclaimer of warranties with every
    copy of the Work as included in the Adaptation You Distribute or
    Publicly Perform; (IV) when You Distribute or Publicly Perform the
    Adaptation, You may not impose any effective technological
    measures on the Adaptation that restrict the ability of a
    recipient of the Adaptation from You to exercise the rights
    granted to that recipient under the terms of the Applicable
    License. This Section 4(b) applies to the Adaptation as
    incorporated in a Collection, but this does not require the
    Collection apart from the Adaptation itself to be made subject to
    the terms of the Applicable License.

    If You Distribute, or Publicly Perform the Work or any Adaptations
    or Collections, You must, unless a request has been made pursuant
    to Section 4(a), keep intact all copyright notices for the Work
    and provide, reasonable to the medium or means You are utilizing:
    (i) the name of the Original Author (or pseudonym, if applicable)
    if supplied, and/or if the Original Author and/or Licensor
    designate another party or parties (e.g., a sponsor institute,
    publishing entity, journal) for attribution ("Attribution
    Parties") in Licensor's copyright notice, terms of service or by
    other reasonable means, the name of such party or parties; (ii)
    the title of the Work if supplied; (iii) to the extent reasonably
    practicable, the URI, if any, that Licensor specifies to be
    associated with the Work, unless such URI does not refer to the
    copyright notice or licensing information for the Work; and (iv) ,
    consistent with Ssection 3(b), in the case of an Adaptation, a
    credit identifying the use of the Work in the Adaptation (e.g.,
    "French translation of the Work by Original Author," or
    "Screenplay based on original Work by Original Author"). The
    credit required by this Section 4(c) may be implemented in any
    reasonable manner; provided, however, that in the case of a
    Adaptation or Collection, at a minimum such credit will appear, if
    a credit for all contributing authors of the Adaptation or
    Collection appears, then as part of these credits and in a manner
    at least as prominent as the credits for the other contributing
    authors. For the avoidance of doubt, You may only use the credit
    required by this Section for the purpose of attribution in the
    manner set out above and, by exercising Your rights under this
    License, You may not implicitly or explicitly assert or imply any
    connection with, sponsorship or endorsement by the Original
    Author, Licensor and/or Attribution Parties, as appropriate, of
    You or Your use of the Work, without the separate, express prior
    written permission of the Original Author, Licensor and/or
    Attribution Parties.

    Except as otherwise agreed in writing by the Licensor or as may be
    otherwise permitted by applicable law, if You Reproduce,
    Distribute or Publicly Perform the Work either by itself or as
    part of any Adaptations or Collections, You must not distort,
    mutilate, modify or take other derogatory action in relation to
    the Work which would be prejudicial to the Original Author's honor
    or reputation. Licensor agrees that in those jurisdictions
    (e.g. Japan), in which any exercise of the right granted in
    Section 3(b) of this License (the right to make Adaptations) would
    be deemed to be a distortion, mutilation, modification or other
    derogatory action prejudicial to the Original Author's honor and
    reputation, the Licensor will waive or not assert, as appropriate,
    this Section, to the fullest extent permitted by the applicable
    national law, to enable You to reasonably exercise Your right
    under Section 3(b) of this License (right to make Adaptations) but
    not otherwise.

5. Representations, Warranties and Disclaimer

UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING,
LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR
WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED,
STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF
TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE,
NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY,
OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT
DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED
WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.

6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY
APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY
LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR
EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK,
EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

7. Termination

    This License and the rights granted hereunder will terminate
    automatically upon any breach by You of the terms of this
    License. Individuals or entities who have received Adaptations or
    Collections from You under this License, however, will not have
    their licenses terminated provided such individuals or entities
    remain in full compliance with those licenses. Sections 1, 2, 5,
    6, 7, and 8 will survive any termination of this License.

    Subject to the above terms and conditions, the license granted
    here is perpetual (for the duration of the applicable copyright in
    the Work). Notwithstanding the above, Licensor reserves the right
    to release the Work under different license terms or to stop
    distributing the Work at any time; provided, however that any such
    election will not serve to withdraw this License (or any other
    license that has been, or is required to be, granted under the
    terms of this License), and this License will continue in full
    force and effect unless terminated as stated above.

8. Miscellaneous

    Each time You Distribute or Publicly Perform the Work or a
    Collection, the Licensor offers to the recipient a license to the
    Work on the same terms and conditions as the license granted to
    You under this License.

    Each time You Distribute or Publicly Perform an Adaptation,
    Licensor offers to the recipient a license to the original Work on
    the same terms and conditions as the license granted to You under
    this License.

    If any provision of this License is invalid or unenforceable under
    applicable law, it shall not affect the validity or enforceability
    of the remainder of the terms of this License, and without further
    action by the parties to this agreement, such provision shall be
    reformed to the minimum extent necessary to make such provision
    valid and enforceable.

    No term or provision of this License shall be deemed waived and no
    breach consented to unless such waiver or consent shall be in
    writing and signed by the party to be charged with such waiver or
    consent.

    This License constitutes the entire agreement between the parties
    with respect to the Work licensed here. There are no
    understandings, agreements or representations with respect to the
    Work not specified here. Licensor shall not be bound by any
    additional provisions that may appear in any communication from
    You. This License may not be modified without the mutual written
    agreement of the Licensor and You.

    The rights granted under, and the subject matter referenced, in
    this License were drafted utilizing the terminology of the Berne
    Convention for the Protection of Literary and Artistic Works (as
    amended on September 28, 1979), the Rome Convention of 1961, the
    WIPO Copyright Treaty of 1996, the WIPO Performances and
    Phonograms Treaty of 1996 and the Universal Copyright Convention
    (as revised on July 24, 1971). These rights and subject matter
    take effect in the relevant jurisdiction in which the License
    terms are sought to be enforced according to the corresponding
    provisions of the implementation of those treaty provisions in the
    applicable national law. If the standard suite of rights granted
    under applicable copyright law includes additional rights not
    granted under this License, such additional rights are deemed to
    be included in the License; this License is not intended to
    restrict the license of any rights under applicable law.


================================================
FILE: NEWS.md
================================================
# Leiningen News -- history of user-visible changes

## 2.12.0 / 2025-09-12

This will be the last release of Leiningen that is still mirrored on
Github; future releases will be Codeberg-only.

* Use `:managed-dependencies` instead of `:exclusions` for version ranges. (Phil Hagelberg)
* Add `:plugin-tree-data` subcommand to deps task. (Gabriel Giussi)
* Fix a bug in `:active-profiles` in middleware plugins. (Rob Browning)
* Update to nREPL 1.3.0 (oyakushev)
* Update Clojure version (Justin Polchlopek)

## 2.11.2 / 2024-02-13

* Add `:preserve-eval-meta` setting to avoid project code reflection. (Marco Biscaro)
* Fix a bug where metadata on project code caused plugin incompatibilities. (Marco Biscaro)

## 2.11.1 / 2024-01-28

* Fix a bug when deploying using passwords read from the console. (Phil Hagelberg)

## 2.11.0 / 2024-01-27

* Top-level `:exclusions` can now affect top-level `:dependencies`. (Juan Monetta)
* Fix a bug where `:eval-in :nrepl` couldn't detect running repl. (Phil Hagelberg)
* Fix a bug where `:eval-in :nrepl` would crash. (Marco Biscaro)
* Fix a bug where files on test path could be visible during jar. (Phil Hagelberg)
* Fix an issue with `check` in namespaces that rely on AOT. (Phil Hagelberg)
* Fix a redundant confusing dependencies warning. (Phil Hagelberg)
* Add `static-classpath` task for static analysis. (Phil Hagelberg)
* Major performance improvements handling pathological dependency trees. (Marco Biscaro)
* Improve error reporting for search failures. (rome user)
* Support XDG config directories. (Phil Hagelberg)
* Use `$XDG_CACHE_HOME` for self-installs if it exists. (Phil Hagelberg)
* Add warnings for buggy composite profiles. (Phil Hagelberg)

## 2.10.0 / 2022-12-09

* Update to nREPL 1.0.0 (Phil Hagelberg)
* Fix a bug where `:eval-in :leiningen` could suppress test exit code. (Phil Hagelberg)
* Add the ability to sign deployed files using SSH keys, not just GPG. (Phil Hagelberg)
* Fix a bug where uberjar splices profiles into target path incorrectly. (Phil Hagelberg)

## 2.9.10 / 2022-08-09

* Fix a bug where dev-resources could leak into jars/uberjars. (Phil Hagelberg)
* Avoid illegal reflective access doing XML parsing in uberjar/search. (Phil Hagelberg)

## 2.9.9 / 2022-08-05

* Migrate the repository from Github to Codeberg. (Phil Hagelberg)
* Fix a bug in `new` where template group-ids could be ignored. (Phil Hagelberg)
* Work around a change in Java 9 which broke template listing. (Phil Hagelberg)
* Fix a bug in pedantic checks which resulted in infinite loops. (Phil Hagelberg)
* Prevent `module-info.class` files from being included in uberjars. (Phil Hagelberg)
* Prevent duplicate warnings in `resource-paths` when creating jars. (Phil Hagelberg)
* Fix an issue with `check` where AOT would shadow reflection warnings. (Phil Hagelberg)
* Allow `change` to edit dependency versions. (Eric Schoen)
* Fix a bug where composite profiles would leak dependencies downstream. (Phil Hagelberg)
* Allow `repl` to bind to filesystem sockets via `:headless :socket PATH` (Rob Browning)

## 2.9.8 / 2021-11-11

* Fix a bug where certain deep dependency trees would overflow stack. (Phil Hagelberg)
* Allow `LEIN_JAR` to be overridden if you install elsewhere. (Ahmed Sajid)

## 2.9.7 / 2021-09-15

* Detect certain pathological dependency trees and warn. (Phil Hagelberg)
* Bump to Clojure 1.10.3. (Grzegorz Smajdor)
* Don't warn on version ranges which point to a single version. (Pierre-Yves Ritschard)
* Fix a bug where verifying deps could loop forever. (James Carnegie)
* Get better error messages when deploys fail. (Toby Crawley)

## 2.9.6 / 2021-04-15

* Look for templates in a way that reflects new Clojars group rules. (Phil Hagelberg)
* Update template-generating template to reflect new Clojars rules. (Phil Hagelberg)
* Don't `:reload` in tests unless connecting to an nrepl. (Ambrose Bonnaire-Sergeant)

## 2.9.5 / 2020-12-07

* Several dependency version bumps. (Bozhidar Batsov, Utkarsh Gupta, Chris Thunes)

## 2.9.4 / 2020-07-08

* Fix a bug where dependency conflict resolution errors were wrong. (Phil Hagelberg)
* Make test selectors skip non-test vars. (Mourjo Sen)
* Fix a bug where `deps :query` would report incorrect results. (Chris Thunes)
* Update nREPL to 0.7. (Bozhidar Batsov)
* Add scheme configuration support to REPL-y and use configured transport when starting the ack-server. (Paulo Feodrippe, Bozhidar Batsov)

## 2.9.3 / 2020-03-16

* Fix a bug where deploying would fail to send signature checksums. (Antonin Hildebrand)
* Memoize application of project middleware. (Chris Thunes)
* Fix a bug where checksum verification failed on non-GNU systems. (Antonio Hernández Blas)

## 2.9.2 / 2020-02-28

* Bump to Clojure 1.10.1. (Phil Hagelberg)
* Fix a bug where disabling implicit middleware disabled explicit ones. (radhika reddy)
* Add checksum check during self-install process. (Toyam Cox)
* Include repository auth when verifying dependencies. (David Bürgin)
* Fix bugs in certain kinds of profile merging. (David Bürgin)
* Include `:repositories` from `project.clj` in `pom.xml` file. (David Bürgin)

## 2.9.1 / 2019-02-26

* Fix a bug where provided namespace compilation order was overridden. (Phil Hagelberg)
* Don't emit namespaced maps when merging data readers for uberjar. (Joel Kaasinen)

## 2.9.0 / 2019-02-10

* Re-enable bootclasspath optimization by default. (Phil Hagelberg)
* Sort namespace order consistently during AOT. (Logan Girard)
* Use Clojure 1.10.0 for plugins and new templates projects. (Alex Miller, Phil Hagelberg)
* Update nREPL to 0.6. (Bozhidar Batsov)

## 2.8.3 / 2018-12-14

* Fix a warning in the powershell script. (Florian Anderiasch)
* Fix a bug where the repl wouldn't launch. (Bozhidar Batsov)
* Remove broken unattended GPG deploy feature.
* Fix a bug where the repl didn't use `:main` as the initial ns. (Phil Hagelberg)

## 2.8.2 / 2018-12-11

* Fix a bug where hidden files would be included in jars. (James Elliott)
* Add support for repository-overrides.clj to bootstrap repository info. (Greg Haskins)
* Use stderr consistently for diagnostics. (Rob Browning)
* Fix a bug in aliases that come from profiles. (Arnout Roemers)
* Fix TLS errors in self-install on Windows. (Florian Anderiasch)
* Templates use EPL-2.0 with GPL secondary license. (Yegor Timoshenko)
* Allow GPG to be invoked unattended with passphrase. (Neil Okamoto)
* Add pprint `--not-pretty` argument that prints instead of pprinting. (Rob Browning)
* Always send diagnostic messages to standard error. (Rob Browning)
* Add project coordinate data to jar metadata. (Conor McDermottroe)
* Allow freeform `:pom-plugin` configuration. (Hannu Hartikainen)
* **(Breaking)** Switch to [nREPL 0.5](https://metaredux.com/posts/2018/10/29/nrepl-redux.html). See the [upgrade notes](https://nrepl.org/nrepl/installation.html#upgrading) if you experience any problems with the `lein repl` task. (Bozhidar Batsov)

## 2.8.1 / 2017-10-27

* Fix a bug where `lein help` couldn't list built-in tasks on Java 9. (Phil Hagelberg)
* Fix a bug where `lein` installed from package managers would obscure exit code. (Phil Hagelberg)
* Fix an errant reflection warning on Java 9. (Toby Crawley)
* Fix an error when no `:plugins` are specified. (Phil Hagelberg)
* Fix a bug where launching project subprocesses would encounter unreadable forms. (Phil Hagelberg)
* Remove auto-setting of cgroups memory limit. (Florian Anderiasch)

## 2.8.0 / 2017-10-17

* Support `LEIN_USE_BOOTCLASSPATH` for users on Java 8. (Phil Hagelberg)
* Disable bytecode verification in Leiningen's own JVM for Java 9 compatibility. (Ghadi Shayban)
* Infer values for pom `<scm>` tag from `.git` directory. (Nicolas Berger)

## 2.8.0-RC1 / 2017-09-18

* Project middleware, hooks, and the `:test` profile are considered deprecated. (Phil Hagelberg)
* Help output no longer includes TOC output. (Irina Renteria)
* The `vcs` task allows the commit message to be customized. (Toby Crawley)
* JVMs on 8u131 and newer will default to using cgroups settings for memory limits. (Phil Hagelberg)
* Add `:query` subcommand to `deps` to quickly find latest versions. (Phil Hagelberg)
* Fix a bug where dependency resolution wasn't cached correctly. (Phil Hagelberg)
* Support for HTTP nREPL has been moved out; requires drawbridge plugin now. (Phil Hagelberg)
* Warn when `$CLASSPATH` is set. (Phil Hagelberg)
* Default to requiring TLS for remote repositories. (Phil Hagelberg)
* Remove warning when running as root. (Phil Hagelberg)
* Add `:why` subtask to `deps` for tracing individual deps. (Phil Hagelberg)
* Remove clj-http and cheshire dependencies, reducing likelihood of conflict. (Phil Hagelberg)
* Warn when plugin dependencies conflict with Leiningen's own. (Phil Hagelberg)
* Fix a bug where repls outside a project were not run in Leiningen's own process. (Phil Hagelberg)
* Add `:plugin-tree` and `:tree-data` subtasks to `deps`. (Ken Restivo)
* Support skipping bootclasspath for Java 9 compatibility. (Phil Hagelberg)
* Allow `vcs` task to skip signing tags. (Nicolas Berger)
* The `search` task no longer downloads indices but hits live search APIs. (Phil Hagelberg)
* Remove duplicate exclusions in `lein deps`. (Emlyn Corrin)
* Leiningen is now installable again via chocolatey. (Florian Anderiasch)
* Dependency names can be specified as strings in addition to symbols. (Wes Morgan)

## 2.7.1 / 2016-09-22

* Add support for SDKMAN! as installation alternative. (Jean Niklas L'orange)
* Improved explanation in some errors. (Jean Niklas L'orange)
* Don't require `nil` for version in managed deps. (Chris Price)
* Fix a bug with snapshot dependencies for managed deps. (Chris Price)

## 2.7.0 / 2016-08-24

* Add PowerShell script for Windows users. (Brian Lalonde)
* Run `:prep-tasks` before `lein test`, so generated test namespaces will be tested. (Martin Reck)
* Better error message when attempting to do `lein run` without `project.clj`. (Eduardo Seabra Silva)
* Add support for `:managed-dependencies`. (Chris Price)
* Provide the current clojars certificate. (Toby Crawley)
* Add `*eval-print-dup*` to evaluate forms passed to `eval-in-leiningen` with `*print-dup*`. (Eduardo Seabra Silva)
* Update bash completions. (Zack Dever)
* Respect `:scm :dir` in `lein vcs` commands. (Ian Kerins)
* Improve whitespace handling from `JVM_OPTS`. (Stephen Nelson)
* Catch and handle fixture errors during `lein test`. (Alex Hall)
* Fix a bug where spaces in directory names on Windows caused crashes. (Leon Mergen, Tobias Kiertscher, Jean Niklas L'orange)
* Fix a bug where `lein search` would take forever downloading clojars.org. (Paul Dorman)
* Retain user defined private repositories when building jars, uberjars and deploy. (Rick Moynihan)
* Honor whitelist settings when `lein javac` is called via `lein jar`. (Chris Price)
* `lein vsc push` for git will now only push branch-related tags. (Łukasz Klich)

## 2.6.1 / 2016-02-08

* Fix a bug where some plugins crashed when used. (Jean Niklas L'orange)

## 2.6.0 / 2016-02-05

* The templates, repl and Leiningen itself now use Clojure 1.8.
* Support for Clojure 1.1.0 and older is now dropped.
* Warn if possibly stale native dependencies end up in `:native-path`. (Jean Niklas L'orange)
* Speed up restarts after `:dependency` changes. (Jean Niklas L'orange)
* `lein release` now supports SNAPSHOT on qualifiers. (Chris Price)
* Synchronise `lein-pkg` and `lein` scripts. (Thu Trang Pham)
* Decrease timeout for the Clojure compiler agent thread pool. (Ryan Fowler)
* Fix a bug where implicit resource directories were created by default. (Jean Niklas L'orange)
* Avoid optimizing away stack traces by default. (solicode)
* Fix a bug where duplicate profiles were merged when profile merging. (Jean Niklas L'orange)
* Improved GPG artifact signing feedback. (Jean Niklas L'orange, Andrea Richiardi)
* Add function to support binary files with `lein-new`. (Sergiy Bondaryev)
* Show better error message when java is not found on the path. (Pavel Prokopenko, Jürgen Hötzel)
* Fix a bug with non-GitHub SCM urls in pom files. (Ralf Schmitt)
* Don't send aot warning if `:aot` contains regex matching the main namespace. (Emlyn Corrin)

## 2.5.3 / 2015-09-21

* Add CHANGELOG.md to default lein templates. (Daniel Compton)
* `lein vcs tag` now supports the `--no-sign` flag. (Daniel Compton)
* Fix a bug where javac errors were not printed to terminal. (Brandon Shimanek)
* Fix a bug where environment variables were not propagated down to GPG. (Brandon Shimanek)
* `lein retest` now saves information on which tests that fail. (Shalaka Patil)
* `lein release` now honors exit codes from `git` and throws if non-0 occurs. (Tim Visher)

## 2.5.2 / 2015-08-09

* Allow repl dependencies to be specified in default user profiles. (Jean Niklas L'orange)
* Fix a bug where transitive dependencies on tools.nrepl failed. (Jean Niklas L'orange)
* Fix a bug preventing custom certificates to work. (Jean Niklas L'orange)
* Add support for reader conditional files. (Stephen Nelson)
* Add `--template-version` flag to `lein new`. (Ohta Shogo)
* Bail immediately if snapshot dependencies are discovered during uberjaring. (Justin Smith)
* Use powershell by default in `lein.bat`. (Frederick Giasson, Florian Anderiasch)
* Fix bug where manifest files could contain duplicate entries. (Michael Blume)
* Allow template designers to use a custom rendering function. (Dmitri Sotnikov)
* Fix a bug where `:uberjar-name` wasn't used when inside the `:uberjar` profile. (Kyle Harrington)

## 2.5.1 / 2015-01-09

* No longer skip certificate checking when upgrading on Windows. (Phil Hagelberg)
* Fix password prompt for Cygwin users. (Carsten Behring)
* Fix a bug where `lein pom` did not add the project's SCM URL to pom.xml. (Fredrick Giasson)
* `lein clean` now cleans up all profile targets. (Jeb Beich, Jim Crossley)
* The order included profiles are merged in is now retained. (Jim Crossley)
* Fix a bug preventing `update-in` to use functions not yet required. (Phil Hagelberg)
* Allow multiple `:repl` profiles. (Hugo Duncan)
* Fix an infinite recursion bug with aliases and `with-profile`. (Hugo Duncan)
* Add flexibility in jar manifest declarations. (Fabio Tudone)
* Fix a bug preventing extra profiles from being included in jars. (Hugo Duncan)
* Fix a bug in self-install on Windows. (Sindunata Sudarmaji)

## 2.5.0 / 2014-09-14

* Allow certain profiles to be `^:leaky` and affect downstream. (Hugo Duncan)
* Allow profiles to be loaded out of plugins. (Phil Hagelberg, Hugo Duncan)
* Make `leiningen.core.project/read` init the project and merge default profiles. (Phil Hagelberg)
* Move auto-clean to jar task for consistency. (Phil Hagelberg)
* Make compilation messages honor `$LEIN_SILENT` (Jean Niklas L'orange)
* Fix a bug around EOF in the repl. (Colin Jones)
* Add `:implicits` subtask to `deps` task. (Phil Hagelberg)
* Update zsh completion rules. (Joshua Davey)
* Fix a stack overflow with :pedantic. (Nelson Morris)
* Fix a bug where repls outside of a project were broken. (Phil Hagelberg)

## 2.4.3 / 2014-08-05

* Allow implicit hooks/middleware to be disabled. (Phil Hagelberg)
* Print compilation errors as they occur. (Paul Legato)
* Switch Central repository to using HTTPS. (Manfred Moser)
* Add `LEIN_NO_USER_PROFILES` to avoid loading user profile. (Hugo Duncan)
* Fix deploy task to work with signature files. (Phil Hagelberg)
* Allow vcs tags to be created with a prefix. (Yannick Scherer)
* Default to warning when version ranges are present. (Phil Hagelberg)
* Let templates be loaded from `:plugin-repositories`. (Jason Felice)

## 2.4.2 / 2014-06-15

* Fix a bug preventing out-of-project runs. (Phil Hagelberg)
* Only load Clojars SSL cert on-demand to improve boot time. (Phil Hagelberg)

## 2.4.1 / 2014-06-15

* Don't commit untracked files in `lein vcs commit`. (Phil Hagelberg)
* Fix a bug where `:mirrors` could not be configured. (Phil Hagelberg)
* Expose `pom.properties` for access to version number during development. (Phil Hagelberg)
* Fix a bug preventing the release task from loading. (Phil Hagelberg)

## 2.4.0 / 2014-06-09

* Allow aliases to splice in values from the project map. (Phil Hagelberg)
* Allow plugins to override built-in tasks. (Phil Hagelberg)
* Add `release` task for automating common release steps. (Wayne Warren, Chris Truter, Phil Hagelberg)
* Add `change` task for programmatc `project.clj` manipulation. (Chris Truter, Max Barnash)
* Abort when `defproject` contains duplicate keys. (Peter Garbers)
* Add `vcs` task to automate version control. (Phil Hagelberg, Wayne Warren)
* Automatically `clean` before `deploy` to avoid AOT in libraries. (Phil Hagelberg)
* Emit warnings to stderr. (Andy Chambers)
* Use `clojure.main` for uberjars that don't declare their own `:main`. (Phil Hagelberg)
* Allow templates to load from `:plugin-repositories`. (Phil Hagelberg)
* Fix a race condition on printing during dependency resolution. (Phil Hagelberg)
* Allow `new` templates to operate on existing directories with `--force` option. (Matthew Blair)
* Fix `search` task to allow queries on multiple fields. (Colin Jones)
* Fix a bug where errors in `run` task were mis-reported. (Gary Fredericks)
* Report download progress of search indices. (Matthew Blair)
* Protection from harmful `:clean-targets` settings. (Craig McDaniel)
* Faster loading of help text. (David Grayson, Ryan Mulligan)
* Add `LEIN_SILENT` option to suppress `*info*` output. (Phil Hagelberg)

## 2.3.4 / 2013-11-18

* Suggest `:exclusions` to possibly confusing `:pedantic?` dependencies. (Nelson Morris, Phil Hagelberg)
* Optionally look for snapshot templates in `new` task. (Travis Vachon)
* Allow task chains to be declared without commas in project.clj. (Jean Niklas L'orange)
* Support extra configurability in `:pom-plugins`. (Dominik Dziedzic)
* Fix a bug where implicit :aot warning triggered incorrectly. (Jean Niklas L'orange)
* Fix a bug where `lein repl connect` ignored port argument. (Toby Crawley)

## 2.3.3 / 2013-10-05

* Add support for `:uberjar-merge-with`. (Marshall Bockrath-Vandegrift)
* Better error message for `-m` arg in `run` task. (Aleksandar Simic)
* Support stdin when using `:eval-in :nrepl`. (Phil Hagelberg)
* Add directory entries to jar files. (Vadim Platonov)
* Fix a bug where `-main` was hard-coded to initial directory. (Phil Hagelberg)

## 2.3.2 / 2013-08-19

* Write `.nrepl-port` file for better tool interoperability. (Phil Hagelberg)
* Support targeted upgrades in `lein.bat`. (Shantanu Kumar)
* Warn when projects rely on implicit AOT of `:main`. (Phil Hagelberg)
* Fix a bug where implicit AOT of `:main` was disabled. (Phil Hagelberg)
* Disable profile isolation by default. Will be back in 3.x. (Phil Hagelberg)

## 2.3.1 / 2013-08-13

* Fix self-install bug. (Sam Aaron, Steven Harms)
* Fix bug with AOT classes not being included in jars. (Phil Hagelberg)
* Support disabling test task's monkeypatch of `clojure.test`. (Phil Hagelberg)
* Allow project map to be readable. (Phil Hagelberg)

## 2.3.0 / 2013-08-08

* Add `:eval-in :pprint` for debugging. (Phil Hagelberg)
* Support cleaning extra dirs with `:clean-targets`. (Yoshinori Kohyama)
* Test-selectors skip fixtures too, not just running tests. (Gary Fredericks)
* Place licenses and readmes into jars. (Phil Hagelberg)
* Include LICENSE as separate file in templates. (Wolodja Wentland)
* Allow aborting on ambiguous version resolution with `:pedantic`. (Nelson Morris, Phil Hagelberg)
* Scope `:compile-path` and `:native-path` under profile-specific target dir. (Phil Hagelberg)
* Fix bug where uberjar filename would include provided profile. (Phil Hagelberg)
* Deprecate explicit `self-install` command. (Phil Hagelberg)
* Fix bugs around long lines in jar manifests. (Leon Barrett)
* Support nested checkout dependencies. (Phil Hagelberg)
* Fix bugs around `:filespecs`. (Jean Niklas L'orange)

## 2.2.0 / 2013-05-28

* Support setting custom welcome message when repl connects. (Colin Jones)
* Fix a bug where old template versions were always fetched. (Nelson Morris)
* Support `:java-agents` for tooling and instrumenting. (Phil Hagelberg)
* Allow checkout dependencies to operate recursively. (Phil Hagelberg)
* Introduce `:uberjar` profile. (Phil Hagelberg)
* Isolate target paths by profiles. (Phil Hagelberg)
* Support deploying ad-hoc files. (Phil Hagelberg)
* Set `*command-line-args*` in run task. (Anthony Grimes)
* Allow templates to specify executable files. (Joe Littlejohn)
* Remove clojuredocs repl support to reduce dependency conflicts. (Phil Hagelberg)

## 2.1.3 / 2013-04-12

* Fix fast trampoline to work without user profiles. (Malcolm Sparks)
* Fix a bug where duplicate files in jars would blow up. (Phil Hagelberg)
* Fix a bug where cyclical dependencies could cause a crash. (Nelson Morris)
* Allow aliases to have docstrings. (Jean Niklas L'orange)
* Read credentials from GPG for mirrors. (bdollard)
* Fix bugs in `update-in` around profiles and more. (Marko Topolnik)

## 2.1.2 / 2013-02-28

* Add new way to specify no-proxy hosts. (Joe Littlejohn)
* Allow TieredCompilation to be disabled for old JVMs. (Phil Hagelberg)
* Fix a bug merging keywords in profiles. (Jean Niklas L'orange)
* Fix a bug where tests wouldn't run under with-profiles. (Phil Hagelberg)
* Support for calling set! on arbitrary vars on startup. (Gary Verhaegen)
* Allow update-in to work on top-level keys. (Marko Topolnik)
* Fix a bug breaking certain templates. (Colin Jones)
* Fix a bug where trampolined repl would hang. (Marko Topolnik)

## 2.1.1 / 2013-03-21

* Add `:test-paths` to directories shared by checkout deps. (Phil Hagelberg)
* Allow `run` task to function outside projects. (Phil Hagelberg)
* Fix a bug preventing `with-profiles` working outside projects. (Colin Jones)
* Fix a bug in trampolined `repl`. (Colin Jones)
* Fix a bug in `update-in` task causing stack overflow. (David Powell)
* Fix a bug in `lein upgrade`. (Phil Hagelberg)

## 2.1.0 / 2013-03-19

* Compile task accepts regexes as command-line args. (Joshua P. Tilles)
* Allow key to be specified to use when signing artifacts. (Tim McCormack)
* Added GPG introductory guide. (Toby Crawley)
* Many bug fixes in batch file launcher. (David Powell)
* Self install via lein.bat no longer requires curl/wget. (slahn)
* Allow stdin of project processes to be closed. (Jean Niklas L'orange)
* Better behaviour when GPG or keys are missing. (Toby Crawley)
* Support customizing key-managers for SSL. (Stephen Nelson)
* Add update-in task for arbitrary project map changes. (Phil Hagelberg)
* Warn when version ranges are detected. (Nelson Morris)
* Add support for msys on Windows machines. (megri)
* Allow use of :mirrors when building jars/uberjars. (Tim McCormack)
* Dependencies may include native components more flexibly. (Marc Liberatore)
* Implement system-level profiles. (Phil Hagelberg)
* Accept repo credentials on the CLI for deploy. (Max Prokopiev)
* Fix a bug breaking recursive aliases. (Hugo Duncan)
* Add support for preventing deployment of branches. (Anthony Grimes)
* Improve boot time by limiting tiered compilation in dev. (Phil Hagelberg)
* Allow building jars with classifiers. (Hugo Duncan)
* Allow :init-ns to be honored by other nrepl clients. (Marko Topolnik)
* Add experimental support for :eval-in :nrepl. (Phil Hagelberg)
* Don't follow symlinks in clean task. (Jean Niklas L'orange)
* Add support for ~/.lein/profiles.d. (Jean Niklas L'orange)
* Allow ctrl-c to interrupt repl input (Colin Jones)
* Allow `lein test` to take files as arguments (Gabriel Horner)

## 2.0.0 / 2013-01-19

* Allow implicit repl profiles to be overridden.
* Accept `:main` as an alias for `-m` in `run` task.
* Reader fixes for `repl`. (Colin Jones, Chas Emerick)
* Fix bug around stdin for subprocesses that have stopped. (Jean Niklas L'orange)
* Warn when `:user` profile is found in `project.clj`. (Michael Grubb)
* Treat `:user` profile as project map outside of project. (Jean Niklas L'orange)

## 2.0.0-RC2 / 2013-01-12

* Fix bug where newnew wouldn't be loaded from outside a project.
* Fix Windows bug in project generation.
* Fix `lein upgrade` bug.

## 2.0.0-RC1 / 2013-01-10

* Fix some reader bugs in repl task. (Colin Jones)
* Fix a bug where Leiningen's deps could affect javac. (Jean Niklas L'orange)
* Test selectors may allow entire namespaces to be skipped. (Anthony Grimes)
* Allow project's git repo to be different than project root. (David Greenberg)
* Don't AOT the `:main` namespace outside of jar/uberjar task.
* Allow hooks from profiles to apply with limited scope. (Hugo Duncan)
* Fix a bug where profile-specific paths were ignored in trampoline.
* Support reading from stdin inside project process.
* Add `:only` test selector. (Anthony Grimes)
* Support partial application for test selectors. (Anthony Grimes)
* Un-deprecate `:auth` profile for full-disk-encryption users.
* Add documentation for mixed-source projects. (Michael Klishin)
* Make later profiles take precedence in with-profile task. (Justin Balthrop)
* Improve help for subtasks. (Tobias Crawley)
* Allow vectors to specify multiple credential sources. (Chas Emerick)
* Look up credentials in environment using namespaced keywords. (Chas Emerick)
* Support overriding repl profile from project.clj or profiles.clj.
* Allow test selectors to operate on namespace. (Jim Crossley)
* Honor environment variables in project.clj. (Justin Balthrop)
* Allow searching over fields other than artifact id. (Michael Klishin)
* Honor per-project REPL history. (Michael Klishin, Colin Jones)
* Reduce output during dependency resolution. (Nelson Morris)
* Fix search task outside project. (Bruce Adams)

## 2.0.0-preview10 / 2012-08-25

* Fix a bug where repositories wouldn't be checked running outside a project.
* Make repl listen on 127.0.0.1 instead of localhost to address IPv6 issues.

## 2.0.0-preview9 / 2012-08-24

* Use provided profile by default everywhere except uberjar. (Marshall Vandegrift)
* Unify format for auto-loading middleware and hooks. (Justin Balthrop)
* Allow more declarative :nrepl-middleware settings. (Chas Emerick)
* Fix `:eval-in :classloader` for native dependencies. (Justin Balthrop)
* Support project and user leinrc file for shell-level customization. (Justin Balthrop)
* Cache trampoline commands for fast boot. Set `$LEIN_FAST_TRAMPOLINE` to enable.
* Support setting HTTPS proxies.
* Improved resilience when self-install is interrupted. (Bruce Adams)
* Fix a bug where profile dependencies weren't honored in trampoline task.

## 2.0.0-preview8 / 2012-08-16

* Place SCM revision in pom.properties in jar files.
* Allow middleware and hooks to be inferred from plugins. (Justin Balthrop)
* Offer similar suggestions when no task is found for input. (Joe Gallo)
* Support `TERM=dumb` in repl task. (Colin Jones)
* Fix reader mismatches between repl client and server. (Colin Jones)
* Use new search index format, support incremental updates. (Christoph Seibert)
* Accept nREPL handlers and middleware from project config.
* Support emitting arbitrary elements in pom.xml. (Esa Laine)
* Fix a bug where repl task was binding to 0.0.0.0.
* Honor `$http_no_proxy` host settings. (Jon Pither)
* Profiles can be specified as compositions of other profiles. (Justin Balthrop)
* Allow for `:prep-tasks` with arguments. (Anthony Marcar)
* Check for "help" after task name. (Bruce Adams)
* Read dependency transport wagons from plugins.
* Allow successive eval-in-project calls with trampoline.
* Bring back selective post-compile cleaning. (Arlen Cuss)
* Fix memory leak in repl task.

## 2.0.0-preview7 / 2012-06-27

* Fix a bug where failed javac wouldn't abort. (Michael Klishin)
* Check task aliases everywhere tasks are invoked.
* Sign jars and poms of releases upon deploy by default.
* Don't decrypt `credentials.clj.gpg` for every request.
* Support setting `:mirrors` in project.clj. (Chas Emerick, Nelson Morris)
* Allow aliases shadowing task names to invoke shadowed tasks.
* Emit `doc/intro.md` in new project templates.
* Allow `:scm` to be set in project.clj for pom inclusion. (Florian Anderiasch)
* Fix a bug where dependency `:classifier` and `:extension` would be ignored.
* Speed up subprocess launches when `:bootclasspath` is set.
* Set user agent for HTTP requests. (Bruce Adams)
* Verify signatures of dependencies with `lein deps :verify`.
* Move task chaining to `do` task in order to allow for higher-order use.

## 2.0.0-preview6 / 2012-06-01

* Allow lookup of `:repositories` credentials from environment variables.
* Perform more SSL certificate validity checks.
* Fix a bug where repl dependency was conflicting.
* Add certificate for Clojars to default project settings.
* Allow custom SSL `:certificates` to be specified for repositories.

## 2.0.0-preview5 / 2012-05-31

* Fix a repl bug where namespaced keywords weren't read right. (Colin Jones)
* Prompt for credentials upon deploy when none are configured.
* Support encrypted deploy credentials using GPG.
* Warn about missing metadata when deploying.
* Default to refusing downloaded jars when checksums don't match.
* Apply middleware before calculating profiles so they work in with-profile.
* Allow reply dependency to be upgraded independently of Leiningen.
* Don't write "stale" directory when running outside a project.
* Proxy settings are passed on to project subprocesses. (Craig McDaniel)
* Revamp tutorial, spin off profiles guide and faq.
* Fix bug that would cause repl task to hang. (Colin Jones)

## 2.0.0-preview4 / 2012-05-11

* Checkout dependencies are not applied with production profile.
* Move pom.xml back to the project root.
* Add -U alias for forcing updates of snapshots.
* Support setting :update and :checksum profiles at top level of project.
* Blink matching parens in repl. (Colin Jones)
* Fix a bug where repl would interfere with project agents. (Chas Emerick)
* Show repl output that is emitted after return value. (Colin Jones)
* Make it easier for plugins to undo profile merging. (David Santiago)
* Add -o alias for activating offline profile.
* Ignore $CLASSPATH environment variable.
* Fix bug where repl task couldn't be trampolined. (Colin Jones)
* Allow jar manifest entries to be dynamically calculated.
* Support map-style :javac-opts like Leiningen 1.x used. (Michael Klishin)
* Allow group-id to be specified when creating new projects. (Michael Klishin)
* Fix a bug where :dev dependencies would be exposed in pom.
* Use Clojure 1.4.0 internally; plugins have access to new Clojure features.

## 2.0.0-preview3 / 2012-04-12

* Add HTTP nREPL support for repl task via :connect option. (Chas Emerick,
  Phil Hagelberg)
* Improve repl startup time, output consistency, Windows support. (Lee Hinman,
  Colin Jones)
* Stop using numeric exit codes for task failures.
* Dynamically resolve unknown templates in new task.
* Automatically activate offline profile when needed.
* Honor $http_proxy environment variable. (Juergen Hoetzel)
* Allow arbitrary :filespecs to be included in jars.
* Let custom :prep-tasks be specified in project.clj.
* Include :java-source-paths and dev/test deps in pom. (Nelson Morris)
* Add offline profile.
* Prevent project JVMs from outlasting Leiningen's process. (Colin Jones)
* Update lein.bat to work with version 2. (Andrew Kondratovich)
* Show a dependency tree in deps task. (Chas Emerick, Nelson Morris)
* Support connecting to nrepl server in repl task. (Chas Emerick, Colin Jones)
* Pretty-print pom.xml. (Nelson Morris)
* Display task aliases in help task. (Michael S. Klishin)
* Only compile stale java source files. (Stephen C. Gilardi)
* Respect :java-cmd in project.clj. (Michael S. Klishin)
* Show progress when downloading search indices. (Justin Kramer)

## 2.0.0-preview2 / 2012-03-08

* Honor :default and :user profiles when running outside a project.
* Fix a bug where subtask help wasn't showing.

## 2.0.0-preview1 / 2012-03-07

* Split out leiningen-core into independent library.
* Construct classpath out of ~/.m2 instead of copying jars to lib/.
* Replace maven-ant-tasks with Pomegranate library. (Chas Emerick,
  Nelson Morris)
* Move build artifacts to target/ directory.
* Add experimental support for running project code in-process with
  :eval-in :classloader. (Justin Balthrop)
* Support profiles for alternate project configurations.
* Switch to using plural :source-paths, :test-paths, and :resource-paths.
* Complete rewrite of repl task. (Colin Jones, Chas Emerick, Anthony Grimes)
* Remove special case of implicit org.clojure group-id in :dependencies.
* Replace :dev-dependencies with :dev profile.
* Support customized :source-paths with :eval-in :leiningen projects.
* Rewrite pom task. (Nelson Morris, Alan Malloy)
* Allow tasks and projects to add custom :injections into project code.
* Support changing :prep-tasks for running tasks other than javac and
  compile before eval-in-project calls.
* Rewrite new task. (Anthony Grimes)
* New check task for catching reflection and other issues. (David Santiago)
* Check project.clj for :aliases.
* Allow partial application of aliases.
* Drop :extra-classpath-dirs option.
* Load :plugins without trampolining the process.
* Remove plugin task in favour of :user profile.
* Allow :repository-auth to be specified using a regular expression.
* Support arbitrary project map transformation functions via :middleware.
* Support changing :local-repo path in project.clj.

## 1.7.1 / 2012-03-27

* Fix a bug where the repl task left JVM processes running.
* Make upgrade task accept arbitrary versions.
* Fix a bug where javac classes would get removed before AOT compilation.
* Allow :aot to contain both symbols and regexes. (Dan Lidral-Porter)
* Fix bug where clean task would be incredibly slow.
* Apply :jvm-opts with :eval-in-leiningen.
* Prevent misbehaving plugins from pulling in conflicting Clojure versions.

## 1.7.0 / 2012-02-06

* Allow any task to perform trampolining.
* Fix a bug where JVM_OPTS with spaces would cause failures.
* Keep pom dependencies off the classpath.
* Block plugins from erroneously including their own Clojure version.
* Allow poms to set parent element. (Nelson Morris)
* Support emitting Maven extensions in pom. (Max Penet)
* Allow faster booting on 64-bit JVMs with tiered compilation.
* Fix a bug where shell wrappers had the wrong classpath. (Tavis Rudd)
* Exclude all signature files from uberjars. (Tim McCormack)
* Allow test selectors to apply to entire namespaces. (Kevin Downey)
* Use LEIN_JAVA_CMD to allow different JVM for Leiningen itself. (Tavis Rudd)
* Honor :plugins key inside project.clj.
* Accept :repl-init namespace as argument to repl task.
* Allow :java-source-path to be nested inside :source-path. (Anthony Grimes)
* Fix a bug where native deps weren't made available. (Anthony Grimes)

## 1.6.2 / 2011-11-11

* Let run task work with main functions from Java classes.
* Fix bug where exceptions would break interactive task.
* Default to Clojure 1.3.0 for new projects.
* Allow Leiningen home to exist inside project directory. (Heinz N. Gies)
* Remove old versions of plugins when upgrading.
* Add user-level :deploy-repositories list. (Michał Marczyk)
* Fix a bug where class files from proxy objects weren't considered
  part of the project. (Stephen Compall)
* Make deps cause implicit clean to avoid AOT version mismatches.
* Include Java source files in jar. (Nathan Marz)
* Add separate :deploy-repositories list. (Chas Emerick)
* Maintain order in repositories list. (Colin Jones)
* Fix a bug where :omit-default-repos wouldn't skip Maven Central. (Chas Emerick)
* Make deps extract native dependencies for all architectures, not just current.
* Fix page count on search results.
* Fix a bug where "lein plugin install" could skip dependencies.
* Reimplement eval-in-project to use clojure.java.shell instead of Ant.
* Separate LEIN\_JVM\_OPTS from JVM_OPTS.

## 1.6.1.1 / 2011-09-06

* Turn off workaround for Clojure's agent thread pool keeping the JVM alive
  by default. Use :shutdown-agents in project.clj to enable it.

## 1.6.1 / 2011-07-06

* Allow alternate main namespace to be used during uberjar creation.
* Add :checkout-deps-shares to share more directories in checkout dependencies.
* Fix a bug where agent thread pool would be shut down in repl task.
* Support :project-init in project.clj to allow pprint to be used in :repl-options.
* Fix a bug where tests would not run using Clojure 1.3.
* Support for .classpath file to include context specific classpath elements.

## 1.6.0 / 2011-06-29

* Enforce project names as readable symbols.
* Add trampoline task.
* Fix a bug where plugins would be unavailable in MinGW.
* Allow functions other than -main to be called using run task.
* Support constructing classpath out of ~/.m2 instead of copying to lib/.
* Fix a bug where help output could be truncated by plugin issues.
* Support native dependencies.
* Test selectors no longer require additional hooke dependency.
* Add retest task.
* Add search task.
* Remove deprecated build.clojure.org repositories.
* Remove user/\*classpath\* var.
* Support :extra-classpath-dirs in project.clj.

## 1.5.2 / 2011-04-13

* Check rlwrap for support of custom quotes before using.
* Improve Solaris support. (Donald Clark Jackson)
* Fix curl error relating to missing $https_proxy. (Pirmin Fix)

## 1.5.1 / 2011-04-12

* Improve rlwrap quote support. (Ambrose Bonnaire-Sergeant)
* Prevent ns load exceptions from halting help.
* Fix :repl-init namespace handling.
* Make deps for :eval-in-leiningen projects available to lein process.
* Pass $https_proxy environment variable to curl.
* Fix :eval-in-leiningen when used with init arg.
* Pom now includes dev-dependencies as test-scoped. (Thomas Engelschmidt)
* Fix handling of arguments with spaces. (Stuart Fehr)
* Fix a plugin bug where it would look for dev-dependencies.
* Fix :min-lein-version checking. (Colin Jones)
* Honor user settings in more places.
* Fix running-as-root warning.
* Revert back to warning when repository checksums don't match.

## 1.5.0 / 2011-03-22

* New projects now use Clojure 1.2.1.
* Honor per-repository :update/:checksum policies.
* Allow some repositories to be releases/snapshots-only.
* Honor global :exclusions. (Joe Gallo)
* Honor :class-file-whitelist to make classes/ deletion more manageable.
* Accept :repl-init namespace in project.clj.
* Warn when falling back to jline if rlwrap is not found.
* Add prepend-task macro for simple hook usage.
* Add flexibility to clean task with :extra-files-to-clean
  and :regex-to-clean.
* Fix bug in interactive task that would cause infinite loop.
* Add version into shell wrapper template.
* Add pcmpl-lein.el for eshell completion.
* Skip fetching dependencies when they haven't changed in project.clj
  if :checksum-deps is set.
* Add system property for $PROJECT.version.
* Add deploy task.
* Reload tests in interactive mode.
* Make test! task accept namespace list as argument. (Joe Gallo)
* Use current year in readme for project skeleton. (Joe Gallo)

## 1.4.2 / 2010-12-31

* Fix a bug where init to eval-in-project was ignored in interactive task.
* Fix a bug in path calculation for native dependencies. (wburke)
* Fix a bug where built-in tasks shadowed plugins (javac, run).
* Allow a seq of regexes in :clean-non-project-classes for more flexibility.
* Fix a bug where the first argument to run would be parsed wrong. (Alex Osborne)
* Use JVM\_OPTS environment variable instead of JAVA\_OPTS, though the latter
  is still supported for backwards-compatibility.

## 1.4.1 / 2010-12-16

* Allow boosting :repl-retry-limit in project.clj for slow-starting projects.
* Turn :clean-non-project-classes off by default.
* Support :skip-aot metadata on :main in project.clj.
* Alias :deps/:dev-deps to :dependencies/:dev-dependencies in project.clj.
* Support setting clojure.debug property.
* Don't allow stable versions to depend upon snapshots.
* Fix exit code for chained tasks.

## 1.4.0 / 2010-12-02

* Support readme, tutorial, news, and copying in help task.
* Show short help summaries in help task overview.
* Keep project JVM running between task runs in interactive task.
* Support :uberjar-exclusions as a seq of regexes in project.clj.
* Support :repl-options in project.clj that get passed to clojure.main/repl.
* Shell wrappers are installed on Windows. (Matjaz Gregoric)
* Windows and Cygwin path fixes. (Matjaz Gregoric)
* Solaris compatibility fixes. (Heinz Gies)
* Deprecated :jar-dir in favour of :target-dir.
* Deprecated unused eval-in-project arguments. (handler, skip-auto-compile)
* Deprecated :namespaces and :test-resources-path in project.clj.
* Delete non-project .class files after AOT compilation. (Luc Prefontaine)
* Merge run task from lein-run plugin. (Siddhartha Reddy)
* Improve subtask help output. (Colin Jones)
* Support :eval-in-leiningen for easier testing of plugins.
* Merge javac task from lein-javac plugin. (Antonio Garrote)
* Add init argument to eval-in-project to help with the Gilardi Scenario.
  See https://technomancy.us/143 for details.
* Fix bug involving repl I/O flushing.
* Run subset of test suite using test selector predicates.
* Specify what file patterns to exclude from jars. (Zehua Liu)
* Sort and de-dupe help output. (Sergio Arbeo)
* Add plugin task: easily install user-level plugins (Colin Jones, Michael Ivey)

## 1.3.1 / 2010-09-07

* Support regex matching in :aot list. (Alex Ott)
* Run self-install automatically if uberjar is missing.
* Fix bugs that caused standalone install task to fail.
* Allow dependency type to be specified in project.clj. (John Sanda)
* Stop jar/uberjar task if compile fails. (Alan Dipert)
* Support :min-lein-version in project.clj so if a project uses newer Leiningen
  features it will warn users of old lein versions. (Isaac Hodes)
* Fix a bug where tests would get skipped if their first form was not ns.
* Fix a bug where "lein help" would hang if run from a dir with a large src/.
* Fix a bug where repl task would hang on unreadable input. (Isaac Hodes)
* Allow repl task to work outside project. (Colin Jones)
* If curl/wget is found, self-install works on Windows. (Shantanu Kumar)
* Fix bug causing standalone install task to fail.
* Allow custom shell-wrappers.
* Start repls in user ns if no :main is in project.clj.

## 1.3.0 / 2010-08-19

* Add :omit-source option to project.clj for shipping aot-only jars.
* Make repl task listen on a socket as well as the command-line.
* Write shell wrapper scripts at installation time. See TUTORIAL.md.
* Put user-level plugins in ~/.lein/plugins on the classpath.
* Load ~/.lein/init.clj on startup.
* Execution of per-project initialization script, specified in :repl-init-script option.
  (Alex Ott)
* Switch to /bin/sh instead of bash. (Mike Meyer)
* Allow multiple tasks to be chained from the command-line. (Colin Jones)
* Add test! task that cleans and does deps before testing.
* Add interactive task for entering tasks in a shell-like environment.
* Work around argument escaping bug on Windows. (Laurence Hygate)
* Require hooks to be specified in project.clj.
* Detect download failures in self-install.
* Add resources and test-resources paths to pom. (Brian Weber)
* Fix bug causing crash if OS name wasn't recognized.
* Improve AOT staleness determination heuristic.
* Fix bug where uberjar left out dependencies for non-AOT'd projects. (Alex Ott)

## 1.2.0 / 2010-07-18

* Don't enable repl rlwrap when unnecessary. (dumb terms, Emacs, etc.)
* Add support for password-protected repositories.
* Allow :jar-name and :uberjar-name to be customized.
* Allow unquoting in defproject form.
* Support classifiers in dependencies.
* Clean before running uberjar task.
* Implicitly clean lib/ before running deps.
* Add support for test-resources directory.
* Fix help output that AOT sometimes drops.
* Clear out lib/dev on lein clean even if :library-path is customized.
* Some tasks suppress useless output.
* Snapshot versions now allow self-install.
* Allow compile task to take a list of namespaces overriding project.clj.
* Handle more types of project metadata.
* Add plugin creation guide.
* Include arglists in help output.
* Make lein script usable from any subdirectory in the project root.
* Fix repl task to work with forked subprocess.
* Fork subprocess unconditionally for greater compatibility.
* Allow $JAVA_CMD to be customized.
* Fix a bug causing everything to recompile in tests. Thanks, Stuart!
* Fix exit code for test runs.
* Automatically compile and fetch deps when needed.
* Allow :jvm-opts and :warn-on-reflection to be set in project.clj.
* Merge lein-swank plugin into swank-clojure.
* Add :aot as an alias in project.clj for :namespaces to AOT-compile.
* Add option to omit-default-repositories.
* Allow group-id to be omitted when depending on Clojure and Contrib.
* Keep dev-dependencies in lib/dev, exclude them from uberjars.
* Include version numbers in jar filenames.
* Fix repl task to use project subclassloader.
* Don't allow "new" task to create *jure names.
* Add classpath command.
* Implement Checkout Dependencies. See README.
* Add option to symlink deps into lib/ instead of copying.
* Fixed bug for file timestamps inside jars.
* Generated poms should work in Java IDEs.
* Improved Cygwin support.
* Added TUTORIAL.md file for introductory concepts.

## 1.1.0 / 2010-02-16

* Added "lein upgrade" task
* Don't download snapshot releases unless actually needed.
* Make subclassloader's classpath available to projects.
* Fixed "install" task to place pom in local repository.
* Bug fixes to "new" task.
* Only AOT-compile namespaces specified in project.clj.
* Better error handling.
* Add exclusions support for dependencies.
* Support dependencies with native code.
* Added experimental Windows support.

## 1.0.1 / 2009-12-10

* Added bash completion.
* Honor $JAVA_OPTS.
* Fix new task.
* Add version task.
* Use jline for repl task.
* Fix pom task for Java 1.5 compatibility.

## 1.0.0 / 2009-12-05

* Source, test, and compilation paths can be set in project.clj.
* Project code runs in an isolated classloader; can now compile/test
  projects that require a different version of Clojure from
  Leiningen. (Does not support 1.0's test-is yet.)
* Install task no longer requires maven to be installed.
* Only compile namespaces whose .class files are older than .clj files.
* Add "new" task for generating blank projects.
* Set <scm> tag when generating pom.xml.
* Include pom.xml, pom.properties, and more detailed manifest in jars.
* Summarize pass/fail counts from test runs across all namespaces.
* Accept a list of namespaces for test task rather than testing all.
* Create $PROJECT-standalone.jar file from uberjar to distinguish from
  regular jar files.
* Plugins have more flexibility to set the classpath and other
  arguments for running project code.
* Add resources/ directory to classpath and generated jars.
* Start Leiningen faster by using -Xbootclasspath argument.

## 0.5.0 / 2009-11-17

* Initial release!


================================================
FILE: README.md
================================================
# Leiningen

[![builds.sr.ht status](https://builds.sr.ht/~technomancy/leiningen.svg)](https://builds.sr.ht/~technomancy/leiningen?)

<img src="https://leiningen.org/img/leiningen.jpg"
 alt="Leiningen logo" title="The man himself" align="right" />

> "Leiningen!" he shouted. "You're insane! They're not creatures you can
> fight&mdash;they're an elemental&mdash;an 'act of God!' Ten miles long, two
> miles wide&mdash;ants, nothing but ants! And every single one of them a
> fiend from hell..."
> - from [Leiningen Versus the Ants](http://www.classicshorts.com/stories/lvta.html) by Carl Stephenson

Leiningen is for automating Clojure projects without setting your hair on fire.

Note: the canonical repository for Leiningen is [on
Codeberg](https://codeberg.org/leiningen/leiningen) but we temporarily
maintain [a mirror on
GitHub](https://github.com/technomancy/leiningen). Please update your
links and git remotes.

## Installation

If your preferred [package manager](https://wiki.leiningen.org/Packaging)
offers a recent version of Leiningen, try that first.

Leiningen installs itself on the first run of the `lein` shell script; there is no
separate install script.  Follow these instructions to install Leiningen manually:

1. Make sure you have Java installed; [OpenJDK](https://adoptium.net) is recommended
2. [Download the `lein` script from the `stable` branch](https://codeberg.org/leiningen/leiningen/raw/branch/stable/bin/lein)
 of this project
3. Place it on your `$PATH` (`/usr/local/bin` for example)
4. Set it to be executable. (`sudo chmod +x /usr/local/bin/lein`)
5. Run it.

Windows users can use the above script in the Linux subsystem or try
[the batch file](https://codeberg.org/leiningen/leiningen/raw/branch/stable/bin/lein.bat) or
[PowerShell version](https://codeberg.org/leiningen/leiningen/raw/branch/stable/bin/lein.ps1)
instead.

## Basic Usage

The
[tutorial](https://codeberg.org/leiningen/leiningen/src/stable/doc/TUTORIAL.md)
has a detailed walk-through of the steps involved in creating a new
project, but here are the commonly-used tasks:

    $ lein new [TEMPLATE] NAME # generate a new project skeleton

    $ lein test [TESTS] # run the tests in the TESTS namespaces, or all tests

    $ lein repl # launch an interactive REPL session

    $ lein run -m my.namespace # run the -main function of a namespace

    $ lein uberjar # package the project and dependencies as standalone jar

    $ lein deploy clojars # publish the project to Clojars as a library

Use `lein help` to see a complete list. `lein help $TASK` shows the
usage for a specific task.

You can also chain tasks together in a single command by using the
`do` task with comma-separated tasks:

    $ lein do clean, test foo.test-core, jar

Most tasks need to be run from somewhere inside a project directory to
work, but some (`new`, `help`, `search`, `version`, and `repl`) may
run from anywhere.

## Configuration

The `project.clj` file in the project root should look like this:

```clj
(defproject myproject "0.5.0-SNAPSHOT"
  :description "A project for doing things."
  :license "Eclipse Public License 1.0"
  :url "https://codelab.org/technomancy/myproject"
  :dependencies [[org.clojure/clojure "1.8.0"]]
  :plugins [[lein-tar "3.2.0"]])
```

The `lein new` task generates a project skeleton with an appropriate
starting point from which you can work. See the
[sample.project.clj](https://codeberg.org/leiningen/leiningen/src/stable/sample.project.clj)
file (also available via `lein help sample`) for a detailed listing of
configuration options.

The `project.clj` file can be customized further with the use of
[profiles](https://codeberg.org/leiningen/leiningen/src/stable/doc/PROFILES.md).

## Documentation

Leiningen documentation is organized as a number of guides:

### Usage

 * [Tutorial](https://codeberg.org/leiningen/leiningen/src/stable/doc/TUTORIAL.md) (start here if you are new)
 * [FAQ](https://codeberg.org/leiningen/leiningen/src/stable/doc/FAQ.md)
 * [Profiles](https://codeberg.org/leiningen/leiningen/src/stable/doc/PROFILES.md)
 * [Deployment & Distribution of Libraries](https://codeberg.org/leiningen/leiningen/src/stable/doc/DEPLOY.md)
 * [Sample project.clj](https://codeberg.org/leiningen/leiningen/src/stable/sample.project.clj)
 * [Polyglot (e.g. Clojure/Java) projects](https://codeberg.org/leiningen/leiningen/src/stable/doc/MIXED_PROJECTS.md)

### Development

* [Writing Plugins](https://codeberg.org/leiningen/leiningen/src/stable/doc/PLUGINS.md)
* [Writing Templates](https://codeberg.org/leiningen/leiningen/src/stable/doc/TEMPLATES.md)
* [Contributing](https://codeberg.org/leiningen/leiningen/src/stable/CONTRIBUTING.md)
* [Building Leiningen](https://codeberg.org/leiningen/leiningen/src/stable/CONTRIBUTING.md#bootstrapping)

## Plugins

Leiningen supports plugins which may introduce new tasks. See
[the plugins wiki page](https://wiki.leiningen.org/Plugins)
for a full list. If a plugin is needed for successful test or build
runs, (such as `lein-tar`) then it should be added to `:plugins` in
project.clj, but if it's for your own convenience (such as
`lein-pprint`) then it should be added to the `:plugins` list in the
`:user` profile in `~/.lein/profiles.clj`. See the
[profiles guide](https://codeberg.org/leiningen/leiningen/src/stable/doc/PROFILES.md)
for details on how to add to your `:user` profile. The
[plugin guide](https://codeberg.org/leiningen/leiningen/src/stable/doc/PLUGINS.md)
explains how to write plugins.

## License

Source Copyright © 2009-2025 Phil Hagelberg, Alex Osborne, Dan Larkin, and
contributors.
Distributed under the Eclipse Public License, the same as Clojure
uses. See the file COPYING.

Thanks to Stuart Halloway for Lancet and Tim Dysinger for convincing
me that good builds are important.

Images Copyright © 2010 Phil Hagelberg. Distributed under the Creative
Commons Attribution + ShareAlike
License 4.0. [Full-size version](https://leiningen.org/img/leiningen-full.jpg)
available.


================================================
FILE: bash_completion.bash
================================================
_lein_completion() {
    local cur prev tasks
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    tasks="change check classpath clean compile deploy deps do help install jar javac new plugin pom release repl retest run search show-profiles test trampoline uberjar update-in upgrade vcs version with-profile"

    case "${prev}" in
        change | check | classpath | clean | deploy | deps | do | install | jar | javac | new | plugin | pom | release | repl | show-profiles | uberjar | update-in | vcs | version)
            COMPREPLY=()
            ;;
        help)
            # Show tasks again, but only once; don't infinitely recurse
            local prev2="${COMP_WORDS[COMP_CWORD-2]}"
            if [ "$prev2" == "help" ]; then
                COMPREPLY=()
            else
                COMPREPLY=( $(compgen -W "${tasks}" -- ${cur}) )
            fi
            ;;
        test | retest )
            # list project's test namespaces:
            local namespaces=$(find test/ -type f -name "*.clj" -exec sed -n 's/^(ns[ ]*//p' '{}' '+')
            COMPREPLY=( $(compgen -W "${namespaces}" -- ${cur}) )
            ;;
        run | compile)
            # list project's src namespaces:
            local namespaces=$(find src/ -type f -name "*.clj" -exec sed -n 's/^(ns[ ]*//p' '{}' '+')
            COMPREPLY=( $(compgen -W "${namespaces}" -- ${cur}) )
            ;;
        lein)
            COMPREPLY=( $(compgen -W "${tasks}" -- ${cur}) )
            ;;
    esac

    return 0
}
complete -F _lein_completion lein


================================================
FILE: bin/bump
================================================
#!/bin/bash

CURRENT_VERSION=$1
SNAPSHOT_VERSION=$2

if [ "$CURRENT_VERSION" = "" ] || [ "$SNAPSHOT_VERSION" = "" ] ; then
   echo "Usage: bin/bump 2.9.7 2.9.8-SNAPSHOT"
   exit 1
fi

for f in bin/lein bin/lein-pkg bin/lein.bat bin/lein.ps1 project.clj leiningen-core/project.clj; do
    sed -i s/$CURRENT_VERSION/$SNAPSHOT_VERSION/ $f
done


================================================
FILE: bin/issues.clj
================================================
;; This is just a one-off tool to classify/summarize issues programmatically.

(try (require 'tentacles.issues)
     (catch java.io.FileNotFoundException _
       (cemerick.pomegranate/add-dependencies
        :repositories [["clojars" {:url "https://clojars.org/repo/"}]]
        :coordinates '[[tentacles "0.2.7"]])
       (require 'tentacles.issues)))

(defn labeled? [label issue] (some #(= (:name %) label) (:labels issue)))
(def low-priority? #{1566 1544 1319 1363 1155})
(def order ["2.4.3" "other" "Enhancement" "docs" "low" "3.0.0"])

(defn categorize [i]
  (cond (labeled? "Windows" i) nil
        (:title (:milestone i)) (:title (:milestone i))
        (labeled? "Enhancement" i) "Enhancement"
        (labeled? "docs" i) "docs"
        (low-priority? (:number i)) "low"
        :else "other"))

(defn report []
  (doseq [[category issues] (->> (tentacles.issues/issues
                                  "technomancy" "leiningen")
                                 (group-by categorize)
                                 (sort-by #(.indexOf order (key %))))
          :when category]
    (println "\n#" category)
    (doseq [i issues]
      (println (:number i) "-" (:title i)))))


================================================
FILE: bin/lein
================================================
#!/usr/bin/env bash

# Ensure this file is executable via `chmod a+x lein`, then place it
# somewhere on your $PATH, like ~/bin. The rest of Leiningen will be
# installed upon first run into the ~/.lein/self-installs directory.

export LEIN_VERSION="2.12.0"
# Must be sha256sum, will be replaced by bin/release
export LEIN_CHECKSUM='b721a573af631784f27ccb52e719e6d1287d9d3951ad56d316d38f7ecfa81aa2'

case $LEIN_VERSION in
    *SNAPSHOT) SNAPSHOT="YES" ;;
    *) SNAPSHOT="NO" ;;
esac

if [[ "$CLASSPATH" != "" ]]; then
    cat <<-'EOS' 1>&2
	WARNING: You have $CLASSPATH set, probably by accident.
	It is strongly recommended to unset this before proceeding.
	EOS
fi

if [[ "$OSTYPE" == "cygwin" ]] || [[ "$OSTYPE" == "msys" ]]; then
    delimiter=";"
else
    delimiter=":"
fi

if [[ "$OSTYPE" == "cygwin" ]]; then
  cygwin=true
else
  cygwin=false
fi

function msg {
    echo "$@" 1>&2
}

function command_not_found {
    msg "Leiningen couldn't find $1 in your \$PATH ($PATH), which is required."
    exit 1
}

function make_native_path {
    # ensure we have native paths
    if $cygwin && [[ "$1"  == /* ]]; then
    echo -n "$(cygpath -wp "$1")"
    elif [[ "$OSTYPE" == "msys" && "$1"  == /?/* ]]; then
    echo -n "$(sh -c "(cd $1 2</dev/null && pwd -W) || echo $1 | sed 's/^\\/\([a-z]\)/\\1:/g'")"
    else
    echo -n "$1"
    fi
}

#  usage : add_path PATH_VAR [PATH]...
function add_path {
    local path_var="$1"
    shift
    while [ -n "$1" ];do
        # http://bashify.com/?Useful_Techniques:Indirect_Variables:Indirect_Assignment
        if [[ -z ${!path_var} ]]; then
          export ${path_var}="$(make_native_path "$1")"
        else
          export ${path_var}="${!path_var}${delimiter}$(make_native_path "$1")"
        fi
    shift
    done
}

function download_failed_message {
    cat <<-EOS 1>&2
	Failed to download $1 (exit code $2)
	It's possible your HTTP client's certificate store does not have the
	correct certificate authority needed. This is often caused by an
	out-of-date version of libssl. It's also possible that you're behind a
	firewall and haven't set HTTP_PROXY and HTTPS_PROXY.
	EOS
}

function checksum_failed_message {
    cat <<-EOS 1>&2
	Failed to properly download $1
	The checksum was mismatched. and we could not verify the downloaded
	file. We expected a sha256 of
	$2 and actually had
	$3.
	We used '$SHASUM_CMD' to verify the downloaded file.
	EOS
}

function self_install {
  if [ -r "$LEIN_JAR" ]; then
    cat <<-EOS 1>&2
	The self-install jar already exists at $LEIN_JAR.
	If you wish to re-download, delete it and rerun "$0 self-install".
	EOS
    exit 1
  fi
  msg "Downloading Leiningen to $LEIN_JAR now..."
  mkdir -p "$(dirname "$LEIN_JAR")"
  LEIN_URL="https://github.com/technomancy/leiningen/releases/download/$LEIN_VERSION/leiningen-$LEIN_VERSION-standalone.jar"
  $HTTP_CLIENT "$LEIN_JAR.pending" "$LEIN_URL"
  local exit_code=$?
  if [ $exit_code == 0 ]; then
      printf "$LEIN_CHECKSUM  $LEIN_JAR.pending\n" > "$LEIN_JAR.pending.shasum"
      $SHASUM_CMD -c "$LEIN_JAR.pending.shasum"
      if [ $? == 0 ]; then
        mv -f "$LEIN_JAR.pending" "$LEIN_JAR"
      else
        got_sum="$($SHASUM_CMD "$LEIN_JAR.pending" | cut -f 1 -d ' ')"
        checksum_failed_message "$LEIN_URL" "$LEIN_CHECKSUM" "$got_sum"
        rm "$LEIN_JAR.pending" 2> /dev/null
        exit 1
      fi
  else
      rm "$LEIN_JAR.pending" 2> /dev/null
      download_failed_message "$LEIN_URL" "$exit_code"
      exit 1
  fi
}

function run_from_source() {
    LEIN_DIR="$(cd $(dirname "$BIN_DIR");pwd -P)"

    # Need to use lein release to bootstrap the leiningen-core library (for aether)
    if [ ! -r "$LEIN_DIR/leiningen-core/.lein-bootstrap" ]; then
        cat <<-'EOS' 1>&2
	Leiningen is missing its dependencies.
	Please run "lein bootstrap" in the leiningen-core/ directory
	with a stable release of Leiningen. See CONTRIBUTING.md for details.
	EOS
        exit 1
    fi

    # If project.clj for lein or leiningen-core changes, we must recalculate
    LAST_PROJECT_CHECKSUM=$(cat "$LEIN_DIR/.lein-project-checksum" 2> /dev/null)
    PROJECT_CHECKSUM=$(sum "$LEIN_DIR/project.clj" "$LEIN_DIR/leiningen-core/project.clj")
    if [ "$PROJECT_CHECKSUM" != "$LAST_PROJECT_CHECKSUM" ]; then
        if [ -r "$LEIN_DIR/.lein-classpath" ]; then
            rm "$LEIN_DIR/.lein-classpath"
        fi
    fi

    # Use bin/lein to calculate its own classpath.
    if [ ! -r "$LEIN_DIR/.lein-classpath" ] && [ "$1" != "classpath" ]; then
        msg "Recalculating Leiningen's classpath."
        cd "$LEIN_DIR"

        LEIN_NO_USER_PROFILES=1 "$LEIN_DIR/bin/lein" classpath .lein-classpath
        sum "$LEIN_DIR/project.clj" "$LEIN_DIR/leiningen-core/project.clj" > \
            .lein-project-checksum
        cd -
    fi

    mkdir -p "$LEIN_DIR/target/classes"
    export LEIN_JVM_OPTS="$LEIN_JVM_OPTS -Dclojure.compile.path=$LEIN_DIR/target/classes"
    add_path CLASSPATH "$LEIN_DIR/leiningen-core/src/" "$LEIN_DIR/leiningen-core/resources/" \
        "$LEIN_DIR/test:$LEIN_DIR/target/classes" "$LEIN_DIR/src" ":$LEIN_DIR/resources"

    if [ -r "$LEIN_DIR/.lein-classpath" ]; then
        add_path CLASSPATH "$(cat "$LEIN_DIR/.lein-classpath" 2> /dev/null)"
    else
        add_path CLASSPATH "$(cat "$LEIN_DIR/leiningen-core/.lein-bootstrap" 2> /dev/null)"
    fi
}

function run_from_checkout() {
    add_path CLASSPATH "$LEIN_JAR"

    if [ "$LEIN_USE_BOOTCLASSPATH" != "no" ]; then
        LEIN_JVM_OPTS="-Xbootclasspath/a:$LEIN_JAR $LEIN_JVM_OPTS"
    fi
}

function cmd_self_install() {
    if [ -r "$BIN_DIR/../src/leiningen/version.clj" ]; then
        cat <<-'EOS' 1>&2
	Running self-install from a checkout is not supported.
	See CONTRIBUTING.md for SNAPSHOT-specific build instructions.
	EOS
        exit 1
    fi
    msg "Manual self-install is deprecated; it will run automatically when necessary."
    self_install
}

function cmd_up_downgrade() {
    if [ "$LEIN_DIR" != "" ]; then
        msg "The upgrade task is not meant to be run from a checkout."
        exit 1
    fi
    if [ $SNAPSHOT = "YES" ]; then
        cat <<-'EOS' 1>&2
	The upgrade task is only meant for stable releases.
	See the "Bootstrapping" section of CONTRIBUTING.md.
	EOS
        exit 1
    fi
    if [ ! -w "$SCRIPT" ]; then
        msg "You do not have permission to upgrade the installation in $SCRIPT"
        exit 1
    else
        TARGET_VERSION="${2:-stable}"
        echo "The script at $SCRIPT will be upgraded to the latest $TARGET_VERSION version."
        echo -n "Do you want to continue [Y/n]? "
        read RESP
        case "$RESP" in
            y|Y|"")
                echo
                msg "Upgrading..."
                if hash mktemp 2>/dev/null; then
                    TARGET="(mktemp -t lein-upgrade.XXXXXXXXX)"
                else
                    TARGET="/tmp/lein-${$}-upgrade"
                fi
                if $cygwin; then
                    TARGET=$(cygpath -w "$TARGET")
                fi
                LEIN_SCRIPT_URL="https://github.com/technomancy/leiningen/raw/$TARGET_VERSION/bin/lein"
                $HTTP_CLIENT "$TARGET" "$LEIN_SCRIPT_URL"
                if [ $? == 0 ]; then
                    cmp -s "$TARGET" "$SCRIPT"
                    if [ $? == 0 ]; then
                        msg "Leiningen is already up-to-date."
                    fi
                    mv "$TARGET" "$SCRIPT" && chmod +x "$SCRIPT"
                    unset CLASSPATH
                    exec "$SCRIPT" version
                else
                    download_failed_message "$LEIN_SCRIPT_URL"
                fi;;
            *)
                msg "Aborted."
                exit 1;;
        esac
    fi
}

function cmd_run {
    if $cygwin; then
        # When running on Cygwin, use Windows-style paths for java
        ORIGINAL_PWD=$(cygpath -w "$ORIGINAL_PWD")
    fi

    # apply context specific CLASSPATH entries
    if [ -f .lein-classpath ]; then
        add_path CLASSPATH "$(cat .lein-classpath)"
    fi

    if [ -n "$DEBUG" ]; then
        msg "Leiningen's classpath: $CLASSPATH"
    fi

    if [ -r .lein-fast-trampoline ]; then
        export LEIN_FAST_TRAMPOLINE='y'
    fi

    if [ "$LEIN_FAST_TRAMPOLINE" != "" ] && [ -r project.clj ]; then
        INPUTS="$* $(cat project.clj) $LEIN_VERSION $(test -f "$LEIN_HOME/profiles.clj" && cat "$LEIN_HOME/profiles.clj") $(test -f profiles.clj && cat profiles.clj)"

        INPUT_CHECKSUM=$(echo "$INPUTS" | $SHASUM_CMD | cut -f 1 -d " ")
        # Just don't change :target-path in project.clj, mkay?
        TRAMPOLINE_FILE="target/trampolines/$INPUT_CHECKSUM"
    else
        if hash mktemp 2>/dev/null; then
            # Check if mktemp is available before using it
            TRAMPOLINE_FILE="$(mktemp -t lein-trampoline-XXXXXXXXXXXXX)"
        else
            TRAMPOLINE_FILE="/tmp/lein-trampoline-$$"
        fi
        trap 'rm -f $TRAMPOLINE_FILE' EXIT
    fi

    if $cygwin; then
        TRAMPOLINE_FILE=$(cygpath -w "$TRAMPOLINE_FILE")
    fi

    if [ "$INPUT_CHECKSUM" != "" ] && [ -r "$TRAMPOLINE_FILE" ]; then
        if [ -n "$DEBUG" ]; then
            msg "Fast trampoline with $TRAMPOLINE_FILE."
        fi
        exec sh -c "exec $(cat "$TRAMPOLINE_FILE")"
    else
        export TRAMPOLINE_FILE
        "$LEIN_JAVA_CMD" \
            -Dfile.encoding=UTF-8 \
            -Dmaven.wagon.http.ssl.easy=false \
            $LEIN_JVM_OPTS \
            -Dleiningen.input-checksum="$INPUT_CHECKSUM" \
            -Dleiningen.original.pwd="$ORIGINAL_PWD" \
            -Dleiningen.script="$SCRIPT" \
            -classpath "$CLASSPATH" \
            clojure.main -m leiningen.core.main "$@"

        EXIT_CODE=$?

        if $cygterm ; then
          stty icanon echo > /dev/null 2>&1
        fi

        if [ -r "$TRAMPOLINE_FILE" ] && [ "$LEIN_TRAMPOLINE_WARMUP" = "" ]; then
            TRAMPOLINE="$(cat "$TRAMPOLINE_FILE")"
            if [ "$INPUT_CHECKSUM" = "" ]; then # not using fast trampoline
                rm "$TRAMPOLINE_FILE"
            fi
            if [ "$TRAMPOLINE" = "" ]; then
                exit $EXIT_CODE
            else
                exec sh -c "exec $TRAMPOLINE"
            fi
        else
            exit $EXIT_CODE
        fi
    fi
}

# cd to the project root, if applicable
NOT_FOUND=1
ORIGINAL_PWD="$PWD"
while [ ! -r "$PWD/project.clj" ] && [ "$PWD" != "/" ] && [ $NOT_FOUND -ne 0 ]
do
    cd ..
    if [ "$(dirname "$PWD")" = "/" ]; then
        NOT_FOUND=0
        cd "$ORIGINAL_PWD"
    fi
done

# User init
if [ "$LEIN_HOME" = "" ]; then
    # Prefer the old location if present
    if [ -d "$HOME/.lein" ]; then
        export LEIN_HOME="$HOME/.lein"
    elif [ -d "$XDG_CACHE_HOME/leiningen" ]; then
        export LEIN_HOME="$XDG_CACHE_HOME/leiningen"
    else
        export LEIN_HOME="$HOME/.lein"
    fi
fi

for f in "/etc/leinrc" "$LEIN_HOME/leinrc" ".leinrc"; do
  if [ -e "$f" ]; then
    source "$f"
  fi
done

if $cygwin; then
    export LEIN_HOME=$(cygpath -m "$LEIN_HOME")
fi

# normalize $0 on certain BSDs
if [ "$(dirname "$0")" = "." ]; then
    SCRIPT="$(which "$(basename "$0")")"
    if [ -z "$SCRIPT" ]; then
        SCRIPT="$0"
    fi
else
    SCRIPT="$0"
fi

# resolve symlinks to the script itself portably
while [ -h "$SCRIPT" ] ; do
    ls=$(ls -ld "$SCRIPT")
    link=$(expr "$ls" : '.*-> \(.*\)$')
    if expr "$link" : '/.*' > /dev/null; then
        SCRIPT="$link"
    else
        SCRIPT="$(dirname "$SCRIPT"$)/$link"
    fi
done

BIN_DIR="$(dirname "$SCRIPT")"


LEIN_JAR="${LEIN_JAR:-${LEIN_HOME}/self-installs/leiningen-${LEIN_VERSION}-standalone.jar}"

export LEIN_JVM_OPTS="${LEIN_JVM_OPTS-"-XX:+TieredCompilation -XX:TieredStopAtLevel=1"}"

# This needs to be defined before we call HTTP_CLIENT below
if [ "$HTTP_CLIENT" = "" ]; then
    if type -p curl >/dev/null 2>&1; then
        if [ "$https_proxy" != "" ]; then
            CURL_PROXY="-x $https_proxy"
        fi
        HTTP_CLIENT="curl $CURL_PROXY -f -L -o"
    else
        HTTP_CLIENT="wget -O"
    fi
fi

# This needs to be defined before we call SHASUM_CMD below
if [ "$SHASUM_CMD" = "" ]; then
    if type -p sha256sum >/dev/null 2>&1; then
        export SHASUM_CMD="sha256sum"
    elif type -p shasum >/dev/null 2>&1; then
        export SHASUM_CMD="shasum --algorithm 256"
    elif type -p sha256 >/dev/null 2>&1; then
        export SHASUM_CMD="sha256 -q"
    else
        command_not_found sha256sum
    fi
fi

# When :eval-in :classloader we need more memory
grep -E -q '^\s*:eval-in\s+:classloader\s*$' project.clj 2> /dev/null && \
    export LEIN_JVM_OPTS="$LEIN_JVM_OPTS -Xms64m -Xmx512m"

if [ -r "$BIN_DIR/../src/leiningen/version.clj" ]; then
    run_from_source "$1"
else
    run_from_checkout "$1"

    if [ ! -r "$LEIN_JAR" -a "$1" != "self-install" ]; then
        self_install
    fi
fi

if [ ! -x "$JAVA_CMD" ] && ! type -f java >/dev/null
then
    msg "Leiningen couldn't find 'java' executable, which is required."
    msg "Please either set JAVA_CMD or put java (>=1.6) in your \$PATH ($PATH)."
    exit 1
fi

export LEIN_JAVA_CMD="${LEIN_JAVA_CMD:-${JAVA_CMD:-java}}"

if [[ -z "${DRIP_INIT+x}" && "$(basename "$LEIN_JAVA_CMD")" == *drip* ]]; then
    export DRIP_INIT="$(printf -- '-e\n(require (quote leiningen.repl))')"
    export DRIP_INIT_CLASS="clojure.main"
fi

# Support $JAVA_OPTS for backwards-compatibility.
export JVM_OPTS="${JVM_OPTS:-"$JAVA_OPTS"}"

# Handle jline issue with cygwin not propagating OSTYPE through java subprocesses: https://github.com/jline/jline2/issues/62
cygterm=false
if $cygwin; then
  case "$TERM" in
    rxvt* | xterm* | vt*) cygterm=true ;;
  esac
fi

if $cygterm; then
  LEIN_JVM_OPTS="$LEIN_JVM_OPTS -Djline.terminal=jline.UnixTerminal"
  stty -icanon min 1 -echo > /dev/null 2>&1
fi

# If you're packaging this for a package manager (.deb, homebrew, etc)
# you need to remove the self-install and upgrade functionality or see lein-pkg.
if [ "$1" = "self-install" ]; then
    cmd_self_install
elif [ "$1" = "upgrade" ] || [ "$1" = "downgrade" ]; then
    cmd_up_downgrade "$@"
else
    cmd_run "$@"
fi


================================================
FILE: bin/lein-pkg
================================================
#!/usr/bin/env bash

# This variant of the lein script is meant for downstream packagers.
# It has all the cross-platform stuff stripped out as well as the
# logic for running from a source checkout and self-install/upgrading.

export LEIN_VERSION="2.12.0"

if [[ "$CLASSPATH" != "" ]]; then
    cat <<-'EOS' 1>&2
	WARNING: You have $CLASSPATH set, probably by accident.
	It is strongly recommended to unset this before proceeding.
	EOS
fi

if [[ "$OSTYPE" == "cygwin" ]] || [[ "$OSTYPE" == "msys" ]]; then
    delimiter=";"
else
    delimiter=":"
fi

if [[ "$OSTYPE" == "cygwin" ]]; then
  cygwin=true
else
  cygwin=false
fi

function msg {
    echo "$@" 1>&2
}

function command_not_found {
    msg "Leiningen couldn't find $1 in your \$PATH ($PATH), which is required."
    exit 1
}

function make_native_path {
    # ensure we have native paths
    if $cygwin && [[ "$1"  == /* ]]; then
    echo -n "$(cygpath -wp "$1")"
    elif [[ "$OSTYPE" == "msys" && "$1"  == /?/* ]]; then
    echo -n "$(sh -c "(cd $1 2</dev/null && pwd -W) || echo $1 | sed 's/^\\/\([a-z]\)/\\1:/g'")"
    else
    echo -n "$1"
    fi
}

#  usage : add_path PATH_VAR [PATH]...
function add_path {
    local path_var="$1"
    shift
    while [ -n "$1" ];do
        # http://bashify.com/?Useful_Techniques:Indirect_Variables:Indirect_Assignment
        if [[ -z ${!path_var} ]]; then
          export ${path_var}="$(make_native_path "$1")"
        else
          export ${path_var}="${!path_var}${delimiter}$(make_native_path "$1")"
        fi
    shift
    done
}

function run_from_checkout() {
    add_path CLASSPATH "$LEIN_JAR"

    if [ "$LEIN_USE_BOOTCLASSPATH" != "no" ]; then
        LEIN_JVM_OPTS="-Xbootclasspath/a:$LEIN_JAR $LEIN_JVM_OPTS"
    fi
}

function cmd_run {
    if $cygwin; then
        # When running on Cygwin, use Windows-style paths for java
        ORIGINAL_PWD=$(cygpath -w "$ORIGINAL_PWD")
    fi

    # apply context specific CLASSPATH entries
    if [ -f .lein-classpath ]; then
        add_path CLASSPATH "$(cat .lein-classpath)"
    fi

    if [ -n "$DEBUG" ]; then
        msg "Leiningen's classpath: $CLASSPATH"
    fi

    if [ -r .lein-fast-trampoline ]; then
        export LEIN_FAST_TRAMPOLINE='y'
    fi

    if [ "$LEIN_FAST_TRAMPOLINE" != "" ] && [ -r project.clj ]; then
        INPUTS="$* $(cat project.clj) $LEIN_VERSION $(test -f "$LEIN_HOME/profiles.clj" && cat "$LEIN_HOME/profiles.clj") $(test -f profiles.clj && cat profiles.clj)"

        INPUT_CHECKSUM=$(echo "$INPUTS" | $SHASUM_CMD | cut -f 1 -d " ")
        # Just don't change :target-path in project.clj, mkay?
        TRAMPOLINE_FILE="target/trampolines/$INPUT_CHECKSUM"
    else
        if hash mktemp 2>/dev/null; then
            # Check if mktemp is available before using it
            TRAMPOLINE_FILE="$(mktemp -t lein-trampoline-XXXXXXXXXXXXX)"
        else
            TRAMPOLINE_FILE="/tmp/lein-trampoline-$$"
        fi
        trap 'rm -f $TRAMPOLINE_FILE' EXIT
    fi

    if $cygwin; then
        TRAMPOLINE_FILE=$(cygpath -w "$TRAMPOLINE_FILE")
    fi

    if [ "$INPUT_CHECKSUM" != "" ] && [ -r "$TRAMPOLINE_FILE" ]; then
        if [ -n "$DEBUG" ]; then
            msg "Fast trampoline with $TRAMPOLINE_FILE."
        fi
        exec sh -c "exec $(cat "$TRAMPOLINE_FILE")"
    else
        export TRAMPOLINE_FILE
        "$LEIN_JAVA_CMD" \
            -Dfile.encoding=UTF-8 \
            -Dmaven.wagon.http.ssl.easy=false \
            $LEIN_JVM_OPTS \
            -Dleiningen.input-checksum="$INPUT_CHECKSUM" \
            -Dleiningen.original.pwd="$ORIGINAL_PWD" \
            -Dleiningen.script="$SCRIPT" \
            -classpath "$CLASSPATH" \
            clojure.main -m leiningen.core.main "$@"

        EXIT_CODE=$?

        if $cygterm ; then
          stty icanon echo > /dev/null 2>&1
        fi

        if [ -r "$TRAMPOLINE_FILE" ] && [ "$LEIN_TRAMPOLINE_WARMUP" = "" ]; then
            TRAMPOLINE="$(cat "$TRAMPOLINE_FILE")"
            if [ "$INPUT_CHECKSUM" = "" ]; then # not using fast trampoline
                rm "$TRAMPOLINE_FILE"
            fi
            if [ "$TRAMPOLINE" = "" ]; then
                exit $EXIT_CODE
            else
                exec sh -c "exec $TRAMPOLINE"
            fi
        else
            exit $EXIT_CODE
        fi
    fi
}

# cd to the project root, if applicable
NOT_FOUND=1
ORIGINAL_PWD="$PWD"
while [ ! -r "$PWD/project.clj" ] && [ "$PWD" != "/" ] && [ $NOT_FOUND -ne 0 ]
do
    cd ..
    if [ "$(dirname "$PWD")" = "/" ]; then
        NOT_FOUND=0
        cd "$ORIGINAL_PWD"
    fi
done

# User init
export LEIN_HOME="${LEIN_HOME:-"$HOME/.lein"}"

for f in "/etc/leinrc" "$LEIN_HOME/leinrc" ".leinrc"; do
  if [ -e "$f" ]; then
    source "$f"
  fi
done

if $cygwin; then
    export LEIN_HOME=$(cygpath -w "$LEIN_HOME")
fi

# normalize $0 on certain BSDs
if [ "$(dirname "$0")" = "." ]; then
    SCRIPT="$(which "$(basename "$0")")"
    if [ -z "$SCRIPT" ]; then
        SCRIPT="$0"
    fi
else
    SCRIPT="$0"
fi

# resolve symlinks to the script itself portably
while [ -h "$SCRIPT" ] ; do
    ls=$(ls -ld "$SCRIPT")
    link=$(expr "$ls" : '.*-> \(.*\)$')
    if expr "$link" : '/.*' > /dev/null; then
        SCRIPT="$link"
    else
        SCRIPT="$(dirname "$SCRIPT"$)/$link"
    fi
done

BIN_DIR="$(dirname "$SCRIPT")"

# If you're not using an uberjar you'll need to list each dependency
# and add them individually to the classpath/bootclasspath as well.

LEIN_JAR=/usr/share/java/leiningen-$LEIN_VERSION-standalone.jar

export LEIN_JVM_OPTS="${LEIN_JVM_OPTS-"-XX:+TieredCompilation -XX:TieredStopAtLevel=1"}"

# This needs to be defined before we call SHASUM_CMD below
if [ "$SHASUM_CMD" = "" ]; then
    if type -p sha256sum >/dev/null 2>&1; then
        export SHASUM_CMD="sha256sum"
    elif type -p shasum >/dev/null 2>&1; then
        export SHASUM_CMD="shasum --algorithm 256"
    elif type -p sha256 >/dev/null 2>&1; then
        export SHASUM_CMD="sha256 -q"
    else
        command_not_found sha256sum
    fi
fi

# When :eval-in :classloader we need more memory
grep -E -q '^\s*:eval-in\s+:classloader\s*$' project.clj 2> /dev/null && \
    export LEIN_JVM_OPTS="$LEIN_JVM_OPTS -Xms64m -Xmx512m"

run_from_checkout "$1"

if [ ! -x "$JAVA_CMD" ] && ! type -f java >/dev/null
then
    msg "Leiningen couldn't find 'java' executable, which is required."
    msg "Please either set JAVA_CMD or put java (>=1.6) in your \$PATH ($PATH)."
    exit 1
fi

export LEIN_JAVA_CMD="${LEIN_JAVA_CMD:-${JAVA_CMD:-java}}"

if [[ -z "${DRIP_INIT+x}" && "$(basename "$LEIN_JAVA_CMD")" == *drip* ]]; then
    export DRIP_INIT="$(printf -- '-e\n(require (quote leiningen.repl))')"
    export DRIP_INIT_CLASS="clojure.main"
fi

# Support $JAVA_OPTS for backwards-compatibility.
export JVM_OPTS="${JVM_OPTS:-"$JAVA_OPTS"}"

# Handle jline issue with cygwin not propagating OSTYPE through java subprocesses: https://github.com/jline/jline2/issues/62
cygterm=false
if $cygwin; then
  case "$TERM" in
    rxvt* | xterm* | vt*) cygterm=true ;;
  esac
fi

if $cygterm; then
  LEIN_JVM_OPTS="$LEIN_JVM_OPTS -Djline.terminal=jline.UnixTerminal"
  stty -icanon min 1 -echo > /dev/null 2>&1
fi

if [ "$1" = "upgrade" ]; then
    echo "This version of Leiningen was installed with a package manager, but"
    echo "the upgrade task is intended for manual installs. Please use your"
    echo "package manager's built-in upgrade facilities instead."
    exit 1
fi

cmd_run "$@"


================================================
FILE: bin/lein.bat
================================================
@echo off

setLocal EnableExtensions EnableDelayedExpansion

set LEIN_VERSION=2.12.0

if "%LEIN_VERSION:~-9%" == "-SNAPSHOT" (
    set SNAPSHOT=YES
) else (
    set SNAPSHOT=NO
)

set ORIGINAL_PWD=%CD%
:: If ORIGINAL_PWD ends with a backslash (such as C:\),
:: we need to escape it with a second backslash.
if "%ORIGINAL_PWD:~-1%x" == "\x" set "ORIGINAL_PWD=%ORIGINAL_PWD%\"

call :FIND_DIR_CONTAINING_UPWARDS project.clj
if "%DIR_CONTAINING%" neq "" cd "%DIR_CONTAINING%"

:: LEIN_JAR and LEIN_HOME variables can be set manually.
:: Only set LEIN_JAR manually if you know what you are doing.
:: Having LEIN_JAR pointing to one version of Leiningen as well as
:: having a different version in PATH has been known to cause problems.

if "x%LEIN_HOME%" == "x" (
    set LEIN_HOME=!USERPROFILE!\.lein
)
SET RC=1

if "x%LEIN_JAR%" == "x" set "LEIN_JAR=!LEIN_HOME!\self-installs\leiningen-!LEIN_VERSION!-standalone.jar"

if "%1" == "self-install" goto SELF_INSTALL
if "%1" == "upgrade"      goto UPGRADE
if "%1" == "downgrade"    goto UPGRADE

if not exist "%~dp0..\src\leiningen\version.clj" goto RUN_NO_CHECKOUT

    :: Running from source checkout.
    call :SET_LEIN_ROOT "%~dp0.."


	set "bootstrapfile=!LEIN_ROOT!\leiningen-core\.lein-bootstrap"
	rem in .lein-bootstrap there is only one line where each path is concatenated to each other via a semicolon, there's no semicolon at the end
	rem each path is NOT inside double quotes and may contain spaces (even semicolons but this is not supported here) in their names, 
	rem  but they won't/cannot contain double quotes " or colons :  in their names (at least on windows it's not allowed/won't work)
	
	rem tested when folders contain spaces and when LEIN_ROOT contains semicolon
	
	
	if not "x%DEBUG%" == "x" echo LEIN_ROOT=!LEIN_ROOT!
	
	rem if not "%LEIN_ROOT:;=%" == "%LEIN_ROOT%" (

	
	rem oddly enough /G:/ should've worked but doesn't where / they say it's console
	rem findstr is C:\Windows\System32\findstr.exe
	echo.!LEIN_ROOT! | findstr /C:";" >nul 2>&1 && (
		rem aka errorlevel is 0 aka the string ";" was found
		echo Your folder structure !LEIN_ROOT! contains at least one semicolon in its name
		echo This is not allowed and would break things with the generated bootstrap file
		echo Please correct this by renaming the folders to not contain semicolons in their name
		del !bootstrapfile! >nul 2>&1
		echo You'll also have to recreate the bootstrap file just to be sure it has semicolon-free names inside
		echo the bootstrap file ^(which was just deleted^) is: !bootstrapfile!
		echo  and the info on how to do that is:
		goto RUN_BOOTSTRAP
	)

	if not exist !bootstrapfile! goto NO_DEPENDENCIES

	findstr \^" "!bootstrapfile!" >nul 2>&1
	if errorlevel 1 goto PARSE_BOOTSTRAPFILE
		echo double quotes detected inside file: !bootstrapfile!
		echo this should not be happening
		goto RUN_BOOTSTRAP

:PARSE_BOOTSTRAPFILE
rem will proceed to set LEIN_LIBS and surround each path from bootstrap file in double quotes and separate it from others with a semicolon
rem the paths inside the bootstrap file do not already contain double quotes but may contain spaces
	rem note worthy: the following won't work due to a hard 1022bytes limit truncation in the variable that was set
	rem set /p LEIN_LIBS=<!bootstrapfile!
	rem so this will work instead:
	rem for /f "usebackq delims=" %%j in (!bootstrapfile!) do set LEIN_LIBS=%%j
	rem just  set LEIN_LIBS="%%j"  is uglier/hacky but would also work here instead of the below:
	for /f "usebackq delims=" %%j in ("!bootstrapfile!") do (
		set tmpline=%%j
		call :PROCESSPATH
	)

	rem remove trailing semicolon, if any
	if "!LEIN_LIBS:~-1!x" == ";x" SET LEIN_LIBS=!LEIN_LIBS:~0,-1!
	if not "x%DEBUG%" == "x" echo LEIN_LIBS=!LEIN_LIBS!

    if "x!LEIN_LIBS!" == "x" goto NO_DEPENDENCIES


	rem semicolons in pathes are not supported, spaces are supported by quoting CLASSPATH as a whole
	rem (no end semicolon required)
    set CLASSPATH=!LEIN_LIBS!;!LEIN_ROOT!\src;!LEIN_ROOT!\resources

    :: Apply context specific CLASSPATH entries
    if exist "%~dp0..\.lein-classpath" (
        for /f "tokens=* delims= " %%i in ("%~dp0..\.lein-classpath") do (
            set CONTEXT_CP=%%i
        )

        if NOT "x!CONTEXT_CP!"=="x" (
            set CLASSPATH=!CONTEXT_CP!;!CLASSPATH!
        )
    )
    goto SETUP_JAVA

:RUN_NO_CHECKOUT

    :: Not running from a checkout.
    if not exist "%LEIN_JAR%" goto NO_LEIN_JAR
    set CLASSPATH=%LEIN_JAR%
  
    if exist ".lein-classpath" (
        for /f "tokens=* delims= " %%i in (.lein-classpath) do (
            set CONTEXT_CP=%%i
        )

        if NOT "x!CONTEXT_CP!"=="x" (
            set CLASSPATH=!CONTEXT_CP!;!CLASSPATH!
        )
    )

:SETUP_JAVA

if not "x%DEBUG%" == "x" echo CLASSPATH=!CLASSPATH!
:: ##################################################

if "x!JAVA_CMD!" == "x" set JAVA_CMD=java
if "x!LEIN_JAVA_CMD!" == "x" set LEIN_JAVA_CMD=%JAVA_CMD%

rem remove quotes from around java commands
for /f "usebackq delims=" %%i in ('!JAVA_CMD!') do set JAVA_CMD=%%~i
for /f "usebackq delims=" %%i in ('!LEIN_JAVA_CMD!') do set LEIN_JAVA_CMD=%%~i

if "x%JVM_OPTS%" == "x" set JVM_OPTS=%JAVA_OPTS%
goto RUN

:DownloadFile
set LAST_HTTP_CLIENT=
rem parameters: TargetFileName Address
if "x%HTTP_CLIENT%" == "x" goto TRY_POWERSHELL
    %HTTP_CLIENT% %1 %2
    SET RC=%ERRORLEVEL%
    goto EXITRC

:TRY_POWERSHELL
call powershell -? >nul 2>&1
if NOT ERRORLEVEL 0 goto TRY_WGET
    set LAST_HTTP_CLIENT=powershell
    rem By default: Win7 = PS2, Win 8.0 = PS3 (maybe?), Win 8.1 = PS4, Win10 = PS5
    powershell -Command "& {param($a,$f) if (($PSVersionTable.PSVersion | Select-Object -ExpandProperty Major) -lt 4) { exit 111; } else { $client = New-Object System.Net.WebClient; [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $client.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials; $client.DownloadFile($a, $f); }}" ""%2"" ""%1""
    SET RC=%ERRORLEVEL%
    goto EXITRC

:TRY_WGET
call wget --help >nul 2>&1
if NOT ERRORLEVEL 0 goto TRY_CURL
    set LAST_HTTP_CLIENT=wget
    call wget -O %1 %2
    SET RC=%ERRORLEVEL%
    goto EXITRC

:TRY_CURL
call curl --help >nul 2>&1
if NOT ERRORLEVEL 0 GOTO NO_HTTP_CLIENT
    rem We set CURL_PROXY to a space character below to pose as a no-op argument
    set LAST_HTTP_CLIENT=curl
    set CURL_PROXY= 
    if NOT "x%HTTPS_PROXY%" == "x" set CURL_PROXY="-x %HTTPS_PROXY%"
    call curl %CURL_PROXY% -f -L -o  %1 %2
    SET RC=%ERRORLEVEL%
    goto EXITRC

:NO_LEIN_JAR
echo.
echo %LEIN_JAR% can not be found.
echo You can try running "lein self-install"
echo or change LEIN_JAR environment variable
echo or edit lein.bat to set appropriate LEIN_JAR path.
echo.
goto EXITRC

:NO_DEPENDENCIES
echo.
echo Leiningen is missing its dependencies.
:RUN_BOOTSTRAP
echo Please run "lein bootstrap" in the leiningen-core/ directory
echo with a stable release of Leiningen. See CONTRIBUTING.md for details.
echo.
goto EXITRC

:SELF_INSTALL
if exist "%LEIN_JAR%" (
    echo %LEIN_JAR% already exists. Delete and retry.
    goto EXITRC
)

for %%f in ("%LEIN_JAR%") do set LEIN_INSTALL_DIR="%%~dpf"
if not exist %LEIN_INSTALL_DIR% mkdir %LEIN_INSTALL_DIR%

echo Downloading Leiningen now...

set LEIN_JAR_URL=https://github.com/technomancy/leiningen/releases/download/%LEIN_VERSION%/leiningen-%LEIN_VERSION%-standalone.jar
call :DownloadFile "%LEIN_JAR%.pending" "%LEIN_JAR_URL%"
SET RC=%ERRORLEVEL%
if not %RC% == 0 goto DOWNLOAD_FAILED
if not exist "%LEIN_JAR%.pending" goto DOWNLOAD_FAILED
move /y "%LEIN_JAR%.pending" "%LEIN_JAR%" >nul 2>&1
SET RC=%ERRORLEVEL%
goto EXITRC

:DOWNLOAD_FAILED
SET RC=3
if "%ERRORLEVEL%" == "111" (
    echo.
    echo You seem to be using an old version of PowerShell that
    echo can't download files via TLS 1.2.
    echo Please upgrade your PowerShell to at least version 4.0, e.g. via
    echo https://www.microsoft.com/en-us/download/details.aspx?id=50395
    echo.
    echo Alternatively you can manually download
    echo %LEIN_JAR_URL%
    echo and save it as
    echo %LEIN_JAR%
    echo.
    echo If you have "curl" or "wget" you can try setting the HTTP_CLIENT
    echo variable, but the TLS problem might still persist.
    echo.
    echo   a^) set HTTP_CLIENT=wget -O
    echo   b^) set HTTP_CLIENT=curl -f -L -o
    echo.
    echo NOTE: Make sure to *not* add double quotes when setting the value
    echo       of HTTP_CLIENT
    goto EXITRC
)
SET RC=3
del "%LEIN_JAR%.pending" >nul 2>&1
echo.
echo Failed to download %LEIN_JAR_URL%
echo.
echo It is possible that the download failed due to "powershell", 
echo "curl" or "wget"'s inability to retrieve GitHub's security certificate.
echo.

if "%LAST_HTTP_CLIENT%" == "powershell" (
  echo The PowerShell failed to download the latest Leiningen version.
  echo Try to use "curl" or "wget" to download Leiningen by setting up
  echo the HTTP_CLIENT environment variable with one of the following 
  echo values:
  echo.
  echo   a^) set HTTP_CLIENT=wget -O
  echo   b^) set HTTP_CLIENT=curl -f -L -o
  echo.
  echo NOTE: Make sure to *not* add double quotes when setting the value
  echo       of HTTP_CLIENT
)

if "%LAST_HTTP_CLIENT%" == "curl" (
  echo Curl failed to download the latest Leiningen version.
  echo Try to use "wget" to download Leiningen by setting up
  echo the HTTP_CLIENT environment variable with one of the following 
  echo values:
  echo.
  echo   a^) set HTTP_CLIENT=wget -O
  echo.
  echo NOTE: Make sure to *not* add double quotes when setting the value
  echo       of HTTP_CLIENT
  echo. 
  echo If neither curl nor wget can download Leiningen, please seek
  echo for help on Leiningen's GitHub project issues page.
)

if "%LAST_HTTP_CLIENT%" == "wget" (
  echo Curl failed to download the latest Leiningen version.
  echo Try to use "wget" to download Leiningen by setting up
  echo the HTTP_CLIENT environment variable with one of the following 
  echo values:
  echo.
  echo.   a^) set HTTP_CLIENT=curl -f -L -o
  echo.
  echo NOTE: make sure *not* to add double quotes to set the value of 
  echo       HTTP_CLIENT
  echo. 
  echo If neither curl nor wget can download Leiningen, please seek
  echo for help on Leiningen's GitHub project issues page.
)

if %SNAPSHOT% == YES echo See README.md for SNAPSHOT build instructions.
echo.
goto EOF


:UPGRADE
set LEIN_BAT=%~dp0%~nx0
set TARGET_VERSION=%2
if "x%2" == "x" set TARGET_VERSION=stable
echo The script at %LEIN_BAT% will be upgraded to the latest %TARGET_VERSION% version.
set /P ANSWER=Do you want to continue (Y/N)?
if /i {%ANSWER%}=={y}   goto YES_UPGRADE
if /i {%ANSWER%}=={yes} goto YES_UPGRADE
echo Aborted.
goto EXITRC


:YES_UPGRADE
echo Downloading latest Leiningen batch script...

set LEIN_BAT_URL=https://github.com/technomancy/leiningen/raw/%TARGET_VERSION%/bin/lein.bat
set TEMP_BAT=%~dp0temp-lein-%RANDOM%%RANDOM%.bat
call :DownloadFile "%LEIN_BAT%.pending" "%LEIN_BAT_URL%"
if ERRORLEVEL 0 goto EXEC_UPGRADE
    del "%LEIN_BAT%.pending" >nul 2>&1
    echo Failed to download %LEIN_BAT_URL%
    goto EXITRC
:EXEC_UPGRADE
move /y "%LEIN_BAT%.pending" "%TEMP_BAT%" >nul 2>&1
echo.
echo Upgrading...
set LEIN_JAR=
call "%TEMP_BAT%" self-install
(
   rem This is self-modifying batch code. Use brackets to pre-load the exit command.
   rem This way, script execution does not depend on whether the replacement script
   rem has that command at the *very same* file position as the calling batch file.
   move /y "%TEMP_BAT%" "%LEIN_BAT%" >nul 2>&1
   exit /B %ERRORLEVEL%
)

:NO_HTTP_CLIENT
echo.
echo ERROR: Neither PowerShell, Wget, or Curl could be found.
echo        Make sure at least one of these tools is installed
echo        and is in PATH. You can get them from URLs below:
echo.
echo PowerShell: "http://www.microsoft.com/powershell"

rem echo Wget:       "http://users.ugent.be/~bpuype/wget/"
rem Note: Stale URL. HTTP 404.
rem Alternative: wget64.exe compiled by J. Simoncic, rename to wget.exe
rem MD5 1750c130c5daca8b347d3f7e34824c9b
rem Check: https://www.virustotal.com/en/file/abf507f8240ed41aac74c9df6de558c88c2f11d7770f02.8.4-SNAPSHOT5f1cc544b9c08b/analysis/
echo Wget:       "https://eternallybored.org/misc/wget/"

echo Curl:       "http://curl.haxx.se/dlwiz/?type=bin&os=Win32&flav=-&ver=2000/XP"
echo.
goto EXITRC


:SET_LEIN_ROOT
set LEIN_ROOT=%~f1
goto EOF

:: Find directory containing filename supplied in first argument
:: looking in current directory, and looking up the parent
:: chain until we find it, or run out
:: returns result in %DIR_CONTAINING%
:: empty string if we don't find it
:FIND_DIR_CONTAINING_UPWARDS
set DIR_CONTAINING=%CD%
set LAST_DIR=

:LOOK_AGAIN
if "%DIR_CONTAINING%" == "%LAST_DIR%" (
    :: didn't find it
    set DIR_CONTAINING=
    goto EOF
)

if EXIST "%DIR_CONTAINING%\%1" (
    :: found it - use result in DIR_CONTAINING
    goto EOF
)

set LAST_DIR=%DIR_CONTAINING%
call :GET_PARENT_PATH "%DIR_CONTAINING%\.."
set DIR_CONTAINING=%PARENT_PATH%
goto LOOK_AGAIN

:GET_PARENT_PATH
set PARENT_PATH=%~f1
goto EOF


:RUN
:: We need to disable delayed expansion here because the %* variable
:: may contain bangs (as in test!). There may also be special
:: characters inside the TRAMPOLINE_FILE.
setLocal DisableDelayedExpansion

set "TRAMPOLINE_FILE=%TEMP%\lein-trampoline-%RANDOM%.bat"
del "%TRAMPOLINE_FILE%" >nul 2>&1

set ERRORLEVEL=
set RC=0
"%LEIN_JAVA_CMD%" -client %LEIN_JVM_OPTS% ^
 -Dfile.encoding=UTF-8 ^
 -Dclojure.compile.path="%DIR_CONTAINING%/target/classes" ^
 -Dleiningen.original.pwd="%ORIGINAL_PWD%" ^
 -cp "%CLASSPATH%" clojure.main -m leiningen.core.main %*
SET RC=%ERRORLEVEL%
if not %RC% == 0 goto EXITRC

if not exist "%TRAMPOLINE_FILE%" goto EOF
call "%TRAMPOLINE_FILE%"
del "%TRAMPOLINE_FILE%" >nul 2>&1
goto EOF


:PROCESSPATH
rem will surround each path with double quotes before appending it to LEIN_LIBS
	for /f "tokens=1* delims=;" %%a in ("%tmpline%") do (
		set LEIN_LIBS=!LEIN_LIBS!"%%a";
		set tmpline=%%b
	)
	if not "%tmpline%" == "" goto PROCESSPATH
	goto EOF

:EXITRC
exit /B %RC%

:EOF



================================================
FILE: bin/lein.cmd
================================================
@echo off
setlocal
set ps1=%~dpn0.ps1
shift
powershell -NoProfile -ExecutionPolicy Bypass -File "%ps1%" %*


================================================
FILE: bin/lein.ps1
================================================
<#
.Synopsis
    Leiningen bootstrap.

.Parameter Command
    The command to pass to leiningen.

.Notes
    This is a very literal port of lein.bat to PowerShell.

    TODO:
    - Determine which (if any) environment variables are used from within Leiningen/Clojure
      and convert the rest to local- or script-scoped variables.
    - Probably should parse the version from the newest .jar filename, rather than hard-code
      it and search for the .jar file from it.
    - Further reduce/simplify/refactor away from batch-file idioms toward idiomatic PowerShell.

.Link
    https://leiningen.org/
#>

#require -version 3
[CmdletBinding(SupportsShouldProcess=$true)] Param(
[Parameter(Position=0,ValueFromRemainingArguments=$true)][string[]]$Command = 'help'
)

function Set-ParentLocation([string]$file)
{
    for($dir = [IO.DirectoryInfo]"$PWD"; $dir.Parent; $dir = $dir.Parent)
    {
        if(Test-Path (Join-Path $dir.FullName $file) -PathType Leaf) { cd $dir.FullName; break }
    }
}

function Initialize-Environment
{
    $env:LEIN_VERSION = '2.12.0'
    $env:SNAPSHOT = if($env:LEIN_VERSION -like '*-SNAPSHOT'){'YES'}else{'NO'} #TODO: Still needed?
    $env:ORIGINAL_PWD = $PWD -replace '\\$','\\'
    Set-ParentLocation project.clj
    if(!$env:LEIN_HOME) {$env:LEIN_HOME = "$env:USERPROFILE\.lein"}
    if(!$env:LEIN_JAR) {$env:LEIN_JAR = "$env:LEIN_HOME\self-installs\leiningen-$env:LEIN_VERSION-standalone.jar"}
    if($PSVersionTable.PSVersion.Major -gt 5) {
        if(!($([System.Net.WebProxy]::new()).IsBypassed('https://github.com/')))
        {
            $proxy = $([System.Net.WebProxy]::new()).GetProxy('https://github.com/')
            Write-Verbose "Using proxy: $proxy"
            $Script:PSBoundParameters = @{
                'Invoke-WebRequest:Proxy' = $proxy
                'Invoke-WebRequest:ProxyUseDefaultCredentials' = $true
            }
        }
    } else {
        if(!([Net.WebRequest]::DefaultWebProxy.IsBypassed('https://github.com/')))
        {
            $proxy = [Net.WebRequest]::DefaultWebProxy.GetProxy('https://github.com/')
            Write-Verbose "Using proxy: $proxy"
            $Script:PSBoundParameters = @{
                'Invoke-WebRequest:Proxy' = $proxy
                'Invoke-WebRequest:ProxyUseDefaultCredentials' = $true
            }
        }
    }
}

function Use-ClassPath([string]$Value)
{
    $env:CLASSPATH =
        if(!(Test-Path .lein-classpath -PathType Leaf)) {$Value}
        else {"$(gc .lein-classpath |? {$_} |select -Last 1);$Value"}
}

function Initialize-Binary
{
    if(!(Test-Path $env:LEIN_JAR -PathType Leaf))
    {throw "$env:LEIN_JAR cannot be found. Try running 'lein self-install' or change the LEIN_JAR environment variable."}
    Use-ClassPath $env:LEIN_JAR
}

function Initialize-Source
{
    $env:LEIN_ROOT = $PSScriptRoot
    $env:bootstrapfile = "$env:LEIN_ROOT\leiningen-core\.lein-bootstrap"
    Write-Verbose "LEIN_ROOT=$env:LEIN_ROOT"
    if($env:bootstrapfile -like '*;*') #TODO: Still important?
    {throw "bootstrap file ($env:bootstrapfile) should not contain semicolons!"}
    if(!(Test-Path $env:bootstrapfile -PathType Leaf)) 
    {throw @'
Leiningen is missing its dependencies. Run 'lein bootstrap' in the leiningen-core/ directory with a stable release.
See CONTRIBUTING.md for details.
'@}
    if((Get-Content $env:bootstrapfile -raw) -like '*"*')
    {throw "Double quotes detected inside bootstrap file $env:bootstrapfile!?"}
    $env:LEIN_LIBS = (Get-Content $env:bootstrapfile |% {$_ -split ';'} |% {"$_"}) -join ';'
    Write-Verbose "LEIN_LIBS=$env:LEIN_LIBS"
    Use-ClassPath "$env:LEIN_LIBS;$env:LEIN_ROOT\src;$env:LEIN_ROOT\resources"
}

function Install-Self
{
    if(Test-Path $env:LEIN_JAR -PathType Leaf) {throw "$env:LEIN_JAR already exists. Delete and retry."}
    $jardir = ([IO.FileInfo]$env:LEIN_JAR).Directory.FullName
    if(!(Test-Path $jardir -PathType Container)) {mkdir $jardir |Out-Null}
    @{ # splatting Invoke-WebRequest due to long URI
        Uri = "https://github.com/technomancy/leiningen/releases/download/$env:LEIN_VERSION/leiningen-$env:LEIN_VERSION-standalone.jar"
        OutFile = $env:LEIN_JAR
    } |% {Write-Progress 'Install-Self' $_.Uri -CurrentOperation "Downloading to $env:LEIN_JAR" ; [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; Invoke-WebRequest @_}
    Write-Progress 'Install-Self' -Completed
}

function Update-Self
{
    $targetVersion = if($Command.Length -gt 1) {$Command[1]} else {'stable'}
    if(!$PSCmdlet.ShouldProcess($PSCommandPath,"upgrade to $targetVersion")) {throw 'Cancelled'}
    @{ # splatting Invoke-WebRequest due to long URI
        Uri = "https://github.com/technomancy/leiningen/raw/$targetVersion/bin/lein.cmd"
        OutFile = "$PSScriptRoot\lein.cmd.pending"
    } |% {Write-Progress 'Update-Self' $_.Uri -CurrentOperation "Downloading to $PSScriptRoot\lein.cmd.pending" ; Invoke-WebRequest @_}
    @{ # splatting Invoke-WebRequest due to long URI
        Uri = "https://github.com/technomancy/leiningen/raw/$targetVersion/bin/lein.ps1"
        OutFile = "$PSCommandPath.pending"
    } |% {Write-Progress 'Update-Self' $_.Uri -CurrentOperation "Downloading to $PSCommandPath.pending" -PercentComplete 50 ; Invoke-WebRequest @_}
    Write-Progress 'Update-Self' -Completed
    Move-Item "$PSScriptRoot\lein.cmd.pending" "$PSScriptRoot\lein.cmd" -force
    Move-Item "$PSCommandPath.pending" "$PSCommandPath" -force
    . "$PSCommandPath" self-install
}

function Invoke-Java
{
    Write-Verbose "CLASSPATH=$env:CLASSPATH"
    $env:JAVA_CMD = if($env:JAVA_CMD){$env:JAVA_CMD -replace '\A"|"\Z',''}else{'java'}
    $env:LEIN_JAVA_CMD = if($env:LEIN_JAVA_CMD){$env:LEIN_JAVA_CMD -replace '\A"|"\Z',''}else{$env:JAVA_CMD}
    if(!$env:JVM_OPTS){$env:JVM_OPTS = $env:JAVA_OPTS}
    $JavaArgs = @(
        '-client',$env:LEIN_JVM_OPTS,
        '-Dfile.encoding=UTF-8',
        "`"-Dclojure.compile.path=$PWD/target/classes`"", #TODO: Add this line only when we're initializing from source
        "`"-Dleiningen.original.pwd=$env:ORIGINAL_PWD`"",
        '-cp',$env:CLASSPATH,
        'clojure.main',
        '-m','leiningen.core.main'
    )
    &$env:LEIN_JAVA_CMD @JavaArgs @Command
}

function Invoke-Leiningen
{
    Initialize-Environment
    switch($Command[0])
    {
        self-install {Install-Self}
        upgrade      {Update-Self }
        downgrade    {Update-Self }
        default
        {
            if(Test-Path "$PSCommandPath\..\src\leiningen\version.clj" -PathType Leaf) {Initialize-Source}
            else {Initialize-Binary}
            Invoke-Java
        }
    }
}

Invoke-Leiningen


================================================
FILE: bin/release
================================================
#!/bin/bash

if [ "$1" = "" ]; then
    echo "usage: $0 VERSION"
    exit 1
fi

RELEASE_VERSION=$1
CURRENT_VERSION="$RELEASE_VERSION-SNAPSHOT"

if [ "$LEIN_STABLE" = "" ]; then
    LEIN_STABLE=/usr/bin/lein
fi

set -e -u

# Would like to use `lein release` here, but we don't have a way to
# update the bash scripts or watch for boot slowdowns that way. Maybe
# try adding lein-shell?

if [ ! -x `which $LEIN_STABLE` ]; then
    echo "Install a stable version of Leiningen as $LEIN_STABLE."
    exit 1
fi

grep $RELEASE_VERSION NEWS.md || (echo "Add $RELEASE_VERSION to NEWS.md" && exit 1)

lein vcs assert-committed

for f in bin/lein bin/lein-pkg bin/lein.bat bin/lein.ps1 project.clj leiningen-core/project.clj; do
    sed -i s/$CURRENT_VERSION/$RELEASE_VERSION/ $f
done

rm -rf target classes leiningen-core/target leiningen-core/classes leiningen-core/lib
rm -rf $HOME/.lein/self-installs/leiningen-$RELEASE_VERSION-standalone.jar

LEIN_ROOT=$PWD

echo "Bootstrapping..."
cd leiningen-core
$LEIN_STABLE do clean, bootstrap
cd ..

echo "Generating uberjar..."

bin/lein uberjar
RELEASE_JAR=$PWD/target/leiningen-$RELEASE_VERSION-standalone.jar
RELEASE_JAR_CHECKSUM="$(sha256sum $RELEASE_JAR | awk '{ print $1 }')"
SELF_INSTALL_JAR=$HOME/.lein/self-installs/$(basename $RELEASE_JAR)
mkdir -p $HOME/.lein/self-installs
cp $RELEASE_JAR $SELF_INSTALL_JAR

sed -i "s/export LEIN_CHECKSUM=.*/export LEIN_CHECKSUM='$RELEASE_JAR_CHECKSUM'/" bin/lein
cp bin/lein /tmp/lein-$RELEASE_VERSION
cd /tmp

if [ ! -r test-project ]; then
    ./lein-$RELEASE_VERSION new test-project
fi

cd test-project

echo "Running a few invocations in order to check boot time..."

time ../lein-$RELEASE_VERSION run -m clojure.main/main -e nil
time ../lein-$RELEASE_VERSION run -m clojure.main/main -e nil
time ../lein-$RELEASE_VERSION run -m clojure.main/main -e nil

echo "Check that these are about the same boot times as with the last version."
echo "Run this in a project: time $LEIN_STABLE run -m clojure.main/main -e nil"
echo "Proceeding here will publish the new version to the git repo."
echo "Are these acceptable times? (~3s) [Y\n]"
read CONTINUE
case "$CONTINUE" in
    y|Y|"")
        gpg -ab $RELEASE_JAR;;
    *)
        echo "Aborted."
        exit 1;;
esac

cd $LEIN_ROOT

git commit -a -m "Release $RELEASE_VERSION"
git tag -s $RELEASE_VERSION -m "Release $RELEASE_VERSION"
git push && git push --tags && git push origin main:stable

echo "Upload to Codeberg and Github:"
echo "    $SELF_INSTALL_JAR"
echo "    $SELF_INSTALL_JAR.asc"
echo
echo "https://codeberg.org/leiningen/leiningen/releases/new?tag=$RELEASE_VERSION"
echo "https://github.com/technomancy/leiningen/releases/new?tag=$RELEASE_VERSION"
echo "Copy this version's section of NEWS.md to the release description."

rm -rf target leiningen-core/target
echo "Test self-install. If things are good, run this:"
echo "    lein deploy clojars && cd leiningen-core && lein deploy clojars"
echo ""
echo "Then run: bin/bump $RELEASE_VERSION NEXT_VERSION-SNAPSHOT"


================================================
FILE: doc/BEGINNER_MISTAKES.md
================================================
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
**Table of Contents**

- [BEGINNER_MISTAKES](#beginner_mistakes)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

# Beginner Mistakes

**Q:** When I have no `project.clj` the command `lein repl` works, but I
       added one and now `lein repl` crashes with:
```
Error: Could not find or load main class clojure.main
Caused by: java.lang.ClassNotFoundException: clojure.main
Subprocess failed (exit code: 1)
```
**A:** When you don't have a `project.clj` Leiningen automatically includes
      the core Clojure language for you.  When you add a `project.clj`,
      Leiningen expects you to specify which version of Clojure you'll
      use. If you're just experimenting with Clojure, remove `project.clj`.
      Otherwise, make sure your `project.clj` has a `:dependencies` section
      with at least `[org.clojure/clojure "1.11.1"]` in it. (Change the version
      from `1.11.1` as necessary.)



================================================
FILE: doc/DEPLOY.md
================================================
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
**Table of Contents**

- [Deploying Libraries](#deploying-libraries)
  - [Private Repositories](#private-repositories)
    - [Static HTTP](#static-http)
    - [SCP](#scp)
    - [S3](#s3)
    - [Artifactory/Nexus/Archiva](#artifactorynexusarchiva)
    - [Other Non-standard Repository Protocols](#other-non-standard-repository-protocols)
  - [Authentication](#authentication)
    - [GPG](#gpg)
    - [Full-disk Encryption](#full-disk-encryption)
    - [Credentials in the Environment](#credentials-in-the-environment)
  - [Deployment](#deployment)
  - [Releasing Simplified](#releasing-simplified)
    - [Overriding the default `:release-tasks`](#overriding-the-default-release-tasks)
    - [Tagging](#tagging)
  - [Deploying to Maven Central](#deploying-to-maven-central)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

# Deploying Libraries

Getting your library into [Clojars](https://clojars.org) is fairly
straightforward as is documented near the end of
[the Leiningen tutorial](https://codeberg.org/leiningen/leiningen/src/stable/doc/TUTORIAL.md).
However, deploying elsewhere is not always that straightforward.

## Private Repositories

There may be times when you want to make a library available to your
team without making it public. This is best done by setting up a
private repository. There are several types of repositories.

### Static HTTP

The simplest kind of private repository is a web server pointed at a
directory full of static files. You can use a `file:///` URL in your
`:repositories` to deploy that way if the directory is local to the
machine on which Leiningen is running.

### SCP

If you already have a server set up with your SSH public keys, the
`scp` transport is a simple way to publish and consume private
dependencies. Place the following inside `defproject`:

```clj
:plugins [[org.apache.maven.wagon/wagon-ssh-external "2.6"]]
:repositories [["releases" "scp://somerepo.com/home/repo/"]]
```

Then place the following outside the `defproject`:

```clj
(cemerick.pomegranate.aether/register-wagon-factory!
 "scp" #(let [c (resolve 'org.apache.maven.wagon.providers.ssh.external.ScpExternalWagon)]
          (clojure.lang.Reflector/invokeConstructor c (into-array []))))
```

It's also possible to deploy to a repository using the `scp` transport
and consume from it over `http` if you set up nginx or something
similar to serve the repository directory over HTTP.

N.B. SCP deploys to Clojars are no longer supported.

### S3

If you don't already have a server running,
[Amazon S3](https://aws.amazon.com/s3/) is a low-maintenance choice;
you can deploy to S3 buckets using the
[S3 wagon private](https://github.com/s3-wagon-private/s3-wagon-private) plugin.

### Artifactory/Nexus/Archiva

The most full-featured and complex route is to run a full-fledged
repository manager. Both [Artifactory](https://www.jfrog.com/open-source/#os-arti), [Archiva](https://archiva.apache.org/) and
[Nexus](https://nexus.sonatype.org/) provide this. They also proxy to
other repositories, so you can set `^:replace` metadata on
`:repositories` in project.clj, and dependency downloads will speed up
by quite a bit since Clojars and Maven Central won't need to be
checked.

The private server will need to be added to the `:repositories`
listing in project.clj. Artifactory, Archiva and Nexus offer separate repositories
for snapshots and releases, so you'll want two entries for them:

```clj
:repositories [["snapshots" "https://blueant.com/archiva/snapshots"]
               ["releases" "https://blueant.com/archiva/internal"]]
```

If you are deploying to a repository that is _only_ used for deployment
and never for dependency resolution, then it should be specified in a
`:deploy-repositories` slot instead of included in the more general-purpose
`:repositories` map; the former is checked by `lein deploy` before the latter.
Deployment-only repositories useful across a number of locally developed
projects may also be specified in the `:user` profile in `~/.lein/profiles.clj`:

```clj
{:user {:deploy-repositories [["internal" "https://blueant.com/archiva/internal"]]}}
```

### Other Non-standard Repository Protocols

If you are deploying to a repository that doesn't use one of the
standard protocols (`file:` or `https:`), you may need to
provide a wagon factory for that protocol. You can do so by specifying
the wagon provider as a plugin dependency:

```clj
:plugins [[org.apache.maven.wagon/wagon-webdav-jackrabbit "2.4"]]
```

then registering a wagon factory function at the bottom of your project.clj:

```clj
(cemerick.pomegranate.aether/register-wagon-factory! "dav"
  #(eval '(org.apache.maven.wagon.providers.webdav.WebDavWagon.)))
```

This step is unnecessary for plugins that include explicit Leiningen
support like
[S3 wagon private](https://github.com/technomancy/s3-wagon-private)
and [lein-webdav](https://github.com/tobias/lein-webdav) as these declare
their wagons in ways that can be inferred automatically.

## Authentication

Deploying and reading from private repositories needs authentication
credentials. Check your repository's documentation for details, but
you'll usually need to provide a `:username` and `:password` (for a repository)
or `:passphrase` (for GPG). Leiningen will prompt you for a password if you
haven't set up credentials, but it's convenient to set it so you don't have to
re-enter it every time you want to deploy. You will need
[gpg](https://www.gnupg.org/) installed and a key pair configured.  If
you need help with either of those, see the
[GPG guide](https://codeberg.org/leiningen/leiningen/src/stable/doc/GPG.md).

### GPG

If you specify a `:creds :gpg` entry in one of your `:repositories` settings
maps, Leiningen will decrypt `~/.lein/credentials.clj.gpg` and use that to find
the proper credentials for the given repository.

```clj
:repositories [["releases" {:url "https://blueant.com/archiva/internal"
                            :creds :gpg}]]
```

First write your credentials map to `~/.lein/credentials.clj` like so:

```clj
{#"blueant" {:password "locative1"}
 #"https://repo.clojars.org"
 {:username "milgrim" :password "CLOJARS_677eb77a08974e2797bbd17a402464e5cd0f987689487633895e649b312e"}
 "s3p://s3-repo-bucket/releases"
 {:username "AKIAIN..." :passphrase "1TChrGK4s..."}}
```

When storing credentials for Clojars, it's recommended to generate a
[deploy token](https://clojars.org/tokens) per machine and store that
instead rather than having a single deploy token in order to limit
the scope of the damage if the credential is leaked.

Then encrypt it with `gpg`:

    $ gpg --default-recipient-self -e \
        ~/.lein/credentials.clj > ~/.lein/credentials.clj.gpg

Remember to delete the plaintext `credentials.clj` once you've
encrypted it. Due to a bug in `gpg` you currently need to use
`gpg-agent` and have already unlocked your key before Leiningen
launches, but with `gpg-agent` you only have to enter your passphrase
periodically; it will keep it cached for a given period.

Note to windows users: Be sure to download the full version of 
[Gpg4win](https://gpg4win.org/download.html) and
select GPA for installation. You then need to run 
`gpg-connect-agent /bye` from the command line before starting lein.

### Full-disk Encryption

If you use full-disk encryption, it may be safe to store your
credentials without using GPG. In this case, you can create an `:auth`
profile containing a `:repository-auth` key mapping URL regexes to
credentials. Your `~/.lein/profiles.clj` file would look something
like this:

```clj
{:user {...}
 :auth {:repository-auth {#"blueant" {:username "milgrim"
                                      :password "locative1"}}}}
```

### Credentials in the Environment

Unattended builds can specify `:env` instead of `:gpg` in the
repository specification to have credentials looked up in the
environment. For example, specifying `:password :env` will cause
Leiningen to look up `(System/getenv "LEIN_PASSWORD")` for that value.
You can control which environment variable is looked up for each value
by using a namespaced keyword, like so:

```clj
:repositories [["releases" {:url "https://blueant.com/archiva/internal"
                            :username :env/archiva_username
                            :password :env/archiva_password}]]
```

Finally, you can opt to load credentials from the environment _or_ GPG credentials
by using a vector of `:gpg` and `:env/*` values to define the priority of each:

```clj
:repositories [["releases" {:url "https://blueant.com/archiva/internal"
                            :username [:gpg :env/archiva_username]
                            :password [:gpg :env/archiva_password]}]]
```

In this example, both `:username` and `:password` will be looked up in
`~/.lein/credentials.clj.gpg` first, and only if a value is not available there will
the `ARCHIVA_*` env vars be checked.  This allows you to avoid creating profiles
just to use different credential sources in e.g. a local development environment
vs. a centralized build environment.

Note that the forms `:env` and `:env/varname` are only supported within the
`:repositories` key. Plugins may decide to implement this themselves, but this
is not default behaviour.

## Deployment

Once you've set up a private repository and configured project.clj
appropriately, you can deploy to it:

    $ lein deploy [repository-name]

If the project's current version is a `SNAPSHOT`, it will default to deploying
to the `"snapshots"` repository; otherwise it will default to `"releases"`. In
order to make `lein deploy` with no argument target Clojars, include this in
your `project.clj`:

```clj
{:deploy-repositories [["releases" :clojars]
                       ["snapshots" :clojars]]}
```

You can use this to alias any `:repositories` entry; Clojars is just the most
common use case.

## Signing Artifacts

By default Leiningen will attempt to sign all artifacts that are deployed
using GPG. If you prefer, you can [sign them using
SSH](https://www.agwa.name/blog/post/ssh_signatures) instead. If you don't
already use GPG, this may be more convenient for you. Edit your
`~/.lein/profiles.clj` file to add a `:user` profile with a `:signing` map:

```clj
{:user {:signing {:gpg-key false
                  :ssh-key "~/.ssh/id_rsa"}}}
```

If you want to keep signing with both SSH and GPG at the same time, you can
omit the `:gpg-key false` setting.

## Releasing Simplified

Once you have your repositories and user credentials configured for deploying,
much of the work involved in actually deploying a release version can be tedious
and difficult to perform in a consistent fashion from one release to the next.
To simplify the release process, there is a `lein release [$LEVEL]` task where
`$LEVEL` can be refer to any of `:major`, `:minor`, `:patch`, `:alpha`, `:beta`,
or `:rc`. The simplification lies in the list of `:release-tasks` that get run
on each call to `lein release`. For example, suppose that your `project.clj`
starts off as follows:

```clojure
(defproject leiningen "2.4.0-SNAPSHOT" ...)
```

Using the default `:release-tasks` and the following command line:

    $ lein release :patch

The following events will happen:

1. The `change` task is run to remove whatever qualifier is currently on
   the version in `project.clj`. In this case, `project.clj` should
   look something like ```(defproject leiningen "2.4.0" ...)```.

2. `vcs` tasks will be run to commit this change and then tag the repository
   with the `release` version number.

3. The `deploy` task will be the same as if `lein deploy` had been run from the
   command line. **NOTE** This will require a valid `"releases"` entry either in
   `:deploy-repositories` or `:repositories`

4. The `change` task is run once more to "bump" the version number in
   `project.clj`. Which version level is decided by the argument
   passed to `lein release`, in this case `:patch`. Afterward, `project.clj` will
   look something like ```(defproject leiningen "2.4.1-SNAPSHOT" ...)```.

5. Finally, `vcs` tasks will be run once more to commit the new change to
   `project.clj` and then push these two new commits to the default remote
   repository.

The release process will fail if there are uncommitted changes.

### Overriding the default `:release-tasks`

You can use the `lein-pprint` plugin to see the default value of `:release-tasks`:

```
$ lein pprint :release-tasks
[["vcs" "assert-committed"]
 ["change" "version" "leiningen.release/bump-version" "release"]
 ["vcs" "commit"]
 ["vcs" "tag"]
 ["deploy"]
 ["change" "version" "leiningen.release/bump-version"]
 ["vcs" "commit"]
 ["vcs" "push"]]
```

This `:release-tasks` value can be overridden in `project.clj`. An example might
be a case in which you want the default workflow up to `lein deploy` but don't
want to automatically bump the version in `project.clj`:

```clojure
  :release-tasks [["vcs" "assert-committed"]
                  ["change" "version"
                   "leiningen.release/bump-version" "release"]
                  ["vcs" "commit"]
                  ["vcs" "tag"]
                  ["deploy"]]
```

The `:release-tasks` vector should have every element be either a task name or a
collection in which the first element is a task name and the rest are arguments
to that task, just like `:prep-tasks` or `:aliases` entries.

Of course, `:release-tasks` doesn't have to look anything like the
default, the default is just an assumed convention among most Clojure
libraries using Leiningen. Applications will have different requirements
that are varied enough that Leiningen doesn't attempt to support them
out of the box.

If you just want to change the `deploy` step so it goes to Clojars, you don't
have to replace the whole `:release-tasks` vector, just set this:

```clojure
:deploy-repositories {"releases" {:url "https://repo.clojars.org" :creds :gpg}}
```

### Committing

By default, `["vcs" "commit"]` will commit with the message `"Version
<version>"`. You can override that by passing a `format`-ready string
to the task, like so: `["vcs" "commit" "Version %s [skip ci]"]`.

### Tagging

By default `["vcs" "tag"]` will create a signed tag with your project version
number. You can add a tag prefix by passing the prefix after `"tag"`,
for example: `["vcs" "tag" "v"]`. You can disable tag signing by passing `--no-sign`,
for example: `["vcs" "tag" "v" "--no-sign"]` or `["vcs" "tag" "--no-sign"]`.

## Deploying to Maven Central

Deploying your libraries and other artifacts to [Maven
Central](https://search.maven.org/) is often desirable.  Most tools that
use the Maven repository format (including Leiningen, Gradle, sbt, and
Maven itself) include Maven Central or one of its mirrors as a default
repository for resolving project dependencies.  So deploying your
libraries to Maven Central offers the widest distribution, especially if
your users are likely to be in languages other than Clojure.

Thankfully, Leiningen can deploy your libraries to Maven Central, with
a few additional bits of configuration.  All of the guidance about
deploying to private repositories laid out above applies; but, here's a
step-by-step recipe from start to finish:

1. Register an account and groupId on `oss.sonatype.org`; refer to
[this](https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide)
for details on how to get registered (you can ignore most of the info on
that page regarding configuring Maven and/or ant, since we'll not be
touching those tools).  Note that all artifacts you deploy to Sonatype OSS will
need to use the groupId(s) you choose, so your project coordinates
should be set up to match; e.g.:

```clojure
(defproject your.group.id/projectname "x.y.z" ...)
```

2. Add your credentials for `oss.sonatype.org` to your
`~/.lein/credentials.clj.gpg` file.  Something like this will do:

```clojure
{#"https://oss.sonatype.org/.*"
 {:username "username" :password "password"}}
```

Refer to the instructions earlier on this page for how to encrypt a
plain-text `credentials.clj` using GPG.

3. Add the Sonatype OSS deployment repository endpoints to your project.clj, e.g.:
```clojure
:deploy-repositories [["releases" {:url "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
                                   :creds :gpg}
                       "snapshots" {:url "https://oss.sonatype.org/content/repositories/snapshots/"
                                    :creds :gpg}]]
```

4. Conform to Sonatype OSS' requirements for uploaded artifacts' `pom.xml` files;
all you need to do is make sure the following slots are populated
properly in your `project.clj`:

```clojure
  :description
  :url
  :license
  :scm
  :pom-addition
  :classifiers
```

Examples of OSS-acceptable values for these entries can be seen in this
[`project.clj`
file](https://github.com/operatr-io/kpow-streams-agent/blob/main/project.clj).
Note that all of them should be appropriate for *your* project; blind
copy/paste is not appropriate here.

5. Run `lein deploy`.  Leiningen will push all of the files it would
otherwise send to Clojars or your other private repository to the proper
OSS repository (either releases or snapshots depending on whether your
project's version number has `-SNAPSHOT` in it or not).

6. If you're deploying a release, log in to `oss.sonatype.org`, and
close and release/promote your staged repository.  (This manual step
will eventually be automated through the use of a plugin.) The release
will show up in OSS' releases repository immediately, and sync to Maven
Central on the next cycle (~ 1-4 hours usually). 


================================================
FILE: doc/FAQ.md
================================================
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
**Table of Contents**

- [FAQ](#faq)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

# FAQ

**Q:** How do you pronounce Leiningen?  
**A:** It's LINE-ing-en. ['laɪnɪŋən]

**Q:** What's a group ID? How do snapshots work?  
**A:** See the
  [tutorial](https://codeberg.org/leiningen/leiningen/src/stable/doc/TUTORIAL.md)
  for background.

**Q:** How should I pick my version numbers?  
**A:** Use [semantic versioning](https://semver.org) to communicate
  intentions to downstream users of your library, but don't make
  assumptions that libraries you use stick with it consistently. Remember
  that the difference between a breaking change and a bug fix is often
  subjective.

**Q:** What if my project depends on jars that aren't in any repository?  
**A:** You will need to get them in a repository. The
  [deploy guide](https://codeberg.org/leiningen/leiningen/src/stable/doc/DEPLOY.md)
  explains how to set up a private repository. In general it's easiest
  to deploy them to a static HTTP server or a private S3 bucket. Once
  the repo is set up, `lein deploy private-repo com.mycorp/somejar
  1.0.0 somejar.jar pom.xml` will push the artifacts out. If you don't
  have a pom, you can create a dummy project with `lein new` and
  generate a pom from that. If you are just doing exploratory coding
  you can deploy to `file:///$HOME/.m2/repository` and the jars will
  be available locally.

**Q:** I want to hack a project and one of its dependencies, but it's annoying to switch between them.  
**A:** Leiningen provides a feature called *checkout dependencies* to
  make this smoother.  See the
  [tutorial](https://codeberg.org/leiningen/leiningen/src/stable/doc/TUTORIAL.md)
  to learn more.

**Q:** Is it possible to exclude indirect dependencies?  
**A:** Yes. Some libraries, such as log4j, depend on projects that are
  not included in public repositories and unnecessary for basic
  functionality.  Projects listed as `:dependencies` may exclude
  any of their dependencies by using the `:exclusions` key. See
  `lein help sample` for details.

**Q:** I specified a dependency on version X but am getting version Y; what's up?  
**A:** One of your dependencies' dependencies has declared a
  dependency on a hard version range, which overrides your "soft"
  declaration. Running `lein deps :tree` will identify which of your
  dependencies are responsible for the version range. You can add an
  `:managed-dependencies` clause to prevent that from affecting the
  rest of your dependencies. See [the managed dependencies
  guide](doc/MANAGED_DEPS.md) for details. You may also want to report
  a bug with the dependency that uses hard version ranges as they
  cause all kinds of problems and exhibit unintuitive behaviour.

**Q:** I have two dependencies, X and Y, which depends on Z. How is the version
  of Z decided?  
**A:** The decision depends on which depth and which order the dependencies come
  in the `:dependencies` vector: The dependency at the lowest depth will be
  picked. If there are multiple versions of a single group/artifact at that
  depth, the first of those will be picked. For instance, in the dependency
  graph

    [Z "1.0.9"]
    [X "1.3.2"]
      [Z "2.0.1"]

  the direct dependency (`[Z "1.0.9"]`) is picked, as it is closest to the root.
  For the dependency graph

    [X "1.3.2"]
      [Z "2.0.1"]
    [Y "1.0.5"]
      [Z "2.1.3"]

  the dependency X comes first, and therefore `[Z "2.0.1"]` is picked. If we
  place Y before X however, `[Z "2.1.3"]` will be picked.
  
  Note that this only applies to soft dependencies, and `lein deps :tree` will
  only warn if the latest version is not chosen.

**Q:** I'm behind an HTTP proxy; how can I fetch my dependencies?  
**A:** Set the `$http_proxy` environment variable in Leiningen 2.x. You can also
  set `$http_no_proxy` for a list of hosts that should be reached directly, bypassing
  the proxy. This is a list of patterns separated by `|` and may start or end with
  a `*` for wildcard, e.g. `localhost|*.mydomain.com`.
  For Leiningen 1.x versions, see the instructions for
  [configuring a Maven proxy](https://maven.apache.org/guides/mini/guide-proxies.html)
  using `~/.m2/settings.xml`.

**Q:** What can be done to speed up launch?  
**A:** The main delay involved in Leiningen comes from starting two
  JVMs: one for your project and one for Leiningen itself. Most people
  use a development cycle that involves keeping a single project REPL
  process running for as long as they're working on that project.
  Depending on your editor you may be able to do this via its Clojure
  integration. (See [cider](https://github.com/clojure-emacs/cider) or
  [fireplace](https://github.com/tpope/vim-fireplace), for example.)
  Otherwise you can use the basic `lein repl`.

**Q:** Still too slow; what else can make startup faster?  
**A:** The wiki has a page covering
  [ways to improve startup time](https://wiki.leiningen.org/Faster).

**Q:** What if I care more about long-term performance than startup time?  
**A:** Leiningen gets a startup time speed boost by disabling optimized
  compilation (which only benefits long-running processes).  This can
  negatively affect performance in the long run, or lead to inaccurate
  benchmarking results.  If want the JVM to fully optimize, you can
  switch profiles with `lein with-profiles production run ...`.

**Q:** I'm attempting to run a project as a background process (`lein run &`),
  but the process suspends until it is in the foreground. How do I run a program
  in the background?  
**A:** For long-lasting processes, it's better to create an uberjar
  and run that or use `lein trampoline run &`. For short-lived ones,
  both `lein run <&- &` and `bash -c "lein run &"` will work fine.

**Q:** How do I determine my project's version at runtime?  
**A:** Leiningen writes a file called `pom.properties` into
  `target/classes` which contains the version number and current git
  revision of the project. In previous versions of Leiningen this was
  only available when running from jar files, but as of 2.4.1 it's
  available during `lein run ...`, etc. You can read it by running
  this code (replace "group" and "artifact" with values appropriate to
  your project):

```clj
(with-open [pom-properties-reader (io/reader (io/resource "META-INF/maven/group/artifact/pom.properties"))]
  (doto (java.util.Properties.)
    (.load pom-properties-reader)))
```

**Q:** How can I read my project map at runtime?  
**A:** Usually you do not need the complete project map, only a specific subset
  of some values. If you want different configuration based on different tasks,
  then [environ](https://github.com/weavejester/environ) is probably a good fit.
  If you want information like the project's version number or git revision,
  read the question and answer above.

  Generally those solutions are sufficient, but if you need more than this, you
  should rather read the `project.clj` yourself. The project map changes based
  on the task you use, and so different tasks (repl, jar, uberjar to name a few)
  will make it hard to make the testing- and production project map identical.
  `project.clj` is added as a resource in
  `META-INF/leiningen/group/artifact/project.clj` (replace "group" and
  "artifact" with values appropriate to your project). You can read it as
  follows:

```clj
(read-string (slurp (io/resource "META-INF/leiningen/group/artifact/project.clj")))
```

**Q:** I need to do AOT for an uberjar; can I avoid it during development?  
**A:** Yes, it is strongly recommended to do AOT only in the uberjar task
  if possible. But by default the AOT'd files will still be visible during 
  development unless you also change `:target-path` to something like
  `"target/uberjar"` in the `:uberjar` profile as well.

**Q:** Is there a way to use an uberjar without AOT?  
**A:** If you omit `:main` in `project.clj`, your uberjars will use
  `clojure.main` as their entry point. You can launch with `java -jar
  my-app-standalone.jar -m my.entry.namespace arg1 arg2 [...]` without
  any AOT, but it will take longer to launch.

**Q:** Why does `lein jar` package some namespaces from dependencies into my jar?  
**A:** This is likely because you have AOT-compiled namespaces. An
  AOT-compiled namespace can only depend on AOT-compiled namespaces. Therefore,
  if you depend on a namespace in a dependency that is not AOT-compiled, it will
  be AOT-compiled and bundled with the jar. It is strongly recommended not to
  perform AOT other than during the creation of an uberjar.

**Q:** I'd like to have certain config active only on a certain OS.  
**A:** You can do this by using unquote in the `:dev` profile:

```clj
:profiles {:dev [:dev/all ~(leiningen.core.utils/get-os)]
           :dev/all {...}
           :linux {...}
           :windows {...}
           :macosx {...}}
```

You can also check things like `(System/getProperty
"java.specification.version")` to use the JVM version or any other
property.

**Q:** I get a `java.security.KeyException` or `sun.security.provider.certpath.SunCertPathBuilderException` when running `lein`  
**A:** The `java.security.KeyException` indicates an ssl error when
  trying to communicate with the HTTPS server via Java. This could be
  because you need to update the JDK, or some other package (e.g. with
  old versions of the nss package).

* On Fedora, you might just try running a `sudo yum update` to update all of your packages or `sudo yum update nss`.
* On Debian/Ubuntu, `sudo update-ca-certificates -f` might help, or `sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure`
* You should also check your system clock and make sure the time is accurate; it's possible to run into SSL connection failures if your clock is way out of sync.
* If it still doesn't work, please see if any of [these 'ssl' labelled issues](https://github.com/technomancy/leiningen/issues?utf8=%E2%9C%93&q=is%3Aissue%20label%3Assl%20) might help

**Q:** I got `Tried to use insecure HTTP repository without TLS`, what is that about?  
**A:** This means your project was configured to download dependencies
from a repository that does not use TLS encryption. This is very
insecure and exposes you to trivially-executed man-in-the-middle
attacks.  In the rare event that you don't care about the security of
the machines running your project or can ensure that the only http
traffic is going out over a trusted network, you can re-enable support
for unsafe repositories by putting this in your `project.clj` file:

    ;; never do this
    (require 'cemerick.pomegranate.aether)
    (cemerick.pomegranate.aether/register-wagon-factory!
     "http" #(org.apache.maven.wagon.providers.http.HttpWagon.))

It's also possible you have a dependency which includes a reference to
an insecure repository for retrieving its own dependencies. If this
happens it is strongly recommended to add an `:exclusion` and report a
bug with the dependency which does this.

**Q:** `lein`/`lein.bat` won't download `leiningen-x.y.z-SNAPSHOT.jar`  

**A:** You probably downloaded `lein`/`lein.bat` from the main
  branch. Unless you plan to build leiningen yourself or help develop
  it, we suggest you use the latest stable version:
  [lein](https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein)/[lein.bat](https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein.bat)

**Q:** I have a dependency whose group ID and/or artifact ID starts with a
number (which is invalid for symbols in Clojure). How can I add it to my
project's dependencies?  
**A:** Leiningen supports string dependency names like this:

```clj
:dependencies [["net.3scale/3scale-api" "3.0.2"]]
```

**Q:** I'm getting warnings for implicit hooks.  
**A:** Hooks are a deprecated feature where plugins can modify the
  behavior of built-in Leiningen functionality; they result in
  situations which can be very difficult to debug and usually point
  to situations in which the original API is not flexible enough.

Adding `:implicits false` to `project.clj` will disable all implicit features.


================================================
FILE: doc/GPG.md
================================================
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
**Table of Contents**

- [Using GPG](#using-gpg)
  - [What is it?](#what-is-it)
  - [Installing GPG](#installing-gpg)
    - [Linux](#linux)
        - [Debian based distributions](#debian-based-distributions)
      - [Fedora based distributions](#fedora-based-distributions)
    - [Mac](#mac)
    - [Windows](#windows)
  - [Creating a keypair](#creating-a-keypair)
  - [Listing keys](#listing-keys)
  - [Publishing your public key](#publishing-your-public-key)
  - [How Leiningen uses GPG](#how-leiningen-uses-gpg)
    - [Signing a file](#signing-a-file)
    - [Overriding the gpg defaults](#overriding-the-gpg-defaults)
  - [Troubleshooting](#troubleshooting)
    - [Debian based distributions](#debian-based-distributions-1)
      - [gpg: can't query passphrase in batch mode](#gpg-cant-query-passphrase-in-batch-mode)
    - [Mac OS](#mac-os)
      - [Unable to get GPG installed via Homebrew and OS Keychain to work](#unable-to-get-gpg-installed-via-homebrew-and-osx-keychain-to-work)
      - [GPG doesn't ask for a passphrase](#gpg-doesnt-ask-for-a-passphrase)
    - [GPG prompts for passphrase but does not work with Leiningen](#gpg-prompts-for-passphrase-but-does-not-work-with-leiningen)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

# Using GPG

This is an introduction to setting up and using
[GPG](https://www.gnupg.org/) keys with
[Leiningen](https://leiningen.org) to sign artifacts for publication to
[Clojars](https://clojars.org/) and to encrypt repository credentials.

There are two versions of GPG available: v1.x and v2.x. For our
purposes, they are functionally equivalent. Package managers generally
install v2.x as `gpg2`, and v1.x as `gpg`, except for Homebrew which
installs v2.x as `gpg`, and v1.x as `gpg1`. By default, Leiningen
expects the GPG command to be `gpg`. You're welcome to use any version
you like, but this primer will only cover installing v1.x (except under
macOS), and has only been tested under v1.x.

## What is it?

[GPG](https://www.gnupg.org/) (or Gnu Privacy Guard) is a set of tools
for cryptographic key creation/management and encryption/signing of
data. If you are unfamiliar with the concepts of public key
cryptography, this
[Wikipedia entry](https://en.wikipedia.org/wiki/Public-key_cryptography)
serves as a good introduction.

An important concept to understand in public key cryptography is that
you are really dealing with two keys (a *keypair*): one public, the
other private (or secret). The public key can be freely shared, and is
used by yourself and others to encrypt data that only you, as the
holder of the private key, can decrypt. It can also be used to verify
the signature of a file, confirming that the file was signed by the
holder of the private key, and the contents of the file have not been
altered since it was signed. **You should guard your private key
and passphrase closely, and share them with no one.**

## Installing GPG

### Linux

##### Debian based distributions

Apt uses GPG v1, so it should already be installed. If not:

    apt-get install gnupg
    
#### Fedora based distributions

Fedora and friends may have GPG v2 installed by default, but GPG v1 is
available via:
    
    yum install gnupg
    
### Mac

There are several options here, depending on which package manager you
have installed (if any):

1. via [homebrew](https://brew.sh/): `brew install gnupg2`
2. via [macports](https://www.macports.org/): `port install gnupg2`
3. via a [binary installer](https://www.gpgtools.org/installer/index.html) 
   (this installs gpg2 as gpg)

### Windows

[GPG4Win](https://gpg4win.org/) provides a binary installer that
provides some possibly useful GUI tools in addition to providing the
`gpg` command.

## Creating a keypair

Create a keypair with:

    gpg --gen-key

This will prompt you for details about the keypair to be generated,
and store the resulting keypair in `~/.gnupg/`.

The default key type (RSA and RSA) is fine for our purposes, as is the
default keysize (2048). We recommend a validity period of 2 years. 

You'll be prompted for a passphrase to protect your private key - it's
important to use a strong one to help protect the integrity of your key.

## Listing keys

GPG stores keys in a keystore located in `~/.gnupg/`. This keystore
holds your keypair(s), along with any other public keys you have used.
    
To list all of the public keys in your keystore:

    gpg --list-keys
    
This will include any public keys you have used, including keys from
others (if you've never used GPG before and just created your first
keypair, you should just see your own key).

The output of the `--list-keys` option will include the id of your
public key in the 'pub' line in the key listing (you'll need that id 
for other commands described here):

    $ gpg --list-keys

                ↓↓↓↓↓↓↓↓
    pub   2048R/2ADFB13E 2013-03-16 [expires: 2014-03-16]
    uid                  Bob Bobson <bob@bobsons.net>
    sub   2048R/8D2344D0 2013-03-16 [expires: 2014-03-16]

The `--fingerprint` option will act just like `--list-keys`, but will
include the fingerprint of each certificate in the output. You can
filter the output of the `--fingerprint` option by providing a key id
or any substring from the uid (this trick also works for the
`--list-keys` option):

    $ gpg --fingerprint 2ADFB13E

    pub   2048R/2ADFB13E 2013-03-16 [expires: 2014-03-16]
          Key fingerprint = 3367 5FD0 D67B 3218 5815  51A3 97D4 06D0 2ADF B13E
    uid                  Bob Bobson <bob@bobsons.net>
    sub   2048R/8D2344D0 2013-03-16 [expires: 2014-03-16]

## Publishing your public key

To make it easier for others that need your public key to find it,
you can publish it to a key server with:

    gpg --send-keys 2ADFB13E # use your id instead

This pushes a copy of your public key to one of a cluster of free key
servers, and the key is propagated to all of the other servers in the
cluster in short order.

If your keypair is compromised, you can publish a revocation
certificate to the key server to let others know that your key can no
longer be trusted for any future signing or encryption. It's a good
idea to generate a revocation certificate whenever you create a new
keypair, and store it in a safe place. As long as you have that
revocation certificate, you can revoke a keypair even if you no longer
have the private key. You can generate a revocation certificate with:

    $ gpg --output 2ADFB13E-revoke.asc --gen-revoke 2ADFB13E

Be sure to protect your revocation certificate carefully - anyone who
gains access to it can use it to revoke your keypair. The GPG
maintainers recommend printing it out and storing the hardcopy in a
safe place.

To revoke your certificate **when the time comes (not now!)**, do the
following:

    $ gpg --import 2ADFB13E-revoke.asc  # ONLY WHEN YOU NEED TO REVOKE
    $ gpg --send-keys 2ADFB13E          # ONLY WHEN YOU NEED TO REVOKE

## How Leiningen uses GPG

Leiningen uses GPG for three things: decrypting credential files,
signing release artifacts, and signing tags. We'll focus on artifact
signing here; for information on credentials encryption/decryption,
see the
[deploy guide](https://codeberg.org/leiningen/leiningen/src/stable/doc/DEPLOY.md). Once
you are configured to sign releases, signing tags should be
straightforward.

On some systems you will be prompted for your GPG passphrase when it
is needed if you haven't entered it. If yours does not, you can
install [Keychain](https://github.com/funtoo/keychain), which provides
this functionality portably. 

### Signing a file

When you deploy a non-SNAPSHOT artifact via the `deploy`
task, Leiningen will attempt to create GPG signatures of the jar and
pom files. It does so by shelling out to `gpg` and using your default
private key to sign each artifact. This will create a signature file
for each artifact named by appending `.asc` to the artifact name.

Both signatures are then uploaded along with the artifacts. If you're
deploying to Clojars, you'll want to provide it with your *public* key
(see below) in order that the signatures can be verified.

To disable signing of releases, set `:sign-releases` to false in the
`:repositories` entry you are targeting. If you do this, everyone who
is depending on your library will not be able to confirm that the copy
they get has not been tampered with, so this is not recommended.

### Overriding the gpg defaults

By default, Leiningen will try to call GPG as `gpg`, which assumes
that `gpg` is in your path, and your GPG binary is actually called
`gpg`. If either of those are false, you can override the command
Leiningen uses for GPG by setting the `LEIN_GPG` environment variable.

GPG by default will select the first private key it finds (which will
be the first key listed by `gpg --list-secret-keys`). If you have
multiple keys and want to sign with one other than first, or want to
use specific keys for a particular release repository, you can specify
which key to use either globally, per-project, or
per-deploy-repository. All three places use the same configuration
syntax, it's all about where you put it. You can specify the key by id
or by the uid.

To set a key globally, add it to your user profile in
`~/.lein/profiles.clj`:

    {:user {...
            :signing {:gpg-key "2ADFB13E"}}} ;; using the key id

To set a key for a particular project, add it to the project
definition:

    (defproject ham-biscuit "0.1.0"
       ...
       :signing {:gpg-key "bob@bobsons.net"} ;; using the key uid
       ...)
    
To set a key for a particular deploy repository, add it to the
repository specification in your project definition:

    (defproject ham-biscuit "0.1.0"
       ...
       :deploy-repositories 
         [["releases" {:url "https://blueant.com/archiva/internal/releases"
                       :signing {:gpg-key "2ADFB13E"}}]
         ["snapshots" "https://blueant.com/archiva/internal/snapshots"]]
       ...)

## Troubleshooting

### Debian based distributions

#### gpg: can't query passphrase in batch mode

	Could not decrypt credentials from /home/xxx/.lein/credentials.clj.gpg
	gpg: can't query passphrase in batch mode
	gpg: decryption failed: secret key not available


This error happens with gpg 1.4.12. Make sure that you have `use-agent` option explicitly enabled in `~/.gnupg/gpg.conf`. See gpg option list.

You can test whether this solution works with

	gpg --quiet --batch --decrypt ~/.lein/credentials.clj.gpg

If the system asked your passphrase then problem solved.

### Mac OS

#### Unable to get GPG installed via Homebrew and OS Keychain to work

Installing GPG from here instead: https://www.gpgtools.org/installer/index.html

#### GPG doesn't ask for a passphrase

Make sure that you have "use-agent" option explicitly enabled in ~/.gnupg/gpg.conf. See gpg option list.

You can test the config with

    gpg --quiet --batch --decrypt ~/.lein/credentials.clj.gpg
    
Leiningen should pick it up automatically when the command above works correctly.

#### gpg: decryption failed: secret key not available

When you run

    gpg --quiet --batch --decrypt ~/.lein/credentials.clj.gpg

you get the error message

    gpg: decryption failed: secret key not available

try running it without `--quiet`

    gpg  --use-agent --decrypt ~/.lein/credentials.clj.gpg

If you get

    gpg: encrypted with RSA key, ID DEAD8F70
    gpg: decryption failed: secret key not available

run `gpg -k` and check that `DEAD8F70` is in the known keys list. If it isn't, `~/.lein/credentials.clj.gpg` may have been encrypted with a different key.

### GPG prompts for passphrase but does not work with Leiningen

    gpg --quiet --batch --decrypt ~/.lein/credentials.clj.gpg

It's hanging for a while after executing lein repl and then prints out these messages:

    $ lein repl
    Could not decrypt credentials from /Users/xxx/.lein/credentials.clj.gpg
    pinentry-curses: no LC_CTYPE known - assuming UTF-8
    pinentry-curses: no LC_CTYPE known - assuming UTF-8
    pinentry-curses: no LC_CTYPE known - assuming UTF-8
    pinentry-curses: no LC_CTYPE known - assuming UTF-8
    pinentry-curses: no LC_CTYPE known - assuming UTF-8
    gpg-agent[1009]: command get_passphrase failed: Invalid IPC response
    gpg: problem with the agent: Invalid IPC response
    gpg: decryption failed: No secret key
    
Leiningen can't present enter-passphrase page of gpg. It's an issue with Leiningen or gpg2 or gpg-agent or pinentry.

Use the GUI version of gpg, GPG Suite. Now when executing 'lein repl', it prompts for passphrase on the GUI instead.


================================================
FILE: doc/MANAGED_DEPS.md
================================================
# Managed Dependencies With Leiningen

Managed dependencies allow you to specify overrides for dependencies that you
may encounter into your dependency tree, in order to ensure consistency.

There are two main reasons you may want to do this. The main one is that your
project's dependency tree might have some dependencies in it that are specified
as ranges. Ranges are antithetical to repeatability. Today you might get one
result from a range, and tomorrow after a new release happens, your result will
change. This is absolutely unacceptable for a tool that strives to provide
consistency, but the dependency resolving library we use unfortunately has this
behavior anyway. Managed dependencies allow us to work around this design flaw
by locking in a specific version in a way that will override whatever ranges
you might encounter.

The other reason managed dependencies are useful is that they allow you to lock
in consistent dependency sets across several projects.

## `:managed-dependencies`

The `:managed-dependencies` section of your `project.clj` file is just like the
regular `:dependencies` section, with two exceptions:

1. It does not actually introduce any dependencies to your project.  It only says,
  "hey leiningen, if you encounter one of these dependencies later, here are the
  versions that you should use instead of whatever is specified."
2. It allows the version number to be omitted from the `:dependencies` section,
  for any artifact that you've listed in your `:managed-dependencies` section.
  Directly declared versions in `:dependencies` will take precedence over
  managed version numbers, but versions that are pulled in transitively will not.

Here's an example:

```clj
(defproject superfun/happyslide "1.0.0-SNAPSHOT"
  :description "A Clojure project with managed dependencies"
  :min-lein-version  "2.7.0"
  :managed-dependencies [[clj-time "0.12.0"]
                         [me.raynes/fs "1.4.6"]
                         [ring/ring-codec "1.0.1"]]
  :dependencies [[clj-time]
                 [me.raynes/fs]])
```

In the example above, the final, resolved project will end up using the specified
 versions of `clj-time` and `me.raynes/fs`.  It will not have an actual dependency
 on `ring/ring-codec` at all, since that is not mentioned in the "real" `:dependencies`
 section.

In the absence of ranges, this feature is not all that useful on its own,
because in the example above, we're specifying the `:managed-dependencies` and
`:dependencies` sections right alongside one another, and you could just as
easily include the version numbers directly in the `:dependencies` section.
The feature becomes more powerful when your build workflow includes some other
way of sharing the `:managed-dependencies` section across multiple projects.

## A note on modifiers (`:exclusions`, `:classifier`, etc.)

The managed dependencies support in leiningen *does* work with modifiers such as
`:exclusions` and `:classifier`.  There are two legal syntaxes; you can explicitly
specify a `nil` for the version string, or you can simply omit the version string:

```clj
(defproject superfun/happyslide "1.0.0-SNAPSHOT"
  :description "A Clojure project with managed dependencies"
  :min-lein-version  "2.7.0"
  :managed-dependencies [[clj-time "0.12.0"]]
  :dependencies [[clj-time :exclusions [foo]]])
```

or

```clj
(defproject superfun/happyslide "1.0.0-SNAPSHOT"
  :description "A Clojure project with managed dependencies"
  :min-lein-version  "2.7.0"
  :managed-dependencies [[clj-time "0.12.0"]]
  :dependencies [[clj-time nil :exclusions [foo]]])
```

Note that `:classifier` is actually a part of the maven coordinates for an
artifact, so for `:classifier` artifacts you will need to specify the `:classifier`
value in both the `:managed-dependencies` and the normal `:dependencies` section:


```clj
(defproject superfun/happyslide "1.0.0-SNAPSHOT"
  :description "A Clojure project with managed dependencies"
  :min-lein-version  "2.7.0"
  :managed-dependencies [[commons-math "1.2" :classifier "sources"]]
  :dependencies [[commons-math :classifier "sources"]])
```

## Lein "parent" projects

One way of leveraging `:managed-dependencies` across multiple projects is to use
the [`lein-parent` plugin](https://github.com/achin/lein-parent).  This plugin
will allow you to define a single "parent" project that is inherited by multiple
"child" projects; e.g.:

```clj
(defproject superfun/myparent "1.0.0"
   :managed-dependencies [[clj-time "0.12.0"]
                            [me.raynes/fs "1.4.6"]
                            [ring/ring-codec "1.0.1"]])

(defproject superfun/kid-a "1.0.0-SNAPSHOT"
   :parent-project [:coords [superfun/myparent "1.0.0"]
                    :inherit [:managed-dependencies]]
   :dependencies [[clj-time]
                  [me.raynes/fs]])

(defproject superfun/kid-b "1.0.0-SNAPSHOT"
 :parent-project [:coords [superfun/myparent "1.0.0"]
                  :inherit [:managed-dependencies]]
 :dependencies [[clj-time]
                [ring/ring-codec]])
```

In this example, we've consolidated the task of managing common version dependencies
in the parent project, and defined two child projects that will inherit those
dependency versions from the parent without needing to specify them explicitly.

This makes it easier to ensure that all of your projects are using the same versions
of your common dependencies, which can help make sure that your uberjar builds are
more predictable and repeatable.

## Other ways to share 'managed-dependencies'

Since the `defproject` form is a macro, it would be possible to write other plugins
that generated the value for a `:managed-dependencies` section dynamically.  That
could provide other useful ways to take advantage of the `:managed-dependencies`
functionality without needing to explicitly populate that section in all of your
`project.clj` files.


================================================
FILE: doc/MIXED_PROJECTS.md
================================================
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
**Table of Contents**

- [Polyglot (Clojure, Java) Projects With Leiningen](#polyglot-clojure-java-projects-with-leiningen)
  - [Source Layout](#source-layout)
  - [Java Source Compilation](#java-source-compilation)
  - [Setting Java Compiler Options With Leiningen](#setting-java-compiler-options-with-leiningen)
  - [Interleaving Compilation Steps](#interleaving-compilation-steps)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

# Polyglot (Clojure, Java) Projects With Leiningen

Clojure is a hosted language that encourages interoperability with its
platform. It is not uncommon to find some amount of Java code in Clojure
projects managed by Leiningen.

This guide explains how you can control source code layout with Leiningen,
compile Java sources and other topics related to polyglot codebases.


## Source Layout

By default, Leiningen assumes your project only has Clojure source code under
`src`. When using both Clojure and Java in the same codebase, however, it is
necessary to tell Leiningen where to find Java sources.

To do so, use `:source-paths` and `:java-source-paths` options in the project
definition:

```clojure
(defproject megacorp/superservice "1.0.0-SNAPSHOT"
  :description "A Clojure project with a little bit of Java sprinkled here and there"
  :min-lein-version  "2.0.0"
  :source-paths      ["src/clojure"]
  :java-source-paths ["src/java"])
```

Having one source root contain another (e.g. `src` and `src/java`) can
cause obscure problems.


## Java Source Compilation

To compile Java sources, you can explicitly run

    lein javac

However, it is usually not necessary because tasks that need to run
project code (`lein test`, `lein run`, etc.) will trigger compilation
automatically. Manually running `lein javac` may be necessary when
using `lein do`, `lein with-profiles` or `lein repl` actively while
also actively changing Java sources in the project.

Running

    lein clean

will remove all compilation artifacts.


## Setting Java Compiler Options With Leiningen

When compiling Java sources, it may be necessary to pass extra arguments to the
compiler. For example, it is very important to target the JVM version you are
going to deploy your project to.

This is done via the `:javac-options` which takes a vector of arguments as you
would pass them to `javac` on the command line. In this case we say that Java
sources use features up to JDK 6 and target JVM is also version 6:

```clojure
(defproject megacorp/superservice "1.0.0-SNAPSHOT"
  :description "A Clojure project with a little bit of Java sprinkled here and there"
  :min-lein-version "2.0.0"
  :source-paths ["src/clojure"]
  :java-source-paths ["src/java"]
  :javac-options     ["-target" "1.6" "-source" "1.6"])
```

Failing to specify the target version will lead JDK compiler to target whatever JDK
Leiningen is running on. It is a good practice to explicitly specify target JVM
version in mixed Clojure/Java projects.

## Interleaving Compilation Steps

In some cases it may be necessary to alternate between compiling
different languages. For instance, systems that generate and
reference Java sources may also provide Clojure code for the generated
sources to use.

Any Clojure code referenced by Java sources must be
[AOT compiled](https://clojure.org/co
Download .txt
gitextract_s64bzl69/

├── .build.yml
├── .circleci/
│   └── config.yml
├── .gitattributes
├── .github/
│   └── README.md
├── .gitignore
├── CONTRIBUTING.md
├── COPYING
├── NEWS.md
├── README.md
├── bash_completion.bash
├── bin/
│   ├── bump
│   ├── issues.clj
│   ├── lein
│   ├── lein-pkg
│   ├── lein.bat
│   ├── lein.cmd
│   ├── lein.ps1
│   └── release
├── doc/
│   ├── BEGINNER_MISTAKES.md
│   ├── DEPLOY.md
│   ├── FAQ.md
│   ├── GPG.md
│   ├── MANAGED_DEPS.md
│   ├── MIXED_PROJECTS.md
│   ├── PLUGINS.md
│   ├── PROFILES.md
│   ├── TEMPLATES.md
│   ├── TUTORIAL.md
│   ├── ja/
│   │   ├── PLUGINS_ja.md
│   │   ├── TUTORIAL_ja.md
│   │   └── lein_ja.1
│   └── lein.1
├── lein-pprint/
│   ├── README.md
│   ├── project.clj
│   ├── src/
│   │   └── leiningen/
│   │       └── pprint.clj
│   └── test/
│       └── leiningen/
│           └── test/
│               └── pprint.clj
├── leiningen-core/
│   ├── README.md
│   ├── dev-resources/
│   │   ├── checkouts/
│   │   │   ├── lib1/
│   │   │   │   └── project.clj
│   │   │   └── lib2/
│   │   │       └── project.clj
│   │   ├── p1.clj
│   │   ├── p2.clj
│   │   ├── p3.clj
│   │   ├── p4.clj
│   │   ├── p5.clj
│   │   ├── profile-metadata.clj
│   │   └── replace-repositories.clj
│   ├── project.clj
│   ├── src/
│   │   └── leiningen/
│   │       └── core/
│   │           ├── classpath.clj
│   │           ├── eval.clj
│   │           ├── main.clj
│   │           ├── pedantic.clj
│   │           ├── project.clj
│   │           ├── ssl.clj
│   │           ├── user.clj
│   │           └── utils.clj
│   └── test/
│       ├── leiningen/
│       │   ├── bluuugh.clj
│       │   ├── core/
│       │   │   └── test/
│       │   │       ├── classpath.clj
│       │   │       ├── eval.clj
│       │   │       ├── helper.clj
│       │   │       ├── main.clj
│       │   │       ├── mirrors.clj
│       │   │       ├── pedantic.clj
│       │   │       ├── project.clj
│       │   │       ├── user.clj
│       │   │       └── utils.clj
│       │   ├── fixed_and_var_args.clj
│       │   ├── one_or_two.clj
│       │   ├── sirius.clj
│       │   ├── var_args.clj
│       │   └── zero.clj
│       └── resources/
│           └── profiles-empty.clj
├── pcmpl-lein.el
├── project.clj
├── resources/
│   ├── leiningen/
│   │   ├── bootclasspath-deps.clj
│   │   └── new/
│   │       ├── app/
│   │       │   ├── CHANGELOG.md
│   │       │   ├── LICENSE
│   │       │   ├── README.md
│   │       │   ├── core.clj
│   │       │   ├── gitignore
│   │       │   ├── hgignore
│   │       │   ├── intro.md
│   │       │   ├── project.clj
│   │       │   └── test.clj
│   │       ├── default/
│   │       │   ├── CHANGELOG.md
│   │       │   ├── LICENSE
│   │       │   ├── README.md
│   │       │   ├── core.clj
│   │       │   ├── gitignore
│   │       │   ├── hgignore
│   │       │   ├── intro.md
│   │       │   ├── project.clj
│   │       │   └── test.clj
│   │       ├── plugin/
│   │       │   ├── CHANGELOG.md
│   │       │   ├── LICENSE
│   │       │   ├── README.md
│   │       │   ├── gitignore
│   │       │   ├── hgignore
│   │       │   ├── name.clj
│   │       │   └── project.clj
│   │       └── template/
│   │           ├── CHANGELOG.md
│   │           ├── LICENSE
│   │           ├── README.md
│   │           ├── foo.clj
│   │           ├── gitignore
│   │           ├── hgignore
│   │           ├── project.clj
│   │           └── temp.clj
│   └── repl-welcome
├── sample.project.clj
├── src/
│   └── leiningen/
│       ├── change.clj
│       ├── check.clj
│       ├── classpath.clj
│       ├── clean.clj
│       ├── compile.clj
│       ├── deploy.clj
│       ├── deps.clj
│       ├── do.clj
│       ├── help.clj
│       ├── install.clj
│       ├── jar.clj
│       ├── javac.clj
│       ├── new/
│       │   ├── app.clj
│       │   ├── default.clj
│       │   ├── plugin.clj
│       │   ├── template.clj
│       │   └── templates.clj
│       ├── new.clj
│       ├── plugin.clj
│       ├── pom.clj
│       ├── release.clj
│       ├── repl.clj
│       ├── retest.clj
│       ├── run.clj
│       ├── search.clj
│       ├── show_profiles.clj
│       ├── static_classpath.clj
│       ├── test.clj
│       ├── trampoline.clj
│       ├── uberjar.clj
│       ├── update_in.clj
│       ├── upgrade.clj
│       ├── vcs.clj
│       ├── version.clj
│       └── with_profile.clj
├── test/
│   ├── .gnupg/
│   │   ├── gpg.conf
│   │   ├── pubring.kbx
│   │   └── trustdb.gpg
│   ├── leiningen/
│   │   ├── echo.clj
│   │   ├── project.clj
│   │   └── test/
│   │       ├── change.clj
│   │       ├── check.clj
│   │       ├── clean.clj
│   │       ├── compile.clj
│   │       ├── deploy.clj
│   │       ├── deps.clj
│   │       ├── do.clj
│   │       ├── help.clj
│   │       ├── helper.clj
│   │       ├── install.clj
│   │       ├── jar.clj
│   │       ├── javac.clj
│   │       ├── jvm_opts.clj
│   │       ├── new/
│   │       │   └── templates.clj
│   │       ├── new.clj
│   │       ├── pom.clj
│   │       ├── release.clj
│   │       ├── repl.clj
│   │       ├── run.clj
│   │       ├── search.clj
│   │       ├── static_classpath.clj
│   │       ├── test.clj
│   │       ├── uberjar.clj
│   │       ├── update_in.clj
│   │       ├── vcs.clj
│   │       └── with_profile.clj
│   ├── sample-connect-string
│   └── sample-connect-string-http
├── test_projects/
│   ├── .ssh/
│   │   ├── allowed_signers
│   │   ├── id_rsa
│   │   ├── id_rsa.pub
│   │   └── verify
│   ├── README.txt
│   ├── bad-require/
│   │   ├── .gitignore
│   │   ├── project.clj
│   │   └── src/
│   │       └── bad_require/
│   │           └── core.clj
│   ├── data-readers-backwards-compatibility/
│   │   └── project.clj
│   ├── file-not-found-thrower/
│   │   ├── .gitignore
│   │   ├── project.clj
│   │   └── src/
│   │       └── file_not_found_thrower/
│   │           └── core.clj
│   ├── java-main/
│   │   ├── .gitignore
│   │   ├── project.clj
│   │   └── src/
│   │       └── java/
│   │           └── my/
│   │               └── java/
│   │                   └── Main.java
│   ├── jvm-opts/
│   │   └── project.clj
│   ├── leaky-composite/
│   │   └── project.clj
│   ├── lein-test-exit-code/
│   │   ├── project.clj
│   │   └── test/
│   │       └── lein_test_exit_code/
│   │           └── core_test.clj
│   ├── lein-test-reload-bug/
│   │   ├── project.clj
│   │   └── test/
│   │       └── lein_test_reload_bug/
│   │           ├── a_deftype.clj
│   │           ├── b_protocol.clj
│   │           └── core_test.clj
│   ├── managed-deps/
│   │   └── project.clj
│   ├── managed-deps-snapshot/
│   │   └── project.clj
│   ├── more-gen-classes/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── doc/
│   │   │   └── intro.md
│   │   ├── project.clj
│   │   └── src/
│   │       └── more_gen_classes/
│   │           ├── bar.clj
│   │           ├── baz.clj
│   │           └── foo.clj
│   ├── native/
│   │   ├── .gitignore
│   │   └── project.clj
│   ├── overlapped-sourcepaths/
│   │   ├── project.clj
│   │   └── src/
│   │       └── foo
│   ├── preserve-eval-meta/
│   │   ├── .gitignore
│   │   ├── project.clj
│   │   └── src/
│   │       └── preserve_eval_meta/
│   │           └── core.clj
│   ├── provided/
│   │   ├── project.clj
│   │   └── src/
│   │       └── provided/
│   │           └── core/
│   │               └── Example.java
│   ├── reflector/
│   │   ├── .gitignore
│   │   ├── project.clj
│   │   └── src/
│   │       └── reflector/
│   │           ├── classy.clj
│   │           └── main.clj
│   ├── sample/
│   │   ├── .nrepl-port
│   │   ├── checkouts/
│   │   │   └── sample2/
│   │   │       ├── .gitignore
│   │   │       ├── README
│   │   │       ├── project.clj
│   │   │       ├── src/
│   │   │       │   └── sample2/
│   │   │       │       ├── alt.clj
│   │   │       │       └── core.clj
│   │   │       └── test/
│   │   │           └── sample2/
│   │   │               └── core_test.clj
│   │   ├── project.clj
│   │   ├── src/
│   │   │   └── nom/
│   │   │       └── nom/
│   │   │           ├── check.clj
│   │   │           └── nom.clj
│   │   └── test/
│   │       └── test_nom_nom_nom.clj
│   ├── sample-bad-user/
│   │   ├── project.clj
│   │   ├── src/
│   │   │   └── nom/
│   │   │       └── nom/
│   │   │           ├── check.clj
│   │   │           └── nom.clj
│   │   └── test/
│   │       └── user.clj
│   ├── sample-deploy/
│   │   ├── deploy-me-0.1.0-SNAPSHOT-fat.jarr
│   │   └── project.clj
│   ├── sample-failing/
│   │   ├── project.clj
│   │   ├── src/
│   │   │   └── nom/
│   │   │       └── nom/
│   │   │           └── nom.clj
│   │   └── test/
│   │       └── sample/
│   │           └── unreadable.clj
│   ├── sample-fixture-error/
│   │   ├── project.clj
│   │   └── test/
│   │       ├── test_a.clj
│   │       ├── test_b.clj
│   │       └── test_c.clj
│   ├── sample-no-aot/
│   │   ├── dev-resources/
│   │   │   └── dev.clj
│   │   ├── project.clj
│   │   ├── src/
│   │   │   └── nom/
│   │   │       └── nom/
│   │   │           └── nom.clj
│   │   └── test/
│   │       ├── namespace.clj
│   │       └── selectors.clj
│   ├── sample-ordered-aot/
│   │   ├── project.clj
│   │   └── src/
│   │       └── sample_ordered_aot/
│   │           ├── baz.clj
│   │           └── foo.clj
│   ├── sample-profile-meta/
│   │   └── project.clj
│   ├── sample-reader-cond/
│   │   ├── project.clj
│   │   ├── src/
│   │   │   └── nom/
│   │   │       └── nom/
│   │   │           ├── clj.clj
│   │   │           └── cljc.cljc
│   │   └── test/
│   │       ├── clj_test.clj
│   │       ├── cljc_test.cljc
│   │       └── selectors.clj
│   ├── tricky-name/
│   │   ├── .gitignore
│   │   ├── project.clj
│   │   └── src/
│   │       └── org/
│   │           └── domain/
│   │               └── tricky_name/
│   │                   ├── brunch.clj
│   │                   ├── core.clj
│   │                   └── munch.clj
│   ├── uberjar-components-merging/
│   │   ├── components1.xml
│   │   ├── components2.xml
│   │   └── expected-components.xml
│   ├── uberjar-merging/
│   │   ├── project.clj
│   │   └── resources/
│   │       └── data_readers.clj
│   ├── with-aliases/
│   │   └── project.clj
│   ├── with-aliases2/
│   │   └── project.clj
│   ├── with-classifiers/
│   │   └── project.clj
│   ├── with-pom-plugins/
│   │   └── project.clj
│   └── with-resources/
│       ├── project.clj
│       └── resources/
│           └── nested/
│               └── dir/
│                   └── sample.txt
├── web/
│   ├── .htaccess
│   ├── 404.html
│   ├── Makefile
│   ├── _foot.html
│   ├── grench.html
│   ├── img/
│   │   └── favicon/
│   │       ├── browserconfig.xml
│   │       └── manifest.json
│   ├── index.html
│   ├── robots.txt
│   ├── stylesheets/
│   │   ├── base.css
│   │   ├── grench.css
│   │   ├── htmlize.css
│   │   ├── layout.css
│   │   ├── lein.css
│   │   └── skeleton.css
│   ├── template.html
│   └── wiki/
│       ├── .gitignore
│       ├── .htaccess
│       └── Makefile
└── zsh_completion.zsh
Download .txt
SYMBOL INDEX (4 symbols across 2 files)

FILE: test_projects/java-main/src/java/my/java/Main.java
  class Main (line 3) | public class Main {
    method main (line 4) | public static void main(String[] args) {

FILE: test_projects/provided/src/provided/core/Example.java
  class Example (line 5) | public class Example {
    method main (line 7) | public static void
Condensed preview — 297 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,142K chars).
[
  {
    "path": ".build.yml",
    "chars": 267,
    "preview": "# -*- js -*-\n{\n    \"image\": \"debian/stable\",\n    \"packages\": [\"gnupg\", \"leiningen\", \"openssh-client\"],\n    \"sources\": [\""
  },
  {
    "path": ".circleci/config.yml",
    "chars": 1692,
    "preview": "# -*- js -*-\n{\n  \"version\": 2.1,\n  \"executors\": {\n    \"clojure\": {\n      \"docker\": [{\"image\": \"clojure:<< parameters.jav"
  },
  {
    "path": ".gitattributes",
    "chars": 92,
    "preview": "#disable autocrlf for all .bat files since they already have CRLF in raw format\n*.bat -crlf\n"
  },
  {
    "path": ".github/README.md",
    "chars": 1764,
    "preview": "# Hello Github User!\n\nThe Leiningen project is in the process of [moving off\nGithub](https://sfconservancy.org/GiveUpGit"
  },
  {
    "path": ".gitignore",
    "chars": 604,
    "preview": "**/target\n*.bak\n*.swp\n*.class\n*asc\n*jar\n*~\n.lein*\n/.classpath\n/.nrepl-port\n/.prepl-port\n/.project\n/.settings\n/hs_err_pid"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 5468,
    "preview": "# Contributing\n\nLeiningen is the most widely-contributed-to Clojure project a the time\nof this writing. We welcome poten"
  },
  {
    "path": "COPYING",
    "chars": 31980,
    "preview": "Source code distributed under the Eclipse Public License - v 1.0:\n\nTHE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS "
  },
  {
    "path": "NEWS.md",
    "chars": 47024,
    "preview": "# Leiningen News -- history of user-visible changes\n\n## 2.12.0 / 2025-09-12\n\nThis will be the last release of Leiningen "
  },
  {
    "path": "README.md",
    "chars": 5987,
    "preview": "# Leiningen\n\n[![builds.sr.ht status](https://builds.sr.ht/~technomancy/leiningen.svg)](https://builds.sr.ht/~technomancy"
  },
  {
    "path": "bash_completion.bash",
    "chars": 1575,
    "preview": "_lein_completion() {\n    local cur prev tasks\n    COMPREPLY=()\n    cur=\"${COMP_WORDS[COMP_CWORD]}\"\n    prev=\"${COMP_WORD"
  },
  {
    "path": "bin/bump",
    "chars": 341,
    "preview": "#!/bin/bash\n\nCURRENT_VERSION=$1\nSNAPSHOT_VERSION=$2\n\nif [ \"$CURRENT_VERSION\" = \"\" ] || [ \"$SNAPSHOT_VERSION\" = \"\" ] ; th"
  },
  {
    "path": "bin/issues.clj",
    "chars": 1190,
    "preview": ";; This is just a one-off tool to classify/summarize issues programmatically.\n\n(try (require 'tentacles.issues)\n     (ca"
  },
  {
    "path": "bin/lein",
    "chars": 14093,
    "preview": "#!/usr/bin/env bash\n\n# Ensure this file is executable via `chmod a+x lein`, then place it\n# somewhere on your $PATH, lik"
  },
  {
    "path": "bin/lein-pkg",
    "chars": 7429,
    "preview": "#!/usr/bin/env bash\n\n# This variant of the lein script is meant for downstream packagers.\n# It has all the cross-platfor"
  },
  {
    "path": "bin/lein.bat",
    "chars": 14462,
    "preview": "@echo off\r\n\r\nsetLocal EnableExtensions EnableDelayedExpansion\r\n\r\nset LEIN_VERSION=2.12.0\r\n\r\nif \"%LEIN_VERSION:~-9%\" == \""
  },
  {
    "path": "bin/lein.cmd",
    "chars": 112,
    "preview": "@echo off\r\nsetlocal\r\nset ps1=%~dpn0.ps1\r\nshift\r\npowershell -NoProfile -ExecutionPolicy Bypass -File \"%ps1%\" %*\r\n"
  },
  {
    "path": "bin/lein.ps1",
    "chars": 6808,
    "preview": "<#\r\n.Synopsis\r\n    Leiningen bootstrap.\r\n\r\n.Parameter Command\r\n    The command to pass to leiningen.\r\n\r\n.Notes\r\n    Thi"
  },
  {
    "path": "bin/release",
    "chars": 3011,
    "preview": "#!/bin/bash\n\nif [ \"$1\" = \"\" ]; then\n    echo \"usage: $0 VERSION\"\n    exit 1\nfi\n\nRELEASE_VERSION=$1\nCURRENT_VERSION=\"$REL"
  },
  {
    "path": "doc/BEGINNER_MISTAKES.md",
    "chars": 1080,
    "preview": "<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD "
  },
  {
    "path": "doc/DEPLOY.md",
    "chars": 17787,
    "preview": "<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD "
  },
  {
    "path": "doc/FAQ.md",
    "chars": 12281,
    "preview": "<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD "
  },
  {
    "path": "doc/GPG.md",
    "chars": 12730,
    "preview": "<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD "
  },
  {
    "path": "doc/MANAGED_DEPS.md",
    "chars": 5885,
    "preview": "# Managed Dependencies With Leiningen\n\nManaged dependencies allow you to specify overrides for dependencies that you\nmay"
  },
  {
    "path": "doc/MIXED_PROJECTS.md",
    "chars": 6776,
    "preview": "<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD "
  },
  {
    "path": "doc/PLUGINS.md",
    "chars": 24631,
    "preview": "<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD "
  },
  {
    "path": "doc/PROFILES.md",
    "chars": 11692,
    "preview": "<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD "
  },
  {
    "path": "doc/TEMPLATES.md",
    "chars": 6599,
    "preview": "<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD "
  },
  {
    "path": "doc/TUTORIAL.md",
    "chars": 31641,
    "preview": "<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD "
  },
  {
    "path": "doc/ja/PLUGINS_ja.md",
    "chars": 16799,
    "preview": "<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD "
  },
  {
    "path": "doc/ja/TUTORIAL_ja.md",
    "chars": 23241,
    "preview": "<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD "
  },
  {
    "path": "doc/ja/lein_ja.1",
    "chars": 3060,
    "preview": ".\\\"to render: groff -Dutf8 -Tutf8 -man doc/ja/lein_ja.1 > lein_ja.man\"\n.TH LEININGEN 1 \"2017 August 10\"\n.SH 名前\nlein \\- C"
  },
  {
    "path": "doc/lein.1",
    "chars": 3788,
    "preview": ".\\\"to render: groff -Tascii -man doc/lein.1 > lein.man\"\n.TH LEININGEN 1 \"2017 August 10\"\n.SH NAME\nlein \\- Automate Cloju"
  },
  {
    "path": "lein-pprint/README.md",
    "chars": 1388,
    "preview": "# lein-pprint\n\nPretty-print a representation of the project map.\n\nThis is a sample of how a simple plugin would work.\n\n#"
  },
  {
    "path": "lein-pprint/project.clj",
    "chars": 291,
    "preview": "(defproject lein-pprint \"1.3.3-SNAPSHOT\"\n  :description \"Pretty-print a representation of the project map.\"\n  :url \"http"
  },
  {
    "path": "lein-pprint/src/leiningen/pprint.clj",
    "chars": 965,
    "preview": "(ns leiningen.pprint\n  (:require [clojure.pprint :as pprint]))\n\n(defn- parse-flags [args]\n  (let [[flag separator & rest"
  },
  {
    "path": "lein-pprint/test/leiningen/test/pprint.clj",
    "chars": 910,
    "preview": "(ns leiningen.test.pprint\n  (:require [clojure.test :refer :all]\n            [leiningen.pprint :refer :all]))\n\n(def proj"
  },
  {
    "path": "leiningen-core/README.md",
    "chars": 3427,
    "preview": "# Leiningen Core\n\nThis library provides the core functionality of Leiningen. This\nconsists of the task execution impleme"
  },
  {
    "path": "leiningen-core/dev-resources/checkouts/lib1/project.clj",
    "chars": 73,
    "preview": "(defproject checkout-lib1 \"0.0.1\"\n  :description \"Test some checkouts.\")\n"
  },
  {
    "path": "leiningen-core/dev-resources/checkouts/lib2/project.clj",
    "chars": 73,
    "preview": "(defproject checkout-lib2 \"0.0.1\"\n  :description \"Test some checkouts.\")\n"
  },
  {
    "path": "leiningen-core/dev-resources/p1.clj",
    "chars": 607,
    "preview": "(defproject leiningen \"2.0.0-SNAPSHOT\"\n  :description \"Automate Clojure projects without setting your hair on fire.\"\n  :"
  },
  {
    "path": "leiningen-core/dev-resources/p2.clj",
    "chars": 122,
    "preview": "(defproject middler \"0.0.1\"\n  :description \"Test some middleware.\"\n  :middleware [leiningen.core.test.project/add-seven]"
  },
  {
    "path": "leiningen-core/dev-resources/p3.clj",
    "chars": 169,
    "preview": "(defproject middlest \"0.0.1\"\n  :description \"Test explicit middleware inside a plugin.\"\n  :plugins [[lein-maven \"0.1.0\"]"
  },
  {
    "path": "leiningen-core/dev-resources/p4.clj",
    "chars": 154,
    "preview": "(defproject middler-no-implicits \"0.0.1\"\n  :description \"Test some middleware.\"\n  :middleware [leiningen.core.test.proje"
  },
  {
    "path": "leiningen-core/dev-resources/p5.clj",
    "chars": 174,
    "preview": "(defproject middler-no-implicit-middleware \"0.0.1\"\n  :description \"Test some middleware.\"\n  :middleware [leiningen.core."
  },
  {
    "path": "leiningen-core/dev-resources/profile-metadata.clj",
    "chars": 695,
    "preview": "(defproject metadata-check \"0.1.0\"\n  :description \"Check that profile metadata is retained.\"\n  :license {:name \"Eclipse "
  },
  {
    "path": "leiningen-core/dev-resources/replace-repositories.clj",
    "chars": 287,
    "preview": "(defproject metadata-check \"0.1.0\"\n  :description \"Check that repositories can be replaced.\"\n  :license {:name \"Eclipse "
  },
  {
    "path": "leiningen-core/project.clj",
    "chars": 1663,
    "preview": "(defproject leiningen-core \"2.12.0\"\n  :url \"https://codeberg.org/leiningen/leiningen\"\n  :license {:name \"Eclipse Public "
  },
  {
    "path": "leiningen-core/src/leiningen/core/classpath.clj",
    "chars": 28231,
    "preview": "(ns leiningen.core.classpath\n  \"Calculate project classpaths by resolving dependencies via Aether.\"\n  (:require [cemeric"
  },
  {
    "path": "leiningen-core/src/leiningen/core/eval.clj",
    "chars": 16526,
    "preview": "(ns leiningen.core.eval\n  \"Evaluate code inside the context of a project.\"\n  (:require [classlojure.core :as cl]\n       "
  },
  {
    "path": "leiningen-core/src/leiningen/core/main.clj",
    "chars": 18300,
    "preview": "(ns leiningen.core.main\n  (:require [leiningen.core.user :as user]\n            [leiningen.core.project :as project]\n    "
  },
  {
    "path": "leiningen-core/src/leiningen/core/pedantic.clj",
    "chars": 12303,
    "preview": "(ns leiningen.core.pedantic\n  \"This namespace exists to hook into Aether's dependency\n  resolution and provide feedback "
  },
  {
    "path": "leiningen-core/src/leiningen/core/project.clj",
    "chars": 46501,
    "preview": "(ns leiningen.core.project\n  \"Read project.clj files.\"\n  (:refer-clojure :exclude [read])\n  (:require [clojure.walk :as "
  },
  {
    "path": "leiningen-core/src/leiningen/core/ssl.clj",
    "chars": 4874,
    "preview": "(ns leiningen.core.ssl\n  (:require [cemerick.pomegranate.aether :as aether]\n            [clojure.java.io :as io]\n       "
  },
  {
    "path": "leiningen-core/src/leiningen/core/user.clj",
    "chars": 8214,
    "preview": "(ns leiningen.core.user\n  \"Functions exposing user-level configuration.\"\n  (:require [clojure.java.io :as io]\n          "
  },
  {
    "path": "leiningen-core/src/leiningen/core/utils.clj",
    "chars": 10303,
    "preview": "(ns leiningen.core.utils\n  (:require [clojure.java.io :as io]\n            [clojure.java.shell :as sh]\n            [cloju"
  },
  {
    "path": "leiningen-core/test/leiningen/bluuugh.clj",
    "chars": 142,
    "preview": "(ns leiningen.bluuugh\n  \"Dummy task for tests.\")\n\n(defn ^:no-project-needed bluuugh\n  [project]\n  (println \"This is a du"
  },
  {
    "path": "leiningen-core/test/leiningen/core/test/classpath.clj",
    "chars": 10056,
    "preview": "(ns leiningen.core.test.classpath\n  (:use [clojure.test]\n        [leiningen.core.classpath])\n  (:require [clojure.java.i"
  },
  {
    "path": "leiningen-core/test/leiningen/core/test/eval.clj",
    "chars": 5093,
    "preview": "(ns leiningen.core.test.eval\n  (:require [clojure.test :refer :all]\n            [leiningen.core.eval :refer :all]\n      "
  },
  {
    "path": "leiningen-core/test/leiningen/core/test/helper.clj",
    "chars": 343,
    "preview": "(ns leiningen.core.test.helper)\n\n(defn abort-msg\n  \"Catches main/abort thrown by calling f on its args and returns its e"
  },
  {
    "path": "leiningen-core/test/leiningen/core/test/main.clj",
    "chars": 7167,
    "preview": "(ns leiningen.core.test.main\n  (:use [clojure.test]\n        [leiningen.core.main]))\n\n;; Shamelessly stolen from\n;; https"
  },
  {
    "path": "leiningen-core/test/leiningen/core/test/mirrors.clj",
    "chars": 1020,
    "preview": "(ns leiningen.core.test.mirrors\n  (:require [clojure.test :refer :all]\n            [cemerick.pomegranate :as pom]\n      "
  },
  {
    "path": "leiningen-core/test/leiningen/core/test/pedantic.clj",
    "chars": 8230,
    "preview": "(ns leiningen.core.test.pedantic\n  (:require [clojure.test :refer :all]\n            [clojure.java.io :as io]\n           "
  },
  {
    "path": "leiningen-core/test/leiningen/core/test/project.clj",
    "chars": 29747,
    "preview": "(ns leiningen.core.test.project\n  (:refer-clojure :exclude [read])\n  (:require [clojure.test :refer :all]\n            [l"
  },
  {
    "path": "leiningen-core/test/leiningen/core/test/user.clj",
    "chars": 2255,
    "preview": "(ns leiningen.core.test.user\n  (:use clojure.test\n        leiningen.core.user))\n\n(deftest resolving-repo-creds\n  (with-r"
  },
  {
    "path": "leiningen-core/test/leiningen/core/test/utils.clj",
    "chars": 1243,
    "preview": "(ns leiningen.core.test.utils\n  (:require [leiningen.core.utils :as utils]\n            [clojure.test :refer [deftest tes"
  },
  {
    "path": "leiningen-core/test/leiningen/fixed_and_var_args.clj",
    "chars": 147,
    "preview": "(ns leiningen.fixed-and-var-args \"Dummy task for tests.\")\n\n(defn fixed-and-var-args [project one two & rest]\n  (println "
  },
  {
    "path": "leiningen-core/test/leiningen/one_or_two.clj",
    "chars": 133,
    "preview": "(ns leiningen.one-or-two \"Dummy task for tests\")\n\n(defn one-or-two\n  \"Dummy task for tests\"\n  ([project one])\n  ([projec"
  },
  {
    "path": "leiningen-core/test/leiningen/sirius.clj",
    "chars": 79,
    "preview": "(ns leiningen.sirius)\n\n(defn ^:pass-through-help sirius [project & args] args)\n"
  },
  {
    "path": "leiningen-core/test/leiningen/var_args.clj",
    "chars": 120,
    "preview": "(ns leiningen.var-args \"Dummy task for tests.\")\n\n(defn var-args [project & args]\n  (println \"a dummy task for tests.\"))\n"
  },
  {
    "path": "leiningen-core/test/leiningen/zero.clj",
    "chars": 104,
    "preview": "(ns leiningen.zero \"Dummy task for tests.\")\n\n(defn zero [project]\n  (println \"a dummy task for tests\"))\n"
  },
  {
    "path": "leiningen-core/test/resources/profiles-empty.clj",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "pcmpl-lein.el",
    "chars": 3397,
    "preview": ";;; pcmpl-lein.el --- pcomplete for Leiningen tasks; works with eshell\n\n;; Copyright (C) 2011 Phil Hagelberg\n;;\n;; Autho"
  },
  {
    "path": "project.clj",
    "chars": 2398,
    "preview": ";; This is Leiningen's own project configuration. See doc/TUTORIAL.md\n;; file as well as sample.project.clj for help wri"
  },
  {
    "path": "resources/leiningen/bootclasspath-deps.clj",
    "chars": 3563,
    "preview": ";; This file is used to warn users when they attempt to load a plugin that\n;; pulls in a dependency which conflicts with"
  },
  {
    "path": "resources/leiningen/new/app/CHANGELOG.md",
    "chars": 777,
    "preview": "# Change Log\nAll notable changes to this project will be documented in this file. This change log follows the convention"
  },
  {
    "path": "resources/leiningen/new/app/LICENSE",
    "chars": 14371,
    "preview": "Eclipse Public License - v 2.0\n\n    THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE\n    PUBLIC LICE"
  },
  {
    "path": "resources/leiningen/new/app/README.md",
    "chars": 984,
    "preview": "# {{name}}\n\nFIXME: description\n\n## Installation\n\nDownload from https://example.com/FIXME.\n\n## Usage\n\nFIXME: explanation\n"
  },
  {
    "path": "resources/leiningen/new/app/core.clj",
    "chars": 123,
    "preview": "(ns {{namespace}}\n  (:gen-class))\n\n(defn -main\n  \"I don't do a whole lot ... yet.\"\n  [& args]\n  (println \"Hello, World!\""
  },
  {
    "path": "resources/leiningen/new/app/gitignore",
    "chars": 125,
    "preview": "/target\n/classes\n/checkouts\nprofiles.clj\npom.xml\npom.xml.asc\n*.jar\n*.class\n/.lein-*\n/.nrepl-port\n/.prepl-port\n.hgignore\n"
  },
  {
    "path": "resources/leiningen/new/app/hgignore",
    "chars": 162,
    "preview": "syntax: glob\npom.xml\npom.xml.asc\n*.jar\n*.class\n.gitignore\n.git/**\n\nsyntax: regexp\n^.nrepl-port\n^.prepl-port\n^.lein-.*\n^t"
  },
  {
    "path": "resources/leiningen/new/app/intro.md",
    "chars": 107,
    "preview": "# Introduction to {{name}}\n\nTODO: write [great documentation](https://jacobian.org/writing/what-to-write/)\n"
  },
  {
    "path": "resources/leiningen/new/app/project.clj",
    "chars": 476,
    "preview": "(defproject {{raw-name}} \"0.1.0-SNAPSHOT\"\n  :description \"FIXME: write description\"\n  :url \"https://example.com/FIXME\"\n "
  },
  {
    "path": "resources/leiningen/new/app/test.clj",
    "chars": 168,
    "preview": "(ns {{namespace}}-test\n  (:require [clojure.test :refer :all]\n            [{{namespace}} :refer :all]))\n\n(deftest a-test"
  },
  {
    "path": "resources/leiningen/new/default/CHANGELOG.md",
    "chars": 777,
    "preview": "# Change Log\nAll notable changes to this project will be documented in this file. This change log follows the convention"
  },
  {
    "path": "resources/leiningen/new/default/LICENSE",
    "chars": 14371,
    "preview": "Eclipse Public License - v 2.0\n\n    THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE\n    PUBLIC LICE"
  },
  {
    "path": "resources/leiningen/new/default/README.md",
    "chars": 750,
    "preview": "# {{name}}\n\nA Clojure library designed to ... well, that part is up to you.\n\n## Usage\n\nFIXME\n\n## License\n\nCopyright © {{"
  },
  {
    "path": "resources/leiningen/new/default/core.clj",
    "chars": 95,
    "preview": "(ns {{namespace}})\n\n(defn foo\n  \"I don't do a whole lot.\"\n  [x]\n  (println x \"Hello, World!\"))\n"
  },
  {
    "path": "resources/leiningen/new/default/gitignore",
    "chars": 125,
    "preview": "/target\n/classes\n/checkouts\nprofiles.clj\npom.xml\npom.xml.asc\n*.jar\n*.class\n/.lein-*\n/.nrepl-port\n/.prepl-port\n.hgignore\n"
  },
  {
    "path": "resources/leiningen/new/default/hgignore",
    "chars": 148,
    "preview": "syntax: glob\ntarget/**\nclasses/**\ncheckouts/**\nprofiles.clj\npom.xml\npom.xml.asc\n*.jar\n*.class\n/.lein-*\n/.nrepl-port\n/.pr"
  },
  {
    "path": "resources/leiningen/new/default/intro.md",
    "chars": 107,
    "preview": "# Introduction to {{name}}\n\nTODO: write [great documentation](https://jacobian.org/writing/what-to-write/)\n"
  },
  {
    "path": "resources/leiningen/new/default/project.clj",
    "chars": 346,
    "preview": "(defproject {{raw-name}} \"0.1.0-SNAPSHOT\"\n  :description \"FIXME: write description\"\n  :url \"https://example.com/FIXME\"\n "
  },
  {
    "path": "resources/leiningen/new/default/test.clj",
    "chars": 168,
    "preview": "(ns {{namespace}}-test\n  (:require [clojure.test :refer :all]\n            [{{namespace}} :refer :all]))\n\n(deftest a-test"
  },
  {
    "path": "resources/leiningen/new/plugin/CHANGELOG.md",
    "chars": 777,
    "preview": "# Change Log\nAll notable changes to this project will be documented in this file. This change log follows the convention"
  },
  {
    "path": "resources/leiningen/new/plugin/LICENSE",
    "chars": 14371,
    "preview": "Eclipse Public License - v 2.0\n\n    THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE\n    PUBLIC LICE"
  },
  {
    "path": "resources/leiningen/new/plugin/README.md",
    "chars": 1074,
    "preview": "# {{name}}\n\nA Leiningen plugin to do many wonderful things.\n\n## Usage\n\nFIXME: Use this for user-level plugins:\n\nPut `[{{"
  },
  {
    "path": "resources/leiningen/new/plugin/gitignore",
    "chars": 125,
    "preview": "/target\n/classes\n/checkouts\nprofiles.clj\npom.xml\npom.xml.asc\n*.jar\n*.class\n/.lein-*\n/.nrepl-port\n/.prepl-port\n.hgignore\n"
  },
  {
    "path": "resources/leiningen/new/plugin/hgignore",
    "chars": 148,
    "preview": "syntax: glob\ntarget/**\nclasses/**\ncheckouts/**\nprofiles.clj\npom.xml\npom.xml.asc\n*.jar\n*.class\n/.lein-*\n/.nrepl-port\n/.pr"
  },
  {
    "path": "resources/leiningen/new/plugin/name.clj",
    "chars": 122,
    "preview": "(ns leiningen.{{unprefixed-name}})\n\n(defn {{unprefixed-name}}\n  \"I don't do a lot.\"\n  [project & args]\n  (println \"Hi!\")"
  },
  {
    "path": "resources/leiningen/new/plugin/project.clj",
    "chars": 278,
    "preview": "(defproject {{name}} \"0.1.0-SNAPSHOT\"\n  :description \"FIXME: write description\"\n  :url \"https://example.com/FIXME\"\n  :li"
  },
  {
    "path": "resources/leiningen/new/template/CHANGELOG.md",
    "chars": 779,
    "preview": "# Change Log\nAll notable changes to this project will be documented in this file. This change log follows the convention"
  },
  {
    "path": "resources/leiningen/new/template/LICENSE",
    "chars": 14371,
    "preview": "Eclipse Public License - v 2.0\n\n    THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE\n    PUBLIC LICE"
  },
  {
    "path": "resources/leiningen/new/template/README.md",
    "chars": 718,
    "preview": "# {{name}}\n\nA Leiningen template for FIXME.\n\n## Usage\n\nFIXME\n\n## License\n\nCopyright © {{year}} FIXME\n\nThis program and t"
  },
  {
    "path": "resources/leiningen/new/template/foo.clj",
    "chars": 20,
    "preview": "(def {{name}} :foo)\n"
  },
  {
    "path": "resources/leiningen/new/template/gitignore",
    "chars": 112,
    "preview": "/target\n/classes\n/checkouts\npom.xml\npom.xml.asc\n*.jar\n*.class\n/.lein-*\n/.nrepl-port\n/.prepl-port\n.hgignore\n.hg/\n"
  },
  {
    "path": "resources/leiningen/new/template/hgignore",
    "chars": 148,
    "preview": "syntax: glob\ntarget/**\nclasses/**\ncheckouts/**\nprofiles.clj\npom.xml\npom.xml.asc\n*.jar\n*.class\n/.lein-*\n/.nrepl-port\n/.pr"
  },
  {
    "path": "resources/leiningen/new/template/project.clj",
    "chars": 315,
    "preview": "(defproject {{group-prefix}}lein-template.{{artifact-id}} \"0.1.0-SNAPSHOT\"\n  :description \"FIXME: write description\"\n  :"
  },
  {
    "path": "resources/leiningen/new/template/temp.clj",
    "chars": 476,
    "preview": "(ns leiningen.new.{{artifact-id}}\n  (:require [leiningen.new.templates :as tmpl]\n            [leiningen.core.main :as ma"
  },
  {
    "path": "resources/repl-welcome",
    "chars": 256,
    "preview": "    Docs: (doc function-name-here)\n          (find-doc \"part-of-name-here\")\n  Source: (source function-name-here)\n Javad"
  },
  {
    "path": "sample.project.clj",
    "chars": 32915,
    "preview": ";; This is an annotated reference of the options that may be set in a\n;; project.clj file. It is fairly contrived in ord"
  },
  {
    "path": "src/leiningen/change.clj",
    "chars": 8570,
    "preview": "(ns leiningen.change\n  \"Rewrite project.clj by applying a function.\"\n  (:require [clojure.string :as str]\n            [c"
  },
  {
    "path": "src/leiningen/check.clj",
    "chars": 1734,
    "preview": "(ns leiningen.check\n  \"Check syntax and warn on reflection.\"\n  (:require [leiningen.core.eval :as eval]\n            [lei"
  },
  {
    "path": "src/leiningen/classpath.clj",
    "chars": 699,
    "preview": "(ns leiningen.classpath\n  \"Print the classpath of the current project.\"\n  (:require [leiningen.core.classpath :as classp"
  },
  {
    "path": "src/leiningen/clean.clj",
    "chars": 3677,
    "preview": "(ns leiningen.clean\n  \"Remove all files from project's target-path.\"\n  (:require [clojure.java.io :as io]\n            [l"
  },
  {
    "path": "src/leiningen/compile.clj",
    "chars": 7449,
    "preview": "(ns leiningen.compile\n  \"Compile Clojure source into .class files.\"\n  (:require [leiningen.core.eval :as eval]\n         "
  },
  {
    "path": "src/leiningen/deploy.clj",
    "chars": 10616,
    "preview": "(ns leiningen.deploy\n  \"Build and deploy jar to remote repository.\"\n  (:require [cemerick.pomegranate.aether :as aether]"
  },
  {
    "path": "src/leiningen/deps.clj",
    "chars": 7624,
    "preview": "(ns leiningen.deps\n  \"Download and examine dependencies.\"\n  (:require [leiningen.core.classpath :as classpath]\n         "
  },
  {
    "path": "src/leiningen/do.clj",
    "chars": 1256,
    "preview": "(ns leiningen.do\n  \"Higher-order task to perform other tasks in succession.\"\n  (:refer-clojure :exclude [do])\n  (:requir"
  },
  {
    "path": "src/leiningen/help.clj",
    "chars": 7727,
    "preview": "(ns leiningen.help\n  \"Display a list of tasks or help for a given task.\"\n  (:require [clojure.string :as string]\n       "
  },
  {
    "path": "src/leiningen/install.clj",
    "chars": 1244,
    "preview": "(ns leiningen.install\n  \"Install the current project to the local repository.\"\n  (:require [cemerick.pomegranate.aether "
  },
  {
    "path": "src/leiningen/jar.clj",
    "chars": 15130,
    "preview": "(ns leiningen.jar\n  \"Package up all the project's files into a jar file.\"\n  (:require [leiningen.pom :as pom]\n          "
  },
  {
    "path": "src/leiningen/javac.clj",
    "chars": 6488,
    "preview": "(ns leiningen.javac\n  \"Compile Java source files.\"\n  (:require [leiningen.classpath :as classpath]\n            [leininge"
  },
  {
    "path": "src/leiningen/new/app.clj",
    "chars": 1318,
    "preview": "(ns leiningen.new.app\n  \"Generate a basic application project.\"\n  (:require [leiningen.new.templates :refer [renderer ye"
  },
  {
    "path": "src/leiningen/new/default.clj",
    "chars": 1570,
    "preview": "(ns leiningen.new.default\n  \"Generate a library project.\"\n  (:require [leiningen.new.templates :refer [renderer year dat"
  },
  {
    "path": "src/leiningen/new/plugin.clj",
    "chars": 1038,
    "preview": "(ns leiningen.new.plugin\n  (:require [leiningen.new.templates :refer [renderer sanitize year date ->files]]\n            "
  },
  {
    "path": "src/leiningen/new/template.clj",
    "chars": 1709,
    "preview": "(ns leiningen.new.template\n  (:require [clojure.string :as str]\n            [leiningen.new.templates :as t]\n            "
  },
  {
    "path": "src/leiningen/new/templates.clj",
    "chars": 8687,
    "preview": ";; You can write a 'new' task yourself without any extra plugins like\n;; lein-newnew. What makes lein-new so useful is t"
  },
  {
    "path": "src/leiningen/new.clj",
    "chars": 10179,
    "preview": "(ns leiningen.new\n  \"Generate project scaffolding based on a template.\"\n  (:refer-clojure :exclude [new])\n  (:require [c"
  },
  {
    "path": "src/leiningen/plugin.clj",
    "chars": 290,
    "preview": "(ns leiningen.plugin\n  \"DEPRECATED. Please use the :user profile instead.\"\n  (:require [leiningen.core.main :as main]))\n"
  },
  {
    "path": "src/leiningen/pom.clj",
    "chars": 17006,
    "preview": "(ns leiningen.pom\n  \"Write a pom.xml file to disk for Maven interoperability.\"\n  (:import java.io.IOException)\n  (:requi"
  },
  {
    "path": "src/leiningen/release.clj",
    "chars": 6744,
    "preview": "(ns leiningen.release\n  \"Perform :release-tasks.\"\n  (:require [clojure.java.io :as io]\n            [leiningen.core.main "
  },
  {
    "path": "src/leiningen/repl.clj",
    "chars": 20886,
    "preview": "(ns leiningen.repl\n  \"Start a repl session either with the current project or standalone.\"\n  (:require [clojure.set]\n   "
  },
  {
    "path": "src/leiningen/retest.clj",
    "chars": 623,
    "preview": "(ns leiningen.retest\n  \"Run only the test namespaces which failed last time around.\"\n  (:require [leiningen.test :as tes"
  },
  {
    "path": "src/leiningen/run.clj",
    "chars": 6718,
    "preview": "(ns leiningen.run\n  \"Run a -main function with optional command-line arguments.\"\n  (:require [leiningen.core.eval :as ev"
  },
  {
    "path": "src/leiningen/search.clj",
    "chars": 2774,
    "preview": "(ns leiningen.search\n  \"Search Central and Clojars for published artifacts.\"\n  (:require [clojure.string :as string]\n   "
  },
  {
    "path": "src/leiningen/show_profiles.clj",
    "chars": 650,
    "preview": "(ns leiningen.show-profiles\n  \"List all available profiles or display one if given an argument.\"\n  (:require [clojure.st"
  },
  {
    "path": "src/leiningen/static_classpath.clj",
    "chars": 1894,
    "preview": "(ns leiningen.static-classpath\n  \"Print the classpath of the current project without loading code.\"\n  (:require [leining"
  },
  {
    "path": "src/leiningen/test.clj",
    "chars": 12183,
    "preview": "(ns leiningen.test\n  \"Run the project's tests.\"\n  (:refer-clojure :exclude [test])\n  (:require [clojure.java.io :as io]\n"
  },
  {
    "path": "src/leiningen/trampoline.clj",
    "chars": 2595,
    "preview": "(ns leiningen.trampoline\n  \"Run a task without nesting the project's JVM inside Leiningen's.\"\n  (:refer-clojure :exclude"
  },
  {
    "path": "src/leiningen/uberjar.clj",
    "chars": 7811,
    "preview": "(ns leiningen.uberjar\n  \"Package up the project files and dependencies into a jar file.\"\n  (:require [clojure.xml :as xm"
  },
  {
    "path": "src/leiningen/update_in.clj",
    "chars": 1683,
    "preview": "(ns leiningen.update-in\n  \"Perform arbitrary transformations on your project map.\"\n  (:refer-clojure :exclude [update-in"
  },
  {
    "path": "src/leiningen/upgrade.clj",
    "chars": 614,
    "preview": "(ns leiningen.upgrade\n  \"Upgrade Leiningen to specified version or latest stable.\"\n  (:require [leiningen.core.main :as "
  },
  {
    "path": "src/leiningen/vcs.clj",
    "chars": 4225,
    "preview": "(ns leiningen.vcs\n  \"Interact with the version control system.\"\n  (:require [clojure.java.io :as io]\n            [bultit"
  },
  {
    "path": "src/leiningen/version.clj",
    "chars": 374,
    "preview": "(ns leiningen.version\n  \"Print version for Leiningen and the current JVM.\"\n  (:require [leiningen.core.main :as main]))\n"
  },
  {
    "path": "src/leiningen/with_profile.clj",
    "chars": 3409,
    "preview": "(ns leiningen.with-profile\n  \"Apply the given task with the profile(s) specified.\"\n  (:require [clojure.string :as strin"
  },
  {
    "path": "test/.gnupg/gpg.conf",
    "chars": 26,
    "preview": "keyserver keys.openpgp.org"
  },
  {
    "path": "test/leiningen/echo.clj",
    "chars": 93,
    "preview": "(ns leiningen.echo)\n\n(defn ^:no-project-needed echo [project & args]\n  (apply println args))\n"
  },
  {
    "path": "test/leiningen/project.clj",
    "chars": 147,
    "preview": "(ns leiningen.project)\n\n(defn ^:no-project-needed project [project & args]\n  (if (seq args)\n    (get-in project (mapv ke"
  },
  {
    "path": "test/leiningen/test/change.clj",
    "chars": 8903,
    "preview": "(ns leiningen.test.change\n  (:require [clojure.string :as str]\n            [clojure.test :refer :all]\n            [leini"
  },
  {
    "path": "test/leiningen/test/check.clj",
    "chars": 1008,
    "preview": "(ns leiningen.test.check\n  (:require [clojure.test :refer :all]\n            [clojure.java.io :as io]\n            [leinin"
  },
  {
    "path": "test/leiningen/test/clean.clj",
    "chars": 5800,
    "preview": "(ns leiningen.test.clean\n  (:use [clojure.test]\n        [clojure.java.io :only [file make-parents writer]]\n        [lein"
  },
  {
    "path": "test/leiningen/test/compile.clj",
    "chars": 5860,
    "preview": "(ns leiningen.test.compile\n  (:refer-clojure :exclude [compile])\n  (:require [clojure.test :refer :all]\n            [clo"
  },
  {
    "path": "test/leiningen/test/deploy.clj",
    "chars": 6336,
    "preview": "(ns leiningen.test.deploy\n  (:require [clojure.java.io :as io]\n            [clojure.test :refer :all]\n            [leini"
  },
  {
    "path": "test/leiningen/test/deps.clj",
    "chars": 13432,
    "preview": "(ns leiningen.test.deps\n  (:require [clojure.test :refer :all]\n            [leiningen.deps :refer :all]\n            [lei"
  },
  {
    "path": "test/leiningen/test/do.clj",
    "chars": 1269,
    "preview": "(ns leiningen.test.do\n  (:refer-clojure :exclude [do])\n  (:use [clojure.test]\n        [leiningen.do]))\n\n(deftest test-gr"
  },
  {
    "path": "test/leiningen/test/help.clj",
    "chars": 2655,
    "preview": "(ns leiningen.test.help\n  (:use [leiningen.help]\n        [clojure.test])\n  (:require [leiningen.test.helper :as helper])"
  },
  {
    "path": "test/leiningen/test/helper.clj",
    "chars": 5480,
    "preview": "(ns leiningen.test.helper\n  (:require [leiningen.core.project :as project]\n            [leiningen.core.user :as user]\n  "
  },
  {
    "path": "test/leiningen/test/install.clj",
    "chars": 998,
    "preview": "(ns leiningen.test.install\n  (:require [leiningen.core.user :as user]\n            [leiningen.core.main :as main]\n       "
  },
  {
    "path": "test/leiningen/test/jar.clj",
    "chars": 7399,
    "preview": "(ns leiningen.test.jar\n  (:require [clojure.test :refer :all]\n            [leiningen.jar :refer :all]\n            [cloju"
  },
  {
    "path": "test/leiningen/test/javac.clj",
    "chars": 1687,
    "preview": "(ns leiningen.test.javac\n  (:use [clojure.test]\n        [clojure.java.io :only [file]]\n        [leiningen.javac :only [j"
  },
  {
    "path": "test/leiningen/test/jvm_opts.clj",
    "chars": 858,
    "preview": "(ns leiningen.test.jvm-opts\n  (:require [leiningen.with-profile :refer [with-profile]]\n            [leiningen.test.helpe"
  },
  {
    "path": "test/leiningen/test/new/templates.clj",
    "chars": 3210,
    "preview": "(ns leiningen.test.new.templates\n  (:use clojure.test\n        leiningen.new.templates)\n  (:require [leiningen.test.helpe"
  },
  {
    "path": "test/leiningen/test/new.clj",
    "chars": 6729,
    "preview": "(ns leiningen.test.new\n  (:require [leiningen.new :as new]\n            [clojure.test :refer :all]\n            [clojure.j"
  },
  {
    "path": "test/leiningen/test/pom.clj",
    "chars": 29041,
    "preview": "(ns leiningen.test.pom\n  (:require [clojure.data.xml :as xml]\n            [leiningen.core.project :as project]\n         "
  },
  {
    "path": "test/leiningen/test/release.clj",
    "chars": 5280,
    "preview": "(ns leiningen.test.release\n  (:require [clojure.test :refer :all]\n            [clojure.pprint :as pprint]\n            [l"
  },
  {
    "path": "test/leiningen/test/repl.clj",
    "chars": 11928,
    "preview": "(ns leiningen.test.repl\n  (:require [clojure.java.io :as io]\n            [clojure.test :refer :all]\n            [leining"
  },
  {
    "path": "test/leiningen/test/run.clj",
    "chars": 4876,
    "preview": "(ns leiningen.test.run\n  (:require [leiningen.core.project :as project]\n            [leiningen.javac]\n            [cloju"
  },
  {
    "path": "test/leiningen/test/search.clj",
    "chars": 1805,
    "preview": "(ns leiningen.test.search\n  (:import (com.sun.net.httpserver HttpExchange HttpHandler HttpServer)\n           (java.net I"
  },
  {
    "path": "test/leiningen/test/static_classpath.clj",
    "chars": 3307,
    "preview": "(ns leiningen.test.static-classpath\n  (:require [clojure.test :refer :all]\n            [clojure.string :as str]\n        "
  },
  {
    "path": "test/leiningen/test/test.clj",
    "chars": 4459,
    "preview": "(ns leiningen.test.test\n  (:refer-clojure :exclude [test])\n  (:require [clojure.test :refer :all]\n            [leiningen"
  },
  {
    "path": "test/leiningen/test/uberjar.clj",
    "chars": 5331,
    "preview": "(ns leiningen.test.uberjar\n  (:require [leiningen.uberjar :refer :all]\n            [clojure.test :refer :all]\n          "
  },
  {
    "path": "test/leiningen/test/update_in.clj",
    "chars": 1223,
    "preview": "(ns leiningen.test.update-in\n  (:refer-clojure :exclude [update-in])\n  (:use clojure.test leiningen.update-in))\n\n(defn- "
  },
  {
    "path": "test/leiningen/test/vcs.clj",
    "chars": 845,
    "preview": "(ns leiningen.test.vcs\n  (:require [clojure.test :refer :all]\n            [leiningen.vcs :as vcs]))\n\n(deftest parsed-arg"
  },
  {
    "path": "test/leiningen/test/with_profile.clj",
    "chars": 4971,
    "preview": "(ns leiningen.test.with-profile\n  (:require [clojure.test :refer :all]\n            [leiningen.core.main :as main]\n      "
  },
  {
    "path": "test/sample-connect-string",
    "chars": 10,
    "preview": "myhost:23\n"
  },
  {
    "path": "test/sample-connect-string-http",
    "chars": 25,
    "preview": "http://localhost:23/repl\n"
  },
  {
    "path": "test_projects/.ssh/allowed_signers",
    "chars": 584,
    "preview": "phil@hagelb.org ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCl/xWvwO2cw7yuHnv1spMGIBBFB5pFXduh3P8RD2dOqAv4CM9mrQ2BjSMbz0WePHvK"
  },
  {
    "path": "test_projects/.ssh/id_rsa",
    "chars": 2602,
    "preview": "-----BEGIN OPENSSH PRIVATE KEY-----\nb3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn\nNhAAAAAwEAAQA"
  },
  {
    "path": "test_projects/.ssh/id_rsa.pub",
    "chars": 568,
    "preview": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCl/xWvwO2cw7yuHnv1spMGIBBFB5pFXduh3P8RD2dOqAv4CM9mrQ2BjSMbz0WePHvKYDNecrpG/vGHZHs5"
  },
  {
    "path": "test_projects/.ssh/verify",
    "chars": 186,
    "preview": "#!/bin/bash\n\nssh-keygen -Y verify -f test_projects/.ssh/allowed_signers -I phil@hagelb.org -n file -s test_projects/samp"
  },
  {
    "path": "test_projects/README.txt",
    "chars": 208,
    "preview": "These projects are used for leiningen's test suite, so don't change\nany of these values without updating the relevant te"
  },
  {
    "path": "test_projects/bad-require/.gitignore",
    "chars": 143,
    "preview": "/target\n/lib\n/classes\n/checkouts\nprofiles.clj\npom.xml\npom.xml.asc\n*.jar\n*.class\n.lein-deps-sum\n.lein-failures\n.lein-plug"
  },
  {
    "path": "test_projects/bad-require/project.clj",
    "chars": 298,
    "preview": "(defproject bad-require \"0.1.0-SNAPSHOT\"\n  :description \"FIXME: write description\"\n  :url \"https://example.com/FIXME\"\n  "
  },
  {
    "path": "test_projects/bad-require/src/bad_require/core.clj",
    "chars": 84,
    "preview": "(ns bad-require.core\n  (:require [this.namespace.does.not.exist]))\n\n(defn -main [])\n"
  },
  {
    "path": "test_projects/data-readers-backwards-compatibility/project.clj",
    "chars": 119,
    "preview": "(defproject bug \"bug\"\n  :dependencies [[org.clojure/clojure \"1.8.0\"]\n                 [org.flatland/ordered \"1.5.6\"]])\n"
  },
  {
    "path": "test_projects/file-not-found-thrower/.gitignore",
    "chars": 110,
    "preview": "/target\n/classes\n/checkouts\nprofiles.clj\npom.xml\npom.xml.asc\n*.jar\n*.class\n/.lein-*\n/.nrepl-port\n/.prepl-port\n"
  },
  {
    "path": "test_projects/file-not-found-thrower/project.clj",
    "chars": 284,
    "preview": "(defproject file-not-found-thrower \"0.1.0-SNAPSHOT\"\n  :description \"FIXME: write description\"\n  :url \"https://example.co"
  },
  {
    "path": "test_projects/file-not-found-thrower/src/file_not_found_thrower/core.clj",
    "chars": 122,
    "preview": "(ns file-not-found-thrower.core)\n\n(defn -main\n  \"I don't do a whole lot.\"\n  []\n  (slurp \"haha this file does NOT EXIST\")"
  },
  {
    "path": "test_projects/java-main/.gitignore",
    "chars": 110,
    "preview": "/target\n/classes\n/checkouts\nprofiles.clj\npom.xml\npom.xml.asc\n*.jar\n*.class\n/.lein-*\n/.nrepl-port\n/.prepl-port\n"
  },
  {
    "path": "test_projects/java-main/project.clj",
    "chars": 176,
    "preview": "(defproject java-main \"0.1.0-SNAPSHOT\"\n  :java-source-paths [\"src/java\"]\n  :dependencies [[org.clojure/clojure \"1.8.0\"]]"
  },
  {
    "path": "test_projects/java-main/src/java/my/java/Main.java",
    "chars": 139,
    "preview": "package my.java;\n\npublic class Main {\n    public static void main(String[] args) {\n        System.out.println(\"Hello fro"
  },
  {
    "path": "test_projects/jvm-opts/project.clj",
    "chars": 204,
    "preview": "(defproject custom/args \"0.0.1-SNAPSHOT\"\n  :description \"A test project\"\n  :dependencies [[org.clojure/clojure \"1.8.0\"]]"
  },
  {
    "path": "test_projects/leaky-composite/project.clj",
    "chars": 284,
    "preview": ";; https://github.com/technomancy/leiningen/issues/2721\n(defproject leaky-composite \"0.1.0-SNAPSHOT\"\n  :dependencies [[o"
  },
  {
    "path": "test_projects/lein-test-exit-code/project.clj",
    "chars": 121,
    "preview": "(defproject lein-test-exit-code \"0.1.0-SNAPSHOT\"\n  :dependencies [[org.clojure/clojure \"1.10.3\"]]\n  :eval-in :leiningen)"
  },
  {
    "path": "test_projects/lein-test-exit-code/test/lein_test_exit_code/core_test.clj",
    "chars": 284,
    "preview": "(ns lein-test-exit-code.core-test\n  (:require [clojure.test :refer [deftest is]]))\n\n(defmacro gen-failing-deftests [n]\n "
  },
  {
    "path": "test_projects/lein-test-reload-bug/project.clj",
    "chars": 100,
    "preview": "(defproject lein-test-reload-bug \"0.1.0-SNAPSHOT\"\n  :dependencies [[org.clojure/clojure \"1.10.1\"]])\n"
  },
  {
    "path": "test_projects/lein-test-reload-bug/test/lein_test_reload_bug/a_deftype.clj",
    "chars": 144,
    "preview": "(ns lein-test-reload-bug.a-deftype\n  (:require [lein-test-reload-bug.b-protocol\n             :refer [B]]))\n\n(deftype A ["
  },
  {
    "path": "test_projects/lein-test-reload-bug/test/lein_test_reload_bug/b_protocol.clj",
    "chars": 67,
    "preview": "(ns lein-test-reload-bug.b-protocol)\n\n(defprotocol B\n  (b [this]))\n"
  },
  {
    "path": "test_projects/lein-test-reload-bug/test/lein_test_reload_bug/core_test.clj",
    "chars": 258,
    "preview": "(ns lein-test-reload-bug.core-test\n  (:require [clojure.test :refer [deftest is]]\n            [lein-test-reload-bug.a-de"
  },
  {
    "path": "test_projects/managed-deps/project.clj",
    "chars": 1332,
    "preview": "(def clj-version \"1.3.0\")\n\n(defproject mgmt \"0.99.0\"\n  :description \"A test project\"\n\n  :managed-dependencies [[~(symbol"
  },
  {
    "path": "test_projects/managed-deps-snapshot/project.clj",
    "chars": 1199,
    "preview": "(def clj-version \"1.3.0\")\n\n(defproject mgmt \"0.99.0-SNAPSHOT\"\n  :description \"A test project\"\n\n  :managed-dependencies ["
  }
]

// ... and 97 more files (download for full content)

About this extraction

This page contains the full source code of the technomancy/leiningen GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 297 files (1.0 MB), approximately 295.0k tokens, and a symbol index with 4 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!