Files
linguist/CONTRIBUTING.md
Brandon Keepers 4b3b1a80f6 Rearrange docs
2015-01-16 09:02:51 -05:00

4.7 KiB

Contributing

The majority of contributions won't need to touch any Ruby code at all. Linguist defines a list of all languages known to GitHub in lib/linguist/languages.yml.

Most languages are detected by their file extension. For disambiguating between files with common extensions, we first apply some common-sense heuristics to pick out obvious languages. After that, we use a statistical classifier. This process can help us tell the difference between, for example, .h files which could be either C, C++, or Obj-C.

Adding a language

We try only to add languages once they have some usage on GitHub. In most cases we prefer that languages be in use in hundreds of repositories before supporting them in Linguist.

To add support for a new language:

  1. Add an entry for your language to languages.yml.
  2. Add a grammar for your language. Please only add grammars that have a license that permits redistribution.
  3. Add your grammar as a submodule: git submodule add https://github.com/JaneSmith/MyGrammar vendor/grammars/MyGrammar.
  4. Add your grammar to grammars.yml by running script/download-grammars --add vendor/grammars/MyGrammar.
  5. Add samples for your language to the samples directory in the correct subdirectory.
  6. Open a pull request, linking to a GitHub search result showing in-the-wild usage.

Fixing syntax highlighting

Syntax highlighting in GitHub is performed using TextMate-compatible grammars. These are the same grammars that TextMate, Sublime Text and Atom use. Every language in languages.yml is mapped to its corresponding TM scope. This scope will be used when picking up a grammar for highlighting.

Assuming your code is being detected as the right language (see Language Detection above), in most cases this is due to a bug in the language grammar rather than a bug in Linguist. grammars.yml lists all the grammars we use for syntax highlighting on github.com. Find the one corresponding to your code's programming language and submit a bug report upstream. If you can, try to reproduce the highlighting problem in the text editor that the grammar is designed for (TextMate, Sublime Text, or Atom) and include that information in your bug report.

You can also try to fix the bug yourself and submit a Pull Request. TextMate's documentation offers a good introduction on how to work with TextMate-compatible grammars. You can test grammars using Lightshow.

Once the bug has been fixed upstream, please let us know and we'll pick it up for GitHub.

Testing

For development you are going to want to checkout out the source. To get it, clone the repo and run Bundler to install its dependencies.

git clone https://github.com/github/linguist.git
cd linguist/
script/bootstrap

To run the tests:

bundle exec rake test

Sometimes getting the tests running can be too much work, especially if you don't have much Ruby experience. It's okay: be lazy and let our build bot Travis run the tests for you. Just open a pull request and the bot will start cranking away.

Here's our current build status: Build Status

Releasing

If you are the current maintainer of this gem:

  1. Create a branch for the release: git checkout -b cut-release-vxx.xx.xx
  2. Make sure your local dependencies are up to date: script/bootstrap
  3. Ensure that samples are updated: bundle exec rake samples
  4. Ensure that tests are green: bundle exec rake test
  5. Bump gem version in lib/linguist/version.rb, like this.
  6. Make a PR to github/linguist, like this.
  7. Build a local gem: bundle exec rake build_gem
  8. Test the gem:
  9. Bump the Gemfile and Gemfile.lock versions for an app which relies on this gem
  10. Install the new gem locally
  11. Test behavior locally, branch deploy, whatever needs to happen
  12. Merge github/linguist PR
  13. Tag and push: git tag vx.xx.xx; git push --tags
  14. Push to rubygems.org -- gem push github-linguist-3.0.0.gem