├── .github ├── CODEOWNERS ├── FUNDING.yml ├── boring-cyborg.yml ├── renovate.json ├── settings.yml └── workflows │ ├── ci.yml │ ├── composer-diff.yaml │ ├── release-managment.yaml │ └── set-milestone-on-pr.yaml ├── LICENSE ├── README.md ├── action.yaml ├── composer.json ├── composer.lock ├── generate-comments ├── Dockerfile-build ├── comment.php ├── composer.json ├── composer.lock ├── entrypoint.sh └── post-process.php └── images └── comment.png /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @WyriHaximus 2 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: WyriHaximus -------------------------------------------------------------------------------- /.github/boring-cyborg.yml: -------------------------------------------------------------------------------- 1 | labelPRBasedOnFilePath: 2 | "Dependencies 📦": 3 | - Dockerfile* 4 | - composer.* 5 | - package.json 6 | - package-lock.json 7 | - yarn.lock 8 | "Docker 🐳": 9 | - Dockerfile* 10 | - .docker/**/* 11 | "Image 🖼": 12 | - "**/*.gif" 13 | - "**/*.jpg" 14 | - "**/*.jpeg" 15 | - "**/*.png" 16 | - "**/*.webp" 17 | "CSS 👩‍🎨": 18 | - "**/*.css" 19 | "HTML 👷‍♀️": 20 | - "**/*.htm" 21 | - "**/*.html" 22 | "NEON 🦹‍♂️": 23 | - "**/*.neon" 24 | "MarkDown 📝": 25 | - "**/*.md" 26 | "YAML 🍄": 27 | - "**/*.yml" 28 | - "**/*.yaml" 29 | "JSON 👨‍💼": 30 | - "**/*.json" 31 | "Go 🐹": 32 | - "**/*.go" 33 | "JavaScript 🦏": 34 | - "**/*.js" 35 | - package.json 36 | - package-lock.json 37 | - yarn.lock 38 | "PHP 🐘": 39 | - "**/*.php" 40 | - composer.* 41 | "Configuration ⚙": 42 | - .github/* 43 | "CI 🚧": 44 | - .github/workflows/* 45 | - .scrutinizer.yml 46 | "Templates 🌲": 47 | - "**/*.twig" 48 | - "**/*.tpl" 49 | "Helm ☸": 50 | - .helm/**/* 51 | "Tests 🧪": 52 | - tests/**/* 53 | "Source 🔮": 54 | - src/**/* 55 | 56 | labelerFlags: 57 | labelOnPRUpdates: true 58 | -------------------------------------------------------------------------------- /.github/renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": [ 4 | "github>WyriHaximus/renovate-config:php-package" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /.github/settings.yml: -------------------------------------------------------------------------------- 1 | repository: 2 | private: false 3 | has_issues: true 4 | has_wiki: false 5 | has_downloads: true 6 | default_branch: master 7 | allow_squash_merge: false 8 | allow_merge_commit: true 9 | allow_rebase_merge: false 10 | 11 | # Labels: define labels for Issues and Pull Requests 12 | labels: 13 | - name: "Dependencies 📦" 14 | color: 0025ff 15 | description: "Pull requests that update a dependency file" 16 | - name: "Image 🖼" 17 | color: 00ffff 18 | - name: "HTML 👷‍♀️" 19 | color: ffffff 20 | - name: "CSS 👩‍🎨" 21 | color: b3b3b3 22 | - name: "JavaScript 🦏" 23 | color: ffff00 24 | - name: "Go 🐹" 25 | color: 00ADD8 26 | - name: "JSON 👨‍💼" 27 | color: 00ADD8 28 | - name: "NEON 🦹‍♂️" 29 | color: CE3262 30 | - name: "MarkDown 📝" 31 | color: 000000 32 | - name: "YAML 🍄" 33 | color: ff1aff 34 | - name: "Templates 🌲" 35 | color: 009933 36 | - name: "Helm ☸" 37 | color: 091C84 38 | - name: "Tests 🧪" 39 | color: ffe6e6 40 | - name: "Source 🔮" 41 | color: e6ffe6 42 | - name: "Configuration ⚙" 43 | color: b3b3cc 44 | - name: "PHP 🐘" 45 | color: 8892BF 46 | description: "Hypertext Pre Processor" 47 | - name: "Docker 🐳" 48 | color: 0db7ed 49 | description: "Pull requests that relate to Docker" 50 | - name: "CI 🚧" 51 | color: ffff00 52 | - name: "Feature 🏗" 53 | color: 66ff99 54 | - name: "Documentation 📚" 55 | color: 6666ff 56 | - name: "Security 🕵️‍♀️" 57 | color: ff0000 58 | - name: "Hacktoberfest 🎃" 59 | color: 152347 60 | - name: "Bug 🐞" 61 | color: d73a4a 62 | description: "Something isn't working" 63 | oldname: bug 64 | - name: "Duplicate ♊" 65 | color: cfd3d7 66 | description: "This issue or pull request already exists" 67 | oldname: duplicate 68 | - name: "Enhancement ✨" 69 | color: a2eeef 70 | description: "New feature or request" 71 | oldname: enhancement 72 | - name: "Good First Issue" 73 | color: 7057ff 74 | description: "Good for newcomers" 75 | oldname: "good first issue" 76 | - name: "Help Wanted" 77 | color: 008672 78 | description: "Extra attention is needed" 79 | oldname: "help wanted" 80 | - name: Invalid 81 | color: e4e669 82 | description: "This doesn't seem right" 83 | oldname: invalid 84 | - name: "Question ❓" 85 | color: d876e3 86 | description: "Further information is requested" 87 | oldname: question 88 | - name: "Will not be fixed 🛑" 89 | color: ffffff 90 | description: "This will not be worked on" 91 | oldname: wontfix 92 | - name: "Sponsor Request ❤️" 93 | color: fedbf0 94 | description: "Issue/PR opened by sponsor" 95 | 96 | branches: 97 | - name: master 98 | protection: 99 | required_pull_request_reviews: 100 | required_approving_review_count: 1 101 | dismiss_stale_reviews: true 102 | require_code_owner_reviews: true 103 | # Required. Require status checks to pass before merging. Set to null to disable 104 | required_status_checks: 105 | # Required. Require branches to be up to date before merging. 106 | strict: true 107 | # Required. The list of status checks to require in order to merge into this branch 108 | contexts: [] 109 | # Required. Enforce all configured restrictions for administrators. Set to true to enforce required status checks for repository administrators. Set to null to disable. 110 | enforce_admins: true 111 | # Required. Restrict who can push to this branch. Team and user restrictions are only available for organization-owned repositories. Set to null to disable. 112 | restrictions: 113 | apps: [] 114 | users: [] 115 | teams: [] 116 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: Continuous Integration 2 | env: 3 | DOCKER_BUILDKIT: 1 4 | on: 5 | push: 6 | branches: 7 | - main 8 | pull_request: 9 | jobs: 10 | generate-ref: 11 | name: Generate Ref 12 | runs-on: ubuntu-latest 13 | outputs: 14 | REF: ${{ steps.generate-ref.outputs.ref }} 15 | steps: 16 | - uses: actions/checkout@v4 17 | - id: generate-ref 18 | name: Generate Ref 19 | run: | 20 | if [ "${{ github.event_name }}" == "pull_request" ] ; then 21 | ref=$(php -r "echo str_replace('/', '-SLASH-', '${{ github.event.pull_request.head.ref }}');") 22 | echo "$ref" 23 | printf "::set-output name=ref::%s" $ref 24 | exit 0 25 | fi 26 | echo "${GITHUB_REF##*/}" 27 | echo "::set-output name=ref::${GITHUB_REF##*/}" 28 | lint-dockerfile: 29 | name: Lint Dockerfile 30 | runs-on: ubuntu-latest 31 | steps: 32 | - uses: actions/checkout@v4 33 | - name: Lint Dockerfile 34 | uses: docker://hadolint/hadolint:latest-debian 35 | with: 36 | entrypoint: hadolint 37 | args: generate-comments/Dockerfile-build 38 | build-docker-image: 39 | name: Build Docker image 40 | needs: 41 | - generate-ref 42 | - lint-dockerfile 43 | runs-on: ubuntu-latest 44 | steps: 45 | - uses: actions/checkout@v4 46 | - run: mkdir ./docker-image/ 47 | - name: Login to GitHub Container Registry 48 | if: github.actor != 'dependabot[bot]' 49 | run: | 50 | echo "${{ secrets.GITHUB_TOKEN }}" | \ 51 | docker login ghcr.io \ 52 | --username "${GITHUB_ACTOR}" \ 53 | --password-stdin 54 | - name: Set up QEMU 55 | uses: docker/setup-qemu-action@v3 56 | - name: Set up Docker Buildx 57 | id: buildx 58 | uses: docker/setup-buildx-action@v3 59 | with: 60 | install: true 61 | - name: Inspect builder 62 | run: | 63 | echo "Name: ${{ steps.buildx.outputs.name }}" 64 | echo "Endpoint: ${{ steps.buildx.outputs.endpoint }}" 65 | echo "Status: ${{ steps.buildx.outputs.status }}" 66 | echo "Flags: ${{ steps.buildx.outputs.flags }}" 67 | echo "Platforms: ${{ steps.buildx.outputs.platforms }}" 68 | - run: docker version 69 | - run: docker images 70 | env: 71 | REF: ${{ needs.generate-ref.outputs.ref }} 72 | - run: docker build --platform=linux/arm64,linux/amd64 --output=type=registry --no-cache -t "$(echo "ghcr.io/${GITHUB_REPOSITORY}:${{ needs.generate-ref.outputs.ref }}" | tr '[:upper:]' '[:lower:]')" ./generate-comments/ -f generate-comments/Dockerfile-build --target=runtime 73 | - run: | 74 | printf "FROM %s" $(echo "ghcr.io/${GITHUB_REPOSITORY}:${{ needs.generate-ref.outputs.ref }}" | tr '[:upper:]' '[:lower:]') >> Dockerfile.tag 75 | docker build --platform=linux/arm64,linux/amd64 --output=type=registry --no-cache -f Dockerfile.tag -t $(echo "ghcr.io/${GITHUB_REPOSITORY}:sha-${GITHUB_SHA}" | tr '[:upper:]' '[:lower:]') . 76 | - run: docker images 77 | comment-composer-lock-diff: 78 | name: Comment composer.lock diff 79 | needs: 80 | - build-docker-image 81 | runs-on: ubuntu-latest 82 | if: ${{ github.event_name == 'pull_request' }} 83 | steps: 84 | - uses: actions/checkout@v4 85 | - name: Check if composer.lock has changed 86 | id: composer-lock-changed 87 | uses: tj-actions/changed-files@v46 88 | with: 89 | files: composer.lock 90 | - name: Download Images 91 | if: github.actor == 'dependabot[bot]' 92 | uses: actions/download-artifact@v4 93 | with: 94 | name: docker-image 95 | path: ./docker-image 96 | - run: docker load --input ./docker-image/image.tar 97 | if: github.actor == 'dependabot[bot]' 98 | - run: git branch 99 | - run: sed -i $(echo "s/main/sha-$GITHUB_SHA/g") action.yaml 100 | - name: Comment composer.lock diff 101 | if: github.actor != 'dependabot[bot]' 102 | uses: ./ 103 | env: 104 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 105 | - name: Comment composer.lock diff 106 | id: composerdiff 107 | uses: ./ 108 | with: 109 | dryRun: yes 110 | env: 111 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 112 | - name: Show production table 113 | run: echo "${PRODUCTION}" 114 | env: 115 | PRODUCTION: ${{ steps.composerdiff.outputs.production }} 116 | - name: Show development table 117 | run: echo "${DEVELOPMENT}" 118 | env: 119 | DEVELOPMENT: ${{ steps.composerdiff.outputs.development }} 120 | - name: Assert Production Output 121 | if: steps.composer-lock-changed.outputs.any_changed == 'true' && ((steps.composerdiff.outputs.development == '' && steps.composerdiff.outputs.production != '') || (steps.composerdiff.outputs.development != '' && steps.composerdiff.outputs.production != '')) 122 | uses: nick-fields/assert-action@v2 123 | with: 124 | expected: "| Prod Packages" 125 | actual: ${{ steps.composerdiff.outputs.production }} 126 | comparison: startsWith 127 | - name: Assert Development Output 128 | if: steps.composer-lock-changed.outputs.any_changed == 'true' && ((steps.composerdiff.outputs.development != '' && steps.composerdiff.outputs.production == '') || (steps.composerdiff.outputs.development != '' && steps.composerdiff.outputs.production != '')) 129 | uses: nick-fields/assert-action@v2 130 | with: 131 | expected: "🚧 Composer Development Dependency changes 🚧" 132 | actual: ${{ steps.composerdiff.outputs.development }} 133 | comparison: startsWith 134 | -------------------------------------------------------------------------------- /.github/workflows/composer-diff.yaml: -------------------------------------------------------------------------------- 1 | name: Composer Diff 2 | on: 3 | ## To make this workflow work in the simplest way possible, without a PAT or juggling information between, we need to 4 | ## run it with permissions as if it was already merged. 5 | ## Refs: https://docs.github.com/en/actions/reference/events-that-trigger-workflows#pull_request_target 6 | ## Refs: https://securitylab.github.com/research/github-actions-preventing-pwn-requests/ 7 | ## Refs: https://twitter.com/WyriHaximus/status/1393679576828686340 8 | pull_request_target: 9 | types: 10 | - opened 11 | - synchronize 12 | - reopened 13 | ## This workflow needs the `pull-request` permissions to work 14 | ## Refs: https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#permissions 15 | permissions: 16 | pull-requests: write 17 | jobs: 18 | comment-composer-lock-diff: 19 | name: Comment composer.lock diff 20 | runs-on: ubuntu-latest 21 | steps: 22 | - name: Comment composer.lock diff 23 | uses: WyriHaximus/github-action-composer.lock-diff@v2 24 | env: 25 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 26 | -------------------------------------------------------------------------------- /.github/workflows/release-managment.yaml: -------------------------------------------------------------------------------- 1 | name: Release Management 2 | on: 3 | pull_request: 4 | types: 5 | - opened 6 | - labeled 7 | - unlabeled 8 | - synchronize 9 | - reopened 10 | milestone: 11 | types: 12 | - closed 13 | permissions: 14 | contents: write 15 | issues: write 16 | pull-requests: write 17 | packages: write 18 | jobs: 19 | release-managment: 20 | name: Release Management 21 | secrets: inherit 22 | uses: WyriHaximus/github-workflows/.github/workflows/github-action-release-managment.yaml@main 23 | with: 24 | milestone: ${{ github.event.milestone.title }} 25 | description: ${{ github.event.milestone.description }} 26 | mustCreateCommit: true 27 | preReleaseScript: | 28 | sed -i 's/main/${{ github.event.milestone.title }}/g' action.yaml 29 | cat action.yaml 30 | git add action.yaml 31 | -------------------------------------------------------------------------------- /.github/workflows/set-milestone-on-pr.yaml: -------------------------------------------------------------------------------- 1 | name: Set Milestone 2 | on: 3 | pull_request: 4 | types: 5 | - assigned 6 | - opened 7 | - synchronize 8 | - reopened 9 | - edited 10 | - ready_for_review 11 | - review_requested 12 | jobs: 13 | set-milestone: 14 | runs-on: ubuntu-latest 15 | steps: 16 | - uses: actions/checkout@v4 17 | if: github.event.pull_request.milestone == null 18 | - name: 'Get Previous tag' 19 | if: github.event.pull_request.milestone == null 20 | id: previousgittag 21 | continue-on-error: true 22 | uses: "WyriHaximus/github-action-get-previous-tag@master" 23 | env: 24 | GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" 25 | - run: | 26 | if [ $(echo ${GITTAG} | wc -c) -eq 1 ] ; then 27 | printf "Falling back to v1.0.0 as \"%s\" is unexpectedly empty\r\n" "${GITTAG}" 28 | printf "::set-output name=tag::%s" "v1.0.0" 29 | exit 0 30 | fi 31 | 32 | printf "Using \"%s\"\r\n" "${GITTAG}" 33 | printf "::set-output name=tag::%s" "${GITTAG}" 34 | name: Fall back to v1.0.0 if we haven't tagged anything yet 35 | if: github.event.pull_request.milestone == null 36 | id: previoustag 37 | env: 38 | GITTAG: ${{ steps.previousgittag.outputs.tag }} 39 | - name: 'Get next versions' 40 | if: github.event.pull_request.milestone == null 41 | id: semvers 42 | uses: "WyriHaximus/github-action-next-semvers@master" 43 | with: 44 | version: ${{ steps.previoustag.outputs.tag }} 45 | strict: false 46 | - run: | 47 | if [ "$IS_DEPENDABOT" = true ] ; then 48 | echo "Is dependabot PR" 49 | if [[ "$(printenv MILESTONES | jq -c '. | length')" -eq "0" ]] ; then 50 | echo "No milestone exists, usint patch version for next milestone" 51 | printf "::set-output name=milestone::%s" "${PATCH}" 52 | exit 0 53 | fi 54 | fi 55 | 56 | echo "Using default minor version for next milestone" 57 | printf "::set-output name=milestone::%s" "${MINOR}" 58 | name: Decide which version to use as milestone 59 | if: github.event.pull_request.milestone == null 60 | id: milestone 61 | env: 62 | MILESTONES: ${{ steps.milestones.outputs.milestones }} 63 | MAJOR: ${{ steps.semvers.outputs.v_major }} 64 | MINOR: ${{ steps.semvers.outputs.v_minor }} 65 | PATCH: ${{ steps.semvers.outputs.v_patch }} 66 | IS_DEPENDABOT: ${{ contains(github.ref, 'dependabot') }} 67 | GITTAG: ${{ steps.previousgittag.outputs.tag }} 68 | PREVIOUSTAG: ${{ steps.previoustag.outputs.tag }} 69 | - name: 'Get Milestones' 70 | if: github.event.pull_request.milestone == null 71 | uses: "WyriHaximus/github-action-get-milestones@master" 72 | id: milestones 73 | env: 74 | GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" 75 | - run: printf "::set-output name=number::%s" $(printenv MILESTONES | jq --arg MILESTONE $(printenv MILESTONE) '.[] | select(.title == $MILESTONE) | .number') 76 | if: github.event.pull_request.milestone == null 77 | id: querymilestone 78 | env: 79 | MILESTONES: ${{ steps.milestones.outputs.milestones }} 80 | MILESTONE: ${{ steps.milestone.outputs.milestone }} 81 | - name: 'Create Milestone' 82 | if: github.event.pull_request.milestone == null && steps.querymilestone.outputs.number == '' 83 | id: createmilestone 84 | uses: "WyriHaximus/github-action-create-milestone@master" 85 | with: 86 | title: ${{ steps.milestone.outputs.milestone }} 87 | env: 88 | GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" 89 | - name: 'Select found or created Milestone' 90 | if: github.event.pull_request.milestone == null 91 | id: selectmilestone 92 | run: | 93 | if [ $(echo ${QUERY_NUMBER} | wc -c) -eq 1 ] ; then 94 | printf "::set-output name=number::%s" "${CREATED_NUMBER}" 95 | exit 0 96 | fi 97 | 98 | printf "::set-output name=number::%s" "${QUERY_NUMBER}" 99 | env: 100 | CREATED_NUMBER: ${{ steps.createmilestone.outputs.number }} 101 | QUERY_NUMBER: ${{ steps.querymilestone.outputs.number }} 102 | - name: 'Set Milestone' 103 | if: github.event.pull_request.milestone == null 104 | uses: "WyriHaximus/github-action-set-milestone@master" 105 | with: 106 | issue_number: ${{ github.event.pull_request.number }} 107 | milestone_number: ${{ steps.selectmilestone.outputs.number }} 108 | env: 109 | GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" 110 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Cees-Jan Kiewiet 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # github-action-composer.lock-diff 2 | 3 | GitHub Action that diffs composer.lock between current branch and default branch 4 | 5 | ![Example output showing this action in action](images/comment.png) 6 | 7 | ## Options (inputs) 8 | 9 | This action supports the following option. 10 | 11 | ### dryRun 12 | 13 | Whether to run this action in dry-run mode or not. Setting this to `yes` will prevent this action from commenting. 14 | 15 | * *Required*: `No` 16 | * *Type*: `string` 17 | * *Example*: `yes` 18 | 19 | ### workingDirectory 20 | 21 | Which directory to run the composer diffing in. 22 | 23 | * *Required*: `No` 24 | * *Type*: `string` 25 | * *Example*: `path/to/directory/` 26 | 27 | ## Output 28 | 29 | This action has two outputs: the `production` and `development` outputs respective tables for each set of dependencies. 30 | 31 | ## Example 32 | 33 | The following example comments on any PR, this example uses the `pull_request_target` trigger which gives it 34 | additional permissions. Be sure to read the [`documentation`](https://docs.github.com/en/actions/reference/events-that-trigger-workflows#pull_request_target) 35 | and this blog post on [`security`](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/) for 36 | using this special trigger. 37 | 38 | ```yaml 39 | name: Composer Diff 40 | on: 41 | ## To make this workflow work in the simplest way possible, without a PAT or juggling information between, we need to 42 | ## run it with permissions as if it was already merged. 43 | ## Refs: https://docs.github.com/en/actions/reference/events-that-trigger-workflows#pull_request_target 44 | ## Refs: https://securitylab.github.com/research/github-actions-preventing-pwn-requests/ 45 | ## Refs: https://twitter.com/WyriHaximus/status/1393679576828686340 46 | pull_request_target: 47 | types: 48 | - opened 49 | - synchronize 50 | - reopened 51 | ## This workflow needs the `pull-request` permissions to work 52 | ## Refs: https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#permissions 53 | permissions: 54 | pull-requests: write 55 | contents: read 56 | jobs: 57 | comment-composer-lock-diff: 58 | name: Comment composer.lock diff 59 | runs-on: ubuntu-latest 60 | steps: 61 | - name: Comment composer.lock diff 62 | uses: WyriHaximus/github-action-composer.lock-diff@v2 63 | env: 64 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 65 | ``` 66 | 67 | ## Reasoning 68 | 69 | The author of the [package](https://github.com/IonBazan/composer-diff/) used in this action also has an 70 | [Action](https://github.com/IonBazan/composer-diff-action) for it. Decided to build a different action so you always 71 | get the development and production dependencies changes in their own outputs and comments instead of just the output 72 | with everything depending on flags and no commenting (+ updates on pushes). That became `v1` of this action, `v2` 73 | introduces looking at the merged commit sha coming from the GitHub API. This sha is the sha of when the PR would be 74 | merged, meaning this action compares between what is currently there, the base branch, and what would be there is the 75 | PR this action runs on is merged. This is done because the head branch that contains the changeset for the PR might be 76 | behind on changes in the base branch, and thus the comparison would be wrong. 77 | 78 | ## License ## 79 | 80 | Copyright 2024 [Cees-Jan Kiewiet](http://wyrihaximus.net/) 81 | 82 | Permission is hereby granted, free of charge, to any person 83 | obtaining a copy of this software and associated documentation 84 | files (the "Software"), to deal in the Software without 85 | restriction, including without limitation the rights to use, 86 | copy, modify, merge, publish, distribute, sublicense, and/or sell 87 | copies of the Software, and to permit persons to whom the 88 | Software is furnished to do so, subject to the following 89 | conditions: 90 | 91 | The above copyright notice and this permission notice shall be 92 | included in all copies or substantial portions of the Software. 93 | 94 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 95 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 96 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 97 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 98 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 99 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 100 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 101 | OTHER DEALINGS IN THE SOFTWARE. 102 | -------------------------------------------------------------------------------- /action.yaml: -------------------------------------------------------------------------------- 1 | name: 'composer.lock Diff' 2 | description: 'GitHub Action that diffs composer.lock between current branch and default branch' 3 | branding: 4 | icon: 'grid' 5 | color: 'orange' 6 | inputs: 7 | dryRun: 8 | description: Generate the comment contents, but don't make the actual comments, set to "yes" to activate, off by default. 9 | required: false 10 | default: 'no' 11 | workingDirectory: 12 | description: Directory to execute the diff generator in 13 | required: false 14 | default: '' 15 | outputs: 16 | production: 17 | description: Changed production dependencies table 18 | development: 19 | description: Changed development dependencies table 20 | runs: 21 | using: "composite" 22 | steps: 23 | - name: Poke Pull Request to force Background Process generating a merged_commit_sha 24 | uses: actions/github-script@v7 25 | id: sha 26 | with: 27 | result-encoding: string 28 | retries: 3 29 | script: | 30 | let timeout = 500; 31 | var pr = (await github.rest.pulls.get({ 32 | pull_number: context.payload.pull_request.number, 33 | owner: context.payload.repository.owner.login, 34 | repo: context.payload.repository.name, 35 | })); 36 | while (timeout < 60000 && pr.data.merge_commit_sha == null) { 37 | timeout *= 2; 38 | await new Promise(r => setTimeout(r, timeout)); 39 | pr = (await github.rest.pulls.get({ 40 | pull_number: context.payload.pull_request.number, 41 | owner: context.payload.repository.owner.login, 42 | repo: context.payload.repository.name, 43 | })); 44 | } 45 | pr = (await github.rest.pulls.get({ 46 | pull_number: context.payload.pull_request.number, 47 | owner: context.payload.repository.owner.login, 48 | repo: context.payload.repository.name, 49 | })); 50 | require('fs').appendFileSync(process.env.GITHUB_OUTPUT, `sha=${pr.data.merge_commit_sha}\n`); 51 | # const requests = Array.from({length: 8}, (v, i) => 500 * Math.pow(2, i)).map(timeout => resolveShaAfterTimeout(timeout)); 52 | # console.log(requests); 53 | # const pr = await Promise.any(requests); 54 | # requests.forEach(request => request.cancel()); 55 | # const resolveShaAfterTimeout = async function (timeout) { 56 | # await new Promise(r => setTimeout(r, timeout)); 57 | # return await github.rest.pulls.get({ 58 | # pull_number: context.payload.pull_request.number, 59 | # owner: context.payload.repository.owner.login, 60 | # repo: context.payload.repository.name, 61 | # }); 62 | # }; 63 | - name: Checkout Head Sha 64 | uses: actions/checkout@v4 65 | with: 66 | ref: ${{ steps.sha.outputs.sha }} 67 | fetch-depth: 1 68 | path: .wyrihaximus-composer.lock-diff/checkout/sha-sha 69 | sparse-checkout-cone-mode: false 70 | sparse-checkout: | 71 | ${{ inputs.workingDirectory }}composer.json 72 | ${{ inputs.workingDirectory }}composer.lock 73 | - name: Checkout Base Ref 74 | uses: actions/checkout@v4 75 | with: 76 | ref: ${{ github.event.pull_request.base.ref }} 77 | fetch-depth: 1 78 | path: .wyrihaximus-composer.lock-diff/checkout/base-ref 79 | sparse-checkout-cone-mode: false 80 | sparse-checkout: | 81 | ${{ inputs.workingDirectory }}composer.json 82 | ${{ inputs.workingDirectory }}composer.lock 83 | - name: Generate Comments 84 | uses: docker://ghcr.io/wyrihaximus/github-action-composer.lock-diff:main 85 | with: 86 | dryRun: ${{ inputs.dryRun }} 87 | workingDirectory: ${{ inputs.workingDirectory }} 88 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wyrihaximus/composer.lock-diff", 3 | "description": "GitHub Action that diffs composer.lock between current branch and default branch", 4 | "require": { 5 | "php": "^8.3", 6 | "composer/composer": "^2.7.7", 7 | "guzzlehttp/guzzle": "^7.8.0", 8 | "ion-bazan/composer-diff": "^1.9", 9 | "symfony/console": "^7.0.0" 10 | }, 11 | "config": { 12 | "platform": { 13 | "php": "8.3.13" 14 | }, 15 | "preferred-install": "dist", 16 | "sort-packages": true, 17 | "allow-plugins": { 18 | "ion-bazan/composer-diff": true 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "3b6251ce102d0d50cd00499bf966b0dc", 8 | "packages": [ 9 | { 10 | "name": "composer/ca-bundle", 11 | "version": "1.2.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/composer/ca-bundle.git", 15 | "reference": "13a8d67799a4f1c0e6bb0abd788abbe9e95dee8e" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/composer/ca-bundle/zipball/13a8d67799a4f1c0e6bb0abd788abbe9e95dee8e", 20 | "reference": "13a8d67799a4f1c0e6bb0abd788abbe9e95dee8e", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "ext-openssl": "*", 25 | "ext-pcre": "*", 26 | "php": "^5.3.2 || ^7.0 || ^8.0" 27 | }, 28 | "require-dev": { 29 | "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8", 30 | "psr/log": "^1.0", 31 | "symfony/process": "^2.5 || ^3.0 || ^4.0" 32 | }, 33 | "type": "library", 34 | "extra": { 35 | "branch-alias": { 36 | "dev-master": "1.x-dev" 37 | } 38 | }, 39 | "autoload": { 40 | "psr-4": { 41 | "Composer\\CaBundle\\": "src" 42 | } 43 | }, 44 | "notification-url": "https://packagist.org/downloads/", 45 | "license": [ 46 | "MIT" 47 | ], 48 | "authors": [ 49 | { 50 | "name": "Jordi Boggiano", 51 | "email": "j.boggiano@seld.be", 52 | "homepage": "http://seld.be" 53 | } 54 | ], 55 | "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", 56 | "keywords": [ 57 | "cabundle", 58 | "cacert", 59 | "certificate", 60 | "ssl", 61 | "tls" 62 | ], 63 | "support": { 64 | "irc": "irc://irc.freenode.org/composer", 65 | "issues": "https://github.com/composer/ca-bundle/issues", 66 | "source": "https://github.com/composer/ca-bundle/tree/master" 67 | }, 68 | "time": "2019-07-30T05:22:27+00:00" 69 | }, 70 | { 71 | "name": "composer/class-map-generator", 72 | "version": "1.3.3", 73 | "source": { 74 | "type": "git", 75 | "url": "https://github.com/composer/class-map-generator.git", 76 | "reference": "61804f9973685ec7bead0fb7fe022825e3cd418e" 77 | }, 78 | "dist": { 79 | "type": "zip", 80 | "url": "https://api.github.com/repos/composer/class-map-generator/zipball/61804f9973685ec7bead0fb7fe022825e3cd418e", 81 | "reference": "61804f9973685ec7bead0fb7fe022825e3cd418e", 82 | "shasum": "" 83 | }, 84 | "require": { 85 | "composer/pcre": "^2.1 || ^3.1", 86 | "php": "^7.2 || ^8.0", 87 | "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7" 88 | }, 89 | "require-dev": { 90 | "phpstan/phpstan": "^1.6", 91 | "phpstan/phpstan-deprecation-rules": "^1", 92 | "phpstan/phpstan-phpunit": "^1", 93 | "phpstan/phpstan-strict-rules": "^1.1", 94 | "symfony/filesystem": "^5.4 || ^6", 95 | "symfony/phpunit-bridge": "^5" 96 | }, 97 | "type": "library", 98 | "extra": { 99 | "branch-alias": { 100 | "dev-main": "1.x-dev" 101 | } 102 | }, 103 | "autoload": { 104 | "psr-4": { 105 | "Composer\\ClassMapGenerator\\": "src" 106 | } 107 | }, 108 | "notification-url": "https://packagist.org/downloads/", 109 | "license": [ 110 | "MIT" 111 | ], 112 | "authors": [ 113 | { 114 | "name": "Jordi Boggiano", 115 | "email": "j.boggiano@seld.be", 116 | "homepage": "https://seld.be" 117 | } 118 | ], 119 | "description": "Utilities to scan PHP code and generate class maps.", 120 | "keywords": [ 121 | "classmap" 122 | ], 123 | "support": { 124 | "issues": "https://github.com/composer/class-map-generator/issues", 125 | "source": "https://github.com/composer/class-map-generator/tree/1.3.3" 126 | }, 127 | "funding": [ 128 | { 129 | "url": "https://packagist.com", 130 | "type": "custom" 131 | }, 132 | { 133 | "url": "https://github.com/composer", 134 | "type": "github" 135 | }, 136 | { 137 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 138 | "type": "tidelift" 139 | } 140 | ], 141 | "time": "2024-06-10T11:53:54+00:00" 142 | }, 143 | { 144 | "name": "composer/composer", 145 | "version": "2.7.7", 146 | "source": { 147 | "type": "git", 148 | "url": "https://github.com/composer/composer.git", 149 | "reference": "291942978f39435cf904d33739f98d7d4eca7b23" 150 | }, 151 | "dist": { 152 | "type": "zip", 153 | "url": "https://api.github.com/repos/composer/composer/zipball/291942978f39435cf904d33739f98d7d4eca7b23", 154 | "reference": "291942978f39435cf904d33739f98d7d4eca7b23", 155 | "shasum": "" 156 | }, 157 | "require": { 158 | "composer/ca-bundle": "^1.0", 159 | "composer/class-map-generator": "^1.3.3", 160 | "composer/metadata-minifier": "^1.0", 161 | "composer/pcre": "^2.1 || ^3.1", 162 | "composer/semver": "^3.3", 163 | "composer/spdx-licenses": "^1.5.7", 164 | "composer/xdebug-handler": "^2.0.2 || ^3.0.3", 165 | "justinrainbow/json-schema": "^5.2.11", 166 | "php": "^7.2.5 || ^8.0", 167 | "psr/log": "^1.0 || ^2.0 || ^3.0", 168 | "react/promise": "^2.8 || ^3", 169 | "seld/jsonlint": "^1.4", 170 | "seld/phar-utils": "^1.2", 171 | "seld/signal-handler": "^2.0", 172 | "symfony/console": "^5.4.11 || ^6.0.11 || ^7", 173 | "symfony/filesystem": "^5.4 || ^6.0 || ^7", 174 | "symfony/finder": "^5.4 || ^6.0 || ^7", 175 | "symfony/polyfill-php73": "^1.24", 176 | "symfony/polyfill-php80": "^1.24", 177 | "symfony/polyfill-php81": "^1.24", 178 | "symfony/process": "^5.4 || ^6.0 || ^7" 179 | }, 180 | "require-dev": { 181 | "phpstan/phpstan": "^1.11.0", 182 | "phpstan/phpstan-deprecation-rules": "^1.2.0", 183 | "phpstan/phpstan-phpunit": "^1.4.0", 184 | "phpstan/phpstan-strict-rules": "^1.6.0", 185 | "phpstan/phpstan-symfony": "^1.4.0", 186 | "symfony/phpunit-bridge": "^6.4.1 || ^7.0.1" 187 | }, 188 | "suggest": { 189 | "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", 190 | "ext-zip": "Enabling the zip extension allows you to unzip archives", 191 | "ext-zlib": "Allow gzip compression of HTTP requests" 192 | }, 193 | "bin": [ 194 | "bin/composer" 195 | ], 196 | "type": "library", 197 | "extra": { 198 | "branch-alias": { 199 | "dev-main": "2.7-dev" 200 | }, 201 | "phpstan": { 202 | "includes": [ 203 | "phpstan/rules.neon" 204 | ] 205 | } 206 | }, 207 | "autoload": { 208 | "psr-4": { 209 | "Composer\\": "src/Composer/" 210 | } 211 | }, 212 | "notification-url": "https://packagist.org/downloads/", 213 | "license": [ 214 | "MIT" 215 | ], 216 | "authors": [ 217 | { 218 | "name": "Nils Adermann", 219 | "email": "naderman@naderman.de", 220 | "homepage": "https://www.naderman.de" 221 | }, 222 | { 223 | "name": "Jordi Boggiano", 224 | "email": "j.boggiano@seld.be", 225 | "homepage": "https://seld.be" 226 | } 227 | ], 228 | "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", 229 | "homepage": "https://getcomposer.org/", 230 | "keywords": [ 231 | "autoload", 232 | "dependency", 233 | "package" 234 | ], 235 | "support": { 236 | "irc": "ircs://irc.libera.chat:6697/composer", 237 | "issues": "https://github.com/composer/composer/issues", 238 | "security": "https://github.com/composer/composer/security/policy", 239 | "source": "https://github.com/composer/composer/tree/2.7.7" 240 | }, 241 | "funding": [ 242 | { 243 | "url": "https://packagist.com", 244 | "type": "custom" 245 | }, 246 | { 247 | "url": "https://github.com/composer", 248 | "type": "github" 249 | }, 250 | { 251 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 252 | "type": "tidelift" 253 | } 254 | ], 255 | "time": "2024-06-10T20:11:12+00:00" 256 | }, 257 | { 258 | "name": "composer/metadata-minifier", 259 | "version": "1.0.0", 260 | "source": { 261 | "type": "git", 262 | "url": "https://github.com/composer/metadata-minifier.git", 263 | "reference": "c549d23829536f0d0e984aaabbf02af91f443207" 264 | }, 265 | "dist": { 266 | "type": "zip", 267 | "url": "https://api.github.com/repos/composer/metadata-minifier/zipball/c549d23829536f0d0e984aaabbf02af91f443207", 268 | "reference": "c549d23829536f0d0e984aaabbf02af91f443207", 269 | "shasum": "" 270 | }, 271 | "require": { 272 | "php": "^5.3.2 || ^7.0 || ^8.0" 273 | }, 274 | "require-dev": { 275 | "composer/composer": "^2", 276 | "phpstan/phpstan": "^0.12.55", 277 | "symfony/phpunit-bridge": "^4.2 || ^5" 278 | }, 279 | "type": "library", 280 | "extra": { 281 | "branch-alias": { 282 | "dev-main": "1.x-dev" 283 | } 284 | }, 285 | "autoload": { 286 | "psr-4": { 287 | "Composer\\MetadataMinifier\\": "src" 288 | } 289 | }, 290 | "notification-url": "https://packagist.org/downloads/", 291 | "license": [ 292 | "MIT" 293 | ], 294 | "authors": [ 295 | { 296 | "name": "Jordi Boggiano", 297 | "email": "j.boggiano@seld.be", 298 | "homepage": "http://seld.be" 299 | } 300 | ], 301 | "description": "Small utility library that handles metadata minification and expansion.", 302 | "keywords": [ 303 | "composer", 304 | "compression" 305 | ], 306 | "support": { 307 | "issues": "https://github.com/composer/metadata-minifier/issues", 308 | "source": "https://github.com/composer/metadata-minifier/tree/1.0.0" 309 | }, 310 | "funding": [ 311 | { 312 | "url": "https://packagist.com", 313 | "type": "custom" 314 | }, 315 | { 316 | "url": "https://github.com/composer", 317 | "type": "github" 318 | }, 319 | { 320 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 321 | "type": "tidelift" 322 | } 323 | ], 324 | "time": "2021-04-07T13:37:33+00:00" 325 | }, 326 | { 327 | "name": "composer/pcre", 328 | "version": "2.1.0", 329 | "source": { 330 | "type": "git", 331 | "url": "https://github.com/composer/pcre.git", 332 | "reference": "3fdb2807b31a78a40ad89570e30ec77466c98717" 333 | }, 334 | "dist": { 335 | "type": "zip", 336 | "url": "https://api.github.com/repos/composer/pcre/zipball/3fdb2807b31a78a40ad89570e30ec77466c98717", 337 | "reference": "3fdb2807b31a78a40ad89570e30ec77466c98717", 338 | "shasum": "" 339 | }, 340 | "require": { 341 | "php": "^7.2 || ^8.0" 342 | }, 343 | "require-dev": { 344 | "phpstan/phpstan": "^1.3", 345 | "phpstan/phpstan-strict-rules": "^1.1", 346 | "symfony/phpunit-bridge": "^5" 347 | }, 348 | "type": "library", 349 | "extra": { 350 | "branch-alias": { 351 | "dev-main": "2.x-dev" 352 | } 353 | }, 354 | "autoload": { 355 | "psr-4": { 356 | "Composer\\Pcre\\": "src" 357 | } 358 | }, 359 | "notification-url": "https://packagist.org/downloads/", 360 | "license": [ 361 | "MIT" 362 | ], 363 | "authors": [ 364 | { 365 | "name": "Jordi Boggiano", 366 | "email": "j.boggiano@seld.be", 367 | "homepage": "http://seld.be" 368 | } 369 | ], 370 | "description": "PCRE wrapping library that offers type-safe preg_* replacements.", 371 | "keywords": [ 372 | "PCRE", 373 | "preg", 374 | "regex", 375 | "regular expression" 376 | ], 377 | "support": { 378 | "issues": "https://github.com/composer/pcre/issues", 379 | "source": "https://github.com/composer/pcre/tree/2.1.0" 380 | }, 381 | "funding": [ 382 | { 383 | "url": "https://packagist.com", 384 | "type": "custom" 385 | }, 386 | { 387 | "url": "https://github.com/composer", 388 | "type": "github" 389 | }, 390 | { 391 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 392 | "type": "tidelift" 393 | } 394 | ], 395 | "time": "2022-11-16T18:32:04+00:00" 396 | }, 397 | { 398 | "name": "composer/semver", 399 | "version": "3.3.0", 400 | "source": { 401 | "type": "git", 402 | "url": "https://github.com/composer/semver.git", 403 | "reference": "f79c90ad4e9b41ac4dfc5d77bf398cf61fbd718b" 404 | }, 405 | "dist": { 406 | "type": "zip", 407 | "url": "https://api.github.com/repos/composer/semver/zipball/f79c90ad4e9b41ac4dfc5d77bf398cf61fbd718b", 408 | "reference": "f79c90ad4e9b41ac4dfc5d77bf398cf61fbd718b", 409 | "shasum": "" 410 | }, 411 | "require": { 412 | "php": "^5.3.2 || ^7.0 || ^8.0" 413 | }, 414 | "require-dev": { 415 | "phpstan/phpstan": "^1.4", 416 | "symfony/phpunit-bridge": "^4.2 || ^5" 417 | }, 418 | "type": "library", 419 | "extra": { 420 | "branch-alias": { 421 | "dev-main": "3.x-dev" 422 | } 423 | }, 424 | "autoload": { 425 | "psr-4": { 426 | "Composer\\Semver\\": "src" 427 | } 428 | }, 429 | "notification-url": "https://packagist.org/downloads/", 430 | "license": [ 431 | "MIT" 432 | ], 433 | "authors": [ 434 | { 435 | "name": "Nils Adermann", 436 | "email": "naderman@naderman.de", 437 | "homepage": "http://www.naderman.de" 438 | }, 439 | { 440 | "name": "Jordi Boggiano", 441 | "email": "j.boggiano@seld.be", 442 | "homepage": "http://seld.be" 443 | }, 444 | { 445 | "name": "Rob Bast", 446 | "email": "rob.bast@gmail.com", 447 | "homepage": "http://robbast.nl" 448 | } 449 | ], 450 | "description": "Semver library that offers utilities, version constraint parsing and validation.", 451 | "keywords": [ 452 | "semantic", 453 | "semver", 454 | "validation", 455 | "versioning" 456 | ], 457 | "support": { 458 | "irc": "irc://irc.freenode.org/composer", 459 | "issues": "https://github.com/composer/semver/issues", 460 | "source": "https://github.com/composer/semver/tree/3.3.0" 461 | }, 462 | "funding": [ 463 | { 464 | "url": "https://packagist.com", 465 | "type": "custom" 466 | }, 467 | { 468 | "url": "https://github.com/composer", 469 | "type": "github" 470 | }, 471 | { 472 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 473 | "type": "tidelift" 474 | } 475 | ], 476 | "time": "2022-03-15T08:35:57+00:00" 477 | }, 478 | { 479 | "name": "composer/spdx-licenses", 480 | "version": "1.5.7", 481 | "source": { 482 | "type": "git", 483 | "url": "https://github.com/composer/spdx-licenses.git", 484 | "reference": "c848241796da2abf65837d51dce1fae55a960149" 485 | }, 486 | "dist": { 487 | "type": "zip", 488 | "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/c848241796da2abf65837d51dce1fae55a960149", 489 | "reference": "c848241796da2abf65837d51dce1fae55a960149", 490 | "shasum": "" 491 | }, 492 | "require": { 493 | "php": "^5.3.2 || ^7.0 || ^8.0" 494 | }, 495 | "require-dev": { 496 | "phpstan/phpstan": "^0.12.55", 497 | "symfony/phpunit-bridge": "^4.2 || ^5" 498 | }, 499 | "type": "library", 500 | "extra": { 501 | "branch-alias": { 502 | "dev-main": "1.x-dev" 503 | } 504 | }, 505 | "autoload": { 506 | "psr-4": { 507 | "Composer\\Spdx\\": "src" 508 | } 509 | }, 510 | "notification-url": "https://packagist.org/downloads/", 511 | "license": [ 512 | "MIT" 513 | ], 514 | "authors": [ 515 | { 516 | "name": "Nils Adermann", 517 | "email": "naderman@naderman.de", 518 | "homepage": "http://www.naderman.de" 519 | }, 520 | { 521 | "name": "Jordi Boggiano", 522 | "email": "j.boggiano@seld.be", 523 | "homepage": "http://seld.be" 524 | }, 525 | { 526 | "name": "Rob Bast", 527 | "email": "rob.bast@gmail.com", 528 | "homepage": "http://robbast.nl" 529 | } 530 | ], 531 | "description": "SPDX licenses list and validation library.", 532 | "keywords": [ 533 | "license", 534 | "spdx", 535 | "validator" 536 | ], 537 | "support": { 538 | "irc": "irc://irc.freenode.org/composer", 539 | "issues": "https://github.com/composer/spdx-licenses/issues", 540 | "source": "https://github.com/composer/spdx-licenses/tree/1.5.7" 541 | }, 542 | "funding": [ 543 | { 544 | "url": "https://packagist.com", 545 | "type": "custom" 546 | }, 547 | { 548 | "url": "https://github.com/composer", 549 | "type": "github" 550 | }, 551 | { 552 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 553 | "type": "tidelift" 554 | } 555 | ], 556 | "time": "2022-05-23T07:37:50+00:00" 557 | }, 558 | { 559 | "name": "composer/xdebug-handler", 560 | "version": "2.0.2", 561 | "source": { 562 | "type": "git", 563 | "url": "https://github.com/composer/xdebug-handler.git", 564 | "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339" 565 | }, 566 | "dist": { 567 | "type": "zip", 568 | "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/84674dd3a7575ba617f5a76d7e9e29a7d3891339", 569 | "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339", 570 | "shasum": "" 571 | }, 572 | "require": { 573 | "php": "^5.3.2 || ^7.0 || ^8.0", 574 | "psr/log": "^1 || ^2 || ^3" 575 | }, 576 | "require-dev": { 577 | "phpstan/phpstan": "^0.12.55", 578 | "symfony/phpunit-bridge": "^4.2 || ^5" 579 | }, 580 | "type": "library", 581 | "autoload": { 582 | "psr-4": { 583 | "Composer\\XdebugHandler\\": "src" 584 | } 585 | }, 586 | "notification-url": "https://packagist.org/downloads/", 587 | "license": [ 588 | "MIT" 589 | ], 590 | "authors": [ 591 | { 592 | "name": "John Stevenson", 593 | "email": "john-stevenson@blueyonder.co.uk" 594 | } 595 | ], 596 | "description": "Restarts a process without Xdebug.", 597 | "keywords": [ 598 | "Xdebug", 599 | "performance" 600 | ], 601 | "support": { 602 | "irc": "irc://irc.freenode.org/composer", 603 | "issues": "https://github.com/composer/xdebug-handler/issues", 604 | "source": "https://github.com/composer/xdebug-handler/tree/2.0.2" 605 | }, 606 | "funding": [ 607 | { 608 | "url": "https://packagist.com", 609 | "type": "custom" 610 | }, 611 | { 612 | "url": "https://github.com/composer", 613 | "type": "github" 614 | }, 615 | { 616 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 617 | "type": "tidelift" 618 | } 619 | ], 620 | "time": "2021-07-31T17:03:58+00:00" 621 | }, 622 | { 623 | "name": "guzzlehttp/guzzle", 624 | "version": "7.8.0", 625 | "source": { 626 | "type": "git", 627 | "url": "https://github.com/guzzle/guzzle.git", 628 | "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9" 629 | }, 630 | "dist": { 631 | "type": "zip", 632 | "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9", 633 | "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9", 634 | "shasum": "" 635 | }, 636 | "require": { 637 | "ext-json": "*", 638 | "guzzlehttp/promises": "^1.5.3 || ^2.0.1", 639 | "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", 640 | "php": "^7.2.5 || ^8.0", 641 | "psr/http-client": "^1.0", 642 | "symfony/deprecation-contracts": "^2.2 || ^3.0" 643 | }, 644 | "provide": { 645 | "psr/http-client-implementation": "1.0" 646 | }, 647 | "require-dev": { 648 | "bamarni/composer-bin-plugin": "^1.8.1", 649 | "ext-curl": "*", 650 | "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", 651 | "php-http/message-factory": "^1.1", 652 | "phpunit/phpunit": "^8.5.29 || ^9.5.23", 653 | "psr/log": "^1.1 || ^2.0 || ^3.0" 654 | }, 655 | "suggest": { 656 | "ext-curl": "Required for CURL handler support", 657 | "ext-intl": "Required for Internationalized Domain Name (IDN) support", 658 | "psr/log": "Required for using the Log middleware" 659 | }, 660 | "type": "library", 661 | "extra": { 662 | "bamarni-bin": { 663 | "bin-links": true, 664 | "forward-command": false 665 | } 666 | }, 667 | "autoload": { 668 | "files": [ 669 | "src/functions_include.php" 670 | ], 671 | "psr-4": { 672 | "GuzzleHttp\\": "src/" 673 | } 674 | }, 675 | "notification-url": "https://packagist.org/downloads/", 676 | "license": [ 677 | "MIT" 678 | ], 679 | "authors": [ 680 | { 681 | "name": "Graham Campbell", 682 | "email": "hello@gjcampbell.co.uk", 683 | "homepage": "https://github.com/GrahamCampbell" 684 | }, 685 | { 686 | "name": "Michael Dowling", 687 | "email": "mtdowling@gmail.com", 688 | "homepage": "https://github.com/mtdowling" 689 | }, 690 | { 691 | "name": "Jeremy Lindblom", 692 | "email": "jeremeamia@gmail.com", 693 | "homepage": "https://github.com/jeremeamia" 694 | }, 695 | { 696 | "name": "George Mponos", 697 | "email": "gmponos@gmail.com", 698 | "homepage": "https://github.com/gmponos" 699 | }, 700 | { 701 | "name": "Tobias Nyholm", 702 | "email": "tobias.nyholm@gmail.com", 703 | "homepage": "https://github.com/Nyholm" 704 | }, 705 | { 706 | "name": "Márk Sági-Kazár", 707 | "email": "mark.sagikazar@gmail.com", 708 | "homepage": "https://github.com/sagikazarmark" 709 | }, 710 | { 711 | "name": "Tobias Schultze", 712 | "email": "webmaster@tubo-world.de", 713 | "homepage": "https://github.com/Tobion" 714 | } 715 | ], 716 | "description": "Guzzle is a PHP HTTP client library", 717 | "keywords": [ 718 | "client", 719 | "curl", 720 | "framework", 721 | "http", 722 | "http client", 723 | "psr-18", 724 | "psr-7", 725 | "rest", 726 | "web service" 727 | ], 728 | "support": { 729 | "issues": "https://github.com/guzzle/guzzle/issues", 730 | "source": "https://github.com/guzzle/guzzle/tree/7.8.0" 731 | }, 732 | "funding": [ 733 | { 734 | "url": "https://github.com/GrahamCampbell", 735 | "type": "github" 736 | }, 737 | { 738 | "url": "https://github.com/Nyholm", 739 | "type": "github" 740 | }, 741 | { 742 | "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", 743 | "type": "tidelift" 744 | } 745 | ], 746 | "time": "2023-08-27T10:20:53+00:00" 747 | }, 748 | { 749 | "name": "guzzlehttp/promises", 750 | "version": "1.5.3", 751 | "source": { 752 | "type": "git", 753 | "url": "https://github.com/guzzle/promises.git", 754 | "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e" 755 | }, 756 | "dist": { 757 | "type": "zip", 758 | "url": "https://api.github.com/repos/guzzle/promises/zipball/67ab6e18aaa14d753cc148911d273f6e6cb6721e", 759 | "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e", 760 | "shasum": "" 761 | }, 762 | "require": { 763 | "php": ">=5.5" 764 | }, 765 | "require-dev": { 766 | "symfony/phpunit-bridge": "^4.4 || ^5.1" 767 | }, 768 | "type": "library", 769 | "autoload": { 770 | "files": [ 771 | "src/functions_include.php" 772 | ], 773 | "psr-4": { 774 | "GuzzleHttp\\Promise\\": "src/" 775 | } 776 | }, 777 | "notification-url": "https://packagist.org/downloads/", 778 | "license": [ 779 | "MIT" 780 | ], 781 | "authors": [ 782 | { 783 | "name": "Graham Campbell", 784 | "email": "hello@gjcampbell.co.uk", 785 | "homepage": "https://github.com/GrahamCampbell" 786 | }, 787 | { 788 | "name": "Michael Dowling", 789 | "email": "mtdowling@gmail.com", 790 | "homepage": "https://github.com/mtdowling" 791 | }, 792 | { 793 | "name": "Tobias Nyholm", 794 | "email": "tobias.nyholm@gmail.com", 795 | "homepage": "https://github.com/Nyholm" 796 | }, 797 | { 798 | "name": "Tobias Schultze", 799 | "email": "webmaster@tubo-world.de", 800 | "homepage": "https://github.com/Tobion" 801 | } 802 | ], 803 | "description": "Guzzle promises library", 804 | "keywords": [ 805 | "promise" 806 | ], 807 | "support": { 808 | "issues": "https://github.com/guzzle/promises/issues", 809 | "source": "https://github.com/guzzle/promises/tree/1.5.3" 810 | }, 811 | "funding": [ 812 | { 813 | "url": "https://github.com/GrahamCampbell", 814 | "type": "github" 815 | }, 816 | { 817 | "url": "https://github.com/Nyholm", 818 | "type": "github" 819 | }, 820 | { 821 | "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", 822 | "type": "tidelift" 823 | } 824 | ], 825 | "time": "2023-05-21T12:31:43+00:00" 826 | }, 827 | { 828 | "name": "guzzlehttp/psr7", 829 | "version": "1.9.1", 830 | "source": { 831 | "type": "git", 832 | "url": "https://github.com/guzzle/psr7.git", 833 | "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b" 834 | }, 835 | "dist": { 836 | "type": "zip", 837 | "url": "https://api.github.com/repos/guzzle/psr7/zipball/e4490cabc77465aaee90b20cfc9a770f8c04be6b", 838 | "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b", 839 | "shasum": "" 840 | }, 841 | "require": { 842 | "php": ">=5.4.0", 843 | "psr/http-message": "~1.0", 844 | "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" 845 | }, 846 | "provide": { 847 | "psr/http-message-implementation": "1.0" 848 | }, 849 | "require-dev": { 850 | "ext-zlib": "*", 851 | "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" 852 | }, 853 | "suggest": { 854 | "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" 855 | }, 856 | "type": "library", 857 | "autoload": { 858 | "files": [ 859 | "src/functions_include.php" 860 | ], 861 | "psr-4": { 862 | "GuzzleHttp\\Psr7\\": "src/" 863 | } 864 | }, 865 | "notification-url": "https://packagist.org/downloads/", 866 | "license": [ 867 | "MIT" 868 | ], 869 | "authors": [ 870 | { 871 | "name": "Graham Campbell", 872 | "email": "hello@gjcampbell.co.uk", 873 | "homepage": "https://github.com/GrahamCampbell" 874 | }, 875 | { 876 | "name": "Michael Dowling", 877 | "email": "mtdowling@gmail.com", 878 | "homepage": "https://github.com/mtdowling" 879 | }, 880 | { 881 | "name": "George Mponos", 882 | "email": "gmponos@gmail.com", 883 | "homepage": "https://github.com/gmponos" 884 | }, 885 | { 886 | "name": "Tobias Nyholm", 887 | "email": "tobias.nyholm@gmail.com", 888 | "homepage": "https://github.com/Nyholm" 889 | }, 890 | { 891 | "name": "Márk Sági-Kazár", 892 | "email": "mark.sagikazar@gmail.com", 893 | "homepage": "https://github.com/sagikazarmark" 894 | }, 895 | { 896 | "name": "Tobias Schultze", 897 | "email": "webmaster@tubo-world.de", 898 | "homepage": "https://github.com/Tobion" 899 | } 900 | ], 901 | "description": "PSR-7 message implementation that also provides common utility methods", 902 | "keywords": [ 903 | "http", 904 | "message", 905 | "psr-7", 906 | "request", 907 | "response", 908 | "stream", 909 | "uri", 910 | "url" 911 | ], 912 | "support": { 913 | "issues": "https://github.com/guzzle/psr7/issues", 914 | "source": "https://github.com/guzzle/psr7/tree/1.9.1" 915 | }, 916 | "funding": [ 917 | { 918 | "url": "https://github.com/GrahamCampbell", 919 | "type": "github" 920 | }, 921 | { 922 | "url": "https://github.com/Nyholm", 923 | "type": "github" 924 | }, 925 | { 926 | "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", 927 | "type": "tidelift" 928 | } 929 | ], 930 | "time": "2023-04-17T16:00:37+00:00" 931 | }, 932 | { 933 | "name": "ion-bazan/composer-diff", 934 | "version": "v1.9.0", 935 | "source": { 936 | "type": "git", 937 | "url": "https://github.com/IonBazan/composer-diff.git", 938 | "reference": "d7f3cd5333c760d5bdfe0178571c99f52979bb9f" 939 | }, 940 | "dist": { 941 | "type": "zip", 942 | "url": "https://api.github.com/repos/IonBazan/composer-diff/zipball/d7f3cd5333c760d5bdfe0178571c99f52979bb9f", 943 | "reference": "d7f3cd5333c760d5bdfe0178571c99f52979bb9f", 944 | "shasum": "" 945 | }, 946 | "require": { 947 | "composer-plugin-api": "^1.1 || ^2.0", 948 | "ext-json": "*", 949 | "php": ">=5.3.2" 950 | }, 951 | "require-dev": { 952 | "composer/composer": "^1.1 || ^2.0", 953 | "symfony/console": "^2.3 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0", 954 | "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0 || ^7.0" 955 | }, 956 | "suggest": { 957 | "composer/composer": "To use the binary without composer runtime", 958 | "symfony/console": "To use the binary without composer runtime" 959 | }, 960 | "bin": [ 961 | "composer-diff" 962 | ], 963 | "type": "composer-plugin", 964 | "extra": { 965 | "class": "IonBazan\\ComposerDiff\\Composer\\Plugin" 966 | }, 967 | "autoload": { 968 | "psr-4": { 969 | "IonBazan\\ComposerDiff\\": "src" 970 | } 971 | }, 972 | "notification-url": "https://packagist.org/downloads/", 973 | "license": [ 974 | "MIT" 975 | ], 976 | "authors": [ 977 | { 978 | "name": "Ion Bazan", 979 | "email": "ion.bazan@gmail.com" 980 | } 981 | ], 982 | "description": "Compares composer.lock changes and generates Markdown report so you can use it in PR description.", 983 | "keywords": [ 984 | "PullRequest", 985 | "composer", 986 | "composer.lock", 987 | "diff", 988 | "github", 989 | "markdown", 990 | "packages", 991 | "packagist" 992 | ], 993 | "support": { 994 | "issues": "https://github.com/IonBazan/composer-diff/issues", 995 | "source": "https://github.com/IonBazan/composer-diff/tree/v1.9.0" 996 | }, 997 | "funding": [ 998 | { 999 | "url": "https://github.com/IonBazan", 1000 | "type": "github" 1001 | } 1002 | ], 1003 | "time": "2024-04-26T11:05:06+00:00" 1004 | }, 1005 | { 1006 | "name": "justinrainbow/json-schema", 1007 | "version": "5.2.11", 1008 | "source": { 1009 | "type": "git", 1010 | "url": "https://github.com/jsonrainbow/json-schema.git", 1011 | "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa" 1012 | }, 1013 | "dist": { 1014 | "type": "zip", 1015 | "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/2ab6744b7296ded80f8cc4f9509abbff393399aa", 1016 | "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa", 1017 | "shasum": "" 1018 | }, 1019 | "require": { 1020 | "php": ">=5.3.3" 1021 | }, 1022 | "require-dev": { 1023 | "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", 1024 | "json-schema/json-schema-test-suite": "1.2.0", 1025 | "phpunit/phpunit": "^4.8.35" 1026 | }, 1027 | "bin": [ 1028 | "bin/validate-json" 1029 | ], 1030 | "type": "library", 1031 | "extra": { 1032 | "branch-alias": { 1033 | "dev-master": "5.0.x-dev" 1034 | } 1035 | }, 1036 | "autoload": { 1037 | "psr-4": { 1038 | "JsonSchema\\": "src/JsonSchema/" 1039 | } 1040 | }, 1041 | "notification-url": "https://packagist.org/downloads/", 1042 | "license": [ 1043 | "MIT" 1044 | ], 1045 | "authors": [ 1046 | { 1047 | "name": "Bruno Prieto Reis", 1048 | "email": "bruno.p.reis@gmail.com" 1049 | }, 1050 | { 1051 | "name": "Justin Rainbow", 1052 | "email": "justin.rainbow@gmail.com" 1053 | }, 1054 | { 1055 | "name": "Igor Wiedler", 1056 | "email": "igor@wiedler.ch" 1057 | }, 1058 | { 1059 | "name": "Robert Schönthal", 1060 | "email": "seroscho@googlemail.com" 1061 | } 1062 | ], 1063 | "description": "A library to validate a json schema.", 1064 | "homepage": "https://github.com/justinrainbow/json-schema", 1065 | "keywords": [ 1066 | "json", 1067 | "schema" 1068 | ], 1069 | "support": { 1070 | "issues": "https://github.com/jsonrainbow/json-schema/issues", 1071 | "source": "https://github.com/jsonrainbow/json-schema/tree/5.2.11" 1072 | }, 1073 | "time": "2021-07-22T09:24:00+00:00" 1074 | }, 1075 | { 1076 | "name": "psr/container", 1077 | "version": "1.1.0", 1078 | "source": { 1079 | "type": "git", 1080 | "url": "https://github.com/php-fig/container.git", 1081 | "reference": "9fc7aab7a78057a124384358ebae8a1711b6f6fc" 1082 | }, 1083 | "dist": { 1084 | "type": "zip", 1085 | "url": "https://api.github.com/repos/php-fig/container/zipball/9fc7aab7a78057a124384358ebae8a1711b6f6fc", 1086 | "reference": "9fc7aab7a78057a124384358ebae8a1711b6f6fc", 1087 | "shasum": "" 1088 | }, 1089 | "require": { 1090 | "php": ">=7.2.0" 1091 | }, 1092 | "type": "library", 1093 | "extra": { 1094 | "branch-alias": { 1095 | "dev-master": "1.1.x-dev" 1096 | } 1097 | }, 1098 | "autoload": { 1099 | "psr-4": { 1100 | "Psr\\Container\\": "src/" 1101 | } 1102 | }, 1103 | "notification-url": "https://packagist.org/downloads/", 1104 | "license": [ 1105 | "MIT" 1106 | ], 1107 | "authors": [ 1108 | { 1109 | "name": "PHP-FIG", 1110 | "homepage": "https://www.php-fig.org/" 1111 | } 1112 | ], 1113 | "description": "Common Container Interface (PHP FIG PSR-11)", 1114 | "homepage": "https://github.com/php-fig/container", 1115 | "keywords": [ 1116 | "PSR-11", 1117 | "container", 1118 | "container-interface", 1119 | "container-interop", 1120 | "psr" 1121 | ], 1122 | "support": { 1123 | "issues": "https://github.com/php-fig/container/issues", 1124 | "source": "https://github.com/php-fig/container/tree/1.1.0" 1125 | }, 1126 | "time": "2021-03-05T15:48:30+00:00" 1127 | }, 1128 | { 1129 | "name": "psr/http-client", 1130 | "version": "1.0.1", 1131 | "source": { 1132 | "type": "git", 1133 | "url": "https://github.com/php-fig/http-client.git", 1134 | "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" 1135 | }, 1136 | "dist": { 1137 | "type": "zip", 1138 | "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", 1139 | "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", 1140 | "shasum": "" 1141 | }, 1142 | "require": { 1143 | "php": "^7.0 || ^8.0", 1144 | "psr/http-message": "^1.0" 1145 | }, 1146 | "type": "library", 1147 | "extra": { 1148 | "branch-alias": { 1149 | "dev-master": "1.0.x-dev" 1150 | } 1151 | }, 1152 | "autoload": { 1153 | "psr-4": { 1154 | "Psr\\Http\\Client\\": "src/" 1155 | } 1156 | }, 1157 | "notification-url": "https://packagist.org/downloads/", 1158 | "license": [ 1159 | "MIT" 1160 | ], 1161 | "authors": [ 1162 | { 1163 | "name": "PHP-FIG", 1164 | "homepage": "http://www.php-fig.org/" 1165 | } 1166 | ], 1167 | "description": "Common interface for HTTP clients", 1168 | "homepage": "https://github.com/php-fig/http-client", 1169 | "keywords": [ 1170 | "http", 1171 | "http-client", 1172 | "psr", 1173 | "psr-18" 1174 | ], 1175 | "support": { 1176 | "source": "https://github.com/php-fig/http-client/tree/master" 1177 | }, 1178 | "time": "2020-06-29T06:28:15+00:00" 1179 | }, 1180 | { 1181 | "name": "psr/http-message", 1182 | "version": "1.0", 1183 | "source": { 1184 | "type": "git", 1185 | "url": "https://github.com/php-fig/http-message.git", 1186 | "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298" 1187 | }, 1188 | "dist": { 1189 | "type": "zip", 1190 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/85d63699f0dbedb190bbd4b0d2b9dc707ea4c298", 1191 | "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298", 1192 | "shasum": "" 1193 | }, 1194 | "require": { 1195 | "php": ">=5.3.0" 1196 | }, 1197 | "type": "library", 1198 | "extra": { 1199 | "branch-alias": { 1200 | "dev-master": "1.0.x-dev" 1201 | } 1202 | }, 1203 | "autoload": { 1204 | "psr-4": { 1205 | "Psr\\Http\\Message\\": "src/" 1206 | } 1207 | }, 1208 | "notification-url": "https://packagist.org/downloads/", 1209 | "license": [ 1210 | "MIT" 1211 | ], 1212 | "authors": [ 1213 | { 1214 | "name": "PHP-FIG", 1215 | "homepage": "http://www.php-fig.org/" 1216 | } 1217 | ], 1218 | "description": "Common interface for HTTP messages", 1219 | "keywords": [ 1220 | "http", 1221 | "http-message", 1222 | "psr", 1223 | "psr-7", 1224 | "request", 1225 | "response" 1226 | ], 1227 | "support": { 1228 | "issues": "https://github.com/php-fig/http-message/issues", 1229 | "source": "https://github.com/php-fig/http-message/tree/master" 1230 | }, 1231 | "time": "2015-05-04T20:22:00+00:00" 1232 | }, 1233 | { 1234 | "name": "psr/log", 1235 | "version": "1.0.0", 1236 | "source": { 1237 | "type": "git", 1238 | "url": "https://github.com/php-fig/log.git", 1239 | "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b" 1240 | }, 1241 | "dist": { 1242 | "type": "zip", 1243 | "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b", 1244 | "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b", 1245 | "shasum": "" 1246 | }, 1247 | "type": "library", 1248 | "autoload": { 1249 | "psr-0": { 1250 | "Psr\\Log\\": "" 1251 | } 1252 | }, 1253 | "notification-url": "https://packagist.org/downloads/", 1254 | "license": [ 1255 | "MIT" 1256 | ], 1257 | "authors": [ 1258 | { 1259 | "name": "PHP-FIG", 1260 | "homepage": "http://www.php-fig.org/" 1261 | } 1262 | ], 1263 | "description": "Common interface for logging libraries", 1264 | "keywords": [ 1265 | "log", 1266 | "psr", 1267 | "psr-3" 1268 | ], 1269 | "support": { 1270 | "issues": "https://github.com/php-fig/log/issues", 1271 | "source": "https://github.com/php-fig/log/tree/1.0.0" 1272 | }, 1273 | "time": "2012-12-21T11:40:51+00:00" 1274 | }, 1275 | { 1276 | "name": "ralouphie/getallheaders", 1277 | "version": "2.0.5", 1278 | "source": { 1279 | "type": "git", 1280 | "url": "https://github.com/ralouphie/getallheaders.git", 1281 | "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa" 1282 | }, 1283 | "dist": { 1284 | "type": "zip", 1285 | "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/5601c8a83fbba7ef674a7369456d12f1e0d0eafa", 1286 | "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa", 1287 | "shasum": "" 1288 | }, 1289 | "require": { 1290 | "php": ">=5.3" 1291 | }, 1292 | "require-dev": { 1293 | "phpunit/phpunit": "~3.7.0", 1294 | "satooshi/php-coveralls": ">=1.0" 1295 | }, 1296 | "type": "library", 1297 | "autoload": { 1298 | "files": [ 1299 | "src/getallheaders.php" 1300 | ] 1301 | }, 1302 | "notification-url": "https://packagist.org/downloads/", 1303 | "license": [ 1304 | "MIT" 1305 | ], 1306 | "authors": [ 1307 | { 1308 | "name": "Ralph Khattar", 1309 | "email": "ralph.khattar@gmail.com" 1310 | } 1311 | ], 1312 | "description": "A polyfill for getallheaders.", 1313 | "support": { 1314 | "issues": "https://github.com/ralouphie/getallheaders/issues", 1315 | "source": "https://github.com/ralouphie/getallheaders/tree/2.0.5" 1316 | }, 1317 | "time": "2016-02-11T07:05:27+00:00" 1318 | }, 1319 | { 1320 | "name": "react/promise", 1321 | "version": "v2.8.0", 1322 | "source": { 1323 | "type": "git", 1324 | "url": "https://github.com/reactphp/promise.git", 1325 | "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4" 1326 | }, 1327 | "dist": { 1328 | "type": "zip", 1329 | "url": "https://api.github.com/repos/reactphp/promise/zipball/f3cff96a19736714524ca0dd1d4130de73dbbbc4", 1330 | "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4", 1331 | "shasum": "" 1332 | }, 1333 | "require": { 1334 | "php": ">=5.4.0" 1335 | }, 1336 | "require-dev": { 1337 | "phpunit/phpunit": "^7.0 || ^6.5 || ^5.7 || ^4.8.36" 1338 | }, 1339 | "type": "library", 1340 | "autoload": { 1341 | "files": [ 1342 | "src/functions_include.php" 1343 | ], 1344 | "psr-4": { 1345 | "React\\Promise\\": "src/" 1346 | } 1347 | }, 1348 | "notification-url": "https://packagist.org/downloads/", 1349 | "license": [ 1350 | "MIT" 1351 | ], 1352 | "authors": [ 1353 | { 1354 | "name": "Jan Sorgalla", 1355 | "email": "jsorgalla@gmail.com" 1356 | } 1357 | ], 1358 | "description": "A lightweight implementation of CommonJS Promises/A for PHP", 1359 | "keywords": [ 1360 | "promise", 1361 | "promises" 1362 | ], 1363 | "support": { 1364 | "issues": "https://github.com/reactphp/promise/issues", 1365 | "source": "https://github.com/reactphp/promise/tree/v2.8.0" 1366 | }, 1367 | "time": "2020-05-12T15:16:56+00:00" 1368 | }, 1369 | { 1370 | "name": "seld/jsonlint", 1371 | "version": "1.8.0", 1372 | "source": { 1373 | "type": "git", 1374 | "url": "https://github.com/Seldaek/jsonlint.git", 1375 | "reference": "ff2aa5420bfbc296cf6a0bc785fa5b35736de7c1" 1376 | }, 1377 | "dist": { 1378 | "type": "zip", 1379 | "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/ff2aa5420bfbc296cf6a0bc785fa5b35736de7c1", 1380 | "reference": "ff2aa5420bfbc296cf6a0bc785fa5b35736de7c1", 1381 | "shasum": "" 1382 | }, 1383 | "require": { 1384 | "php": "^5.3 || ^7.0 || ^8.0" 1385 | }, 1386 | "require-dev": { 1387 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 1388 | }, 1389 | "bin": [ 1390 | "bin/jsonlint" 1391 | ], 1392 | "type": "library", 1393 | "autoload": { 1394 | "psr-4": { 1395 | "Seld\\JsonLint\\": "src/Seld/JsonLint/" 1396 | } 1397 | }, 1398 | "notification-url": "https://packagist.org/downloads/", 1399 | "license": [ 1400 | "MIT" 1401 | ], 1402 | "authors": [ 1403 | { 1404 | "name": "Jordi Boggiano", 1405 | "email": "j.boggiano@seld.be", 1406 | "homepage": "http://seld.be" 1407 | } 1408 | ], 1409 | "description": "JSON Linter", 1410 | "keywords": [ 1411 | "json", 1412 | "linter", 1413 | "parser", 1414 | "validator" 1415 | ], 1416 | "support": { 1417 | "issues": "https://github.com/Seldaek/jsonlint/issues", 1418 | "source": "https://github.com/Seldaek/jsonlint/tree/master" 1419 | }, 1420 | "funding": [ 1421 | { 1422 | "url": "https://github.com/Seldaek", 1423 | "type": "github" 1424 | }, 1425 | { 1426 | "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", 1427 | "type": "tidelift" 1428 | } 1429 | ], 1430 | "time": "2020-04-30T19:05:18+00:00" 1431 | }, 1432 | { 1433 | "name": "seld/phar-utils", 1434 | "version": "1.2.0", 1435 | "source": { 1436 | "type": "git", 1437 | "url": "https://github.com/Seldaek/phar-utils.git", 1438 | "reference": "9f3452c93ff423469c0d56450431562ca423dcee" 1439 | }, 1440 | "dist": { 1441 | "type": "zip", 1442 | "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/9f3452c93ff423469c0d56450431562ca423dcee", 1443 | "reference": "9f3452c93ff423469c0d56450431562ca423dcee", 1444 | "shasum": "" 1445 | }, 1446 | "require": { 1447 | "php": ">=5.3" 1448 | }, 1449 | "type": "library", 1450 | "extra": { 1451 | "branch-alias": { 1452 | "dev-master": "1.x-dev" 1453 | } 1454 | }, 1455 | "autoload": { 1456 | "psr-4": { 1457 | "Seld\\PharUtils\\": "src/" 1458 | } 1459 | }, 1460 | "notification-url": "https://packagist.org/downloads/", 1461 | "license": [ 1462 | "MIT" 1463 | ], 1464 | "authors": [ 1465 | { 1466 | "name": "Jordi Boggiano", 1467 | "email": "j.boggiano@seld.be" 1468 | } 1469 | ], 1470 | "description": "PHAR file format utilities, for when PHP phars you up", 1471 | "keywords": [ 1472 | "phar" 1473 | ], 1474 | "support": { 1475 | "issues": "https://github.com/Seldaek/phar-utils/issues", 1476 | "source": "https://github.com/Seldaek/phar-utils/tree/1.2.0" 1477 | }, 1478 | "time": "2021-12-10T11:20:11+00:00" 1479 | }, 1480 | { 1481 | "name": "seld/signal-handler", 1482 | "version": "2.0.0", 1483 | "source": { 1484 | "type": "git", 1485 | "url": "https://github.com/Seldaek/signal-handler.git", 1486 | "reference": "e1ac658a54dbe15dcda621fa95a2248e10566bcb" 1487 | }, 1488 | "dist": { 1489 | "type": "zip", 1490 | "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/e1ac658a54dbe15dcda621fa95a2248e10566bcb", 1491 | "reference": "e1ac658a54dbe15dcda621fa95a2248e10566bcb", 1492 | "shasum": "" 1493 | }, 1494 | "require": { 1495 | "php": ">=7.2.0" 1496 | }, 1497 | "require-dev": { 1498 | "phpstan/phpstan": "^1", 1499 | "phpstan/phpstan-deprecation-rules": "^1.0", 1500 | "phpstan/phpstan-phpunit": "^1", 1501 | "phpstan/phpstan-strict-rules": "^1.3", 1502 | "phpunit/phpunit": "^7.5.20 || ^8.5.23", 1503 | "psr/log": "^1 || ^2 || ^3" 1504 | }, 1505 | "type": "library", 1506 | "extra": { 1507 | "branch-alias": { 1508 | "dev-main": "2.x-dev" 1509 | } 1510 | }, 1511 | "autoload": { 1512 | "psr-4": { 1513 | "Seld\\Signal\\": "src/" 1514 | } 1515 | }, 1516 | "notification-url": "https://packagist.org/downloads/", 1517 | "license": [ 1518 | "MIT" 1519 | ], 1520 | "authors": [ 1521 | { 1522 | "name": "Jordi Boggiano", 1523 | "email": "j.boggiano@seld.be", 1524 | "homepage": "http://seld.be" 1525 | } 1526 | ], 1527 | "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", 1528 | "keywords": [ 1529 | "posix", 1530 | "sigint", 1531 | "signal", 1532 | "sigterm", 1533 | "unix" 1534 | ], 1535 | "support": { 1536 | "issues": "https://github.com/Seldaek/signal-handler/issues", 1537 | "source": "https://github.com/Seldaek/signal-handler/tree/2.0.0" 1538 | }, 1539 | "time": "2022-07-20T14:27:19+00:00" 1540 | }, 1541 | { 1542 | "name": "symfony/console", 1543 | "version": "v7.0.0", 1544 | "source": { 1545 | "type": "git", 1546 | "url": "https://github.com/symfony/console.git", 1547 | "reference": "64e06788686633deb8d9a7c75ab31bcf4b233a26" 1548 | }, 1549 | "dist": { 1550 | "type": "zip", 1551 | "url": "https://api.github.com/repos/symfony/console/zipball/64e06788686633deb8d9a7c75ab31bcf4b233a26", 1552 | "reference": "64e06788686633deb8d9a7c75ab31bcf4b233a26", 1553 | "shasum": "" 1554 | }, 1555 | "require": { 1556 | "php": ">=8.2", 1557 | "symfony/polyfill-mbstring": "~1.0", 1558 | "symfony/service-contracts": "^2.5|^3", 1559 | "symfony/string": "^6.4|^7.0" 1560 | }, 1561 | "conflict": { 1562 | "symfony/dependency-injection": "<6.4", 1563 | "symfony/dotenv": "<6.4", 1564 | "symfony/event-dispatcher": "<6.4", 1565 | "symfony/lock": "<6.4", 1566 | "symfony/process": "<6.4" 1567 | }, 1568 | "provide": { 1569 | "psr/log-implementation": "1.0|2.0|3.0" 1570 | }, 1571 | "require-dev": { 1572 | "psr/log": "^1|^2|^3", 1573 | "symfony/config": "^6.4|^7.0", 1574 | "symfony/dependency-injection": "^6.4|^7.0", 1575 | "symfony/event-dispatcher": "^6.4|^7.0", 1576 | "symfony/http-foundation": "^6.4|^7.0", 1577 | "symfony/http-kernel": "^6.4|^7.0", 1578 | "symfony/lock": "^6.4|^7.0", 1579 | "symfony/messenger": "^6.4|^7.0", 1580 | "symfony/process": "^6.4|^7.0", 1581 | "symfony/stopwatch": "^6.4|^7.0", 1582 | "symfony/var-dumper": "^6.4|^7.0" 1583 | }, 1584 | "type": "library", 1585 | "autoload": { 1586 | "psr-4": { 1587 | "Symfony\\Component\\Console\\": "" 1588 | }, 1589 | "exclude-from-classmap": [ 1590 | "/Tests/" 1591 | ] 1592 | }, 1593 | "notification-url": "https://packagist.org/downloads/", 1594 | "license": [ 1595 | "MIT" 1596 | ], 1597 | "authors": [ 1598 | { 1599 | "name": "Fabien Potencier", 1600 | "email": "fabien@symfony.com" 1601 | }, 1602 | { 1603 | "name": "Symfony Community", 1604 | "homepage": "https://symfony.com/contributors" 1605 | } 1606 | ], 1607 | "description": "Eases the creation of beautiful and testable command line interfaces", 1608 | "homepage": "https://symfony.com", 1609 | "keywords": [ 1610 | "cli", 1611 | "command-line", 1612 | "console", 1613 | "terminal" 1614 | ], 1615 | "support": { 1616 | "source": "https://github.com/symfony/console/tree/v7.0.0" 1617 | }, 1618 | "funding": [ 1619 | { 1620 | "url": "https://symfony.com/sponsor", 1621 | "type": "custom" 1622 | }, 1623 | { 1624 | "url": "https://github.com/fabpot", 1625 | "type": "github" 1626 | }, 1627 | { 1628 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1629 | "type": "tidelift" 1630 | } 1631 | ], 1632 | "time": "2023-11-20T16:43:42+00:00" 1633 | }, 1634 | { 1635 | "name": "symfony/deprecation-contracts", 1636 | "version": "v2.2.0", 1637 | "source": { 1638 | "type": "git", 1639 | "url": "https://github.com/symfony/deprecation-contracts.git", 1640 | "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665" 1641 | }, 1642 | "dist": { 1643 | "type": "zip", 1644 | "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665", 1645 | "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665", 1646 | "shasum": "" 1647 | }, 1648 | "require": { 1649 | "php": ">=7.1" 1650 | }, 1651 | "type": "library", 1652 | "extra": { 1653 | "branch-alias": { 1654 | "dev-master": "2.2-dev" 1655 | }, 1656 | "thanks": { 1657 | "name": "symfony/contracts", 1658 | "url": "https://github.com/symfony/contracts" 1659 | } 1660 | }, 1661 | "autoload": { 1662 | "files": [ 1663 | "function.php" 1664 | ] 1665 | }, 1666 | "notification-url": "https://packagist.org/downloads/", 1667 | "license": [ 1668 | "MIT" 1669 | ], 1670 | "authors": [ 1671 | { 1672 | "name": "Nicolas Grekas", 1673 | "email": "p@tchwork.com" 1674 | }, 1675 | { 1676 | "name": "Symfony Community", 1677 | "homepage": "https://symfony.com/contributors" 1678 | } 1679 | ], 1680 | "description": "A generic function and convention to trigger deprecation notices", 1681 | "homepage": "https://symfony.com", 1682 | "support": { 1683 | "source": "https://github.com/symfony/deprecation-contracts/tree/master" 1684 | }, 1685 | "funding": [ 1686 | { 1687 | "url": "https://symfony.com/sponsor", 1688 | "type": "custom" 1689 | }, 1690 | { 1691 | "url": "https://github.com/fabpot", 1692 | "type": "github" 1693 | }, 1694 | { 1695 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1696 | "type": "tidelift" 1697 | } 1698 | ], 1699 | "time": "2020-09-07T11:33:47+00:00" 1700 | }, 1701 | { 1702 | "name": "symfony/filesystem", 1703 | "version": "v5.4.0", 1704 | "source": { 1705 | "type": "git", 1706 | "url": "https://github.com/symfony/filesystem.git", 1707 | "reference": "731f917dc31edcffec2c6a777f3698c33bea8f01" 1708 | }, 1709 | "dist": { 1710 | "type": "zip", 1711 | "url": "https://api.github.com/repos/symfony/filesystem/zipball/731f917dc31edcffec2c6a777f3698c33bea8f01", 1712 | "reference": "731f917dc31edcffec2c6a777f3698c33bea8f01", 1713 | "shasum": "" 1714 | }, 1715 | "require": { 1716 | "php": ">=7.2.5", 1717 | "symfony/polyfill-ctype": "~1.8", 1718 | "symfony/polyfill-mbstring": "~1.8", 1719 | "symfony/polyfill-php80": "^1.16" 1720 | }, 1721 | "type": "library", 1722 | "autoload": { 1723 | "psr-4": { 1724 | "Symfony\\Component\\Filesystem\\": "" 1725 | }, 1726 | "exclude-from-classmap": [ 1727 | "/Tests/" 1728 | ] 1729 | }, 1730 | "notification-url": "https://packagist.org/downloads/", 1731 | "license": [ 1732 | "MIT" 1733 | ], 1734 | "authors": [ 1735 | { 1736 | "name": "Fabien Potencier", 1737 | "email": "fabien@symfony.com" 1738 | }, 1739 | { 1740 | "name": "Symfony Community", 1741 | "homepage": "https://symfony.com/contributors" 1742 | } 1743 | ], 1744 | "description": "Provides basic utilities for the filesystem", 1745 | "homepage": "https://symfony.com", 1746 | "support": { 1747 | "source": "https://github.com/symfony/filesystem/tree/v5.4.0" 1748 | }, 1749 | "funding": [ 1750 | { 1751 | "url": "https://symfony.com/sponsor", 1752 | "type": "custom" 1753 | }, 1754 | { 1755 | "url": "https://github.com/fabpot", 1756 | "type": "github" 1757 | }, 1758 | { 1759 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1760 | "type": "tidelift" 1761 | } 1762 | ], 1763 | "time": "2021-10-28T13:39:27+00:00" 1764 | }, 1765 | { 1766 | "name": "symfony/finder", 1767 | "version": "v5.4.0", 1768 | "source": { 1769 | "type": "git", 1770 | "url": "https://github.com/symfony/finder.git", 1771 | "reference": "d2f29dac98e96a98be467627bd49c2efb1bc2590" 1772 | }, 1773 | "dist": { 1774 | "type": "zip", 1775 | "url": "https://api.github.com/repos/symfony/finder/zipball/d2f29dac98e96a98be467627bd49c2efb1bc2590", 1776 | "reference": "d2f29dac98e96a98be467627bd49c2efb1bc2590", 1777 | "shasum": "" 1778 | }, 1779 | "require": { 1780 | "php": ">=7.2.5", 1781 | "symfony/deprecation-contracts": "^2.1|^3", 1782 | "symfony/polyfill-php80": "^1.16" 1783 | }, 1784 | "type": "library", 1785 | "autoload": { 1786 | "psr-4": { 1787 | "Symfony\\Component\\Finder\\": "" 1788 | }, 1789 | "exclude-from-classmap": [ 1790 | "/Tests/" 1791 | ] 1792 | }, 1793 | "notification-url": "https://packagist.org/downloads/", 1794 | "license": [ 1795 | "MIT" 1796 | ], 1797 | "authors": [ 1798 | { 1799 | "name": "Fabien Potencier", 1800 | "email": "fabien@symfony.com" 1801 | }, 1802 | { 1803 | "name": "Symfony Community", 1804 | "homepage": "https://symfony.com/contributors" 1805 | } 1806 | ], 1807 | "description": "Finds files and directories via an intuitive fluent interface", 1808 | "homepage": "https://symfony.com", 1809 | "support": { 1810 | "source": "https://github.com/symfony/finder/tree/v5.4.0" 1811 | }, 1812 | "funding": [ 1813 | { 1814 | "url": "https://symfony.com/sponsor", 1815 | "type": "custom" 1816 | }, 1817 | { 1818 | "url": "https://github.com/fabpot", 1819 | "type": "github" 1820 | }, 1821 | { 1822 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1823 | "type": "tidelift" 1824 | } 1825 | ], 1826 | "time": "2021-11-28T15:25:38+00:00" 1827 | }, 1828 | { 1829 | "name": "symfony/polyfill-ctype", 1830 | "version": "v1.8.0", 1831 | "source": { 1832 | "type": "git", 1833 | "url": "https://github.com/symfony/polyfill-ctype.git", 1834 | "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae" 1835 | }, 1836 | "dist": { 1837 | "type": "zip", 1838 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/7cc359f1b7b80fc25ed7796be7d96adc9b354bae", 1839 | "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae", 1840 | "shasum": "" 1841 | }, 1842 | "require": { 1843 | "php": ">=5.3.3" 1844 | }, 1845 | "type": "library", 1846 | "extra": { 1847 | "branch-alias": { 1848 | "dev-master": "1.8-dev" 1849 | } 1850 | }, 1851 | "autoload": { 1852 | "files": [ 1853 | "bootstrap.php" 1854 | ], 1855 | "psr-4": { 1856 | "Symfony\\Polyfill\\Ctype\\": "" 1857 | } 1858 | }, 1859 | "notification-url": "https://packagist.org/downloads/", 1860 | "license": [ 1861 | "MIT" 1862 | ], 1863 | "authors": [ 1864 | { 1865 | "name": "Symfony Community", 1866 | "homepage": "https://symfony.com/contributors" 1867 | }, 1868 | { 1869 | "name": "Gert de Pagter", 1870 | "email": "BackEndTea@gmail.com" 1871 | } 1872 | ], 1873 | "description": "Symfony polyfill for ctype functions", 1874 | "homepage": "https://symfony.com", 1875 | "keywords": [ 1876 | "compatibility", 1877 | "ctype", 1878 | "polyfill", 1879 | "portable" 1880 | ], 1881 | "support": { 1882 | "source": "https://github.com/symfony/polyfill-ctype/tree/master" 1883 | }, 1884 | "time": "2018-04-30T19:57:29+00:00" 1885 | }, 1886 | { 1887 | "name": "symfony/polyfill-intl-grapheme", 1888 | "version": "v1.0.0", 1889 | "source": { 1890 | "type": "git", 1891 | "url": "https://github.com/symfony/polyfill-intl-grapheme.git", 1892 | "reference": "9332d285b58a16b144b3bf0bfd3b6334d9a43006" 1893 | }, 1894 | "dist": { 1895 | "type": "zip", 1896 | "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/9332d285b58a16b144b3bf0bfd3b6334d9a43006", 1897 | "reference": "9332d285b58a16b144b3bf0bfd3b6334d9a43006", 1898 | "shasum": "" 1899 | }, 1900 | "require": { 1901 | "php": ">=5.3.3" 1902 | }, 1903 | "type": "library", 1904 | "extra": { 1905 | "branch-alias": { 1906 | "dev-master": "1.0-dev" 1907 | } 1908 | }, 1909 | "autoload": { 1910 | "files": [ 1911 | "bootstrap.php" 1912 | ], 1913 | "psr-4": { 1914 | "Symfony\\Polyfill\\Intl\\Grapheme\\": "" 1915 | } 1916 | }, 1917 | "notification-url": "https://packagist.org/downloads/", 1918 | "license": [ 1919 | "MIT" 1920 | ], 1921 | "authors": [ 1922 | { 1923 | "name": "Nicolas Grekas", 1924 | "email": "p@tchwork.com" 1925 | }, 1926 | { 1927 | "name": "Symfony Community", 1928 | "homepage": "https://symfony.com/contributors" 1929 | } 1930 | ], 1931 | "description": "Symfony polyfill for intl's grapheme_* functions", 1932 | "homepage": "https://symfony.com", 1933 | "keywords": [ 1934 | "compatibility", 1935 | "grapheme", 1936 | "intl", 1937 | "polyfill", 1938 | "portable", 1939 | "shim" 1940 | ], 1941 | "support": { 1942 | "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/master" 1943 | }, 1944 | "time": "2015-11-04T20:28:58+00:00" 1945 | }, 1946 | { 1947 | "name": "symfony/polyfill-intl-normalizer", 1948 | "version": "v1.0.0", 1949 | "source": { 1950 | "type": "git", 1951 | "url": "https://github.com/symfony/polyfill-intl-normalizer.git", 1952 | "reference": "b0235b9e98e224821e23018a9487764ad6dec859" 1953 | }, 1954 | "dist": { 1955 | "type": "zip", 1956 | "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/b0235b9e98e224821e23018a9487764ad6dec859", 1957 | "reference": "b0235b9e98e224821e23018a9487764ad6dec859", 1958 | "shasum": "" 1959 | }, 1960 | "require": { 1961 | "php": ">=5.3.3" 1962 | }, 1963 | "type": "library", 1964 | "extra": { 1965 | "branch-alias": { 1966 | "dev-master": "1.0-dev" 1967 | } 1968 | }, 1969 | "autoload": { 1970 | "files": [ 1971 | "bootstrap.php" 1972 | ], 1973 | "psr-4": { 1974 | "Symfony\\Polyfill\\Intl\\Normalizer\\": "" 1975 | }, 1976 | "classmap": [ 1977 | "Resources/stubs" 1978 | ] 1979 | }, 1980 | "notification-url": "https://packagist.org/downloads/", 1981 | "license": [ 1982 | "MIT" 1983 | ], 1984 | "authors": [ 1985 | { 1986 | "name": "Nicolas Grekas", 1987 | "email": "p@tchwork.com" 1988 | }, 1989 | { 1990 | "name": "Symfony Community", 1991 | "homepage": "https://symfony.com/contributors" 1992 | } 1993 | ], 1994 | "description": "Symfony polyfill for intl's Normalizer class and related functions", 1995 | "homepage": "https://symfony.com", 1996 | "keywords": [ 1997 | "compatibility", 1998 | "intl", 1999 | "normalizer", 2000 | "polyfill", 2001 | "portable", 2002 | "shim" 2003 | ], 2004 | "support": { 2005 | "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/master" 2006 | }, 2007 | "time": "2015-11-04T20:28:58+00:00" 2008 | }, 2009 | { 2010 | "name": "symfony/polyfill-mbstring", 2011 | "version": "v1.8.0", 2012 | "source": { 2013 | "type": "git", 2014 | "url": "https://github.com/symfony/polyfill-mbstring.git", 2015 | "reference": "3296adf6a6454a050679cde90f95350ad604b171" 2016 | }, 2017 | "dist": { 2018 | "type": "zip", 2019 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/3296adf6a6454a050679cde90f95350ad604b171", 2020 | "reference": "3296adf6a6454a050679cde90f95350ad604b171", 2021 | "shasum": "" 2022 | }, 2023 | "require": { 2024 | "php": ">=5.3.3" 2025 | }, 2026 | "suggest": { 2027 | "ext-mbstring": "For best performance" 2028 | }, 2029 | "type": "library", 2030 | "extra": { 2031 | "branch-alias": { 2032 | "dev-master": "1.8-dev" 2033 | } 2034 | }, 2035 | "autoload": { 2036 | "files": [ 2037 | "bootstrap.php" 2038 | ], 2039 | "psr-4": { 2040 | "Symfony\\Polyfill\\Mbstring\\": "" 2041 | } 2042 | }, 2043 | "notification-url": "https://packagist.org/downloads/", 2044 | "license": [ 2045 | "MIT" 2046 | ], 2047 | "authors": [ 2048 | { 2049 | "name": "Nicolas Grekas", 2050 | "email": "p@tchwork.com" 2051 | }, 2052 | { 2053 | "name": "Symfony Community", 2054 | "homepage": "https://symfony.com/contributors" 2055 | } 2056 | ], 2057 | "description": "Symfony polyfill for the Mbstring extension", 2058 | "homepage": "https://symfony.com", 2059 | "keywords": [ 2060 | "compatibility", 2061 | "mbstring", 2062 | "polyfill", 2063 | "portable", 2064 | "shim" 2065 | ], 2066 | "support": { 2067 | "source": "https://github.com/symfony/polyfill-mbstring/tree/master" 2068 | }, 2069 | "time": "2018-04-26T10:06:28+00:00" 2070 | }, 2071 | { 2072 | "name": "symfony/polyfill-php73", 2073 | "version": "v1.24.0", 2074 | "source": { 2075 | "type": "git", 2076 | "url": "https://github.com/symfony/polyfill-php73.git", 2077 | "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5" 2078 | }, 2079 | "dist": { 2080 | "type": "zip", 2081 | "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/cc5db0e22b3cb4111010e48785a97f670b350ca5", 2082 | "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5", 2083 | "shasum": "" 2084 | }, 2085 | "require": { 2086 | "php": ">=7.1" 2087 | }, 2088 | "type": "library", 2089 | "extra": { 2090 | "branch-alias": { 2091 | "dev-main": "1.23-dev" 2092 | }, 2093 | "thanks": { 2094 | "name": "symfony/polyfill", 2095 | "url": "https://github.com/symfony/polyfill" 2096 | } 2097 | }, 2098 | "autoload": { 2099 | "files": [ 2100 | "bootstrap.php" 2101 | ], 2102 | "psr-4": { 2103 | "Symfony\\Polyfill\\Php73\\": "" 2104 | }, 2105 | "classmap": [ 2106 | "Resources/stubs" 2107 | ] 2108 | }, 2109 | "notification-url": "https://packagist.org/downloads/", 2110 | "license": [ 2111 | "MIT" 2112 | ], 2113 | "authors": [ 2114 | { 2115 | "name": "Nicolas Grekas", 2116 | "email": "p@tchwork.com" 2117 | }, 2118 | { 2119 | "name": "Symfony Community", 2120 | "homepage": "https://symfony.com/contributors" 2121 | } 2122 | ], 2123 | "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", 2124 | "homepage": "https://symfony.com", 2125 | "keywords": [ 2126 | "compatibility", 2127 | "polyfill", 2128 | "portable", 2129 | "shim" 2130 | ], 2131 | "support": { 2132 | "source": "https://github.com/symfony/polyfill-php73/tree/v1.24.0" 2133 | }, 2134 | "funding": [ 2135 | { 2136 | "url": "https://symfony.com/sponsor", 2137 | "type": "custom" 2138 | }, 2139 | { 2140 | "url": "https://github.com/fabpot", 2141 | "type": "github" 2142 | }, 2143 | { 2144 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2145 | "type": "tidelift" 2146 | } 2147 | ], 2148 | "time": "2021-06-05T21:20:04+00:00" 2149 | }, 2150 | { 2151 | "name": "symfony/polyfill-php80", 2152 | "version": "v1.24.0", 2153 | "source": { 2154 | "type": "git", 2155 | "url": "https://github.com/symfony/polyfill-php80.git", 2156 | "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9" 2157 | }, 2158 | "dist": { 2159 | "type": "zip", 2160 | "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/57b712b08eddb97c762a8caa32c84e037892d2e9", 2161 | "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9", 2162 | "shasum": "" 2163 | }, 2164 | "require": { 2165 | "php": ">=7.1" 2166 | }, 2167 | "type": "library", 2168 | "extra": { 2169 | "branch-alias": { 2170 | "dev-main": "1.23-dev" 2171 | }, 2172 | "thanks": { 2173 | "name": "symfony/polyfill", 2174 | "url": "https://github.com/symfony/polyfill" 2175 | } 2176 | }, 2177 | "autoload": { 2178 | "files": [ 2179 | "bootstrap.php" 2180 | ], 2181 | "psr-4": { 2182 | "Symfony\\Polyfill\\Php80\\": "" 2183 | }, 2184 | "classmap": [ 2185 | "Resources/stubs" 2186 | ] 2187 | }, 2188 | "notification-url": "https://packagist.org/downloads/", 2189 | "license": [ 2190 | "MIT" 2191 | ], 2192 | "authors": [ 2193 | { 2194 | "name": "Ion Bazan", 2195 | "email": "ion.bazan@gmail.com" 2196 | }, 2197 | { 2198 | "name": "Nicolas Grekas", 2199 | "email": "p@tchwork.com" 2200 | }, 2201 | { 2202 | "name": "Symfony Community", 2203 | "homepage": "https://symfony.com/contributors" 2204 | } 2205 | ], 2206 | "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", 2207 | "homepage": "https://symfony.com", 2208 | "keywords": [ 2209 | "compatibility", 2210 | "polyfill", 2211 | "portable", 2212 | "shim" 2213 | ], 2214 | "support": { 2215 | "source": "https://github.com/symfony/polyfill-php80/tree/v1.24.0" 2216 | }, 2217 | "funding": [ 2218 | { 2219 | "url": "https://symfony.com/sponsor", 2220 | "type": "custom" 2221 | }, 2222 | { 2223 | "url": "https://github.com/fabpot", 2224 | "type": "github" 2225 | }, 2226 | { 2227 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2228 | "type": "tidelift" 2229 | } 2230 | ], 2231 | "time": "2021-09-13T13:58:33+00:00" 2232 | }, 2233 | { 2234 | "name": "symfony/polyfill-php81", 2235 | "version": "v1.24.0", 2236 | "source": { 2237 | "type": "git", 2238 | "url": "https://github.com/symfony/polyfill-php81.git", 2239 | "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f" 2240 | }, 2241 | "dist": { 2242 | "type": "zip", 2243 | "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/5de4ba2d41b15f9bd0e19b2ab9674135813ec98f", 2244 | "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f", 2245 | "shasum": "" 2246 | }, 2247 | "require": { 2248 | "php": ">=7.1" 2249 | }, 2250 | "type": "library", 2251 | "extra": { 2252 | "branch-alias": { 2253 | "dev-main": "1.23-dev" 2254 | }, 2255 | "thanks": { 2256 | "name": "symfony/polyfill", 2257 | "url": "https://github.com/symfony/polyfill" 2258 | } 2259 | }, 2260 | "autoload": { 2261 | "files": [ 2262 | "bootstrap.php" 2263 | ], 2264 | "psr-4": { 2265 | "Symfony\\Polyfill\\Php81\\": "" 2266 | }, 2267 | "classmap": [ 2268 | "Resources/stubs" 2269 | ] 2270 | }, 2271 | "notification-url": "https://packagist.org/downloads/", 2272 | "license": [ 2273 | "MIT" 2274 | ], 2275 | "authors": [ 2276 | { 2277 | "name": "Nicolas Grekas", 2278 | "email": "p@tchwork.com" 2279 | }, 2280 | { 2281 | "name": "Symfony Community", 2282 | "homepage": "https://symfony.com/contributors" 2283 | } 2284 | ], 2285 | "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", 2286 | "homepage": "https://symfony.com", 2287 | "keywords": [ 2288 | "compatibility", 2289 | "polyfill", 2290 | "portable", 2291 | "shim" 2292 | ], 2293 | "support": { 2294 | "source": "https://github.com/symfony/polyfill-php81/tree/v1.24.0" 2295 | }, 2296 | "funding": [ 2297 | { 2298 | "url": "https://symfony.com/sponsor", 2299 | "type": "custom" 2300 | }, 2301 | { 2302 | "url": "https://github.com/fabpot", 2303 | "type": "github" 2304 | }, 2305 | { 2306 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2307 | "type": "tidelift" 2308 | } 2309 | ], 2310 | "time": "2021-09-13T13:58:11+00:00" 2311 | }, 2312 | { 2313 | "name": "symfony/process", 2314 | "version": "v6.4.0", 2315 | "source": { 2316 | "type": "git", 2317 | "url": "https://github.com/symfony/process.git", 2318 | "reference": "191703b1566d97a5425dc969e4350d32b8ef17aa" 2319 | }, 2320 | "dist": { 2321 | "type": "zip", 2322 | "url": "https://api.github.com/repos/symfony/process/zipball/191703b1566d97a5425dc969e4350d32b8ef17aa", 2323 | "reference": "191703b1566d97a5425dc969e4350d32b8ef17aa", 2324 | "shasum": "" 2325 | }, 2326 | "require": { 2327 | "php": ">=8.1" 2328 | }, 2329 | "type": "library", 2330 | "autoload": { 2331 | "psr-4": { 2332 | "Symfony\\Component\\Process\\": "" 2333 | }, 2334 | "exclude-from-classmap": [ 2335 | "/Tests/" 2336 | ] 2337 | }, 2338 | "notification-url": "https://packagist.org/downloads/", 2339 | "license": [ 2340 | "MIT" 2341 | ], 2342 | "authors": [ 2343 | { 2344 | "name": "Fabien Potencier", 2345 | "email": "fabien@symfony.com" 2346 | }, 2347 | { 2348 | "name": "Symfony Community", 2349 | "homepage": "https://symfony.com/contributors" 2350 | } 2351 | ], 2352 | "description": "Executes commands in sub-processes", 2353 | "homepage": "https://symfony.com", 2354 | "support": { 2355 | "source": "https://github.com/symfony/process/tree/v6.4.0" 2356 | }, 2357 | "funding": [ 2358 | { 2359 | "url": "https://symfony.com/sponsor", 2360 | "type": "custom" 2361 | }, 2362 | { 2363 | "url": "https://github.com/fabpot", 2364 | "type": "github" 2365 | }, 2366 | { 2367 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2368 | "type": "tidelift" 2369 | } 2370 | ], 2371 | "time": "2023-11-17T21:06:49+00:00" 2372 | }, 2373 | { 2374 | "name": "symfony/service-contracts", 2375 | "version": "v2.5.0", 2376 | "source": { 2377 | "type": "git", 2378 | "url": "https://github.com/symfony/service-contracts.git", 2379 | "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc" 2380 | }, 2381 | "dist": { 2382 | "type": "zip", 2383 | "url": "https://api.github.com/repos/symfony/service-contracts/zipball/1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc", 2384 | "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc", 2385 | "shasum": "" 2386 | }, 2387 | "require": { 2388 | "php": ">=7.2.5", 2389 | "psr/container": "^1.1", 2390 | "symfony/deprecation-contracts": "^2.1" 2391 | }, 2392 | "conflict": { 2393 | "ext-psr": "<1.1|>=2" 2394 | }, 2395 | "suggest": { 2396 | "symfony/service-implementation": "" 2397 | }, 2398 | "type": "library", 2399 | "extra": { 2400 | "branch-alias": { 2401 | "dev-main": "2.5-dev" 2402 | }, 2403 | "thanks": { 2404 | "name": "symfony/contracts", 2405 | "url": "https://github.com/symfony/contracts" 2406 | } 2407 | }, 2408 | "autoload": { 2409 | "psr-4": { 2410 | "Symfony\\Contracts\\Service\\": "" 2411 | } 2412 | }, 2413 | "notification-url": "https://packagist.org/downloads/", 2414 | "license": [ 2415 | "MIT" 2416 | ], 2417 | "authors": [ 2418 | { 2419 | "name": "Nicolas Grekas", 2420 | "email": "p@tchwork.com" 2421 | }, 2422 | { 2423 | "name": "Symfony Community", 2424 | "homepage": "https://symfony.com/contributors" 2425 | } 2426 | ], 2427 | "description": "Generic abstractions related to writing services", 2428 | "homepage": "https://symfony.com", 2429 | "keywords": [ 2430 | "abstractions", 2431 | "contracts", 2432 | "decoupling", 2433 | "interfaces", 2434 | "interoperability", 2435 | "standards" 2436 | ], 2437 | "support": { 2438 | "source": "https://github.com/symfony/service-contracts/tree/v2.5.0" 2439 | }, 2440 | "funding": [ 2441 | { 2442 | "url": "https://symfony.com/sponsor", 2443 | "type": "custom" 2444 | }, 2445 | { 2446 | "url": "https://github.com/fabpot", 2447 | "type": "github" 2448 | }, 2449 | { 2450 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2451 | "type": "tidelift" 2452 | } 2453 | ], 2454 | "time": "2021-11-04T16:48:04+00:00" 2455 | }, 2456 | { 2457 | "name": "symfony/string", 2458 | "version": "v6.4.0", 2459 | "source": { 2460 | "type": "git", 2461 | "url": "https://github.com/symfony/string.git", 2462 | "reference": "b45fcf399ea9c3af543a92edf7172ba21174d809" 2463 | }, 2464 | "dist": { 2465 | "type": "zip", 2466 | "url": "https://api.github.com/repos/symfony/string/zipball/b45fcf399ea9c3af543a92edf7172ba21174d809", 2467 | "reference": "b45fcf399ea9c3af543a92edf7172ba21174d809", 2468 | "shasum": "" 2469 | }, 2470 | "require": { 2471 | "php": ">=8.1", 2472 | "symfony/polyfill-ctype": "~1.8", 2473 | "symfony/polyfill-intl-grapheme": "~1.0", 2474 | "symfony/polyfill-intl-normalizer": "~1.0", 2475 | "symfony/polyfill-mbstring": "~1.0" 2476 | }, 2477 | "conflict": { 2478 | "symfony/translation-contracts": "<2.5" 2479 | }, 2480 | "require-dev": { 2481 | "symfony/error-handler": "^5.4|^6.0|^7.0", 2482 | "symfony/http-client": "^5.4|^6.0|^7.0", 2483 | "symfony/intl": "^6.2|^7.0", 2484 | "symfony/translation-contracts": "^2.5|^3.0", 2485 | "symfony/var-exporter": "^5.4|^6.0|^7.0" 2486 | }, 2487 | "type": "library", 2488 | "autoload": { 2489 | "files": [ 2490 | "Resources/functions.php" 2491 | ], 2492 | "psr-4": { 2493 | "Symfony\\Component\\String\\": "" 2494 | }, 2495 | "exclude-from-classmap": [ 2496 | "/Tests/" 2497 | ] 2498 | }, 2499 | "notification-url": "https://packagist.org/downloads/", 2500 | "license": [ 2501 | "MIT" 2502 | ], 2503 | "authors": [ 2504 | { 2505 | "name": "Nicolas Grekas", 2506 | "email": "p@tchwork.com" 2507 | }, 2508 | { 2509 | "name": "Symfony Community", 2510 | "homepage": "https://symfony.com/contributors" 2511 | } 2512 | ], 2513 | "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", 2514 | "homepage": "https://symfony.com", 2515 | "keywords": [ 2516 | "grapheme", 2517 | "i18n", 2518 | "string", 2519 | "unicode", 2520 | "utf-8", 2521 | "utf8" 2522 | ], 2523 | "support": { 2524 | "source": "https://github.com/symfony/string/tree/v6.4.0" 2525 | }, 2526 | "funding": [ 2527 | { 2528 | "url": "https://symfony.com/sponsor", 2529 | "type": "custom" 2530 | }, 2531 | { 2532 | "url": "https://github.com/fabpot", 2533 | "type": "github" 2534 | }, 2535 | { 2536 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2537 | "type": "tidelift" 2538 | } 2539 | ], 2540 | "time": "2023-11-28T20:41:49+00:00" 2541 | } 2542 | ], 2543 | "packages-dev": [], 2544 | "aliases": [], 2545 | "minimum-stability": "stable", 2546 | "stability-flags": [], 2547 | "prefer-stable": false, 2548 | "prefer-lowest": true, 2549 | "platform": { 2550 | "php": "^8.3" 2551 | }, 2552 | "platform-dev": [], 2553 | "platform-overrides": { 2554 | "php": "8.3.13" 2555 | }, 2556 | "plugin-api-version": "2.6.0" 2557 | } 2558 | -------------------------------------------------------------------------------- /generate-comments/Dockerfile-build: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:experimental 2 | FROM wyrihaximusnet/php:8.3-nts-alpine-slim-dev-root AS install-dependencies 3 | RUN mkdir /workdir 4 | COPY ./composer.json /workdir 5 | COPY ./composer.lock /workdir 6 | WORKDIR /workdir 7 | RUN composer install --ansi --no-progress --no-interaction --prefer-dist 8 | 9 | ## Compile runtime image 10 | FROM wyrihaximusnet/php:8.3-nts-alpine-slim-root AS runtime 11 | RUN mkdir /workdir 12 | COPY ./entrypoint.sh ./comment.php ./post-process.php ./composer.* /workdir/ 13 | COPY --from=install-dependencies /workdir/vendor/ /workdir/vendor/ 14 | ENTRYPOINT ["/workdir/entrypoint.sh"] 15 | -------------------------------------------------------------------------------- /generate-comments/comment.php: -------------------------------------------------------------------------------- 1 | \__ ' . $argv[1] . ' -----^---{(@ -->'; 8 | $commentContents = $locator . PHP_EOL . $argv[2] . PHP_EOL . $diff . PHP_EOL; 9 | 10 | $client = new GuzzleHttp\Client(); 11 | $res = $client->request('GET', 'https://api.github.com/repos/' . getenv('GITHUB_REPOSITORY') . '/issues/' . $prNumber . '/comments', [ 12 | 'headers' => [ 13 | 'Accept' => 'application/vnd.github.v3+json', 14 | 'Authorization' => 'token ' . getenv('GITHUB_TOKEN'), 15 | ], 16 | ]); 17 | $comments = json_decode($res->getBody()->getContents(), true); 18 | 19 | foreach ($comments as $comment) { 20 | if (strpos($comment['body'], $locator) === 0) { 21 | if (strlen($diff) === 0) { 22 | echo 'Deleting ', $argv[1], ' comment', PHP_EOL; 23 | $client->request('DELETE', 'https://api.github.com/repos/' . getenv('GITHUB_REPOSITORY') . '/issues/comments/' . $comment['id'], [ 24 | 'headers' => [ 25 | 'Accept' => 'application/vnd.github.v3+json', 26 | 'Authorization' => 'token ' . getenv('GITHUB_TOKEN'), 27 | ], 28 | ]); 29 | 30 | exit(0); 31 | } 32 | 33 | echo 'Updating ', $argv[1], ' comment', PHP_EOL; 34 | $client->request('PATCH', 'https://api.github.com/repos/' . getenv('GITHUB_REPOSITORY') . '/issues/comments/' . $comment['id'], [ 35 | 'headers' => [ 36 | 'Accept' => 'application/vnd.github.v3+json', 37 | 'Authorization' => 'token ' . getenv('GITHUB_TOKEN'), 38 | 'Content-type' => 'application/json', 39 | ], 40 | 'json' => ['body' => $commentContents], 41 | ]); 42 | 43 | exit(0); 44 | } 45 | } 46 | 47 | if (strlen($diff) === 0) { 48 | exit(0); 49 | } 50 | 51 | 52 | echo 'Posting ', $argv[1], ' comment', PHP_EOL; 53 | $client->request('POST', 'https://api.github.com/repos/' . getenv('GITHUB_REPOSITORY') . '/issues/' . $prNumber . '/comments', [ 54 | 'headers' => [ 55 | 'Accept' => 'application/vnd.github.v3+json', 56 | 'Authorization' => 'token ' . getenv('GITHUB_TOKEN'), 57 | 'Content-type' => 'application/json', 58 | ], 59 | 'json' => ['body' => $commentContents], 60 | ]); 61 | -------------------------------------------------------------------------------- /generate-comments/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wyrihaximus/composer.lock-diff", 3 | "description": "GitHub Action that diffs composer.lock between current branch and default branch", 4 | "require": { 5 | "php": "^8.3", 6 | "composer/composer": "^2.7.7", 7 | "guzzlehttp/guzzle": "^7.8.0", 8 | "ion-bazan/composer-diff": "^1.9", 9 | "symfony/console": "^7.0.0" 10 | }, 11 | "config": { 12 | "platform": { 13 | "php": "8.3.13" 14 | }, 15 | "preferred-install": "dist", 16 | "sort-packages": true, 17 | "allow-plugins": { 18 | "ion-bazan/composer-diff": true 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /generate-comments/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/ash 2 | 3 | set -eo pipefail 4 | 5 | 6 | echo "Working Directory:" 7 | workingDirectory=$([ -z "$INPUT_WORKINGDIRECTORY" ] && echo "" || echo "$(echo "${INPUT_WORKINGDIRECTORY}" | sed 's/\\//g')/") 8 | echo "${workingDirectory}" 9 | 10 | /workdir/vendor/bin/composer-diff ".wyrihaximus-composer.lock-diff/checkout/base-ref/${workingDirectory}composer.lock" ".wyrihaximus-composer.lock-diff/checkout/sha-sha/${workingDirectory}composer.lock" --with-links --with-platform --no-dev -vvv > /workdir/production.md 11 | production=$(cat /workdir/production.md) 12 | /workdir/vendor/bin/composer-diff ".wyrihaximus-composer.lock-diff/checkout/base-ref/${workingDirectory}composer.lock" ".wyrihaximus-composer.lock-diff/checkout/sha-sha/${workingDirectory}composer.lock" --with-links --with-platform --no-prod -vvv > /workdir/development.md 13 | development=$(cat /workdir/development.md) 14 | 15 | echo "Raw:" 16 | echo "==================================================" 17 | echo "Production:" 18 | echo "${production}" 19 | echo "--------------------------------------------------" 20 | echo "Development:" 21 | echo "${development}" 22 | 23 | php /workdir/post-process.php production 24 | php /workdir/post-process.php development 25 | 26 | echo "Post Processed:" 27 | echo "==================================================" 28 | echo "Production:" 29 | echo "${production}" 30 | echo "--------------------------------------------------" 31 | echo "Development:" 32 | echo "${development}" 33 | 34 | delimiter="$(openssl rand -hex 8)" 35 | echo "production<<${delimiter}" >> "${GITHUB_OUTPUT}" 36 | echo "$production" >> "${GITHUB_OUTPUT}" 37 | echo "${delimiter}" >> "${GITHUB_OUTPUT}" 38 | 39 | delimiter="$(openssl rand -hex 8)" 40 | echo "development<<${delimiter}" >> "${GITHUB_OUTPUT}" 41 | echo "$development" >> "${GITHUB_OUTPUT}" 42 | echo "${delimiter}" >> "${GITHUB_OUTPUT}" 43 | 44 | 45 | if [ "$INPUT_DRYRUN" != "yes" ] 46 | echo "In a dry run so not upserting comments when desirable" 47 | then 48 | echo "Not in a dry run so upserting comments when desirable" 49 | php /workdir/comment.php production "🏰 Composer Production Dependency changes 🏰" 50 | php /workdir/comment.php development "🚧 Composer Development Dependency changes 🚧" 51 | fi 52 | -------------------------------------------------------------------------------- /generate-comments/post-process.php: -------------------------------------------------------------------------------- 1 | $sha) { 15 | foreach ($lines as $index => $contents) { 16 | if (strpos($contents, ' | 9999999-dev ' . $sha . ' | dev-' . $matches[1][$matchIndex] . ' ' . $sha . ' | ') !== false) { 17 | unset($lines[$index]); 18 | } 19 | } 20 | } 21 | 22 | $processedContents = implode(PHP_EOL, $lines); 23 | if (strpos($processedContents, '[Compare]') === false) { 24 | $processedContents = ''; 25 | } 26 | 27 | file_put_contents('/workdir/' . $argv[1] . '.md', $processedContents); 28 | -------------------------------------------------------------------------------- /images/comment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WyriHaximus/github-action-composer.lock-diff/d226bac58283232585b53b44bcd9ed83df8b605f/images/comment.png --------------------------------------------------------------------------------