Added capability of skipping some event types (#7)

diff --git a/README.md b/README.md
index 9de025f..5354a8e 100644
--- a/README.md
+++ b/README.md
@@ -114,6 +114,8 @@
 | `notifyPRCancelMessage` | no       |              | Optional cancel message to use instead of the default one when notifyPRCancel is true.  It is only used in 'self' cancelling mode.                                                                               |
 | `notifyPRMessageStart`  | no       |              | Only for workflow_run events triggered by the PRs. If not empty, it notifies those PRs with the message specified at the start of the workflow - adding the link to the triggered workflow_run.                  |
 | `jobNameRegexps`        | no       |              | An array of job name regexps. Only runs containing any job name matching any of of the regexp in this array are considered for cancelling in `failedJobs` and `namedJobs` cancel modes.                          |
+| `skipEventTypes`        | no       |              | Array of event names that should be skipped when cancelling (JSON-encoded string). This might be used in order to skip direct pushes or scheduled events..                                                       |
+
 
 The job cancel modes work as follows:
 
@@ -303,6 +305,9 @@
 events triggered in the local repository, as well as triggered from the forks, so you do not need
 to set up any extra actions to cancel internal Pushes/Pull Requests.
 
+You can also choose to skip certain types of events (for example `push` and `schedule` if you want your
+jobs to run to full completion for this kind of events.
+
 ```yaml
 name: Cancelling
 on:
@@ -322,6 +327,7 @@
           token: ${{ secrets.GITHUB_TOKEN }}
           sourceRunId: ${{ github.event.workflow_run.id }}
           notifyPRCancel: true
+          skipEventTypes: '["push", "schedule"]'
 ```
 
 Note that `duplicate` cancel mode cannot be used for `workflow_run` type of event without `sourceId` input.
diff --git a/action.yml b/action.yml
index 7accb50..8fc9087 100644
--- a/action.yml
+++ b/action.yml
@@ -41,6 +41,11 @@
       Array of job name regexps (JSON-encoded string). Used by `failedJobs` and `namedJobs` cancel modes
       to match job names of workflow runs.
     required: false
+  skipEventTypes:
+    description: |
+      Array of event names that should be skipped when cancelling (JSON-encoded string). This might be used
+      in order to skip direct pushes or scheduled events.
+    required: false
 runs:
   using: 'node12'
   main: 'dist/index.js'
diff --git a/dist/index.js b/dist/index.js
index 7f28bf7..53c47fc 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -1622,7 +1622,7 @@
         return workflowRuns;
     });
 }
-function shouldBeCancelled(octokit, owner, repo, runItem, headRepo, cancelMode, sourceRunId, jobNamesRegexps) {
+function shouldBeCancelled(octokit, owner, repo, runItem, headRepo, cancelMode, sourceRunId, jobNamesRegexps, skipEventTypes) {
     return __awaiter(this, void 0, void 0, function* () {
         if ('completed' === runItem.status.toString()) {
             core.info(`\nThe run ${runItem.id} is completed. Not cancelling it.\n`);
@@ -1632,6 +1632,11 @@
             core.info(`\nThe run ${runItem.id} is (${runItem.event} event - not in ${CANCELLABLE_RUNS}). Not cancelling it.\n`);
             return false;
         }
+        if (skipEventTypes.includes(runItem.event.toString())) {
+            core.info(`\nThe run ${runItem.id} is (${runItem.event} event - ` +
+                `it is in skipEventTypes ${skipEventTypes}). Not cancelling it.\n`);
+            return false;
+        }
         if (cancelMode === CancelMode.FAILED_JOBS) {
             // Cancel all jobs that have failed jobs (no matter when started)
             if (yield jobsMatchingNames(octokit, owner, repo, runItem.id, jobNamesRegexps, true)) {
@@ -1705,7 +1710,7 @@
         }
     });
 }
-function findAndCancelRuns(octokit, selfRunId, sourceWorkflowId, sourceRunId, owner, repo, headRepo, headBranch, sourceEventName, cancelMode, notifyPRCancel, notifyPRMessageStart, jobNameRegexps, reason) {
+function findAndCancelRuns(octokit, selfRunId, sourceWorkflowId, sourceRunId, owner, repo, headRepo, headBranch, sourceEventName, cancelMode, notifyPRCancel, notifyPRMessageStart, jobNameRegexps, skipEventTypes, reason) {
     return __awaiter(this, void 0, void 0, function* () {
         const statusValues = ['queued', 'in_progress'];
         const workflowRuns = yield getWorkflowRuns(octokit, statusValues, cancelMode, function (status) {
@@ -1734,7 +1739,7 @@
         const pullRequestToNotify = [];
         for (const [key, runItem] of workflowRuns) {
             core.info(`\nChecking run number: ${key}, RunId: ${runItem.id}, Url: ${runItem.url}. Status ${runItem.status}\n`);
-            if (yield shouldBeCancelled(octokit, owner, repo, runItem, headRepo, cancelMode, sourceRunId, jobNameRegexps)) {
+            if (yield shouldBeCancelled(octokit, owner, repo, runItem, headRepo, cancelMode, sourceRunId, jobNameRegexps, skipEventTypes)) {
                 if (notifyPRCancel && runItem.event === 'pull_request') {
                     const pullRequest = yield findPullRequest(octokit, owner, repo, runItem.head_repository.owner.login, runItem.head_branch, runItem.head_sha);
                     if (pullRequest) {
@@ -1832,7 +1837,7 @@
         ];
     });
 }
-function performCancelJob(octokit, selfRunId, sourceWorkflowId, sourceRunId, owner, repo, headRepo, headBranch, sourceEventName, cancelMode, notifyPRCancel, notifyPRCancelMessage, notifyPRMessageStart, jobNameRegexps) {
+function performCancelJob(octokit, selfRunId, sourceWorkflowId, sourceRunId, owner, repo, headRepo, headBranch, sourceEventName, cancelMode, notifyPRCancel, notifyPRCancelMessage, notifyPRMessageStart, jobNameRegexps, skipEventTypes) {
     return __awaiter(this, void 0, void 0, function* () {
         core.info('\n###################################################################################\n');
         core.info(`All parameters: owner: ${owner}, repo: ${repo}, run id: ${sourceRunId}, ` +
@@ -1862,7 +1867,7 @@
             throw Error(`Wrong cancel mode ${cancelMode}! This should never happen.`);
         }
         core.info('\n###################################################################################\n');
-        return yield findAndCancelRuns(octokit, selfRunId, sourceWorkflowId, sourceRunId, owner, repo, headRepo, headBranch, sourceEventName, cancelMode, notifyPRCancel, notifyPRMessageStart, jobNameRegexps, reason);
+        return yield findAndCancelRuns(octokit, selfRunId, sourceWorkflowId, sourceRunId, owner, repo, headRepo, headBranch, sourceEventName, cancelMode, notifyPRCancel, notifyPRMessageStart, jobNameRegexps, skipEventTypes, reason);
     });
 }
 function verboseOutput(name, value) {
@@ -1885,8 +1890,13 @@
         const jobNameRegexps = jobNameRegexpsString
             ? JSON.parse(jobNameRegexpsString)
             : [];
+        const skipEventTypesString = core.getInput('skipEventTypes');
+        const skipEventTypes = skipEventTypesString
+            ? JSON.parse(skipEventTypesString)
+            : [];
         const [owner, repo] = repository.split('/');
-        core.info(`\nGetting workflow id for source run id: ${sourceRunId}, owner: ${owner}, repo: ${repo}\n`);
+        core.info(`\nGetting workflow id for source run id: ${sourceRunId}, owner: ${owner}, repo: ${repo},` +
+            ` skipEventTypes: ${skipEventTypes}\n`);
         const sourceWorkflowId = yield getWorkflowId(octokit, sourceRunId, owner, repo);
         core.info(`Repository: ${repository}, Owner: ${owner}, Repo: ${repo}, ` +
             `Event name: ${eventName}, CancelMode: ${cancelMode}, ` +
@@ -1926,7 +1936,7 @@
                 body: `${notifyPRMessageStart} [The workflow run](${selfWorkflowRunUrl})`
             });
         }
-        const cancelledRuns = yield performCancelJob(octokit, selfRunId, sourceWorkflowId, sourceRunId, owner, repo, headRepo, headBranch, sourceEventName, cancelMode, notifyPRCancel, notifyPRCancelMessage, notifyPRMessageStart, jobNameRegexps);
+        const cancelledRuns = yield performCancelJob(octokit, selfRunId, sourceWorkflowId, sourceRunId, owner, repo, headRepo, headBranch, sourceEventName, cancelMode, notifyPRCancel, notifyPRCancelMessage, notifyPRMessageStart, jobNameRegexps, skipEventTypes);
         verboseOutput('cancelledRuns', JSON.stringify(cancelledRuns));
     });
 }
diff --git a/src/main.ts b/src/main.ts
index 44ef1bc..e7bcbe8 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -204,7 +204,8 @@
   headRepo: string,
   cancelMode: CancelMode,
   sourceRunId: number,
-  jobNamesRegexps: string[]
+  jobNamesRegexps: string[],
+  skipEventTypes: string[]
 ): Promise<boolean> {
   if ('completed' === runItem.status.toString()) {
     core.info(`\nThe run ${runItem.id} is completed. Not cancelling it.\n`)
@@ -216,6 +217,13 @@
     )
     return false
   }
+  if (skipEventTypes.includes(runItem.event.toString())) {
+    core.info(
+      `\nThe run ${runItem.id} is (${runItem.event} event - ` +
+        `it is in skipEventTypes ${skipEventTypes}). Not cancelling it.\n`
+    )
+    return false
+  }
   if (cancelMode === CancelMode.FAILED_JOBS) {
     // Cancel all jobs that have failed jobs (no matter when started)
     if (
@@ -333,6 +341,7 @@
   notifyPRCancel: boolean,
   notifyPRMessageStart: string,
   jobNameRegexps: string[],
+  skipEventTypes: string[],
   reason: string
 ): Promise<number[]> {
   const statusValues = ['queued', 'in_progress']
@@ -406,7 +415,8 @@
         headRepo,
         cancelMode,
         sourceRunId,
-        jobNameRegexps
+        jobNameRegexps,
+        skipEventTypes
       )
     ) {
       if (notifyPRCancel && runItem.event === 'pull_request') {
@@ -570,7 +580,8 @@
   notifyPRCancel: boolean,
   notifyPRCancelMessage: string,
   notifyPRMessageStart: string,
-  jobNameRegexps: string[]
+  jobNameRegexps: string[],
+  skipEventTypes: string[]
 ): Promise<number[]> {
   core.info(
     '\n###################################################################################\n'
@@ -627,6 +638,7 @@
     notifyPRCancel,
     notifyPRMessageStart,
     jobNameRegexps,
+    skipEventTypes,
     reason
   )
 }
@@ -653,10 +665,17 @@
   const jobNameRegexps = jobNameRegexpsString
     ? JSON.parse(jobNameRegexpsString)
     : []
+
+  const skipEventTypesString = core.getInput('skipEventTypes')
+  const skipEventTypes = skipEventTypesString
+    ? JSON.parse(skipEventTypesString)
+    : []
+
   const [owner, repo] = repository.split('/')
 
   core.info(
-    `\nGetting workflow id for source run id: ${sourceRunId}, owner: ${owner}, repo: ${repo}\n`
+    `\nGetting workflow id for source run id: ${sourceRunId}, owner: ${owner}, repo: ${repo},` +
+      ` skipEventTypes: ${skipEventTypes}\n`
   )
   const sourceWorkflowId = await getWorkflowId(
     octokit,
@@ -738,7 +757,8 @@
     notifyPRCancel,
     notifyPRCancelMessage,
     notifyPRMessageStart,
-    jobNameRegexps
+    jobNameRegexps,
+    skipEventTypes
   )
 
   verboseOutput('cancelledRuns', JSON.stringify(cancelledRuns))