- Start Date: 2019-03-06
- RFC PR: (leave this empty)
- VuePress Issue: (leave this empty)

# Summary

A new official plugin `@vuepress/plugin-git-log` featured with more computed properties to be mixed in.

# Basic example

1. Apply the plugin `@vuepress/git-log`.
2. It will provide a computed property `$git`, with following attributes:
   - **$git.updated:** the last updating time for this page
   - **$git.created:** the first creating time for this page
   - **$git.author:** the author for this page
   - **$git.contributors:** contributors for this page
   - **$git.commits:** detailed informations of commits to this page

# Motivation

Although last-updated works well, git-log provides more information. Such plugin will provide remarkable convenience to users, because it automatically generates some necessary meta information.

# Detailed design

## Computed Properties

We will get all computed properties through a command line like this:

```bash
git log --format="%h %at %ct %an"
```

Passing the result to client, we will get a `$git.commits` like this:

```json
[{
  "hash": "aabbccd",
  "authorTime": 11111111,
  "commitTime": 22222222,
  "author": "fooooooo"
}, {
  "hash": "ffeeddc",
  "authorTime": 33333333,
  "commitTime": 44444444,
  "author": "baaaaaar"
}]
```

And other computed properties can be derived from this.

## Options

### formatTime

A function to format unix time. It may have two arguments: `time` and `lang`. The default value will be:

```js
function formatTime (timestamp, lang) {
  return new Date(timestamp).toLocaleString(lang)
}
```

### additionalProps

Aside from some properties listed above, we can add some custom properties through this option:

```js
module.exports = {
  plugins: [
    ['@vuepress/git-log', {
      additionalProps: {
        subject: '%s',
        authorEmail: '%ae',
      }
    }]
  ]
}
```

### additionalArgs

A string or an array of strings to include all the additional args. The default value will be `'--no-merge'`.

### onlyFirstAndLastCommit

If set to `true`, this plugin will only look for the first and last commit, which may save lots of time. The default value is `false`.

However, setting this option to also means you will have no access to **\$git.contributors** and **$git.commits**.

# Drawbacks

- It will replace existing plugin `@vuepress/plugin-last-updated`, which may lead to a breaking change (also see [adoption-strategy](#adoption-strategy)).
- It will cost more time to get all the detailed informations on a large git project than in the past with default options (because `onlyFirstAndLastCommit` is `false`).

# Alternatives

Publish multiple packages like `@vuepress/plugin-last-updated`. But in that case, we may need lots of command lines, which may seriously affect performance.

# Adoption strategy

We will deprecate `@vuepress/plugin-last-updated` after several months. Before then, we will automatically import `@vuepress/plugin-git-log` in `@vuepress/plugin-last-updated` and support both functionality.

```js
// server
module.exports = {
  plugins: ['@vuepress/last-updated']
  // show deprecation warning
}
```
```js
// client
export default {
  created () {
    console.log(this.$lastUpdated) // show deprecation warning
    console.log(this.$git.updated)
  }
}
```

# How we teach this

Through official plugin documentation (i.e. `/plugin/official/plugin-git-log.html`).

# Unresolved questions

N/A
