master 077bddd7bdab cached
7 files
8.9 KB
2.3k tokens
2 symbols
1 requests
Download .txt
Repository: deepakputhraya/action-pr-title
Branch: master
Commit: 077bddd7bdab
Files: 7
Total size: 8.9 KB

Directory structure:
gitextract_emneji4x/

├── .github/
│   └── workflows/
│       └── main.yml
├── .gitignore
├── LICENSE
├── README.md
├── action.yml
├── index.js
└── package.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/workflows/main.yml
================================================
name: main
# This workflow is triggered on pushes to the repository.
on:
  pull_request:
    types: [opened, edited, synchronize, reopened]

jobs:
  build:
    # Job name is Greeting
    name: Check
    # This job runs on Linux
    runs-on: 'ubuntu-latest'
    steps:
      - uses: actions/checkout@master
      - uses: actions/setup-node@v1
        with:
          node-version: '20'
      - run: npm install
      - name: Validate
        uses: ./
        with:
          github_token: ${{ github.token }}


================================================
FILE: .gitignore
================================================
.idea/


================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2018 GitHub, Inc. and contributors

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.


================================================
FILE: README.md
================================================
# Branch naming rules
<img alt="GitHub Actions status" src="https://github.com/deepakputhraya/action-pr-title/workflows/main/badge.svg">

Github action to enforce Pull Request title conventions

## Usage

See [action.yml](./action.yml)

```yaml
steps:
- uses: deepakputhraya/action-pr-title@master
  with:
    regex: '([a-z])+\/([a-z])+' # Regex the title should match.
    allowed_prefixes: 'feature,fix,JIRA' # title should start with the given prefix
    disallowed_prefixes: 'feat/,hotfix' # title should not start with the given prefix
    prefix_case_sensitive: false # title prefix are case insensitive
    min_length: 5 # Min length of the title
    max_length: 20 # Max length of the title
    verbal_description: 'Two words with a slash (/) between' # Verbal description of the regex rule
    github_token: ${{ github.token }} # Default: ${{ github.token }}
```

### Note:
Ensure to add `types` to the Pull requests webhook event as by default workflows are triggered only 
for `opened`, `synchronize`, or `reopened` pull request events. Read more about 
it [here](https://docs.github.com/en/free-pro-team@latest/actions/reference/events-that-trigger-workflows#pull_request). 
```yaml
on:
  pull_request:
    types: [opened, edited, synchronize, reopened]
```
or 
[here](https://docs.github.com/en/free-pro-team@latest/actions/reference/events-that-trigger-workflows#pull_request_target). 
```yaml
on:
  pull_request_target:
    types: [opened, edited, synchronize, reopened]
```

Triggering the action on anything other than `pull_request` or `pull_request_target` will cause a failure.

## Permissions

In case the action fails with the following error:

```
Event name: pull_request
Error: Resource not accessible by integration
```

You can fix this, by adding the following to your workflow:


```yaml
permissions:
  pull-requests: read
```

## License
The scripts and documentation in this project are released under the [MIT License](./LICENSE)


================================================
FILE: action.yml
================================================
name: 'Pull Request title rules'
description: 'Github action to enforce Pull Request title conventions'
author: 'deepakputhraya'
inputs:
  regex:
    description: 'Regex to validate the pull request title'
    required: false
    default: '.+'
  allowed_prefixes:
    description: 'Comma separated list of prefix allowed to be used in title. eg: feature,hotfix,JIRA-'
    required: false
    default: ''
  disallowed_prefixes:
    description: 'Comma separated list of prefix disallowed to be used in title. eg: feat,fix'
    required: false
    default: ''
  prefix_case_sensitive:
    description: 'Are the allowed & disallowed prefixes case sensitive?'
    required: false
    default: 'false'
  min_length:
    description: 'Min length of title'
    required: false
    default: '1'
  max_length:
    description: 'Max length of title. -1 to ignore the rule'
    required: false
    default: '-1'
  verbal_description:
    description: 'Description of the title rules to display when the action fails'
    required: false
    default: ''
  github_token:
    description: >
      Personal access token (PAT) used to fetch the repository. The PAT is configured
      with the local git config, which enables your scripts to run authenticated git
      commands. The post-job step removes the PAT.
      We recommend using a service account with the least permissions necessary.
      Also when generating a new PAT, select the least scopes necessary.
    required: false
    default: ${{ github.token }}

runs:
  using: 'node20'
  main: 'index.js'
branding:
  icon: 'alert-triangle'
  color: 'gray-dark'


================================================
FILE: index.js
================================================
const core = require('@actions/core');
const github = require('@actions/github');

const validEvent = ['pull_request','pull_request_target'];

function validateTitlePrefix(title, prefix, caseSensitive) {
    if (!caseSensitive) {
        prefix = prefix.toLowerCase();
        title = title.toLowerCase();
    }
    return title.startsWith(prefix);
}

async function run() {
    try {
        const verbalDescription = core.getInput('verbal_description')
        const authToken = core.getInput('github_token', {required: true})
        const eventName = github.context.eventName;
        core.info(`Event name: ${eventName}`);
        if (validEvent.indexOf(eventName) < 0) {
            core.setFailed(`Invalid event: ${eventName}`);
            return;
        }

        const owner = github.context.payload.pull_request.base.user.login;
        const repo = github.context.payload.pull_request.base.repo.name;

        const client = new github.getOctokit(authToken);
        // The pull request info on the context isn't up to date. When
        // the user updates the title and re-runs the workflow, it would
        // be outdated. Therefore fetch the pull request via the REST API
        // to ensure we use the current title.
        const {data: pullRequest} = await client.rest.pulls.get({
          owner,
          repo,
          pull_number: github.context.payload.pull_request.number
        });

        const title = pullRequest.title;

        core.info(`Pull Request title: "${title}"`);

        // Check if title pass regex
        const regex = RegExp(core.getInput('regex'));
        if (!regex.test(title)) {
            const messageSuffix = verbalDescription ? `rule - ${verbalDescription}` : `match regex - ${regex}`;

            core.setFailed(`Pull Request title "${title}" failed to pass ${messageSuffix}`);
            return
        }

        // Check min length
        const minLen = parseInt(core.getInput('min_length'));
        if (title.length < minLen) {
            core.setFailed(`Pull Request title "${title}" is smaller than min length specified - ${minLen}`);
            return
        }

        // Check max length
        const maxLen = parseInt(core.getInput('max_length'));
        if (maxLen > 0 && title.length > maxLen) {
            core.setFailed(`Pull Request title "${title}" is greater than max length specified - ${maxLen}`);
            return
        }

        // Check if title starts with an allowed prefix
        let prefixes = core.getInput('allowed_prefixes');
        const prefixCaseSensitive = (core.getInput('prefix_case_sensitive') === 'true');
        core.info(`Allowed Prefixes: ${prefixes}`);
        if (prefixes.length > 0 && !prefixes.split(',').some((el) => validateTitlePrefix(title, el, prefixCaseSensitive))) {
            core.setFailed(`Pull Request title "${title}" did not match any of the prefixes - ${prefixes}`);
            return
        }

        // Check if title starts with a disallowed prefix
        prefixes = core.getInput('disallowed_prefixes');
        core.info(`Disallowed Prefixes: ${prefixes}`);
        if (prefixes.length > 0 && prefixes.split(',').some((el) => validateTitlePrefix(title, el, prefixCaseSensitive))) {
            core.setFailed(`Pull Request title "${title}" matched with a disallowed prefix - ${prefixes}`);
            return
        }

    } catch (error) {
        core.setFailed(error.message);
    }
}

run();


================================================
FILE: package.json
================================================
{
  "name": "action-pr-title",
  "version": "1.3.0",
  "description": "Github action to enforce naming convention on Pull Request titles",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "github",
    "actions"
  ],
  "author": "deepakputhraya",
  "license": "MIT",
  "dependencies": {
    "@actions/core": "^1.11.1",
    "@actions/github": "^6.0.0"
  }
}
Download .txt
gitextract_emneji4x/

├── .github/
│   └── workflows/
│       └── main.yml
├── .gitignore
├── LICENSE
├── README.md
├── action.yml
├── index.js
└── package.json
Download .txt
SYMBOL INDEX (2 symbols across 1 files)

FILE: index.js
  function validateTitlePrefix (line 6) | function validateTitlePrefix(title, prefix, caseSensitive) {
  function run (line 14) | async function run() {
Condensed preview — 7 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (10K chars).
[
  {
    "path": ".github/workflows/main.yml",
    "chars": 508,
    "preview": "name: main\n# This workflow is triggered on pushes to the repository.\non:\n  pull_request:\n    types: [opened, edited, syn"
  },
  {
    "path": ".gitignore",
    "chars": 7,
    "preview": ".idea/\n"
  },
  {
    "path": "LICENSE",
    "chars": 1096,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2018 GitHub, Inc. and contributors\n\nPermission is hereby granted, free of charge, t"
  },
  {
    "path": "README.md",
    "chars": 1962,
    "preview": "# Branch naming rules\n<img alt=\"GitHub Actions status\" src=\"https://github.com/deepakputhraya/action-pr-title/workflows/"
  },
  {
    "path": "action.yml",
    "chars": 1606,
    "preview": "name: 'Pull Request title rules'\ndescription: 'Github action to enforce Pull Request title conventions'\nauthor: 'deepakp"
  },
  {
    "path": "index.js",
    "chars": 3449,
    "preview": "const core = require('@actions/core');\nconst github = require('@actions/github');\n\nconst validEvent = ['pull_request','p"
  },
  {
    "path": "package.json",
    "chars": 458,
    "preview": "{\n  \"name\": \"action-pr-title\",\n  \"version\": \"1.3.0\",\n  \"description\": \"Github action to enforce naming convention on Pul"
  }
]

About this extraction

This page contains the full source code of the deepakputhraya/action-pr-title GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 7 files (8.9 KB), approximately 2.3k tokens, and a symbol index with 2 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!