docs/git.md
You can overload the AST node with extra methods to get information from Git.
Let's start with some basic setup to reuse in the next examples:
## Git require
By default, this extension is not loaded in the fast environment, so you should
require it.
```ruby
require 'fast/git'
```
Then it will work with any AST node.
```ruby
ast = Fast.ast_from_file('lib/fast.rb')
```
## Log
First commit from git:
```ruby
ast.git_log.first.author.name # => "Jonatas Davi Paganini"
```
It uses [ruby-git](https://github.com/ruby-git/ruby-git#examples) gem, so all
methods are available:
```ruby
ast.git_log.since(Time.mktime(2019)).entries.map(&:message)
```
Counting commits per year:
```ruby
ast.git_log.entries.group_by{|t|t.date.year}.transform_values(&:size)
# => {2020=>4, 2019=>22, 2018=>4}
```
Counting commits per contributor:
```ruby
ast.git_log.entries.group_by{|t|t.author.name}.transform_values(&:size)
# => {"Jônatas Davi Paganini"=>29, ...}
```
Selecting last commit message:
```ruby
ast.last_commit.message # => "Add node extensions for extracting info from git (#21)"
```
Remote git URL:
```ruby
ast.remote_url # => "git@github.com:jonatas/fast.git"
ast.project_url # => "https://github.com/jonatas/fast"
```
The `sha` from last commit:
```ruby
ast.sha # => "cd1c036b55ec1d41e5769ad73b282dd6429a90a6"
```
Pick a link from the files to master version:
```ruby
ast.link # => "https://github.com/jonatas/fast/blob/master/lib/fast.rb#L3-L776"
```
Getting permalink from current commit:
```ruby
ast.permalink # => "https://github.com/jonatas/fast/blob/cd1c036b55ec1d41e5769ad73b282dd6429a90a6/lib/fast.rb#L3-L776"
```
## Markdown link
Let's say you'd like to capture a list of class names that inherits the `Find`
class:
```ruby
puts ast.capture("(class $(const nil _) (const nil Find)").map(&:md_link).join("\n* ")
```
It will output the following links:
* [FindString](https://github.com/jonatas/fast/blob/master/lib/fast.rb#L485)
* [MethodCall](https://github.com/jonatas/fast/blob/master/lib/fast.rb#L496)
* [InstanceMethodCall](https://github.com/jonatas/fast/blob/master/lib/fast.rb#L507)
* [FindWithCapture](https://github.com/jonatas/fast/blob/master/lib/fast.rb#L524)
* [FindFromArgument](https://github.com/jonatas/fast/blob/master/lib/fast.rb#L551)
* [Capture](https://github.com/jonatas/fast/blob/master/lib/fast.rb#L598)
* [Parent](https://github.com/jonatas/fast/blob/master/lib/fast.rb#L622)
* [Any](https://github.com/jonatas/fast/blob/master/lib/fast.rb#L636)
* [All](https://github.com/jonatas/fast/blob/master/lib/fast.rb#L647)
* [Not](https://github.com/jonatas/fast/blob/master/lib/fast.rb#L659)
* [Maybe](https://github.com/jonatas/fast/blob/master/lib/fast.rb#L667)
## Permalink
If you need to get a permanent link to the code, use the `permalink` method:
```ruby
ast.search("(class (const nil _) (const nil Find)").map(&:permalink)
# => ["https://github.com/jonatas/fast/blob/cd1c036b55ec1d41e5769ad73b282dd6429a90a6/lib/fast.rb#L524-L541",
# "https://github.com/jonatas/fast/blob/cd1c036b55ec1d41e5769ad73b282dd6429a90a6/lib/fast.rb#L551-L571", ...]
```