This avoids confusion between `.into_iter()` and `.iter()`. On a slice,
both methods do the same (correct) thing. Using `.into_iter()` will
result in a clippy warning about the slice not being consumed.
Previously a Git repository was initialized if a Cargo workspace was
detected. However, it's also possible for users to initialize rustlings
in an existing Git repository that doesn't contain a Cargo workspace. In
that case, it's still undesirable to initialize a nested Git repository
for rustlings. We therefore search all ancestors of the current working
directory for `.git` or `.jj` directories to determine if rustlings is
being initialized in an existing Git repository.
Students do not have the necessary knowledge at this point to understand
what's happening with the iterator combinators. This topic is covered
well by the dedicated exercises about iterators later.
closes#2102
Some cargo workspaces may contain windows line endings. Even if the
file is stored in a repo with unix line endings, users may have some
setting activated that automatically translates them to windows line
endings when working locally.
Some people would get stuck on this exercise, trying to understand the meaning
behind foo, fuzz, baz etc. Making the theme of the code make a little more sense
to humans should hopefully prevent people from getting confused by abstract and
non-sensical tests.
- Detect if we are in a cargo project more reliably.
(e.g. if `rustlings init` is run in the `src/` directory)
- Refuse to initialize rustlings in a non-workspace cargo project.
- Automatically populate the `workspace.members` field if `rustlings init` is
run in a workspace.
This may be considered risky, as there is no guarantee that's what the user
wanted to do. However, it is consistent with the behavior of `cargo new`.
Also, newcomers to Rust are unlikely to accidentally be in a cargo workspace,
as they won't know how to create one in the first place.
The use case for initialization in a workspace is when a workshop organizer
wants to use rustlings alongside other exerices and provide a single
repository with everything in one place.
hashbrown is already used in the standard library, but we want the
improved performance of the different hash algorithm.
Using ahash directly conveys this intent more clearly.