rs-matter-stack 0.1.0

Utility for configuring and running rs-matter
Documentation
#!/usr/bin/env python3

"""
Set up environment variables used to generate size report artifacts.

Takes a single argument, a JSON dictionary of the `github` context.
Typically run as:

```
    - name: Set up environment for size reports
      if: ${{ !env.ACT }}
      env:
        GH_CONTEXT: ${{ toJson(github) }}
      run: gh_sizes_environment.py "${GH_CONTEXT}"
```

Sets the following environment variables:

- `GH_EVENT_PR`         For a pull request, the PR number; otherwise 0.
- `GH_EVENT_HASH`       SHA of the commit under test.
- `GH_EVENT_PARENT`     SHA of the parent commit to which the commit under
                        test is applied.
- `GH_EVENT_REF`        The branch or tag ref that triggered the workflow run.
- `GH_EVENT_TIMESTAMP`  For `push` events only, the timestamp of the commit.
"""

import json
import os
import re
import subprocess
import sys

import dateutil.parser

github = json.loads(sys.argv[1])

commit = None
timestamp = None
ref = github['ref']

if github['event_name'] == 'pull_request':

  pr = github['event']['number']
  commit = github['event']['pull_request']['head']['sha']

  # Try to find the actual commit against which the current PR compares
  # by scraping the HEAD commit message.
  r = subprocess.run(['git', 'show', '--no-patch', '--format=%s', 'HEAD'],
                     capture_output=True, text=True, check=True)
  m = re.fullmatch('Merge [0-9a-f]+ into ([0-9a-f]+)', r.stdout)
  if m:
    parent = m.group(1)
  else:
    parent = github['event']['pull_request']['base']['sha']

elif github['event_name'] == 'push':

  commit = github['sha']
  parent = github['event']['before']
  timestamp = dateutil.parser.isoparse(
      github['event']['head_commit']['timestamp']).timestamp()

  # Try to find the PR being committed by scraping the commit message.
  m = re.search(r'\(#(\d+)\)', github['event']['head_commit']['message'])
  if m:
    pr = m.group(1)
  else:
    pr = 0

# Environment variables for subsequent workflow steps are set by
# writing to the file named by `$GITHUB_ENV`.

if commit is not None:
  env = os.environ.get('GITHUB_ENV')
  assert env
  with open(env, 'at') as out:
    print(f'GH_EVENT_PR={pr}', file=out)
    print(f'GH_EVENT_HASH={commit}', file=out)
    print(f'GH_EVENT_PARENT={parent}', file=out)
    print(f'GH_EVENT_REF={ref}', file=out)
    if timestamp:
      print(f'GH_EVENT_TIMESTAMP={timestamp}', file=out)