summaryrefslogtreecommitdiff
path: root/.github/workflows/project.yml
blob: 1e66efda893fa19ad8daeb27637293742c9d977e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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: Read project data
        env:
          GITHUB_TOKEN: ${{ secrets.PROJECT_TOKEN }}
          ORGANIZATION: ohmyzsh
          PROJECT_NUMBER: "1"
        run: |
          gh auth login

          # 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: ${{ secrets.PROJECT_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: ${{ secrets.PROJECT_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: ${{ secrets.PROJECT_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