I tested this by creating a dummy implementation of an `HgRepositoryProvider`
(with the optional `createRepositorySync()` method implemented) and an `HgRepository`
in an Atom package with the following stanza in the `package.json`:
```
"providedServices": {
"atom.repository-provider": {
"versions": {
"0.1.0": "createHgRepositoryProvider"
}
}
},
```
I opened a path with an Hg repository from the command line using Atom.
I verified that `atom.project.repositoryProviders` contains both a
`GitRepositoryProvider` and an `HgRepositoryProvider`.
I also verified that running the following printed out an `HgRepository`:
```
var Directory = require('pathwatcher').Directory;
atom.project.repositoryForDirectory(
new Directory(atom.project.getPath(), /* symlink */ false)).then(
function(repo) { console.log('repo: %o', repo); });
```
One thing that stands out to me about the current API for the
atom.repository-provider service is that the function used to create
a `RepositoryProvider` does not receive any arguments. If the creation
of the `GitRepositoryProvider` were done via the service, this would
be a problem because it needs a reference to `atom.project`, which is
not defined when it is created. (We work around this because it is
created in `Project`'s constructor, so it can pass `this` to
`new GitRepositoryProvider()`.)
We would have to create a `RepositoryProviderFactory` or something if
we wanted to specify arguments when creating a `RepositoryProvider`,
in general. Maybe that's too crazy / not an issue, in practice.
Though note that `GitRepository` cannot access `atom.project` lazily
because it uses it in its constructor to do the following:
```
if @project?
@subscriptions.add @project.eachBuffer (buffer) => @subscribeToBuffer(buffer)
```
So long as we can guarantee that `atom.project` is defined before the
other providers are initialized, I think we should be OK.
Follow-up work:
* Replace the use of `RepositoryProvider.createRepositorySync()` with
`RepositoryProvider.repositoryForDirectory()` in `Project.setPaths()`.
* Replace all uses of `Project.getRepositories()` with
`Project.repositoryForDirectory()` in packages that are bundled with Atom
by default.
* Implement `Directory.exists()` and/or `Directory.existsSync()` and update
`git-repositor-provider.coffee`, as appropriate.
* Eliminate `GitRepositoryProvider.repositoryForDirectory()`'s use of
synchronous methods.
* Somewhat orthogonal to this diff, but the following fields need to be
removed from `Project` because they enforce the idea of a single root:
`path`, `rootDirectory`, and `repo`. This has implications around the
existing use of `@rootDirectory?.off()` and `@destroyRepo()`.
Atom is a hackable text editor for the 21st century, built on atom-shell, and based on everything we love about our favorite editors. We designed it to be deeply customizable, but still approachable using the default configuration.
Visit atom.io to learn more or visit the Atom forum.
Visit issue #3684 to learn more about the Atom 1.0 roadmap.
Installing
OS X
Download the latest Atom release.
Atom will automatically update when a new release is available.
Windows
Download the latest AtomSetup.exe installer.
Atom will automatically update when a new release is available.
You can also download an atom-windows.zip file from the releases page.
The .zip version will not automatically update.
Using chocolatey? Run cinst Atom to install
the latest version of Atom.
Debian Linux (Ubuntu)
Currently only a 64-bit version is available.
- Download
atom-amd64.debfrom the Atom releases page. - Run
sudo dpkg --install atom-amd64.debon the downloaded package. - Launch Atom using the installed
atomcommand.
The Linux version does not currently automatically update so you will need to repeat these steps to upgrade to future releases.
Red Hat Linux (Fedora, CentOS, Red Hat)
Currently only a 64-bit version is available.
- Download
atom.x86_64.rpmfrom the Atom releases page. - Run
sudo yum localinstall atom.x86_64.rpmon the downloaded package. - Launch Atom using the installed
atomcommand.
The Linux version does not currently automatically update so you will need to repeat these steps to upgrade to future releases.
Building
Developing
Check out the guides and the API reference.
