|
@@ -0,0 +1,134 @@
|
|
|
+name: Project tracking
|
|
|
+on:
|
|
|
+ issues:
|
|
|
+ types: [opened]
|
|
|
+ pull_request_target:
|
|
|
+ types: [opened, synchronize]
|
|
|
+
|
|
|
+jobs:
|
|
|
+ add-to-project:
|
|
|
+ name: Add to project
|
|
|
+ runs-on: ubuntu-latest
|
|
|
+ steps:
|
|
|
+ - name: Generate token
|
|
|
+ id: generate_token
|
|
|
+ uses: tibdex/github-app-token@36464acb844fc53b9b8b2401da68844f6b05ebb0
|
|
|
+ with:
|
|
|
+ app_id: ${{ secrets.OHMYZSH_BOT_APP_ID }}
|
|
|
+ private_key: ${{ secrets.OHMYZSH_BOT_APP_PEM }}
|
|
|
+ - name: Read project data
|
|
|
+ env:
|
|
|
+ GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
|
|
|
+ ORGANIZATION: ohmyzsh
|
|
|
+ PROJECT_NUMBER: "1"
|
|
|
+ run: |
|
|
|
+ # Get Project data
|
|
|
+ gh api graphql -f query='
|
|
|
+ query($org: String!, $number: Int!) {
|
|
|
+ organization(login: $org){
|
|
|
+ projectNext(number: $number) {
|
|
|
+ id
|
|
|
+ fields(first:20) {
|
|
|
+ nodes {
|
|
|
+ id
|
|
|
+ name
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ' -f org=$ORGANIZATION -F number=$PROJECT_NUMBER > project_data.json
|
|
|
+
|
|
|
+ # Parse project data
|
|
|
+ cat >> $GITHUB_ENV <<EOF
|
|
|
+ PROJECT_ID=$(jq '.data.organization.projectNext.id' project_data.json)
|
|
|
+ PLUGIN_FIELD_ID=$(jq '.data.organization.projectNext.fields.nodes[] | select(.name == "Plugin") | .id' project_data.json)
|
|
|
+ THEME_FIELD_ID=$(jq '.data.organization.projectNext.fields.nodes[] | select(.name == "Theme") | .id' project_data.json)
|
|
|
+ EOF
|
|
|
+ - name: Add to project
|
|
|
+ env:
|
|
|
+ GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
|
|
|
+ ISSUE_ID: ${{ github.event.issue.node_id }}
|
|
|
+ PR_ID: ${{ github.event.pull_request.node_id }}
|
|
|
+ run: |
|
|
|
+ item_id="$(gh api graphql -f query='
|
|
|
+ mutation($project: ID!, $item: ID!) {
|
|
|
+ addProjectNextItem(input: {projectId: $project, contentId: $item}) {
|
|
|
+ projectNextItem {
|
|
|
+ id
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ' -f project=$PROJECT_ID -f item=${ISSUE_ID:-$PR_ID} --jq '.data.addProjectNextItem.projectNextItem.id')"
|
|
|
+
|
|
|
+ echo "ITEM_ID=$item_id" >> $GITHUB_ENV
|
|
|
+ - name: Classify Pull Request
|
|
|
+ if: github.event_name == 'pull_request_target'
|
|
|
+ env:
|
|
|
+ GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
|
|
|
+ run: |
|
|
|
+ gh pr view ${{ github.event.pull_request.number }} --json files --jq '.files.[].path' | awk -F/ '
|
|
|
+ /^plugins\// {
|
|
|
+ plugins[$2] = 1
|
|
|
+ }
|
|
|
+ /^themes\// {
|
|
|
+ gsub(/\.zsh-theme$/, "", $2)
|
|
|
+ themes[$2] = 1
|
|
|
+ }
|
|
|
+ END {
|
|
|
+ for (plugin in plugins) {
|
|
|
+ print plugin >> "plugins.list"
|
|
|
+ }
|
|
|
+ for (theme in themes) {
|
|
|
+ print theme >> "themes.list"
|
|
|
+ }
|
|
|
+ }
|
|
|
+ '
|
|
|
+ # If only one plugin is modified, add it to the plugin field
|
|
|
+ if [[ $(wc -l < plugins.list) = 1 ]]; then
|
|
|
+ echo "PLUGIN=$(cat plugins.list)" >> $GITHUB_ENV
|
|
|
+ fi
|
|
|
+ # If only one theme is modified, add it to the theme field
|
|
|
+ if [[ $(wc -l < themes.list) = 1 ]]; then
|
|
|
+ echo "THEME=$(cat themes.list)" >> $GITHUB_ENV
|
|
|
+ fi
|
|
|
+ - name: Fill Pull Request fields in project
|
|
|
+ if: github.event_name == 'pull_request_target'
|
|
|
+ env:
|
|
|
+ GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
|
|
|
+ run: |
|
|
|
+ gh api graphql -f query='
|
|
|
+ mutation (
|
|
|
+ $project: ID!
|
|
|
+ $item: ID!
|
|
|
+ $plugin_field: ID!
|
|
|
+ $plugin_value: String!
|
|
|
+ $theme_field: ID!
|
|
|
+ $theme_value: String!
|
|
|
+ ) {
|
|
|
+ set_plugin: updateProjectNextItemField(input: {
|
|
|
+ projectId: $project
|
|
|
+ itemId: $item
|
|
|
+ fieldId: $plugin_field
|
|
|
+ value: $plugin_value
|
|
|
+ }) {
|
|
|
+ projectNextItem {
|
|
|
+ id
|
|
|
+ }
|
|
|
+ }
|
|
|
+ set_theme: updateProjectNextItemField(input: {
|
|
|
+ projectId: $project
|
|
|
+ itemId: $item
|
|
|
+ fieldId: $theme_field
|
|
|
+ value: $theme_value
|
|
|
+ }) {
|
|
|
+ projectNextItem {
|
|
|
+ id
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ' -f project=$PROJECT_ID -f item=$ITEM_ID \
|
|
|
+ -f plugin_field=$PLUGIN_FIELD_ID -f plugin_value=$PLUGIN \
|
|
|
+ -f theme_field=$THEME_FIELD_ID -f theme_value=$THEME \
|
|
|
+ --silent
|
|
|
+
|