summaryrefslogtreecommitdiff
path: root/.github/workflows/project.yml
blob: 2a27b70fc5db307640305d96012512e62b459f66 (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
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
    if: github.repository == 'ohmyzsh/ohmyzsh'
    env:
      GITHUB_TOKEN: ${{ secrets.PROJECT_TOKEN }}
    steps:
      - name: Read project data
        env:
          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:
          ISSUE_OR_PR_ID: ${{ github.event.issue.node_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_OR_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'
        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'
        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