Compare commits

..

163 Commits
pr-3 ... master

Author SHA1 Message Date
f110a678f5
rm bang
Signed-off-by: Václav Valíček <valicek1994@gmail.com>
2022-07-27 08:40:56 +02:00
bfcc41e678
New: test-2
Signed-off-by: Václav Valíček <valicek1994@gmail.com>
2022-07-27 08:39:26 +02:00
917323e628
New test-1
Signed-off-by: Václav Valíček <valicek1994@gmail.com>
2022-07-27 08:35:18 +02:00
e0c7e2a725
Singned commit + source modify
Signed-off-by: Václav Valíček <valicek1994@gmail.com>
2022-06-20 01:49:32 +02:00
Stephan
7bc1195651 exp 2022-03-18 18:49:47 +01:00
Stephan
786c441206 exp 2022-03-18 18:48:12 +01:00
Stephan
558f12143c exp 2022-03-18 18:45:23 +01:00
Stephan
2cd8137eeb exp 2022-03-18 18:39:54 +01:00
Stephan
77f77c3e8b exp 2022-03-18 18:37:35 +01:00
Stephan
143637c4fc exp 2022-03-18 18:31:39 +01:00
Stephan
06bdaca2c1 exp 2022-03-18 18:30:07 +01:00
Stephan
10c0963c6d exp 2022-03-18 18:24:54 +01:00
Stephan
30c00bf385 exp 2022-03-18 18:23:20 +01:00
Stephan
d6b1a8d591 exp 2022-03-18 18:20:34 +01:00
Stephan
c090c23662 exp 2022-03-18 18:10:55 +01:00
Stephan
d8cd3257e0 exp 2022-03-18 18:08:47 +01:00
Stephan
93e9740904 exp 2022-03-18 18:03:53 +01:00
Stephan
95d31440db exp 2022-03-18 18:02:01 +01:00
Stephan
f916de4ff4 exp 2022-03-18 18:00:22 +01:00
Stephan
b3615798ac exp 2022-03-18 17:58:45 +01:00
Stephan
4f5e3068cc exp 2022-03-18 17:52:23 +01:00
Stephan
86dab14dfd exp 2022-03-18 17:50:11 +01:00
Stephan
fa0c7b9ac1 exp 2022-03-18 17:46:24 +01:00
Stephan
863aefcc9d exp 2022-03-18 17:42:21 +01:00
Stephan
d6ed51a6f0 exp 2022-03-18 17:02:19 +01:00
Stephan
efed3f3cc1 exp 2022-03-18 16:58:14 +01:00
Stephan
13a337a9b8 exp 2022-03-18 16:56:06 +01:00
Stephan
ac561c87a4 exp 2022-03-18 16:45:22 +01:00
Stephan
6f924bbb78 exp 2022-03-18 16:44:03 +01:00
Stephan
cb40378ce6 exp 2022-03-18 16:40:35 +01:00
Stephan
74f650bb33 exp 2022-03-18 16:35:35 +01:00
Stephan
b893475bf9 exp 2022-03-18 16:33:02 +01:00
Stephan
cfa76a1ae7 exp 2022-03-18 16:30:06 +01:00
Stephan
716be074d3 exp 2022-03-18 16:22:46 +01:00
Stephan
2249395b68 exp 2022-03-18 16:20:45 +01:00
Stephan
b7b967f078 exp 2022-03-18 16:11:14 +01:00
Stephan
df19db009c exp 2022-03-18 16:08:28 +01:00
Stephan
b789a373ac exp 2022-03-18 16:06:27 +01:00
Stephan
80ea5c8f2c exp 2022-03-18 16:02:03 +01:00
Stephan
aee24c13f3 exp 2022-03-18 16:00:10 +01:00
Stephan
d77c4fdfd4 exp 2022-03-18 15:58:28 +01:00
Stephan
21b99568fe exp 2022-03-18 15:53:55 +01:00
Stephan
0835da33bd exp 2022-03-18 15:53:27 +01:00
Stephan
c0b18d2f43 exp 2022-03-18 15:47:17 +01:00
Stephan
af2ea06031 fix 2022-01-10 20:05:10 +01:00
Stephan
eb36d5f680 fix 2022-01-10 20:00:34 +01:00
Stephan
e0f2b0031a fix 2022-01-10 19:53:04 +01:00
Stephan
59c7f9c4ce fix 2022-01-10 19:25:02 +01:00
Stephan
c26fc558a8 fix 2022-01-10 19:21:00 +01:00
Stephan
0b3a88b35a fix 2022-01-10 19:14:40 +01:00
Stephan
1da26533a1 fix 2022-01-10 18:51:48 +01:00
Stephan
702e7112e2 fix 2022-01-10 18:49:04 +01:00
Stephan
6a00c973fb fix 2022-01-10 18:39:14 +01:00
Stephan
a7ff547627 fix 2022-01-10 16:02:56 +01:00
Stephan
46233a24ae fix 2022-01-10 15:57:24 +01:00
Stephan
0741c67ed3 fix 2022-01-10 15:55:57 +01:00
Stephan
2d88efd6e2 fix 2022-01-10 15:23:50 +01:00
Stephan
2926b8c82d fix 2022-01-10 15:16:02 +01:00
Stephan
48eb74f956 fix 2022-01-10 15:05:08 +01:00
Stephan
021137402f fix 2022-01-10 15:02:03 +01:00
Stephan
4227e0fa09 fix 2022-01-10 14:59:04 +01:00
Stephan
f1101d51bc fix 2022-01-10 14:41:24 +01:00
Stephan
1e8aa06e8f fix 2022-01-10 14:38:36 +01:00
Stephan
7df140fdbb fix 2022-01-10 14:37:03 +01:00
Stephan
d3f5d490e6 fix 2022-01-10 14:34:34 +01:00
Stephan
2b75661fd2 fix 2022-01-10 13:25:02 +01:00
Stephan
bd262a8978 fix 2022-01-10 13:23:53 +01:00
Stephan
14e56223cd fix 2022-01-10 13:22:35 +01:00
Stephan
a8da58dd52 make it minimal 2022-01-10 12:10:30 +01:00
Stephan
522b08f4fb fix 2022-01-10 11:28:16 +01:00
Stephan
1124d1661a test assign-milestone 2022-01-10 11:25:09 +01:00
Stephan
7c3bb81709 cleanup 2022-01-10 08:16:46 +01:00
Stephan
3d32dbd623 fix 2021-12-20 19:22:26 +01:00
Stephan
e902f2afac fix 2021-12-20 19:16:22 +01:00
Stephan
0132417d3a fix 2021-12-20 19:12:14 +01:00
Stephan
2376e90494 fix 2021-12-20 19:08:45 +01:00
Stephan
af84310aa0 fix 2021-12-20 19:07:11 +01:00
Stephan
02c3f02a25 fix 2021-12-20 19:02:46 +01:00
Stephan
4661a20940 fix 2021-12-20 14:19:30 +01:00
Stephan
d1aba02e40 fix 2021-12-20 13:01:12 +01:00
Stephan
87f5690188 fix 2021-12-16 16:07:45 +01:00
Stephan
f9c717556d fix 2021-12-16 16:06:06 +01:00
Stephan
b7be07cd11 fix 2021-12-16 16:04:40 +01:00
Stephan
bccd87fe75 fix 2021-12-16 15:51:58 +01:00
Stephan
3855041754 fix 2021-12-16 14:49:26 +01:00
Stephan
72c147effd fix 2021-12-16 14:09:19 +01:00
Stephan
241f21c28b fix 2021-12-16 14:06:20 +01:00
Stephan
7035d63440 fix 2021-12-16 14:03:52 +01:00
Stephan
561e1dcfde fix 2021-12-16 13:59:02 +01:00
Stephan
04327b45b0 fix 2021-12-16 13:55:52 +01:00
Stephan
435be3b612 fix 2021-12-16 13:54:27 +01:00
Stephan
ef71b6110f fix 2021-12-16 13:51:58 +01:00
Stephan
4611d58702 fix 2021-12-16 13:48:06 +01:00
Stephan
6f0311f20f fix 2021-12-16 13:44:14 +01:00
Stephan
7b4d73a9db fix 2021-12-16 13:39:46 +01:00
Stephan
5144a4ebeb fix 2021-12-16 13:00:12 +01:00
Stephan
6d27d4d607 fix 2021-12-16 12:56:17 +01:00
Stephan
6349403466 fix 2021-12-16 12:54:38 +01:00
Stephan
9e6aad4060 fix 2021-12-16 12:50:40 +01:00
Stephan
3356fe58aa fix 2021-12-16 12:49:06 +01:00
Stephan
4bf2ae8436 fix 2021-12-16 12:47:47 +01:00
Stephan
a748f6afa7 Merge remote-tracking branch 'origin/master' 2021-12-16 12:46:23 +01:00
Stephan
d4fe53e46b test assign to project 2021-12-16 12:46:08 +01:00
Stephan
879fa90155
Merge pull request #64 from M0stafa-Fawzy/master
Merge: Add files via upload
Looks good to me now!
2021-12-13 10:26:19 +01:00
Mostafa Fawzy
912747b966
Update 6.txt 2021-12-12 23:35:15 +02:00
Mostafa Fawzy
23a0258b4a
Merge pull request #1 from M0stafa-Fawzy/M0stafa-Fawzy-patch-1
Add files via upload
2021-12-12 03:52:48 +02:00
Mostafa Fawzy
2210711e57
Add files via upload 2021-12-12 03:51:28 +02:00
Mostafa Fawzy
1a1db12656
Add files via upload 2021-12-12 03:44:10 +02:00
Stephan
43287ec9cf exp 2021-12-10 18:56:12 +01:00
Stephan
4bc423721a exp 2021-12-10 18:09:50 +01:00
Stephan
5ef1917f61 exp 2021-12-10 18:04:43 +01:00
Stephan
3b98325435 exp 2021-12-10 17:53:40 +01:00
Stephan
7688e0cbc7 exp 2021-12-10 17:48:01 +01:00
Stephan
5595250e09 exp 2021-12-10 17:42:04 +01:00
Stephan
4e8f7f271f exp 2021-12-10 17:39:59 +01:00
Stephan
f2db146379 exp 2021-12-10 17:35:15 +01:00
Stephan
11e6e12f60 exp 2021-12-10 17:32:45 +01:00
Stephan
56827f467a rename 2021-12-10 17:30:51 +01:00
Stephan
34a05d36a6 exp 2021-12-10 17:29:04 +01:00
Stephan
bb1ee93cb9 exp 2021-12-10 17:27:14 +01:00
Stephan
de64657f2c exp 2021-12-10 16:40:40 +01:00
Stephan
32e0aac7fa exp 2021-12-10 16:38:27 +01:00
Stephan
d62945518b exp 2021-12-10 16:35:57 +01:00
Stephan
a73381dafa exp 2021-12-10 16:33:36 +01:00
Stephan
3c564909d0 exp 2021-12-10 16:32:54 +01:00
Stephan
e65ddbcdfd manual action exp 2021-12-10 16:24:40 +01:00
Stephan
71f3728648 wkf exp 2021-12-09 08:53:14 +01:00
Stephan
54b0888107 wkf exp 2021-12-09 08:48:06 +01:00
Stephan
0a056599a3 wkf exp 2021-12-08 13:10:28 +01:00
Stephan
18c361ce7f github workflow experiment 2021-12-08 13:01:59 +01:00
Stephan
7240558fd8 duh 2021-12-03 11:13:42 +01:00
GitHub Actions
d76304d5ea Foo 2021-12-03 10:11:00 +00:00
Stephan
947625402d test-push 2021-12-03 11:10:44 +01:00
Stephan
6285473aa7
Update README.md 2021-10-24 17:32:09 +02:00
Stephan
0d7242e7fc
A friendler README 2021-10-24 17:30:27 +02:00
Stephan
28dd92bcec
Merge pull request #62 from danswiger/master
Minor change - hey, I am happy to merge your test PR, just so you can see what happens!
2021-10-24 17:21:20 +02:00
dswiger
e0fff7d62e Merge branch 'dnew' - fixed conflict manually in 'vim' 2021-10-23 12:21:34 -04:00
dswiger
5171313fd6 A non-conflicting change 2021-10-23 12:18:09 -04:00
dswiger
9d6af11683 Second commit for conflict 2021-10-23 12:17:19 -04:00
dswiger
b99b892baf First change for conflict. 2021-10-23 12:16:06 -04:00
dswiger
e3bf97c1ca adding file to branch 2021-10-23 12:09:47 -04:00
dswiger
5adc4e70a4 Minor change 2021-10-23 11:20:05 -04:00
Stephan
a01b7130b8 created symlink 2021-10-20 07:17:10 +00:00
Stephan
dbd20f76d5 again and again 2021-10-20 09:16:46 +02:00
Stephan
df0a3488d5 again 2021-10-20 09:11:33 +02:00
Stephan
5d1637699c bah 2021-10-20 09:05:22 +02:00
Stephan
767f48236c direct git link 2021-10-19 16:53:39 +02:00
Stephan
cd04389146 created symlink 2021-10-19 14:24:45 +00:00
Stephan
d48a659702 pwsh again 2021-10-19 16:24:20 +02:00
Stephan
462132dc28 created symlink 2021-10-19 14:19:17 +00:00
Stephan
e6cfcc57fe pwsh now 2021-10-19 16:17:22 +02:00
Stephan
9a7204dfca created symlink 2021-10-19 14:15:45 +00:00
Stephan
22751c3d2b pwsh 2021-10-19 16:15:13 +02:00
Stephan
a87c48b4ee created symlink 2021-10-19 14:04:42 +00:00
Stephan
64b17ac379 again 2021-10-19 16:04:11 +02:00
Stephan
5c3f366371 created symlink 2021-10-19 14:02:49 +00:00
Stephan
c4b36f3e20 again 2021-10-19 16:02:16 +02:00
Stephan
796c3370ca created symlink 2021-10-19 13:54:47 +00:00
Stephan
e9f7e6fd36 update action 2021-10-19 15:54:23 +02:00
Stephan
edcae1c219 update action 2021-10-19 15:48:52 +02:00
Stephan
bba2ce50bb duh 2021-10-19 15:44:05 +02:00
Stephan
e35659c99c test symlink 2021-10-19 15:39:43 +02:00
Stephan
598702c8b2 e 2021-10-15 16:42:01 +02:00
15 changed files with 678 additions and 9 deletions

158
.github/workflows/assign-milestones.js vendored Normal file
View File

@ -0,0 +1,158 @@
// assign a milestone to issues or PRs added to a project, with a name corresponding
// to the name of the project - create the milestone if it does not exist
//
// adding a *second* project to the issue will update the milestone accordingly
// removing that project will reset the milestone entirely (not use the other project)
// and, no idea what happens if one very quickly adds and removes an issue
//
// an issue or PR actually becomes a card (or, a card is actually created...) when
// it's move to a project column for the first time - being assigned to the project
// and showing in project's backlog is not enough.
module.exports = async ({github, context, core}) => {
const restapi = github.rest
function last1(s) {
const pos = s.lastIndexOf('/')
return s.substring(pos + 1)
}
function last2(s) {
const pos1 = s.lastIndexOf('/')
const pos2 = s.lastIndexOf('/', pos1-1)
return [ s.substring(pos2 + 1, pos1), s.substring(pos1 + 1) ]
}
function firstOrDefault(items, predicate) {
for (const item of items) {
if (predicate(item)) {
return item
}
}
return null
}
// insanely enough, due to the total lack of documentation, this
// is the best way one can figure out what exactly we are getting
console.log(github)
console.log(context)
console.log(context.payload)
//console.log(`event: ${github.event_name}/${github.event.action}`)
// get and validate the event name
const eventName = context.eventName
if (eventName != 'project_card') {
return
}
// get and validate the event action
const eventAction = context.payload.action
if (eventAction != 'created' && eventAction != 'deleted') {
return
}
console.log(`event: ${eventName}/${eventAction}`)
const columnId = context.payload.project_card.column_id
const columnResponse = await restapi.projects.getColumn({
column_id: columnId
})
const column = columnResponse.data
console.log(column)
const projectId = last1(column.project_url)
const projectResponse = await restapi.projects.get({
project_id: projectId
});
const project = projectResponse.data
console.log(project)
const projectName = project.name
// -- when a card is deleted it cannot be fetched!
//const cardId = context.payload.project_card.id
//const cardResponse = await restapi.projects.getCard({
// card_id: cardId
//})
//const card = cardResponse.data
//console.log(card)
//const [ itemType, itemNumber ] = last2(card.content_url)
const [ itemType, itemNumber ] = last2(context.payload.project_card.content_url)
const isIssue = itemType == 'issues'
const isPull = itemType == 'pulls'
if (!isIssue && !isPull) {
core.setFailed(`Unsupported item type ${itemType}`)
return
}
const itemApi = isIssue ? restapi.issues : restapi.pulls
var request = {
owner: context.repo.owner,
repo: context.repo.repo
}
request[isIssue ? 'issue_number' : 'pull_number'] = itemNumber
console.log(request)
const itemResponse = await itemApi.get(request)
const item = itemResponse.data
console.log(item)
const itemId = item.id
const itemMilestone = item.milestone
console.log(`item: ${itemType}/${itemId} milestone: ${itemMilestone == null ? '<none>' : itemMilestone}`)
if (eventAction == 'created') {
console.log('add or update milestone of issue/pull of created card')
const milestonesResponse = await restapi.issues.listMilestones({
owner: context.repo.owner,
repo: context.repo.repo
})
const milestones = milestonesResponse.data
console.log(milestones)
var milestone = firstOrDefault(milestones, (x) => x.title == projectName)
if (!milestone) {
console.log(`create milestone '${projectName}'`)
const milestoneResponse = await restapi.issues.createMilestone({
owner: context.repo.owner,
repo: context.repo.repo,
title: projectName
})
milestone = milestoneResponse.data
}
const milestoneNumber = milestone.number
if (!item.milestone || item.milestone.number != milestoneNumber)
{
request = {
owner: context.repo.owner,
repo: context.repo.repo,
milestone: milestoneNumber
}
request[isIssue ? 'issue_number' : 'pull_number'] = itemNumber
await itemApi.update(request)
}
}
else if (eventAction == 'deleted') {
if (itemMilestone) {
console.log('remove milestone from issue/pull of deleted card')
request = {
owner: context.repo.owner,
repo: context.repo.repo
}
request[isIssue ? 'issue_number' : 'pull_number'] = itemNumber
request.milestone = null
await itemApi.update(request)
}
else {
console.log('deleted card had no milestone')
}
}
else {
console.log(`nothing to do for evet action ${eventAction}`)
}
}

46
.github/workflows/assign-milestones.yml vendored Normal file
View File

@ -0,0 +1,46 @@
name: Assign Milestones
on:
project_card:
# ignore: moved, converted, edited
types: [ created, deleted, moved ] # FIXME temp
jobs:
assign:
runs-on: ubuntu-latest
name: Assign
steps:
- name: Checkout
uses: actions/checkout@v2
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Assign
uses: actions/github-script@v5
with:
github-token: ${{ secrets.MY_GITHUB_TOKEN_TESTREPO }}
script: |
// see https://github.com/actions/github-script
//
// note: 'github' below is not the same as the yml-level 'github' context
// see https://docs.github.com/en/actions/learn-github-actions/contexts
// for yml contexts
//
// github A pre-authenticated octokit/rest.js client with pagination plugins
// .rest The REST API (e.g. github.rest.issues.get(...) gets an issue)
// .request
// .paginate
// .graphql
// context An object containing the context of the workflow run
// see https://github.com/actions/toolkit/blob/main/packages/github/src/context.ts
// core A reference to the @actions/core package
// glob A reference to the @actions/glob package
// io A reference to the @actions/io package
// exec A reference to the @actions/exec package
// require A proxy wrapper around the normal Node.js require to enable requiring relative paths
// (relative to the current working directory) + requiring npm packages installed in the
// current working directory.
const script = require('./.github/workflows/assign-milestones.js')
await script({github, context, core})

137
.github/workflows/assign-to-project.yml vendored Normal file
View File

@ -0,0 +1,137 @@
name: Assign PRs to Project
on:
#issues:
# types: [ opened ]
#pull_request:
# types: [ opened ]
# important to use pull_request_target here to run code from 'main' not the PR,
# with access to PAT - and safe permission to make changes to the project
pull_request_target:
types: [ opened, labeled ]
# github-script: https://github.com/actions/github-script
# -> points to github rest (octokit) reference doc
# github PAT: https://github.com/settings/tokens
# must have full repo access
# FIXME how can I prevent a user from creating a PR and stealing my token?
# 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
# curl -H "Accept: application/vnd.github.v3+json" -H "Authorization: token ghp_..." https://api.github.com/projects/1/columns?owner=zpqrtbnk&repo=test-repo
# curl -H "Accept: application/vnd.github.v3+json" -H "Authorization: token ghp_..." https://api.github.com/projects/1/columns?owner=zpqrtbnk-alt&repo=test-repo-alt
jobs:
assign:
runs-on: ubuntu-latest
name: Assign
steps:
- name: Assign
uses: actions/github-script@v4
with:
github-token: ${{ secrets.MY_GITHUB_TOKEN_TESTREPO }}
script: |
//const project_name = 'The API Team Board'
//const column_name = 'Drafting'
const project_name = 'test-project'
const column_name = 'To do'
function firstOrDefault(items, predicate) {
for (const item of items) {
if (predicate(item)) {
return item
}
}
return null
}
// find the project
console.log('find project...')
const projects = await github.projects.listForRepo({
owner: context.repo.owner,
repo: context.repo.repo
})
console.log(`retrieved ${projects.data.length} projects.`)
const project = firstOrDefault(projects.data, (x) => x.name === project_name)
if (!project) {
core.setFailed(`Failed to find project "${project_name}".`)
return
}
else {
console.log(`project '${project_name}' id: ${project.id}.`)
}
// find the column
console.log('find column...')
const columns = await github.projects.listColumns({
project_id: project.id
})
console.log(`retrieved ${columns.data.length} columns.`)
const column = firstOrDefault(columns.data, (x) => x.name === column_name)
if (!column) {
core.setFailed(`Failed to find column "${column_name}" in project ${project.name}.`)
return
}
else {
console.log(`column '${column_name}' id: ${column.id}.`)
}
// determine content type
console.log('determine content type...')
const event_name = context.eventName
var content_type = null
var item_number = null
var item_id = null
if (event_name === 'issues') {
content_type = 'Issue'
// temp!
core.setFailed(`Unsupported: issue.`)
return
item_number = context.issue.number
item_id = context.issue.id
}
if (event_name === 'pull_request' || event_name === 'pull_request_target') {
content_type = 'PullRequest'
item_number = context.payload.pull_request.number
item_id = context.payload.pull_request.id
}
if (!content_type) {
core.setFailed(`Unexpected event name "${event_name}".`)
return
}
else {
console.log(`content type: ${content_type}.`)
}
// get the item
console.log('get the item...')
const item = await github.issues.get({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: item_number
})
if (!item) {
core.setFailed(`Failed to get item ${item_number}.`)
return
}
else {
console.log(`${content_type} #${context.issue.number} id: ${item.data.id}.`)
if (item_id === item.data.id) {
console.log(`item_id: ${item_id}`)
}
else {
console.log(`but 'context.payload' provides item_id: ${item_id} and meh?`)
}
}
console.log('create the card...')
console.log(`in column ${column.id} for item ${item_id} of type ${content_type}`)
await github.projects.createCard({
column_id: column.id,
//note:,
content_id: item_id,
content_type: content_type
})
console.log('created')

137
.github/workflows/publish-release.js vendored Normal file
View File

@ -0,0 +1,137 @@
module.exports = /*async*/ ({github, context, core}) => {
const restapi = github.rest
var dryrun = context.payload.inputs.dryrun
function firstOrDefault(items, predicate) {
for (const item of items) {
if (predicate(item)) {
return item
}
}
return null
}
async function validateRelease() {
const version = context.payload.inputs.version
const tag = "v" + version
console.log(`Validate version '${version}'.`)
// git branch must exist
const branchRefs = await restapi.git.listMatchingRefs({
owner: context.repo.owner,
repo: context.repo.repo,
ref: `heads/release/${version}`
})
if (firstOrDefault(branchRefs.data, (x) => x.ref == `refs/heads/release/${version}`) == null) {
core.setFailed(`Could not find branch 'release/${version}'.`)
return
}
console.log(`Found branch 'release/${version}'.`)
// github milestone must exist and be open
const milestone = await getMilestone()
if (milestone == null) {
core.setFailed(`Could not find milestone '${version}'.`)
return
}
if (milestone.state != "open") {
core.setFailed(`Milestone '${version}' is already closed.`)
return
}
console.log(`Found open milestone '${version}'.`)
// github release must exist and not be published yet
const release = await getRelease()
if (release === null) {
core.setFailed(`Could not find a GitHub release for tag '${tag}'.`)
return
}
if (!release.draft) {
core.setFailed(`GitHub release for tag '${tag}' is already published.`)
return
}
console.log(`Found yet-unpublished GitHub release for tag '${tag}'.`)
// tag must not exist
const tagRefs = await restapi.git.listMatchingRefs({
owner: context.repo.owner,
repo: context.repo.repo,
ref: `tags/${tag}`
})
if (firstOrDefault(tagRefs.data, (x) => x.ref == `tags/${tag}`) != null) {
core.setFailed(`Tag '${tag}' already exists.`)
return
}
console.log(`Verified that tag '${tag}' does not exist yet.`)
console.log('Release is valid.')
}
async function publishRelease() {
const version = context.payload.inputs.version
const tag = "v" + version
console.log(`Publish GitHub release '${version}'.`)
const release = await getRelease()
await restapi.repos.updateRelease({
owner: context.repo.owner,
repo: context.repo.repo,
release_id: release.id,
draft: false
})
}
async function closeMilestone() {
const version = context.payload.inputs.version
const tag = "v" + version
console.log(`Close milestone '${version}'.`)
const milestone = await getMilestone()
await restapi.issues.updateMilestone({
owner: context.repo.owner,
repo: context.repo.repo,
milestone_number: milestone.number,
state: "closed"
})
}
async function getRelease() {
// note: getReleaseByTag only returns published releases
// note: we may eventually need to paginate
// and then releases.headers should contain what we need?
// https://octokit.github.io/rest.js/v18#pagination
const version = context.payload.inputs.version
const tag = `v${version}`
const releases = await restapi.repos.listReleases({
owner: context.repo.owner,
repo: context.repo.repo
})
const release = firstOrDefault(releases.data, (x) => x.tag_name == tag)
return release
}
async function getMilestone() {
const version = context.payload.inputs.version
const milestonesResponse = await restapi.issues.listMilestones({
owner: context.repo.owner,
repo: context.repo.repo
})
const milestones = milestonesResponse.data
return firstOrDefault(milestones, (x) => x.title == version)
}
return {
validateRelease: validateRelease,
publishRelease: publishRelease,
closeMilestone: closeMilestone
}
}

46
.github/workflows/publish-release.yml vendored Normal file
View File

@ -0,0 +1,46 @@
name: Publish Release
on:
workflow_dispatch:
inputs:
version:
description: 'Version'
required: true
dryrun:
description: 'DryRun'
required: true
type: boolean
default: true
jobs:
job:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Configure repository
shell: bash
run: |
git config user.email "github-actions@hazelcast.com"
git config user.name "GitHub Actions (Build Release)"
- name: Validate the release
uses: actions/github-script@v5
with:
script: |
const scriptf = require('./.github/workflows/publish-release.js')
const script = scriptf({github, context, core})
await script.validateRelease()
- name: Finalize GitHub release and milestone
if: ${{ github.event.inputs.dryrun == 'false' }}
uses: actions/github-script@v5
with:
script: |
const scriptf = require('./.github/workflows/publish-release.js')
const script = scriptf({github, context, core})
await script.publishRelease()
await script.closeMilestone()

26
.github/workflows/rest-description.yml vendored Normal file
View File

@ -0,0 +1,26 @@
name: Toy with issue description
on:
issues:
types: labeled
jobs:
toy-desc:
runs-on: ubuntu-latest
if: |
!contains(github.event.issue.title, '!exclude!') ||
contains(github.event.issue.title, '!force!')
steps:
- name: Toy with issue description
uses: actions/github-script@v4.0.2
with:
script: |
const title = `${{ github.event.issue.title }} !`
const body = `updated\n${{ github.event.issue.body }}`
github.issues.update({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
title: title,
body: body
})

82
.github/workflows/symlink-test.yml vendored Normal file
View File

@ -0,0 +1,82 @@
name: Symlink Test
on:
# trigger on push to any branch
push:
branches-ignore:
- 'release/*'
tags-ignore:
- '*'
jobs:
# try to create and push the symlink
symlink-test:
name: Symlink Test
runs-on: windows-latest
steps:
# checkout the code
- name: Checkout code
uses: actions/checkout@v2
with:
token: ${{ secrets.GITHUB_TOKEN }}
# symlink via bash
# this does *not* create a symlink, but a directory
#- name: Symlink Bash
# shell: bash
# run: |
# if ! [ -L bang ]; then
# ln -s duh bang
# ls -l
# git config --global user.email "stephan@REDACTED.com"
# git config --global user.name "Stephan"
# git config --global core.symlinks "true"
# git add bang
# git commit -m "created symlink"
# fi
# symlink via pwsh
# this creates a 'bang' file that contains 'duh'
# on local machine, it fails 'New-Item: Administrator privilege required for this operation.'
#
# update: it creates *something* that is listed as a directory in the log,
# and that GitHub represents as a link, so it has to be a link, but when
# I check the thing out, it's a file
# because Windows won't create the link but on Linux, it's checked out as a link
#
#- name: Symlink Pwsh
# shell: pwsh
# run: |
# if (! (test-path bang)) {
# New-Item -ItemType SymbolicLink -Name bang -Target duh
# write-output "DIR:"
# ls .
# write-output "DIR:"
# ls bang
# git config --global user.email "stephan@REDACTED.com"
# git config --global user.name "Stephan"
# git config --global core.symlinks "true"
# git add bang
# git commit -m "created symlink"
# }
# see
# this just creates the symlink in Git - works on Windows
# BUT will be checked out as a file and we don't care
- name: Symlink Git
shell: bash
run: |
if ! [ -f "bang" ]; then
git update-index --add --cacheinfo 120000 "$(echo "duh" | git hash-object -w --stdin)" "bang"
git config --global user.email "stephan@REDACTED.com"
git config --global user.name "Stephan"
git commit -m "created symlink"
fi
# push changes back
- name: Push
shell: bash
run: git push

25
.github/workflows/test-push.yml vendored Normal file
View File

@ -0,0 +1,25 @@
name: Test Push
on: push
jobs:
foo:
name: Foo
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
ref: ${{github.ref}}
- name: Foo
shell: bash
run: |
echo "foo" >> foo.txt
- name: Push
shell: bash
run: |
git config --global user.name "GitHub Actions"
git config --global user.email "github-actions@hazelcast.com"
git add foo.txt
git commit -m "Foo"
git push

View File

@ -1,19 +1,30 @@
# test-repo
# A Git(Hub) Test Repository
A Git(Hub) Test Repository
Hey! This is my personal Git(Hub) Test Repository where I experiment with Git and GitHub.
`git clone https://github.com/zpqrtbnk/test-repo.git .`
If you are new to Git and GitHub and found this repository through Google: feel free to clone the repository and experiment with it! You will not be able to push back to the repository, as it is *my* repository and I cannot let everybody push to it. The right way to do it on GitHub is:
We have pages at: http://zpqrtbnk.github.io/test-repo/
1. fork the repository in your own account,
2. make changes and push them in a branch of your own fork,
3. create a Pull Request in my repository.
We have an image in the README
![Image](https://raw.github.com/zpqrtbnk/test-repo/master/wtf.jpg)
I will get notified, will review the changes that you propose, and eventually will either merge the changes, or reject them. This *may* take some time as I am not actively monitoring nor maintaining this repository, as you can guess, but I try to be helpful ;)
etc
etc
Don't expect to find anything meaningful nor useful in the repository. Also, I happen to force-push a reset of everything from time to time. This means that I reset all history, including changes that you may have submitted. In theory, noone ever does this to a repository. But hey, this is a *test* repository after all.
The rest of this README file is mostly random stuff.
Clone the repository with: `git clone https://github.com/zpqrtbnk/test-repo.git .`
We have test GitHUb pages (from the `gh-pages` branch) at: http://zpqrtbnk.github.io/test-repo/
We have an image in the README (markdown)
![Image](wtf.jpg)
We have an image in the README (html)
<img src="./wtf.jpg" />
We have an image in the README (more html)
<p align="center" style="background:#000;padding:5px;color:#fff;font-size:150%;margin-bottom:64px">
<img src="./wtf.jpg" />
<span style="margin-left:48px;">wubble</span>

1
duh/duh.txt Normal file
View File

@ -0,0 +1 @@
duh

View File

@ -1 +0,0 @@
foo

0
test-1 Normal file
View File

0
test-2 Normal file
View File

1
test.txt Normal file
View File

@ -0,0 +1 @@
test