# The `[sources]` section

Contains all of the configuration for `cargo deny check sources`

## Example Config

```ini
{{#include ../../../../tests/cfg/sources.toml}}
```

### The `unknown-registry` field (optional)

Determines what happens when a crate from a crate registry that is not in the `allow-registry` list is encountered.

* `deny` - Will emit an error with the URL of the source, and fail the check.
* `warn` (default) - Prints a warning for each crate, but does not fail the check.
* `allow` - Prints a note for each crate, but does not fail the check.

### The `unknown-git` field (optional)

Determines what happens when a crate from a git repository not in the `allow-git` list is encountered.

* `deny` - Will emit an error with the URL of the repository, and fail the check.
* `warn` (default) - Prints a warning for each crate, but does not fail the check.
* `allow` - Prints a note for each crate, but does not fail the check.

### The `required-git-spec` (optional)

Determines which [specifiers](https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#specifying-dependencies-from-git-repositories) are required for git sources. Git sources are a convenient way to use patched code temporarily, but they have downsides for long term maintenance, as the specifier you use for the source determines what happens when you do a `cargo update`, and in the default case, this means you essentially have a wildcard dependency on the repository.

This configuration value allows you to control what specifiers you want to allow for your git sources to reduce surprises. The following values are listed in order from least to most specific, and using a less specific specifier will also allow all of the more specific ones.

* `any` (default) - Allows all git specs, including the default of not having
any specifier, which tracks the latest commit on the `master` branch of the repo
* `branch` - Allows the `branch = "<branch_name>"` specifier.
* `tag` - Allows the `tag = "<tag_name>"` specifier.
* `rev` - Allows the `rev = "<commit_sha>"` specifier.

### The `allow-git` field (optional)

Configure which git urls are allowed for crate sources. If a crate's source is not in one of the listed urls, then the `unknown-git` setting will determine how it is handled. Note that the url must match exactly, though `.git` is stripped if it exists to match the logic of cargo.

```ini
[sources]
allow-git = [
    "https://github.com/EmbarkStudios/cargo-deny",
]
```

### The `private` field (optional)

Similarly to `allow-git`, allows you to configure urls, however, unlike `allow-git` which is meant for a single, exact, url, `private` urls actually allow _any_ git repo url which matches the host and begins with the same path. This field is primarily meant to support the use of internal/private git hosts (usually on a VPN) without needing to specify each individual repo. Of course, this can be used to also just allow every repo on Github, but this is not recommended. 😉

```ini
[sources]
private = [
    "https://super-duper-sekret",
]
```

### The `allow-registry` field (optional)

The list of registries that are allowed. If a crate is not found in one of the listed registries, then the `unknown-registry` setting will determine how it is handled.

If not specified, this list will by default contain the [crates.io](http://crates.io) registry, equivalent to this:

```ini
[sources]
allow-registry = [
    "https://github.com/rust-lang/crates.io-index",
]
```

To not allow any crates registries, set it to empty:

```ini
[sources]
unknown-registry = "deny"
allow-registry = []
```

### The `allow-org` field (optional)

Generally, I think most projects in the Rust space probably follow a similar procedure as we do when they want to fix a bug or add a feature to one of their dependencies, which is basically.

1. Fork the crate to make your changes
1. Hack away locally, probably just patching your project(s) to use a `path` dependency to the cloned fork
1. Push changes to your fork, and once you're happy, change the `path` dependency to a `git` dependency and point it to your fork for others/CI to be able to use the same changes easily
1. Eventually (hopefully!) make a PR to the original repo with your changes
1. Hopefully get your changes merged to the original repo
1. Wait until a release is made that incorporates your changes, possibly changing the `git` source to point to the original repo
1. Remove the `git` source and instead point at the new version of the crate with your changes
1. Profit!

When working in a company or organization, it is often the case that all crates will be forked to a shared organization account rather than a personal Github account. However, if you lint your git sources, every new and deleted fork needs to keep that list updated, which is tedious, even if all the forks fall under the same organization (in Github terminology), even though presumably only people you trust have permission to create forks there, and you would like to just blanket trust any repo under that org.

The `allow-org` object allows you to specify 1 or more organizations or users in several VCS providers to more easily configure git sources for your projects.

#### The `github` field (optional)

Allows you to specify one or more `github.com` organizations to allow as git sources.

```ini
[sources.allow-org]
github = ["YourCoolOrgGoesHere"]
```

#### The `gitlab` field (optional)

Allows you to specify one or more `gitlab.com` organizations to allow as git sources.

```ini
[sources.allow-org]
gitlab = ["YourCoolOrgGoesHere"]
```

#### The `bitbucket` field (optional)

Allows you to specify one or more `bitbucket.org` organizations to allow as git sources.

```ini
[sources.allow-org]
bitbucket = ["YourCoolOrgGoesHere"]
```
