chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
name: Assign Issue
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: [opened, edited]
|
||||
|
||||
jobs:
|
||||
assign:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: "3.x"
|
||||
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade PyGithub
|
||||
|
||||
- name: Assign Issue
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: python .github/workflows/issue_assigner/assign_issue.py
|
||||
@@ -0,0 +1,93 @@
|
||||
"""Assigns the issue based on who created the file mentioned."""
|
||||
|
||||
# pylint: disable=line-too-long,too-many-arguments
|
||||
import base64
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
|
||||
from github import Github
|
||||
|
||||
|
||||
def get_issue_number(event_path: str) -> int:
|
||||
"""Retrieves the issue number from GitHub event data."""
|
||||
# Load event data
|
||||
with open(event_path, encoding="utf-8") as f:
|
||||
event_data = json.load(f)
|
||||
|
||||
# Determine the issue number based on the event
|
||||
if "issue" in event_data:
|
||||
return int(event_data["issue"]["number"])
|
||||
|
||||
raise ValueError("Unable to determine issue number from event data.")
|
||||
|
||||
|
||||
def main() -> None:
|
||||
"""Gets filename mentioned in issue, finds author username in file, assigns issue to user."""
|
||||
# Get GitHub token and repository details
|
||||
repo_name = os.getenv("GITHUB_REPOSITORY", "")
|
||||
token = os.getenv("GITHUB_TOKEN")
|
||||
issue_number = get_issue_number(os.getenv("GITHUB_EVENT_PATH", ""))
|
||||
|
||||
g = Github(token)
|
||||
repo = g.get_repo(repo_name)
|
||||
issue = repo.get_issue(number=issue_number)
|
||||
|
||||
# Regex to find any file with an extension
|
||||
file_match = re.search(r"\b([\w-]+\.[\w]+)\b", issue.body, re.IGNORECASE)
|
||||
|
||||
if not file_match:
|
||||
print("No file found in issue.")
|
||||
return
|
||||
|
||||
file_name = file_match.group(1)
|
||||
result = g.search_code(f"repo:{repo_name} filename:{file_name}")
|
||||
|
||||
if result.totalCount == 0:
|
||||
result = g.search_code(f"repo:{repo_name} {file_name}")
|
||||
if result.totalCount == 0:
|
||||
print(f"No files found for {file_name}")
|
||||
return
|
||||
|
||||
file_path = result[0].path
|
||||
|
||||
# Get the commits for the file
|
||||
commits = repo.get_commits(path=file_path)
|
||||
|
||||
# Try to get the author of the first commit
|
||||
if commits.totalCount > 0:
|
||||
# The last commit in the list is the first commit
|
||||
first_commit = commits[commits.totalCount - 1]
|
||||
if first_commit.author:
|
||||
username = first_commit.author.login
|
||||
print(
|
||||
f"Assigning {username} to Issue #{issue_number} for File {file_path} based on the first commit."
|
||||
)
|
||||
issue.add_to_assignees(username)
|
||||
return
|
||||
|
||||
# If the file is a notebook and the first commit author wasn't found,
|
||||
# check the notebook metadata as a fallback.
|
||||
if file_name.endswith(".ipynb"):
|
||||
print(
|
||||
"Could not determine the first commit author, checking the notebook metadata."
|
||||
)
|
||||
file_content_encoded = repo.get_contents(file_path).content
|
||||
file_content = str(base64.b64decode(file_content_encoded))[:10000]
|
||||
match = re.search(
|
||||
r"Author.+https://github\.com/([^/\)]+)", file_content, flags=re.DOTALL
|
||||
)
|
||||
|
||||
if match:
|
||||
username = match.group(1)
|
||||
print(
|
||||
f"Assigning {username} to Issue #{issue_number} for File {file_path} based on notebook metadata."
|
||||
)
|
||||
issue.add_to_assignees(username)
|
||||
return
|
||||
|
||||
print(f"No User Found for {file_name}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,25 @@
|
||||
name: Links
|
||||
|
||||
on:
|
||||
repository_dispatch:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: "00 18 * * *"
|
||||
|
||||
jobs:
|
||||
linkChecker:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
|
||||
- name: Link Checker
|
||||
id: lychee
|
||||
uses: lycheeverse/lychee-action@v2
|
||||
|
||||
- name: Create Issue From File
|
||||
if: env.lychee_exit_code != 0
|
||||
uses: peter-evans/create-issue-from-file@v5
|
||||
with:
|
||||
title: Link Checker Report
|
||||
content-filepath: ./lychee/out.md
|
||||
labels: report, automated issue
|
||||
@@ -0,0 +1,66 @@
|
||||
#################################
|
||||
#################################
|
||||
## Super Linter GitHub Actions ##
|
||||
#################################
|
||||
#################################
|
||||
name: Lint Code Base
|
||||
|
||||
#
|
||||
# Documentation:
|
||||
# https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions
|
||||
#
|
||||
|
||||
#############################
|
||||
# Start the job on all push #
|
||||
#############################
|
||||
on:
|
||||
pull_request:
|
||||
branches: [main]
|
||||
|
||||
###############
|
||||
# Set the Job #
|
||||
###############
|
||||
jobs:
|
||||
build:
|
||||
# Name the Job
|
||||
name: Lint Code Base
|
||||
# Set the agent to run on
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
##################
|
||||
# Load all steps #
|
||||
##################
|
||||
steps:
|
||||
##########################
|
||||
# Checkout the code base #
|
||||
##########################
|
||||
- name: Checkout Code
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
# Full git history is needed to get a proper list of changed files within `super-linter`
|
||||
fetch-depth: 0
|
||||
|
||||
################################
|
||||
# Run Linter against code base #
|
||||
################################
|
||||
- name: Lint Code Base
|
||||
uses: super-linter/super-linter/slim@v7
|
||||
env:
|
||||
DEFAULT_BRANCH: main
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
FILTER_REGEX_EXCLUDE: "^(.github/|gemini/sample-apps/finance-advisor-spanner/|gemini/sample-apps/quickbot/).*"
|
||||
LOG_LEVEL: WARN
|
||||
SHELLCHECK_OPTS: -e SC1091 -e 2086
|
||||
VALIDATE_ALL_CODEBASE: false
|
||||
VALIDATE_PYTHON_PYINK: false
|
||||
VALIDATE_PYTHON_ISORT: false
|
||||
VALIDATE_PYTHON_BLACK: false
|
||||
VALIDATE_CHECKOV: false
|
||||
VALIDATE_JAVASCRIPT_STANDARD: false
|
||||
VALIDATE_TYPESCRIPT_STANDARD: false
|
||||
VALIDATE_JUPYTER_NBQA_FLAKE8: false
|
||||
VALIDATE_JUPYTER_NBQA_PYLINT: false
|
||||
VALIDATE_JUPYTER_NBQA_ISORT: false
|
||||
VALIDATE_JUPYTER_NBQA_MYPY: false
|
||||
VALIDATE_JUPYTER_NBQA_BLACK: false
|
||||
VALIDATE_JSCPD: false
|
||||
@@ -0,0 +1,156 @@
|
||||
name: Check Spelling
|
||||
|
||||
# Comment management is handled through a secondary job, for details see:
|
||||
# https://github.com/check-spelling/check-spelling/wiki/Feature%3A-Restricted-Permissions
|
||||
#
|
||||
# `jobs.comment-push` runs when a push is made to a repository and the `jobs.spelling` job needs to make a comment
|
||||
# (in odd cases, it might actually run just to collapse a comment, but that's fairly rare)
|
||||
# it needs `contents: write` in order to add a comment.
|
||||
#
|
||||
# `jobs.comment-pr` runs when a pull_request is made to a repository and the `jobs.spelling` job needs to make a comment
|
||||
# or collapse a comment (in the case where it had previously made a comment and now no longer needs to show a comment)
|
||||
# it needs `pull-requests: write` in order to manipulate those comments.
|
||||
|
||||
# Updating pull request branches is managed via comment handling.
|
||||
# For details, see: https://github.com/check-spelling/check-spelling/wiki/Feature:-Update-expect-list
|
||||
#
|
||||
# These elements work together to make it happen:
|
||||
#
|
||||
# `on.issue_comment`
|
||||
# This event listens to comments by users asking to update the metadata.
|
||||
#
|
||||
# `jobs.update`
|
||||
# This job runs in response to an issue_comment and will push a new commit
|
||||
# to update the spelling metadata.
|
||||
#
|
||||
# `with.experimental_apply_changes_via_bot`
|
||||
# Tells the action to support and generate messages that enable it
|
||||
# to make a commit to update the spelling metadata.
|
||||
#
|
||||
# `with.ssh_key`
|
||||
# In order to trigger workflows when the commit is made, you can provide a
|
||||
# secret (typically, a write-enabled github deploy key).
|
||||
#
|
||||
# For background, see: https://github.com/check-spelling/check-spelling/wiki/Feature:-Update-with-deploy-key
|
||||
|
||||
# Sarif reporting
|
||||
#
|
||||
# Access to Sarif reports is generally restricted (by GitHub) to members of the repository.
|
||||
#
|
||||
# Requires enabling `security-events: write`
|
||||
# and configuring the action with `use_sarif: 1`
|
||||
#
|
||||
# For information on the feature, see: https://github.com/check-spelling/check-spelling/wiki/Feature:-Sarif-output
|
||||
|
||||
# Minimal workflow structure:
|
||||
#
|
||||
# on:
|
||||
# push:
|
||||
# ...
|
||||
# pull_request_target:
|
||||
# ...
|
||||
# jobs:
|
||||
# # you only want the spelling job, all others should be omitted
|
||||
# spelling:
|
||||
# # remove `security-events: write` and `use_sarif: 1`
|
||||
# # remove `experimental_apply_changes_via_bot: 1`
|
||||
# ... otherwise adjust the `with:` as you wish
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- "**"
|
||||
types:
|
||||
- "opened"
|
||||
- "reopened"
|
||||
- "synchronize"
|
||||
|
||||
jobs:
|
||||
spelling:
|
||||
name: Check Spelling
|
||||
permissions:
|
||||
contents: read
|
||||
actions: read
|
||||
security-events: write
|
||||
outputs:
|
||||
followup: ${{ steps.spelling.outputs.followup }}
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ contains(github.event_name, 'pull_request') || github.event_name == 'push' }}
|
||||
concurrency:
|
||||
group: spelling-${{ github.event.pull_request.number || github.ref }}
|
||||
# note: If you use only_check_changed_files, you do not want cancel-in-progress
|
||||
cancel-in-progress: false
|
||||
steps:
|
||||
- name: check-spelling
|
||||
id: spelling
|
||||
uses: check-spelling/check-spelling@main
|
||||
with:
|
||||
suppress_push_for_open_pull_request: ${{ github.actor != 'dependabot[bot]' && 1 }}
|
||||
checkout: true
|
||||
check_file_names: 1
|
||||
spell_check_this: check-spelling/spell-check-this@main
|
||||
post_comment: 0
|
||||
use_magic_file: 1
|
||||
report-timing: 1
|
||||
warnings: bad-regex,binary-file,deprecated-feature,ignored-expect-variant,large-file,limited-references,no-newline-at-eof,noisy-file,non-alpha-in-dictionary,token-is-substring,unexpected-line-ending,whitespace-in-dictionary,minified-file,unsupported-configuration,no-files-to-check,unclosed-block-ignore-begin,unclosed-block-ignore-end
|
||||
experimental_apply_changes_via_bot: 1
|
||||
dictionary_source_prefixes: '{"cspell": "https://raw.githubusercontent.com/streetsidesoftware/cspell-dicts/main/dictionaries/"}'
|
||||
extra_dictionaries: |
|
||||
cspell:aws/dict/aws.txt
|
||||
cspell:bash/samples/bash-words.txt
|
||||
cspell:companies/dict/companies.txt
|
||||
cspell:css/dict/css.txt
|
||||
cspell:data-science/dict/data-science-models.txt
|
||||
cspell:data-science/dict/data-science.txt
|
||||
cspell:data-science/dict/data-science-tools.txt
|
||||
cspell:dart/src/dart.txt
|
||||
cspell:de_DE/src/German_de_DE.dic
|
||||
cspell:django/requirements.txt
|
||||
cspell:django/dict/django.txt
|
||||
cspell:docker/src/docker-words.txt
|
||||
cspell:en_shared/dict/acronyms.txt
|
||||
cspell:en_shared/dict/shared-additional-words.txt
|
||||
cspell:en_GB/en_GB.trie
|
||||
cspell:en_US/en_US.trie
|
||||
cspell:filetypes/src/filetypes.txt
|
||||
cspell:flutter/src/flutter.txt
|
||||
cspell:fonts/dict/fonts.txt
|
||||
cspell:fr_FR/fr-fr.trie
|
||||
cspell:fullstack/dict/fullstack.txt
|
||||
cspell:golang/dict/go.txt
|
||||
cspell:google/dict/google.txt
|
||||
cspell:html/dict/html.txt
|
||||
cspell:it_IT/dict/it-it.trie
|
||||
cspell:java/src/java.txt
|
||||
cspell:k8s/dict/k8s.txt
|
||||
cspell:mnemonics/dict/mnemonics.txt
|
||||
cspell:monkeyc/src/monkeyc_keywords.txt
|
||||
cspell:node/dict/node.txt
|
||||
cspell:npm/dict/npm.txt
|
||||
cspell:people-names/dict/people-names.txt
|
||||
cspell:php/dict/php.txt
|
||||
cspell:python/dict/python.txt
|
||||
cspell:python/dict/python-common.txt
|
||||
cspell:shell/dict/shell-all-words.txt
|
||||
cspell:software-terms/dict/softwareTerms.txt
|
||||
cspell:software-terms/dict/webServices.txt
|
||||
cspell:sql/src/common-terms.txt
|
||||
cspell:sql/src/sql.txt
|
||||
cspell:sql/src/tsql.txt
|
||||
cspell:svelte/dict/svelte.txt
|
||||
cspell:terraform/dict/terraform.txt
|
||||
cspell:typescript/dict/typescript.txt
|
||||
check_extra_dictionaries:
|
||||
cspell:cryptocurrencies/dict/cryptocurrencies.txt
|
||||
cspell:gaming-terms/dict/gaming-terms.txt
|
||||
cspell:latex/dict/latex.txt
|
||||
cspell:public-licenses/src/additional-licenses.txt
|
||||
cspell:public-licenses/src/generated/public-licenses.txt
|
||||
ignore-pattern: "[^'a-záéíóúñçüA-ZÁÉÍÓÚÑÇÜ]"
|
||||
upper-pattern: "[A-ZÁÉÍÓÚÑÇÜ]"
|
||||
lower-pattern: "[a-záéíóúñçü]"
|
||||
not-lower-pattern: "[^a-záéíóúñçü]"
|
||||
not-upper-or-lower-pattern: "[^A-ZÁÉÍÓÚÑÇÜa-záéíóúñçü]"
|
||||
punctuation-pattern: "'"
|
||||
only_check_changed_files: true
|
||||
longest_word: "10"
|
||||
Reference in New Issue
Block a user