Compare commits
6 Commits
pull-reque
...
github_act
Author | SHA1 | Date | |
---|---|---|---|
|
329d16b330 | ||
|
5debc514d6 | ||
|
af89e7930f | ||
|
becb838708 | ||
|
27071cb9c8 | ||
|
19937e41db |
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -1,5 +1,3 @@
|
|||||||
<!-- DO NOT DELETE THE TEXT BELOW. Please make sure relevant boxes are checked [x] -->
|
|
||||||
|
|
||||||
Thank you for taking the time to work on a PR for Awesome-Selfhosted!
|
Thank you for taking the time to work on a PR for Awesome-Selfhosted!
|
||||||
|
|
||||||
To ensure your PR is dealt with swiftly please check the following:
|
To ensure your PR is dealt with swiftly please check the following:
|
||||||
|
110
.github/workflows/monthly.yml
vendored
Normal file
110
.github/workflows/monthly.yml
vendored
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
name: Monthly Checks
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 5 1 * *'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
create-issue:
|
||||||
|
if: always()
|
||||||
|
needs: [check_syntax, check_links, check_github_commit_dates]
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/download-artifact@v2
|
||||||
|
with:
|
||||||
|
name: result
|
||||||
|
- name: Create Issue template
|
||||||
|
run: |
|
||||||
|
printf '%s\n%s%s %s\n%s\n%s\n' '---' 'title: Monthly Checks - ' $( date +"%B %Y" ) 'labels: automated issue' '---' > .github/ISSUE_TEMPLATE.md
|
||||||
|
echo -e '[](https://github.com/n8225/awesome-selfhosted/actions/workflows/monthly.yml)' >> .github/ISSUE_TEMPLATE.md
|
||||||
|
echo -e '\n--------------------' >> .github/ISSUE_TEMPLATE.md
|
||||||
|
echo -e '\n### Awesome_Bot link checks\n' >> .github/ISSUE_TEMPLATE.md
|
||||||
|
jq -r '.[] | ["* [ ] ", "Line ", .loc, ": ", .link, ", ", .error] | join("")' ab-results-README.md-filtered.json >> .github/ISSUE_TEMPLATE.md || true
|
||||||
|
echo -e '\n' >> .github/ISSUE_TEMPLATE.md
|
||||||
|
cat github_commit_dates.md >> .github/ISSUE_TEMPLATE.md || true
|
||||||
|
echo -e '\n' >> .github/ISSUE_TEMPLATE.md
|
||||||
|
cat syntax_check.md >> .github/ISSUE_TEMPLATE.md || true
|
||||||
|
echo -e '\n--------------------\n' >> .github/ISSUE_TEMPLATE.md
|
||||||
|
printf '%s/%s%s%s' ${GITHUB_SERVER_URL} ${GITHUB_REPOSITORY} '/actions/runs/' ${GITHUB_RUN_ID} >> .github/ISSUE_TEMPLATE.md
|
||||||
|
- name: Verify template
|
||||||
|
run: cat .github/ISSUE_TEMPLATE.md
|
||||||
|
- name: create issue
|
||||||
|
id: create-iss
|
||||||
|
uses: buluma/create-an-issue@v2
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- run: 'echo Created issue number ${{ steps.create-iss.outputs.number }}'
|
||||||
|
|
||||||
|
check_github_commit_dates:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Setup Python 3.x
|
||||||
|
uses: actions/setup-python@v2
|
||||||
|
with:
|
||||||
|
python-version: '3.x'
|
||||||
|
- name: Setup Checks
|
||||||
|
run: pip3 install Requests
|
||||||
|
- name: Checks
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: python tests/check-github-commit-dates.py README.md
|
||||||
|
- name: Check result
|
||||||
|
if: ${{ always() }}
|
||||||
|
run: cat github_commit_dates.md
|
||||||
|
- name: Upload result
|
||||||
|
if: ${{ always() }}
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: result
|
||||||
|
path: github_commit_dates.md
|
||||||
|
|
||||||
|
check_syntax:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Use Node.js
|
||||||
|
uses: actions/setup-node@v1
|
||||||
|
with:
|
||||||
|
node-version: '14.x'
|
||||||
|
- name: Setup Checks
|
||||||
|
run: |
|
||||||
|
cd tests
|
||||||
|
npm install --silent chalk
|
||||||
|
cd ..
|
||||||
|
- name: Checks
|
||||||
|
run:
|
||||||
|
script -e -c 'node tests/test.js -r README.md'
|
||||||
|
- name: Check result
|
||||||
|
if: ${{ always() }}
|
||||||
|
run: cat syntax_check.md
|
||||||
|
- name: upload check syntax results
|
||||||
|
if: ${{ always() }}
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: result
|
||||||
|
path: syntax_check.md
|
||||||
|
|
||||||
|
check_links:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Set up Ruby 2.6
|
||||||
|
uses: ruby/setup-ruby@v1
|
||||||
|
with:
|
||||||
|
ruby-version: 2.6.7
|
||||||
|
- name: Setup Checks
|
||||||
|
run: gem install awesome_bot
|
||||||
|
- name: Checks
|
||||||
|
run: awesome_bot -f README.md --allow-redirect --allow 202,429 --white-list < tests/link_whitelist.txt
|
||||||
|
- name: Check result
|
||||||
|
if: ${{ always() }}
|
||||||
|
run: cat ab-results-README.md-filtered.json
|
||||||
|
- name: upload awesome_bot results
|
||||||
|
if: ${{ always() }}
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: result
|
||||||
|
path: ab-results-*.json
|
47
.github/workflows/pull_request.yml
vendored
Normal file
47
.github/workflows/pull_request.yml
vendored
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
name: Pull Request Checks
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check_syntax:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: create diff
|
||||||
|
run: git diff origin/master -U0 README.md | grep --perl-regexp --only-matching "(?<=^\+).*" > temp.md
|
||||||
|
- name: Use Node.js
|
||||||
|
uses: actions/setup-node@v1
|
||||||
|
with:
|
||||||
|
node-version: '14.x'
|
||||||
|
- name: install chalk
|
||||||
|
run: |
|
||||||
|
cd tests
|
||||||
|
npm install chalk
|
||||||
|
cd ..
|
||||||
|
- name: Checks
|
||||||
|
run: script -e -c 'node tests/test.js -r README.md -d temp.md'
|
||||||
|
|
||||||
|
check_links:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: create diff
|
||||||
|
run: git diff origin/master -U0 README.md | grep --perl-regexp --only-matching "(?<=^\+).*" > temp.md
|
||||||
|
- name: Set up Ruby 2.6
|
||||||
|
uses: actions/setup-ruby@v1
|
||||||
|
with:
|
||||||
|
ruby-version: 2.6.x
|
||||||
|
- name: install awesome_bot
|
||||||
|
run: gem install awesome_bot
|
||||||
|
- name: Checks
|
||||||
|
run: awesome_bot -f temp.md --allow-redirect --skip-save-results --allow 202 --white-list < tests/link_whitelist.txt
|
||||||
|
|
20
.travis.yml
20
.travis.yml
@@ -1,20 +0,0 @@
|
|||||||
language: node_js
|
|
||||||
|
|
||||||
node_js:
|
|
||||||
- "node"
|
|
||||||
|
|
||||||
cache:
|
|
||||||
npm: false
|
|
||||||
|
|
||||||
before_install:
|
|
||||||
- rvm install 2.6.2
|
|
||||||
- gem install awesome_bot
|
|
||||||
- sudo apt update && sudo apt install python3-pip python3-setuptools
|
|
||||||
- cd tests && npm install chalk && cd ..
|
|
||||||
|
|
||||||
script:
|
|
||||||
- 'if [[ "$TRAVIS_BRANCH" == "master" && "$TRAVIS_EVENT_TYPE" == "cron" ]]; then make check_all; fi'
|
|
||||||
- 'if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then make check_pr; fi'
|
|
||||||
|
|
||||||
notifications:
|
|
||||||
email: false
|
|
65
AUTHORS.md
65
AUTHORS.md
@@ -1,7 +1,7 @@
|
|||||||
|Commits | Author |
|
|Commits | Author |
|
||||||
| :---: | --- |
|
| :---: | --- |
|
||||||
|1560|nodiscc <nodiscc@gmail.com>|
|
|1494|nodiscc <nodiscc@gmail.com>|
|
||||||
|334|n8225 <n8225@users.noreply.github.com>|
|
|327|n8225 <n8225@users.noreply.github.com>|
|
||||||
|319|Kickball <ed.kickball@hotmail.com>|
|
|319|Kickball <ed.kickball@hotmail.com>|
|
||||||
|122|Andrew Rylatt <arylatt@users.noreply.github.com>|
|
|122|Andrew Rylatt <arylatt@users.noreply.github.com>|
|
||||||
|77|Meitar M <meitarm@gmail.com>|
|
|77|Meitar M <meitarm@gmail.com>|
|
||||||
@@ -12,12 +12,10 @@
|
|||||||
|23|cave beat <cave@cavebeat.org>|
|
|23|cave beat <cave@cavebeat.org>|
|
||||||
|17|Thomas Dalichow <info@thomasdalichow.de>|
|
|17|Thomas Dalichow <info@thomasdalichow.de>|
|
||||||
|14|Miguel Piedrafita <github@miguelpiedrafita.com>|
|
|14|Miguel Piedrafita <github@miguelpiedrafita.com>|
|
||||||
|14|kokomo123 <70863536+kokomo123@users.noreply.github.com>|
|
|
||||||
|13|Ferdinand Mütsch <mail@ferdinand-muetsch.de>|
|
|13|Ferdinand Mütsch <mail@ferdinand-muetsch.de>|
|
||||||
|13|jungle-boogie <sean@jungleboogie.me>|
|
|13|jungle-boogie <sean@jungleboogie.me>|
|
||||||
|12|Alex <alex@maximum.guru>|
|
|12|Alex <alex@maximum.guru>|
|
||||||
|12|Pe46dro <pietro@marangon.me>|
|
|12|Pe46dro <pietro@marangon.me>|
|
||||||
|11|Akashdeep Dhar <akashdeep.dhar@gmail.com>|
|
|
||||||
|11|Pietro Marangon <pietro.marangon@gmail.com>|
|
|11|Pietro Marangon <pietro.marangon@gmail.com>|
|
||||||
|10|Kevin <kevin@kevink.dev>|
|
|10|Kevin <kevin@kevink.dev>|
|
||||||
|9|Andrew Peng <pengc99@gmail.com>|
|
|9|Andrew Peng <pengc99@gmail.com>|
|
||||||
@@ -28,6 +26,7 @@
|
|||||||
|8|CooperBarrett <anthony.lhuissier@openmailbox.org>|
|
|8|CooperBarrett <anthony.lhuissier@openmailbox.org>|
|
||||||
|8|Martijn <martijn@mrtijn.nl>|
|
|8|Martijn <martijn@mrtijn.nl>|
|
||||||
|8|Rodrigo Avelino <rodrigo@avelino.org>|
|
|8|Rodrigo Avelino <rodrigo@avelino.org>|
|
||||||
|
|8|kokomo123 <70863536+kokomo123@users.noreply.github.com>|
|
||||||
|7|Hammy Havoc <hammy@splitanatom.com>|
|
|7|Hammy Havoc <hammy@splitanatom.com>|
|
||||||
|7|Ilian <ugg.rock@gmail.com>|
|
|7|Ilian <ugg.rock@gmail.com>|
|
||||||
|7|James Mills <prologic@shortcircuit.net.au>|
|
|7|James Mills <prologic@shortcircuit.net.au>|
|
||||||
@@ -38,11 +37,11 @@
|
|||||||
|7|n1trux <n1trux@users.noreply.github.com>|
|
|7|n1trux <n1trux@users.noreply.github.com>|
|
||||||
|7|phre4k <me@phre4k.at>|
|
|7|phre4k <me@phre4k.at>|
|
||||||
|7|édouard u. <mail@edouard.us>|
|
|7|édouard u. <mail@edouard.us>|
|
||||||
|6|Alexander <46561566+AlexKnowsIt@users.noreply.github.com>|
|
|
||||||
|6|Chris McCormick <chris@mccormick.cx>|
|
|6|Chris McCormick <chris@mccormick.cx>|
|
||||||
|6|Per Guth <mail@perguth.de>|
|
|6|Per Guth <mail@perguth.de>|
|
||||||
|6|Quinn Comendant <quinn@strangecode.com>|
|
|6|Quinn Comendant <quinn@strangecode.com>|
|
||||||
|6|Touhid Arastu <touhid.arastu@gmail.com>|
|
|6|Touhid Arastu <touhid.arastu@gmail.com>|
|
||||||
|
|5|Alexander <46561566+AlexKnowsIt@users.noreply.github.com>|
|
||||||
|5|Bob van Luijt <bob@semi.technology>|
|
|5|Bob van Luijt <bob@semi.technology>|
|
||||||
|5|Dariusz <37488679+Volmarg@users.noreply.github.com>|
|
|5|Dariusz <37488679+Volmarg@users.noreply.github.com>|
|
||||||
|5|Deluan Quintão <github@deluan.com>|
|
|5|Deluan Quintão <github@deluan.com>|
|
||||||
@@ -108,7 +107,6 @@
|
|||||||
|4|Meitar M <meitarm+github.1djyXhCkVsRYzZRk@gmail.com>|
|
|4|Meitar M <meitarm+github.1djyXhCkVsRYzZRk@gmail.com>|
|
||||||
|4|Praveen Durairaju <praveend.web@gmail.com>|
|
|4|Praveen Durairaju <praveend.web@gmail.com>|
|
||||||
|4|Rodolfo Berrios <inbox@rodolfoberrios.com>|
|
|4|Rodolfo Berrios <inbox@rodolfoberrios.com>|
|
||||||
|4|Ryan DeShone <rfdeshon@gmail.com>|
|
|
||||||
|4|Sandro <sandro.jaeckel@posteo.de>|
|
|4|Sandro <sandro.jaeckel@posteo.de>|
|
||||||
|4|Sebastian Stehle <sebastian@squidex.io>|
|
|4|Sebastian Stehle <sebastian@squidex.io>|
|
||||||
|4|Sergio Brighenti <sergio@brighenti.me>|
|
|4|Sergio Brighenti <sergio@brighenti.me>|
|
||||||
@@ -123,7 +121,6 @@
|
|||||||
|4|dpfaffenbauer <dominik@lineofcode.at>|
|
|4|dpfaffenbauer <dominik@lineofcode.at>|
|
||||||
|4|dyu <david.yu.ftw@gmail.com>|
|
|4|dyu <david.yu.ftw@gmail.com>|
|
||||||
|4|hebbet <pascal.herbert@gmail.com>|
|
|4|hebbet <pascal.herbert@gmail.com>|
|
||||||
|4|oof2win2 <honza.koco44@gmail.com>|
|
|
||||||
|4|paddo <mail@patrickrichter.net>|
|
|4|paddo <mail@patrickrichter.net>|
|
||||||
|3|132ikl <132@ikl.sh>|
|
|3|132ikl <132@ikl.sh>|
|
||||||
|3|Aguay <baraise.valentin@gmail.com>|
|
|3|Aguay <baraise.valentin@gmail.com>|
|
||||||
@@ -134,7 +131,6 @@
|
|||||||
|3|BernsteinA <4685390+BernsteinA@users.noreply.github.com>|
|
|3|BernsteinA <4685390+BernsteinA@users.noreply.github.com>|
|
||||||
|3|Brandon Jones <brandon@radroot.com>|
|
|3|Brandon Jones <brandon@radroot.com>|
|
||||||
|3|Burak Emre Kabakcı <emrekabakci@gmail.com>|
|
|3|Burak Emre Kabakcı <emrekabakci@gmail.com>|
|
||||||
|3|Christopher Charbonneau Wells <cdubz@users.noreply.github.com>|
|
|
||||||
|3|Conor O'Callaghan <brioscaibriste@users.noreply.github.com>|
|
|3|Conor O'Callaghan <brioscaibriste@users.noreply.github.com>|
|
||||||
|3|Cédric Krier <cedk@users.noreply.github.com>|
|
|3|Cédric Krier <cedk@users.noreply.github.com>|
|
||||||
|3|Daniel Mason <danielmason@catalyst.net.nz>|
|
|3|Daniel Mason <danielmason@catalyst.net.nz>|
|
||||||
@@ -191,9 +187,9 @@
|
|||||||
|3|Prashant Singh <prashant.singh852@webkul.com>|
|
|3|Prashant Singh <prashant.singh852@webkul.com>|
|
||||||
|3|PrplHaz4 <PrplHaz4@users.noreply.github.com>|
|
|3|PrplHaz4 <PrplHaz4@users.noreply.github.com>|
|
||||||
|3|Roland Whitehead <4478022+qururoland@users.noreply.github.com>|
|
|3|Roland Whitehead <4478022+qururoland@users.noreply.github.com>|
|
||||||
|
|3|Ryan DeShone <rfdeshon@gmail.com>|
|
||||||
|3|Sandro Jäckel <sandro.jaeckel@gmail.com>|
|
|3|Sandro Jäckel <sandro.jaeckel@gmail.com>|
|
||||||
|3|Sheshbabu <sheshbabu@gmail.com>|
|
|3|Sheshbabu <sheshbabu@gmail.com>|
|
||||||
|3|Sjoerd van der Hoorn <sjoerdvanderhoorn@hotmail.com>|
|
|
||||||
|3|Tobi Schäfer <interface@p3k.org>|
|
|3|Tobi Schäfer <interface@p3k.org>|
|
||||||
|3|Tom Pansino <2768420+tpansino@users.noreply.github.com>|
|
|3|Tom Pansino <2768420+tpansino@users.noreply.github.com>|
|
||||||
|3|Yann Forget <forget.yann31@gmail.com>|
|
|3|Yann Forget <forget.yann31@gmail.com>|
|
||||||
@@ -258,6 +254,7 @@
|
|||||||
|2|Chris Lu <chrislusf@users.noreply.github.com>|
|
|2|Chris Lu <chrislusf@users.noreply.github.com>|
|
||||||
|2|Chris Missal <chris.missal@gmail.com>|
|
|2|Chris Missal <chris.missal@gmail.com>|
|
||||||
|2|Christophe De Troyer <christophe.detroyer@gmail.com>|
|
|2|Christophe De Troyer <christophe.detroyer@gmail.com>|
|
||||||
|
|2|Christopher Charbonneau Wells <cdubz@users.noreply.github.com>|
|
||||||
|2|Cleberson Ramirio <cleberson.ramirio@outlook.com>|
|
|2|Cleberson Ramirio <cleberson.ramirio@outlook.com>|
|
||||||
|2|Corentin Brossault <corentin.brossault@gmail.com>|
|
|2|Corentin Brossault <corentin.brossault@gmail.com>|
|
||||||
|2|Costin Moise <necenzurat@gmail.com>|
|
|2|Costin Moise <necenzurat@gmail.com>|
|
||||||
@@ -381,6 +378,7 @@
|
|||||||
|2|Shane Cooke <shanecooke@mac.com>|
|
|2|Shane Cooke <shanecooke@mac.com>|
|
||||||
|2|Simon Vieille <simon@deblan.fr>|
|
|2|Simon Vieille <simon@deblan.fr>|
|
||||||
|2|Simone Grignola <sito@grignola.ch>|
|
|2|Simone Grignola <sito@grignola.ch>|
|
||||||
|
|2|Sjoerd van der Hoorn <sjoerdvanderhoorn@hotmail.com>|
|
||||||
|2|Spark <24642451+Sparkenstein@users.noreply.github.com>|
|
|2|Spark <24642451+Sparkenstein@users.noreply.github.com>|
|
||||||
|2|Stefan Bohacek <stefan.bohacek@gmail.com>|
|
|2|Stefan Bohacek <stefan.bohacek@gmail.com>|
|
||||||
|2|Stefane Fermigier <sf@fermigier.com>|
|
|2|Stefane Fermigier <sf@fermigier.com>|
|
||||||
@@ -406,7 +404,6 @@
|
|||||||
|2|Yurii Dubinka <yurii.dubinka@gmail.com>|
|
|2|Yurii Dubinka <yurii.dubinka@gmail.com>|
|
||||||
|2|Zeniic <Zeniic@users.noreply.github.com>|
|
|2|Zeniic <Zeniic@users.noreply.github.com>|
|
||||||
|2|Zeyphros <robin@decker.cx>|
|
|2|Zeyphros <robin@decker.cx>|
|
||||||
|2|Ziga Zajc <ziga.zajc007@gmail.com>|
|
|
||||||
|2|agetic <agetic@debian>|
|
|2|agetic <agetic@debian>|
|
||||||
|2|ahaenggli <adriano@haenggli.net>|
|
|2|ahaenggli <adriano@haenggli.net>|
|
||||||
|2|aldevar <aldevar@alaben.net>|
|
|2|aldevar <aldevar@alaben.net>|
|
||||||
@@ -421,7 +418,6 @@
|
|||||||
|2|fengshaun <amoradi@fedoraproject.org>|
|
|2|fengshaun <amoradi@fedoraproject.org>|
|
||||||
|2|fuerbringer <severin@protonmail.ch>|
|
|2|fuerbringer <severin@protonmail.ch>|
|
||||||
|2|gseva <gavrilovseva@gmail.com>|
|
|2|gseva <gavrilovseva@gmail.com>|
|
||||||
|2|horahoradev <horahora1567@gmail.com>|
|
|
||||||
|2|jciskey <jciskey@gmail.com>|
|
|2|jciskey <jciskey@gmail.com>|
|
||||||
|2|jganobsik <39414138+jganobsik@users.noreply.github.com>|
|
|2|jganobsik <39414138+jganobsik@users.noreply.github.com>|
|
||||||
|2|jimykk <JimyKK@users.noreply.github.com>|
|
|2|jimykk <JimyKK@users.noreply.github.com>|
|
||||||
@@ -458,13 +454,11 @@
|
|||||||
|1|Aditya Nagla <me@cdadityang.xyz>|
|
|1|Aditya Nagla <me@cdadityang.xyz>|
|
||||||
|1|Adrian Kumpf <adrian.kumpf@posteo.de>|
|
|1|Adrian Kumpf <adrian.kumpf@posteo.de>|
|
||||||
|1|Aimee <16459597+Aimeedeer@users.noreply.github.com>|
|
|1|Aimee <16459597+Aimeedeer@users.noreply.github.com>|
|
||||||
|1|Aimeos <aimeos@aimeos.org>|
|
|
||||||
|1|Akos Veres <veres@akos.me>|
|
|1|Akos Veres <veres@akos.me>|
|
||||||
|1|Alashov Berkeli <yunus.alashow@gmail.com>|
|
|1|Alashov Berkeli <yunus.alashow@gmail.com>|
|
||||||
|1|Alberto Bertogli <albertito@blitiri.com.ar>|
|
|1|Alberto Bertogli <albertito@blitiri.com.ar>|
|
||||||
|1|Alejandro Rodríguez <arcxyz@users.noreply.github.com>|
|
|1|Alejandro Rodríguez <arcxyz@users.noreply.github.com>|
|
||||||
|1|Alex <alexta69@gmail.com>|
|
|1|Alex <alexta69@gmail.com>|
|
||||||
|1|Alex Cureton-Griffiths <alexcg1@users.noreply.github.com>|
|
|
||||||
|1|Alex Fornuto <alex@fornuto.com>|
|
|1|Alex Fornuto <alex@fornuto.com>|
|
||||||
|1|Alex Ling <hkalexling@gmail.com>|
|
|1|Alex Ling <hkalexling@gmail.com>|
|
||||||
|1|Alex Tselegidis <alextselegidis@gmail.com>|
|
|1|Alex Tselegidis <alextselegidis@gmail.com>|
|
||||||
@@ -475,8 +469,6 @@
|
|||||||
|1|Alexey Strokach <alex.strokach@utoronto.ca>|
|
|1|Alexey Strokach <alex.strokach@utoronto.ca>|
|
||||||
|1|Alfred Bez <alfred.bez@googlemail.com>|
|
|1|Alfred Bez <alfred.bez@googlemail.com>|
|
||||||
|1|Algram <aliasgram@gmail.com>|
|
|1|Algram <aliasgram@gmail.com>|
|
||||||
|1|Alicia Sykes <gh@d0h.co>|
|
|
||||||
|1|AltumCode <hello@altumcode.com>|
|
|
||||||
|1|Alys <alice.harris@oldgods.net>|
|
|1|Alys <alice.harris@oldgods.net>|
|
||||||
|1|Andre <andre.lehmann@posteo.de>|
|
|1|Andre <andre.lehmann@posteo.de>|
|
||||||
|1|Andrei Marcu <andrei@marcu.net>|
|
|1|Andrei Marcu <andrei@marcu.net>|
|
||||||
@@ -495,7 +487,6 @@
|
|||||||
|1|Anton Troyanov <anton@troyanov.net>|
|
|1|Anton Troyanov <anton@troyanov.net>|
|
||||||
|1|Arkady Asuratov <arkady.asuratov@dubas.pro>|
|
|1|Arkady Asuratov <arkady.asuratov@dubas.pro>|
|
||||||
|1|Armando Lüscher <armando@noplanman.ch>|
|
|1|Armando Lüscher <armando@noplanman.ch>|
|
||||||
|1|Arnav Jindal <arnav.jindal7@gmail.com>|
|
|
||||||
|1|Arnold Schrijver <aschrijver@users.noreply.github.com>|
|
|1|Arnold Schrijver <aschrijver@users.noreply.github.com>|
|
||||||
|1|ArthurHoaro <arthur@hoa.ro>|
|
|1|ArthurHoaro <arthur@hoa.ro>|
|
||||||
|1|Ash Leece <ash@leece.im>|
|
|1|Ash Leece <ash@leece.im>|
|
||||||
@@ -560,17 +551,13 @@
|
|||||||
|1|David Stephens <dave@force9.org>|
|
|1|David Stephens <dave@force9.org>|
|
||||||
|1|David Yu <david.yu.ftw@gmail.com>|
|
|1|David Yu <david.yu.ftw@gmail.com>|
|
||||||
|1|Deeoon <25846405+Deeoon@users.noreply.github.com>|
|
|1|Deeoon <25846405+Deeoon@users.noreply.github.com>|
|
||||||
|1|Deihim007 <deihim007@gmail.com>|
|
|
||||||
|1|Denis <isdn@users.noreply.github.com>|
|
|1|Denis <isdn@users.noreply.github.com>|
|
||||||
|1|Denis <issden@gmail.com>|
|
|1|Denis <issden@gmail.com>|
|
||||||
|1|Diego Molina <diemol@users.noreply.github.com>|
|
|1|Diego Molina <diemol@users.noreply.github.com>|
|
||||||
|1|Dimitri Steinel <d.steinel@de.edenspiekermann.com>|
|
|1|Dimitri Steinel <d.steinel@de.edenspiekermann.com>|
|
||||||
|1|Dirk Krause <dirkk0@googlemail.com>|
|
|1|Dirk Krause <dirkk0@googlemail.com>|
|
||||||
|1|Dmitrii Poddubnyi <dpoddubny@gmail.com>|
|
|
||||||
|1|Dmitriy Volkov <wldhx+vcs+github_com@wldhx.me>|
|
|1|Dmitriy Volkov <wldhx+vcs+github_com@wldhx.me>|
|
||||||
|1|Dmitry Khomutov <poisoncorpsee@gmail.com>|
|
|1|Dmitry Khomutov <poisoncorpsee@gmail.com>|
|
||||||
|1|Dmitry Sinina <12762053+dmitry-sinina@users.noreply.github.com>|
|
|
||||||
|1|Domarys <domaryscorrea@gmail.com>|
|
|
||||||
|1|DonPascualino <50177009+DonPascualino@users.noreply.github.com>|
|
|1|DonPascualino <50177009+DonPascualino@users.noreply.github.com>|
|
||||||
|1|Doğan Çelik <dogancelik@users.noreply.github.com>|
|
|1|Doğan Çelik <dogancelik@users.noreply.github.com>|
|
||||||
|1|Dražen Lučanin <kermit666@gmail.com>|
|
|1|Dražen Lučanin <kermit666@gmail.com>|
|
||||||
@@ -583,7 +570,6 @@
|
|||||||
|1|Edreih Aldana <edreihaldana@yahoo.com>|
|
|1|Edreih Aldana <edreihaldana@yahoo.com>|
|
||||||
|1|Eldad A. Fux <eldad.fux@gmail.com>|
|
|1|Eldad A. Fux <eldad.fux@gmail.com>|
|
||||||
|1|Emeric POUPON <epoupon@users.noreply.github.com>|
|
|1|Emeric POUPON <epoupon@users.noreply.github.com>|
|
||||||
|1|Emiliano <emiliano@sturniolo.com.ar>|
|
|
||||||
|1|Emlembow <36314674+Emlembow@users.noreply.github.com>|
|
|1|Emlembow <36314674+Emlembow@users.noreply.github.com>|
|
||||||
|1|Eran Chetz <eran.chetzroni@algolia.com>|
|
|1|Eran Chetz <eran.chetzroni@algolia.com>|
|
||||||
|1|Eren Hatırnaz <erenhatirnaz@hotmail.com.tr>|
|
|1|Eren Hatırnaz <erenhatirnaz@hotmail.com.tr>|
|
||||||
@@ -600,7 +586,6 @@
|
|||||||
|1|Fabian Patzke <github@patzi.de>|
|
|1|Fabian Patzke <github@patzi.de>|
|
||||||
|1|Farhan Ghumra <Xyroid@users.noreply.github.com>|
|
|1|Farhan Ghumra <Xyroid@users.noreply.github.com>|
|
||||||
|1|Fazal Majid <github@sentfrom.com>|
|
|1|Fazal Majid <github@sentfrom.com>|
|
||||||
|1|Feuerhamster <38376566+Feuerhamster@users.noreply.github.com>|
|
|
||||||
|1|Florian <52180080+Icesofty@users.noreply.github.com>|
|
|1|Florian <52180080+Icesofty@users.noreply.github.com>|
|
||||||
|1|Florian Kaiser <florian.kaiser@fnkr.net>|
|
|1|Florian Kaiser <florian.kaiser@fnkr.net>|
|
||||||
|1|Florian Kaldowski <flokX@users.noreply.github.com>|
|
|1|Florian Kaldowski <flokX@users.noreply.github.com>|
|
||||||
@@ -611,7 +596,6 @@
|
|||||||
|1|FreeScout <40499291+freescout-helpdesk@users.noreply.github.com>|
|
|1|FreeScout <40499291+freescout-helpdesk@users.noreply.github.com>|
|
||||||
|1|G <w_i_n_d_y_o@hotmail.com>|
|
|1|G <w_i_n_d_y_o@hotmail.com>|
|
||||||
|1|Galen Abell <galen@galenabell.com>|
|
|1|Galen Abell <galen@galenabell.com>|
|
||||||
|1|Gervwyk <gervwyk@gmail.com>|
|
|
||||||
|1|Gio <giodi@users.noreply.github.com>|
|
|1|Gio <giodi@users.noreply.github.com>|
|
||||||
|1|Giorgos Logiotatidis <glogiotatidis@users.noreply.github.com>|
|
|1|Giorgos Logiotatidis <glogiotatidis@users.noreply.github.com>|
|
||||||
|1|Girish Ramakrishnan <mail@girish.in>|
|
|1|Girish Ramakrishnan <mail@girish.in>|
|
||||||
@@ -624,10 +608,8 @@
|
|||||||
|1|Henrique Holanda <contato@henriqueholanda.com.br>|
|
|1|Henrique Holanda <contato@henriqueholanda.com.br>|
|
||||||
|1|Herman Zvonimir Došilović <hermanz.dosilovic@gmail.com>|
|
|1|Herman Zvonimir Došilović <hermanz.dosilovic@gmail.com>|
|
||||||
|1|Hooopo <Hoooopo@gmail.com>|
|
|1|Hooopo <Hoooopo@gmail.com>|
|
||||||
|1|Hunter Wittenborn <hunter@hunterwittenborn.com>|
|
|
||||||
|1|IAlwaysBeCoding <erik.dominguez1003@gmail.com>|
|
|1|IAlwaysBeCoding <erik.dominguez1003@gmail.com>|
|
||||||
|1|Icantcodeatall <francois.lachese@me.com>|
|
|1|Icantcodeatall <francois.lachese@me.com>|
|
||||||
|1|IceCryptonym <59789660+IceCryptonym@users.noreply.github.com>|
|
|
||||||
|1|Igor Antun <IgorAntun@users.noreply.github.com>|
|
|1|Igor Antun <IgorAntun@users.noreply.github.com>|
|
||||||
|1|Igor Petrov <garik.piton@gmail.com>|
|
|1|Igor Petrov <garik.piton@gmail.com>|
|
||||||
|1|Imron RA <42175898+imronra@users.noreply.github.com>|
|
|1|Imron RA <42175898+imronra@users.noreply.github.com>|
|
||||||
@@ -636,8 +618,6 @@
|
|||||||
|1|Jack <jackdev@mailbox.org>|
|
|1|Jack <jackdev@mailbox.org>|
|
||||||
|1|Jackson Delahunt <jackson@jacksondelahunt.com>|
|
|1|Jackson Delahunt <jackson@jacksondelahunt.com>|
|
||||||
|1|Jakob Gillich <jakob@gillich.me>|
|
|1|Jakob Gillich <jakob@gillich.me>|
|
||||||
|1|James <jmz.taylor16@gmail.com>|
|
|
||||||
|1|James Read <contact@jread.com>|
|
|
||||||
|1|Jan <jayphizzle@users.noreply.github.com>|
|
|1|Jan <jayphizzle@users.noreply.github.com>|
|
||||||
|1|Jan Dietrich <jan.dietrich.12@gmail.com>|
|
|1|Jan Dietrich <jan.dietrich.12@gmail.com>|
|
||||||
|1|Jannik Anker <jannikanker@users.noreply.github.com>|
|
|1|Jannik Anker <jannikanker@users.noreply.github.com>|
|
||||||
@@ -661,7 +641,6 @@
|
|||||||
|1|Jordan Doyle <jordan@9t9t9.com>|
|
|1|Jordan Doyle <jordan@9t9t9.com>|
|
||||||
|1|Jordan Doyle <jordan@doyle.la>|
|
|1|Jordan Doyle <jordan@doyle.la>|
|
||||||
|1|Josh Harmon <me@joshharmon.me>|
|
|1|Josh Harmon <me@joshharmon.me>|
|
||||||
|1|Josh Moore <josh.moore@jmoore.dev>|
|
|
||||||
|1|Joshua Hamilton <joshua.hamilton@fabricut.com>|
|
|1|Joshua Hamilton <joshua.hamilton@fabricut.com>|
|
||||||
|1|José Castro <cogurov@gmail.com>|
|
|1|José Castro <cogurov@gmail.com>|
|
||||||
|1|Julien <bibich@users.noreply.github.com>|
|
|1|Julien <bibich@users.noreply.github.com>|
|
||||||
@@ -693,10 +672,8 @@
|
|||||||
|1|Lorenz Hübschle-Schneider <lorenzhs@users.noreply.github.com>|
|
|1|Lorenz Hübschle-Schneider <lorenzhs@users.noreply.github.com>|
|
||||||
|1|Louis Grenard <louis.grenard@gmail.com>|
|
|1|Louis Grenard <louis.grenard@gmail.com>|
|
||||||
|1|Lukas Masuch <Lukas.Masuch@gmail.com>|
|
|1|Lukas Masuch <Lukas.Masuch@gmail.com>|
|
||||||
|1|Lukas Schulte Pelkum <kbrt@protonmail.com>|
|
|
||||||
|1|Luke Hoersten <Luke@Hoersten.org>|
|
|1|Luke Hoersten <Luke@Hoersten.org>|
|
||||||
|1|Luke Singham <lukesingham@gmail.com>|
|
|1|Luke Singham <lukesingham@gmail.com>|
|
||||||
|1|Luke Whrit <lukewhrit@pm.me>|
|
|
||||||
|1|Luuk Nieuwdorp <luuknieuwdorp@users.noreply.github.com>|
|
|1|Luuk Nieuwdorp <luuknieuwdorp@users.noreply.github.com>|
|
||||||
|1|Lyz <lyz@riseup.net>|
|
|1|Lyz <lyz@riseup.net>|
|
||||||
|1|Marcin Karpezo <m.karpezo@nencki.gov.pl>|
|
|1|Marcin Karpezo <m.karpezo@nencki.gov.pl>|
|
||||||
@@ -710,7 +687,6 @@
|
|||||||
|1|Mark Railton <mark@markrailton.com>|
|
|1|Mark Railton <mark@markrailton.com>|
|
||||||
|1|Markus Dieckmann <markus.dieckmann@posteo.de>|
|
|1|Markus Dieckmann <markus.dieckmann@posteo.de>|
|
||||||
|1|Martin Allien <1965795+AllienWorks@users.noreply.github.com>|
|
|1|Martin Allien <1965795+AllienWorks@users.noreply.github.com>|
|
||||||
|1|Martin Kucej <i.librarian.software@gmail.com>|
|
|
||||||
|1|Martin Malinda <malindacz@gmail.com>|
|
|1|Martin Malinda <malindacz@gmail.com>|
|
||||||
|1|Marvin <Groruk@uberdoge.network>|
|
|1|Marvin <Groruk@uberdoge.network>|
|
||||||
|1|Marvin Gülker <post+git@guelker.eu>|
|
|1|Marvin Gülker <post+git@guelker.eu>|
|
||||||
@@ -723,22 +699,18 @@
|
|||||||
|1|Matthew Dews <matthew-dews@users.noreply.github.com>|
|
|1|Matthew Dews <matthew-dews@users.noreply.github.com>|
|
||||||
|1|Matthew East <matthew@mattheweast.me>|
|
|1|Matthew East <matthew@mattheweast.me>|
|
||||||
|1|Matthew McEachen <matthew@photostructure.com>|
|
|1|Matthew McEachen <matthew@photostructure.com>|
|
||||||
|1|Matthew Wild <mwild1@gmail.com>|
|
|
||||||
|1|Matthias De Bie <mattydebie@gmail.com>|
|
|1|Matthias De Bie <mattydebie@gmail.com>|
|
||||||
|1|Max <2843450+b-m-f@users.noreply.github.com>|
|
|1|Max <2843450+b-m-f@users.noreply.github.com>|
|
||||||
|1|Max Hollmann <maxhollmann@gmail.com>|
|
|1|Max Hollmann <maxhollmann@gmail.com>|
|
||||||
|1|Maxime Bouroumeau-Fuseau <maxime.bouroumeau@gmail.com>|
|
|1|Maxime Bouroumeau-Fuseau <maxime.bouroumeau@gmail.com>|
|
||||||
|1|Mellow Fish Ltd <mfscripts@users.noreply.github.com>|
|
|
||||||
|1|Michael Barrow <michael@barrow.me>|
|
|1|Michael Barrow <michael@barrow.me>|
|
||||||
|1|Michael Burns <michael@mirwin.net>|
|
|1|Michael Burns <michael@mirwin.net>|
|
||||||
|1|Michael Lynch <mtlynch@users.noreply.github.com>|
|
|
||||||
|1|Michael M. Chang <michael@mchang.name>|
|
|1|Michael M. Chang <michael@mchang.name>|
|
||||||
|1|Michael Malura <github@malura.me>|
|
|1|Michael Malura <github@malura.me>|
|
||||||
|1|Michael Stegeman <michael@stegeman.me>|
|
|1|Michael Stegeman <michael@stegeman.me>|
|
||||||
|1|Michael van Tricht <metricht@gmail.com>|
|
|1|Michael van Tricht <metricht@gmail.com>|
|
||||||
|1|Michael van Tricht <mvantricht@expandonline.nl>|
|
|1|Michael van Tricht <mvantricht@expandonline.nl>|
|
||||||
|1|Michael van Tricht <swordbeta@users.noreply.github.com>|
|
|1|Michael van Tricht <swordbeta@users.noreply.github.com>|
|
||||||
|1|Miguel Michelson Martinez <miguel@chaskiq.io>|
|
|
||||||
|1|Mike Goodwin <xenithorb@users.noreply.github.com>|
|
|1|Mike Goodwin <xenithorb@users.noreply.github.com>|
|
||||||
|1|Mike Steele <mike@steel.fm>|
|
|1|Mike Steele <mike@steel.fm>|
|
||||||
|1|Miloš Kroulík <milos.kroulik@gmail.com>|
|
|1|Miloš Kroulík <milos.kroulik@gmail.com>|
|
||||||
@@ -758,7 +730,6 @@
|
|||||||
|1|Nicolas Mattiocco <nicolas.mattiocco@gmail.com>|
|
|1|Nicolas Mattiocco <nicolas.mattiocco@gmail.com>|
|
||||||
|1|NicolasCARPi <nicolas.carpi@curie.fr>|
|
|1|NicolasCARPi <nicolas.carpi@curie.fr>|
|
||||||
|1|Niels Robin-Aubertin <nrobinaubertin@users.noreply.github.com>|
|
|1|Niels Robin-Aubertin <nrobinaubertin@users.noreply.github.com>|
|
||||||
|1|Nikita Kolmogorov <backmeupplz@gmail.com>|
|
|
||||||
|1|Nikodem Deja <nikodem@nikodemdeja.pl>|
|
|1|Nikodem Deja <nikodem@nikodemdeja.pl>|
|
||||||
|1|Nirmal Almara <yo@mysticmode.org>|
|
|1|Nirmal Almara <yo@mysticmode.org>|
|
||||||
|1|Nisar Hassan Naqvi <syednisarhassan12@gmail.com>|
|
|1|Nisar Hassan Naqvi <syednisarhassan12@gmail.com>|
|
||||||
@@ -772,7 +743,6 @@
|
|||||||
|1|Owen Young <theowenyoung@gmail.com>|
|
|1|Owen Young <theowenyoung@gmail.com>|
|
||||||
|1|PMK <webmaster@pmklaassen.com>|
|
|1|PMK <webmaster@pmklaassen.com>|
|
||||||
|1|Paolo Pustorino <stickgrinder@gmail.com>|
|
|1|Paolo Pustorino <stickgrinder@gmail.com>|
|
||||||
|1|Pasha Finkelshteyn <pavel.finkelshtein@gmail.com>|
|
|
||||||
|1|Pau Kiat Wee <paukiatwee@gmail.com>|
|
|1|Pau Kiat Wee <paukiatwee@gmail.com>|
|
||||||
|1|Paul <paul@rosanbo.com>|
|
|1|Paul <paul@rosanbo.com>|
|
||||||
|1|Paul Götzinger <paul70079@gmail.com>|
|
|1|Paul Götzinger <paul70079@gmail.com>|
|
||||||
@@ -797,11 +767,9 @@
|
|||||||
|1|Pouria Ezzati <ezzati.upt@gmail.com>|
|
|1|Pouria Ezzati <ezzati.upt@gmail.com>|
|
||||||
|1|Prahalad Belavadi <prahaladbelavadi@gmail.com>|
|
|1|Prahalad Belavadi <prahaladbelavadi@gmail.com>|
|
||||||
|1|Pranav Raj S <pranav@chatwoot.com>|
|
|1|Pranav Raj S <pranav@chatwoot.com>|
|
||||||
|1|Qb <github@qbit.moe>|
|
|
||||||
|1|Quentin de Quelen <quentin@meilisearch.com>|
|
|1|Quentin de Quelen <quentin@meilisearch.com>|
|
||||||
|1|R. Miles McCain <milesmcc@users.noreply.github.com>|
|
|1|R. Miles McCain <milesmcc@users.noreply.github.com>|
|
||||||
|1|Rafael Milewski <Milewski@users.noreply.github.com>|
|
|1|Rafael Milewski <Milewski@users.noreply.github.com>|
|
||||||
|1|Rafał Kukawski <rafal@kukawski.pl>|
|
|
||||||
|1|Raphael Fetzer <kontakt@fetzer.me>|
|
|1|Raphael Fetzer <kontakt@fetzer.me>|
|
||||||
|1|RblSb <msrblsb@gmail.com>|
|
|1|RblSb <msrblsb@gmail.com>|
|
||||||
|1|Remi Rampin <remirampin@gmail.com>|
|
|1|Remi Rampin <remirampin@gmail.com>|
|
||||||
@@ -814,7 +782,6 @@
|
|||||||
|1|Roberto Rosario <roberto.rosario.gonzalez@gmail.com>|
|
|1|Roberto Rosario <roberto.rosario.gonzalez@gmail.com>|
|
||||||
|1|Robin Schneider <ypid@riseup.net>|
|
|1|Robin Schneider <ypid@riseup.net>|
|
||||||
|1|Roman Nesterov <me@rhrn.ru>|
|
|1|Roman Nesterov <me@rhrn.ru>|
|
||||||
|1|Ross Parker <rossdotparker@gmail.com>|
|
|
||||||
|1|Rouven Bauer <robsdedude@gmail.com>|
|
|1|Rouven Bauer <robsdedude@gmail.com>|
|
||||||
|1|RussellAult <RussellAult@users.noreply.github.com>|
|
|1|RussellAult <RussellAult@users.noreply.github.com>|
|
||||||
|1|Ryan Halliday <ry167@ry167.com>|
|
|1|Ryan Halliday <ry167@ry167.com>|
|
||||||
@@ -830,11 +797,9 @@
|
|||||||
|1|Scott Humphries <sscotth@users.noreply.github.com>|
|
|1|Scott Humphries <sscotth@users.noreply.github.com>|
|
||||||
|1|Scott Miller <scott.miller.utah@gmail.com>|
|
|1|Scott Miller <scott.miller.utah@gmail.com>|
|
||||||
|1|Sean Begley <begleysm@users.noreply.github.com>|
|
|1|Sean Begley <begleysm@users.noreply.github.com>|
|
||||||
|1|Sebastian <sebastian@silef.de>|
|
|
||||||
|1|Senan Kelly <senan.f.b.kelly+github@gmail.com>|
|
|1|Senan Kelly <senan.f.b.kelly+github@gmail.com>|
|
||||||
|1|Sergey Bronnikov <sergeyb@bronevichok.ru>|
|
|1|Sergey Bronnikov <sergeyb@bronevichok.ru>|
|
||||||
|1|Sergey Ponomarev <me@sergey-ponomarev.ru>|
|
|1|Sergey Ponomarev <me@sergey-ponomarev.ru>|
|
||||||
|1|Sergey Romanenko <sergey.romanenko@flextype.org>|
|
|
||||||
|1|Sheldon Rupp <me@shel.io>|
|
|1|Sheldon Rupp <me@shel.io>|
|
||||||
|1|Shikiryu <Chouchen@users.noreply.github.com>|
|
|1|Shikiryu <Chouchen@users.noreply.github.com>|
|
||||||
|1|Shyim <6224096+shyim@users.noreply.github.com>|
|
|1|Shyim <6224096+shyim@users.noreply.github.com>|
|
||||||
@@ -845,14 +810,10 @@
|
|||||||
|1|Simon Hanna <simon.hanna@jesus.de>|
|
|1|Simon Hanna <simon.hanna@jesus.de>|
|
||||||
|1|Simon Ramsay <nexus-uw@users.noreply.github.com>|
|
|1|Simon Ramsay <nexus-uw@users.noreply.github.com>|
|
||||||
|1|Simon Vandevelde <simon.vandevelde@hotmail.com>|
|
|1|Simon Vandevelde <simon.vandevelde@hotmail.com>|
|
||||||
|1|SlidingHorn <slidinghorn@protonmail.com>|
|
|
||||||
|1|Sourabh Joshi <38150665+sourabh-joshi@users.noreply.github.com>|
|
|1|Sourabh Joshi <38150665+sourabh-joshi@users.noreply.github.com>|
|
||||||
|1|Spencer McIntyre <zeroSteiner@gmail.com>|
|
|1|Spencer McIntyre <zeroSteiner@gmail.com>|
|
||||||
|1|Spencer Muise <spencermuise@gmail.com>|
|
|1|Spencer Muise <spencermuise@gmail.com>|
|
||||||
|1|Spike <19519553+spikecodes@users.noreply.github.com>|
|
|
||||||
|1|Stan Triepels <1939656+GDay@users.noreply.github.com>|
|
|
||||||
|1|Starbeamrainbowlabs <sbrl@starbeamrainbowlabs.com>|
|
|1|Starbeamrainbowlabs <sbrl@starbeamrainbowlabs.com>|
|
||||||
|1|Stefan Fernandez <stefan.fernandez@gmail.com>|
|
|
||||||
|1|Stefan Weil <sw@weilnetz.de>|
|
|1|Stefan Weil <sw@weilnetz.de>|
|
||||||
|1|Stephen Smith <stephen304@gmail.com>|
|
|1|Stephen Smith <stephen304@gmail.com>|
|
||||||
|1|Steve Divskinsy <stevesbrain@users.noreply.github.com>|
|
|1|Steve Divskinsy <stevesbrain@users.noreply.github.com>|
|
||||||
@@ -883,7 +844,6 @@
|
|||||||
|1|Tom Tamaira <admin@tomtamaira.com>|
|
|1|Tom Tamaira <admin@tomtamaira.com>|
|
||||||
|1|Tomer Shvueli <tomer@shvueli.com>|
|
|1|Tomer Shvueli <tomer@shvueli.com>|
|
||||||
|1|Tommy Ku <tommyku@users.noreply.github.com>|
|
|1|Tommy Ku <tommyku@users.noreply.github.com>|
|
||||||
|1|Totonyus <Totonyus@users.noreply.github.com>|
|
|
||||||
|1|Travis Carr <tmcarr89@gmail.com>|
|
|1|Travis Carr <tmcarr89@gmail.com>|
|
||||||
|1|Trevor Ford <trvrfrd@users.noreply.github.com>|
|
|1|Trevor Ford <trvrfrd@users.noreply.github.com>|
|
||||||
|1|Uli <github@uli-fahrer.de>|
|
|1|Uli <github@uli-fahrer.de>|
|
||||||
@@ -899,7 +859,6 @@
|
|||||||
|1|Wonno <Wonno@users.noreply.github.com>|
|
|1|Wonno <Wonno@users.noreply.github.com>|
|
||||||
|1|WordsPerMinute <59267072+WordsPerMinute@users.noreply.github.com>|
|
|1|WordsPerMinute <59267072+WordsPerMinute@users.noreply.github.com>|
|
||||||
|1|Wundark <weavp001@gmail.com>|
|
|1|Wundark <weavp001@gmail.com>|
|
||||||
|1|Yuli <stremovsky@gmail.com>|
|
|
||||||
|1|Yurii Rashkovskii <yrashk@gmail.com>|
|
|1|Yurii Rashkovskii <yrashk@gmail.com>|
|
||||||
|1|Zoran Pandovski <zoran.pandovski@gmail.com>|
|
|1|Zoran Pandovski <zoran.pandovski@gmail.com>|
|
||||||
|1|aeruower <65504420+aeruower@users.noreply.github.com>|
|
|1|aeruower <65504420+aeruower@users.noreply.github.com>|
|
||||||
@@ -909,16 +868,13 @@
|
|||||||
|1|benmaynard11 <allowin-217941-github@vhost244.maynardnetworks.com>|
|
|1|benmaynard11 <allowin-217941-github@vhost244.maynardnetworks.com>|
|
||||||
|1|bitcoinshirt <36959754+bitcoinshirt@users.noreply.github.com>|
|
|1|bitcoinshirt <36959754+bitcoinshirt@users.noreply.github.com>|
|
||||||
|1|bitsii <40513121+bitsii@users.noreply.github.com>|
|
|1|bitsii <40513121+bitsii@users.noreply.github.com>|
|
||||||
|1|bram2w <bram2w@users.noreply.github.com>|
|
|
||||||
|1|bricej13 <bricej13@gmail.com>|
|
|1|bricej13 <bricej13@gmail.com>|
|
||||||
|1|buzz <buzz@users.noreply.github.com>|
|
|1|buzz <buzz@users.noreply.github.com>|
|
||||||
|1|c22 <c22@users.noreply.github.com>|
|
|1|c22 <c22@users.noreply.github.com>|
|
||||||
|1|cbdev <cb@cbcdn.com>|
|
|1|cbdev <cb@cbcdn.com>|
|
||||||
|1|cinwell.li <cinwell.li@gmail.com>|
|
|
||||||
|1|clach04 <clach04@gmail.com>|
|
|1|clach04 <clach04@gmail.com>|
|
||||||
|1|costpermille <costpermille@users.noreply.github.com>|
|
|1|costpermille <costpermille@users.noreply.github.com>|
|
||||||
|1|cpdev <cpdevelops@users.noreply.github.com>|
|
|1|cpdev <cpdevelops@users.noreply.github.com>|
|
||||||
|1|cranberry <georg@lysergic.dev>|
|
|
||||||
|1|darkdragon-001 <darkdragon-001@users.noreply.github.com>|
|
|1|darkdragon-001 <darkdragon-001@users.noreply.github.com>|
|
||||||
|1|dgtlmoon <leigh@morresi.net>|
|
|1|dgtlmoon <leigh@morresi.net>|
|
||||||
|1|dicedtomato <35403473+diced@users.noreply.github.com>|
|
|1|dicedtomato <35403473+diced@users.noreply.github.com>|
|
||||||
@@ -943,9 +899,7 @@
|
|||||||
|1|gloriafolaron <55953099+gloriafolaron@users.noreply.github.com>|
|
|1|gloriafolaron <55953099+gloriafolaron@users.noreply.github.com>|
|
||||||
|1|golangci <35628013+golangci@users.noreply.github.com>|
|
|1|golangci <35628013+golangci@users.noreply.github.com>|
|
||||||
|1|ice-92 <ice-92@users.noreply.github.com>|
|
|1|ice-92 <ice-92@users.noreply.github.com>|
|
||||||
|1|ifshee <85419413+ifshee@users.noreply.github.com>|
|
|
||||||
|1|ilsi <ilsi@users.noreply.github.com>|
|
|1|ilsi <ilsi@users.noreply.github.com>|
|
||||||
|1|inkhey <guenael.muller@algoo.fr>|
|
|
||||||
|1|itsnotv <itsnotv@users.noreply.github.com>|
|
|1|itsnotv <itsnotv@users.noreply.github.com>|
|
||||||
|1|jake <jake@diesel>|
|
|1|jake <jake@diesel>|
|
||||||
|1|jarek91 <jarek91@users.noreply.github.com>|
|
|1|jarek91 <jarek91@users.noreply.github.com>|
|
||||||
@@ -956,7 +910,6 @@
|
|||||||
|1|kn0wmad <kn0wmad@protonmail.com>|
|
|1|kn0wmad <kn0wmad@protonmail.com>|
|
||||||
|1|lachlan-00 <lachlan.00@gmail.com>|
|
|1|lachlan-00 <lachlan.00@gmail.com>|
|
||||||
|1|lardbit <45122868+lardbit@users.noreply.github.com>|
|
|1|lardbit <45122868+lardbit@users.noreply.github.com>|
|
||||||
|1|larspontoppidan <36330737+larspontoppidan@users.noreply.github.com>|
|
|
||||||
|1|lemon24 <damian.adrian24@gmail.com>|
|
|1|lemon24 <damian.adrian24@gmail.com>|
|
||||||
|1|littleguga <littleguga@users.noreply.github.com>|
|
|1|littleguga <littleguga@users.noreply.github.com>|
|
||||||
|1|londonatil <65257173+londonatil@users.noreply.github.com>|
|
|1|londonatil <65257173+londonatil@users.noreply.github.com>|
|
||||||
@@ -971,14 +924,11 @@
|
|||||||
|1|mundurragacl <mundurragacl@gmail.com>|
|
|1|mundurragacl <mundurragacl@gmail.com>|
|
||||||
|1|mxroute <37432698+mxroute@users.noreply.github.com>|
|
|1|mxroute <37432698+mxroute@users.noreply.github.com>|
|
||||||
|1|n2i <xuansamdinh.n2i@gmail.com>|
|
|1|n2i <xuansamdinh.n2i@gmail.com>|
|
||||||
|1|nicod_ <nicod@lerebooteux.fr>|
|
|
||||||
|1|niedev <luca.martino181@gmail.com>|
|
|1|niedev <luca.martino181@gmail.com>|
|
||||||
|1|nodomain <ff@nodomain.cc>|
|
|1|nodomain <ff@nodomain.cc>|
|
||||||
|1|norstbox <norstbox@users.noreply.github.com>|
|
|1|norstbox <norstbox@users.noreply.github.com>|
|
||||||
|1|nwerker <45071484+nwerker@users.noreply.github.com>|
|
|1|nwerker <45071484+nwerker@users.noreply.github.com>|
|
||||||
|1|orhun <orhun@archlinux.org>|
|
|
||||||
|1|pastapojken <pastapojken@users.noreply.github.com>|
|
|1|pastapojken <pastapojken@users.noreply.github.com>|
|
||||||
|1|pawelmalak <pawel999@icloud.com>|
|
|
||||||
|1|philipp-r || 333 <philipp-r@users.noreply.github.com>|
|
|1|philipp-r || 333 <philipp-r@users.noreply.github.com>|
|
||||||
|1|phobot <piter90@gmail.com>|
|
|1|phobot <piter90@gmail.com>|
|
||||||
|1|pips <pips@e5150.fr>|
|
|1|pips <pips@e5150.fr>|
|
||||||
@@ -986,7 +936,6 @@
|
|||||||
|1|poVoq <wm_jkm@yahoo.com>|
|
|1|poVoq <wm_jkm@yahoo.com>|
|
||||||
|1|railscard <railscard@gmail.com>|
|
|1|railscard <railscard@gmail.com>|
|
||||||
|1|raman325 <7243222+raman325@users.noreply.github.com>|
|
|1|raman325 <7243222+raman325@users.noreply.github.com>|
|
||||||
|1|ran88dom99 <rain8dome9@gmail.com>|
|
|
||||||
|1|reddec <owner@reddec.net>|
|
|1|reddec <owner@reddec.net>|
|
||||||
|1|sc0repi0 <sc0repi0@gmx.de>|
|
|1|sc0repi0 <sc0repi0@gmx.de>|
|
||||||
|1|skarphet <skarphet@users.noreply.github.com>|
|
|1|skarphet <skarphet@users.noreply.github.com>|
|
||||||
|
@@ -1,10 +1,9 @@
|
|||||||
# Awesome Selfhosted - Non-Free Software
|
# Awesome Selfhosted - Proprietary Software
|
||||||
|
|
||||||
**Software listed here does not meet the [Free Software](https://en.wikipedia.org/wiki/Free_software) definition**. It implements their own licensing with restrictions and grants which you must check on each case. Restrictions may include limits on allowed use of the software, access to the source code, modification and further redistribution. This software can therefore contain anti user-freedom features, such as but not limited to: backdoors, user lock-in, sending personal data to a third party.
|
**Software listed here does not allow you to run it for any purpose, study, modify or distribute the source code.** Some of the software here may not be audited due to its closed source nature, and can therefore contain anti-features, such as but not limited to: undisclosed security vulnerabilities, backdoors, user lock-in, sending personal data to a third party.
|
||||||
|
|
||||||
## Analytics
|
## Analytics
|
||||||
|
|
||||||
- [66Analytics](https://66analytics.com/) `⊘ Proprietary` - 66Analytics is a self-hosted, friendly, all-in-one web analytics tool. Lightweight tracking, session replays, heatmaps, user journeys & more. Can be used for personal reasons & can be white labeled to start a SAAS. ([Demo](https://66analytics.com/demo)) `PHP/MySQL`
|
|
||||||
- [userTrack](https://www.usertrack.net/) `⊘ Proprietary` - userTrack is a web analytics platform with heatmaps, session recordings and powerful user segmentation feature. Updated very regularly. ([Demo](https://dashboard.usertrack.net/server/demoLogin.php)) `PHP/MySQL/ReactJS`
|
- [userTrack](https://www.usertrack.net/) `⊘ Proprietary` - userTrack is a web analytics platform with heatmaps, session recordings and powerful user segmentation feature. Updated very regularly. ([Demo](https://dashboard.usertrack.net/server/demoLogin.php)) `PHP/MySQL/ReactJS`
|
||||||
- [UXLens](https://uxlens.com/) `⊘ Proprietary` - UXLens is a website visitor recording software meant for identifying UI issues and fix them to improve user experience. Formerly known as SessionRecord ([Demo](https://console.uxlens.com/test)) `Docker Nodejs`
|
- [UXLens](https://uxlens.com/) `⊘ Proprietary` - UXLens is a website visitor recording software meant for identifying UI issues and fix them to improve user experience. Formerly known as SessionRecord ([Demo](https://console.uxlens.com/test)) `Docker Nodejs`
|
||||||
|
|
||||||
@@ -26,7 +25,6 @@
|
|||||||
|
|
||||||
## E-books and Integrated Library Systems (ILS)
|
## E-books and Integrated Library Systems (ILS)
|
||||||
|
|
||||||
- [Bookwyrm](https://joinbookwyrm.com/) `⊘ Proprietary` - BookWyrm is a social network for tracking your reading, talking about books, writing reviews, and discovering what to read next. ([Source Code](https://github.com/bookwyrm-social/bookwyrm)) `Python`
|
|
||||||
- [Ubooquity](https://vaemendis.net/ubooquity/) `⊘ Proprietary` - Ubooquity is a free to use, versatile, lightweight, multi-platform, and secure home server for your comic and e-book library. `Java`
|
- [Ubooquity](https://vaemendis.net/ubooquity/) `⊘ Proprietary` - Ubooquity is a free to use, versatile, lightweight, multi-platform, and secure home server for your comic and e-book library. `Java`
|
||||||
|
|
||||||
|
|
||||||
@@ -54,7 +52,7 @@
|
|||||||
|
|
||||||
## Maps & GPS
|
## Maps & GPS
|
||||||
|
|
||||||
- [MapTiler Server](https://www.maptiler.com/server/) `⊘ Proprietary` - Software for self-hosting of OpenStreetMap vector tiles, satellite imagery, own geodata and data from PostGIS database.
|
- [OpenMapTiles Server](https://openmaptiles.org/) `⊘ Proprietary` - Set of tools for self-hosting of OpenStreetMap vector tiles. ([Partial Source Code](https://github.com/openmaptiles)) `Python/JavaScript`
|
||||||
|
|
||||||
## Media Streaming
|
## Media Streaming
|
||||||
|
|
||||||
|
@@ -7,12 +7,10 @@ Requirements:
|
|||||||
- A personal access token (https://github.com/settings/tokens)
|
- A personal access token (https://github.com/settings/tokens)
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
- Run awesome_bot --allow-redirect -f README.md beforehand to detect any error(4xx, 5xx) that would
|
- Github graphql API calls are limited to 5000 points/hour https://docs.github.com/en/graphql/overview/resource-limitations
|
||||||
cause the script to abort
|
|
||||||
- Github API calls are limited to 5000 requests/hour https://developer.github.com/v3/#rate-limiting
|
|
||||||
- Put the token in your environment variables:
|
- Put the token in your environment variables:
|
||||||
export GITHUB_TOKEN=18c45f8d8d556492d1d877998a5b311b368a76e4
|
export GITHUB_TOKEN=18c45f8d8d556492d1d877998a5b311b368a76e4
|
||||||
- The output is unsorted, just pipe it through 'sort' or paste it in your editor and sort from there
|
- The output is sorted oldest to newest
|
||||||
- Put the script in your crontab or run it from time to time. It doesn't make sense to add this
|
- Put the script in your crontab or run it from time to time. It doesn't make sense to add this
|
||||||
script to the CI job that runs every time something is pushed.
|
script to the CI job that runs every time something is pushed.
|
||||||
- To detect no-commit related activity (repo metadata changes, wiki edits, ...), replace pushed_at
|
- To detect no-commit related activity (repo metadata changes, wiki edits, ...), replace pushed_at
|
||||||
@@ -20,11 +18,15 @@ Usage:
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from github import Github
|
import math
|
||||||
import sys
|
import sys
|
||||||
import time
|
|
||||||
import re
|
import re
|
||||||
import os
|
import os
|
||||||
|
import logging
|
||||||
|
import requests
|
||||||
|
from requests.adapters import HTTPAdapter
|
||||||
|
from requests.exceptions import ConnectionError
|
||||||
|
from datetime import *
|
||||||
|
|
||||||
__author__ = "nodiscc"
|
__author__ = "nodiscc"
|
||||||
__copyright__ = "Copyright 2019, nodiscc"
|
__copyright__ = "Copyright 2019, nodiscc"
|
||||||
@@ -36,25 +38,172 @@ __email__ = "nodiscc@gmail.com"
|
|||||||
__status__ = "Production"
|
__status__ = "Production"
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s', datefmt='%d-%b-%y %H:%M:%S')
|
||||||
access_token = os.environ['GITHUB_TOKEN']
|
|
||||||
|
|
||||||
""" find all URLs of the form https://github.com/owner/repo """
|
""" find all URLs of the form https://github.com/owner/repo """
|
||||||
with open('README.md', 'r') as readme:
|
def parse_github_projects():
|
||||||
data = readme.read()
|
with open(sys.argv[1], 'r') as readme:
|
||||||
project_urls = re.findall('https://github.com/[A-z]*/[A-z|0-9|\-|_|\.]+', data)
|
logging.info('Testing ' + sys.argv[1])
|
||||||
|
data = readme.read()
|
||||||
|
project_urls = re.findall('https://github\.com/([a-zA-Z\d\-\._]{1,39}/[a-zA-Z\d\-\._]{1,39})(?=\)|/|#\s)', data)
|
||||||
|
""" Uncomment this to debug the list of matched URLs """
|
||||||
|
# print(str(project_urls))
|
||||||
|
# print(len(project_urls))
|
||||||
|
# with open('links.txt', 'w') as filehandle:
|
||||||
|
# for l in project_urls:
|
||||||
|
# filehandle.write('%s\n' % l)
|
||||||
|
|
||||||
urls = sorted(set(project_urls))
|
# exit(0)
|
||||||
|
sorted_urls = sorted(set(project_urls))
|
||||||
|
logging.info('Checking ' + str(len(sorted_urls)) + ' github repos.')
|
||||||
|
return sorted_urls
|
||||||
|
|
||||||
""" Uncomment this to debug the list of matched URLs """
|
|
||||||
# print(str(urls))
|
|
||||||
# exit(0)
|
|
||||||
|
|
||||||
""" login to github API """
|
""" function to query Github graphql API """
|
||||||
g = Github(access_token)
|
def query_github_api(query):
|
||||||
|
access_token = os.environ['GITHUB_TOKEN']
|
||||||
|
headers = {"Authorization": "Bearer " + access_token}
|
||||||
|
github_adapter = HTTPAdapter(max_retries=7)
|
||||||
|
session = requests.Session()
|
||||||
|
session.mount('https:api.github.com/graphql', github_adapter)
|
||||||
|
try:
|
||||||
|
response = session.post('https://api.github.com/graphql', timeout=(10) , json={'query': query}, headers=headers)
|
||||||
|
response.raise_for_status()
|
||||||
|
#logging.debug(response.json())
|
||||||
|
return response.json()
|
||||||
|
except requests.exceptions.HTTPError as errh:
|
||||||
|
logging.error("An Http Error occurred:" + repr(errh))
|
||||||
|
return {'errors': [{'type': 'HTTP Error'}]}
|
||||||
|
except requests.exceptions.ConnectionError as errc:
|
||||||
|
logging.error("An Error Connecting to the API occurred:" + repr(errc))
|
||||||
|
return {"errors": [ { "type": "Connect Error"}]}
|
||||||
|
except requests.exceptions.Timeout as errt:
|
||||||
|
logging.error("A Timeout Error occurred:" + repr(errt))
|
||||||
|
return {"errors": [ { "type": "Timeout Error"}]}
|
||||||
|
except requests.exceptions.RequestException as err:
|
||||||
|
logging.error("An Unknown Error occurred" + repr(err))
|
||||||
|
return {"errors": [ { "type": "Request Exception"}]}
|
||||||
|
|
||||||
""" load project metadata, output last commit date and URL """
|
""" function to add commas for prettier output"""
|
||||||
for url in urls:
|
def add_comma(s):
|
||||||
project = re.sub('https://github.com/', '', url)
|
if s != '':
|
||||||
repo = g.get_repo(project)
|
s = ', ' + s
|
||||||
print(str(repo.pushed_at) + ' https://github.com/' + project)
|
return s
|
||||||
|
else:
|
||||||
|
return s
|
||||||
|
|
||||||
|
""" function to check remaining rate limit """
|
||||||
|
def check_github_remaining_limit(urls, project_per_call):
|
||||||
|
query = '''
|
||||||
|
query{
|
||||||
|
viewer {
|
||||||
|
login
|
||||||
|
}
|
||||||
|
rateLimit {
|
||||||
|
cost
|
||||||
|
remaining
|
||||||
|
resetAt
|
||||||
|
}
|
||||||
|
}'''
|
||||||
|
logging.info("Checking github api remaining rate limit.")
|
||||||
|
result = query_github_api(query)
|
||||||
|
if 'errors' in result:
|
||||||
|
logging.error(result["errors"][0]["type"] + ", " + result["errors"][0]["message"])
|
||||||
|
with open('github_commit_dates.md', 'w') as filehandle:
|
||||||
|
filehandle.write('%s\n' % '--------------------\n### Github commit date checks')
|
||||||
|
filehandle.write(result["errors"][0]["type"] + ", " + result["errors"][0]["message"])
|
||||||
|
else:
|
||||||
|
if result["data"]["rateLimit"]["remaining"] < len(urls):
|
||||||
|
logging.error('Github api calls remaining is insufficient, exiting.')
|
||||||
|
logging.error('URLS: ' + str(len(urls)) + ', api calls remaining: ' + str(result["data"]["rateLimit"]["remaining"]) + ', Resets at: ' + str(result["data"]["rateLimit"]["resetAt"]))
|
||||||
|
with open('github_commit_dates.md', 'w') as filehandle:
|
||||||
|
filehandle.write('%s\n' % '--------------------\n### Github commit date checks')
|
||||||
|
filehandle.write('Github api calls remaining is insufficient, exiting.\n')
|
||||||
|
filehandle.write('URLS: ' + str(len(urls)) + str(math.ceil(len(urls) / project_per_call)) + ', Github API cost: ' + ', api calls remaining: ' + str(result["data"]["rateLimit"]["remaining"]) + ', Resets at: ' + str(result["data"]["rateLimit"]["resetAt"]) + '\n')
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
def parse_api_output(github_graphql_data, url_store):
|
||||||
|
output = []
|
||||||
|
if "errors" in github_graphql_data:
|
||||||
|
for e in github_graphql_data["errors"]:
|
||||||
|
print(e)
|
||||||
|
logging.info('https://github.com/'+ url_store[e["path"][0]] + ", " + e["type"])
|
||||||
|
output.append([date(1900, 1, 1),'https://github.com/'+ url_store[e["path"][0]], e["type"]])
|
||||||
|
if "data" in github_graphql_data:
|
||||||
|
for g, v in github_graphql_data["data"].items():
|
||||||
|
if github_graphql_data["data"][g] == None:
|
||||||
|
continue
|
||||||
|
elif g == 'rateLimit':
|
||||||
|
logging.info('Remaining Ratelimit: ' + str(github_graphql_data["data"][g]["remaining"]) + ' Cost: ' + str(github_graphql_data["data"][g]["cost"]))
|
||||||
|
else:
|
||||||
|
has_issue = False
|
||||||
|
note = ''
|
||||||
|
if github_graphql_data["data"][g]["isArchived"] == True:
|
||||||
|
has_issue = True
|
||||||
|
note = 'Archived'
|
||||||
|
if github_graphql_data["data"][g]["isDisabled"] == True:
|
||||||
|
if note == '':
|
||||||
|
has_issue = True
|
||||||
|
note = 'Disabled'
|
||||||
|
else:
|
||||||
|
note = note + ', Disabled'
|
||||||
|
if github_graphql_data["data"][g]["nameWithOwner"] != url_store[g]:
|
||||||
|
if note == '':
|
||||||
|
has_issue = True
|
||||||
|
note = 'Moved to https://github.com/'+ github_graphql_data["data"][g]["nameWithOwner"]
|
||||||
|
else:
|
||||||
|
note = note + ', Moved to https://github.com/'+ github_graphql_data["data"][g]["nameWithOwner"]
|
||||||
|
project_pushed_at = datetime.strptime(github_graphql_data["data"][g]["pushedAt"], '%Y-%m-%dT%H:%M:%SZ').date()
|
||||||
|
if project_pushed_at < (date.today() - timedelta(days = 365)):
|
||||||
|
has_issue = True
|
||||||
|
if has_issue:
|
||||||
|
output.append([project_pushed_at, 'https://github.com/'+url_store[g], note])
|
||||||
|
logging.info(str(project_pushed_at)+' | https://github.com/'+url_store[g]+' | '+note)
|
||||||
|
return output
|
||||||
|
|
||||||
|
def github_api_alias(url):
|
||||||
|
replace = ["-", "/", "."]
|
||||||
|
for s in replace:
|
||||||
|
url = url.replace(s, "_")
|
||||||
|
return "_" + url
|
||||||
|
|
||||||
|
def build_query(urls, project_per_call):
|
||||||
|
i = 0
|
||||||
|
output = []
|
||||||
|
query_param = '{pushedAt updatedAt isArchived isDisabled nameWithOwner}'
|
||||||
|
url_store = {}
|
||||||
|
while (i < len(urls)):
|
||||||
|
query_repo_count = 0
|
||||||
|
query = "query{rateLimit{cost remaining resetAt}"
|
||||||
|
while (query_repo_count < project_per_call and i < len(urls)):
|
||||||
|
key = github_api_alias(urls[i])
|
||||||
|
url_store[key] = urls[i]
|
||||||
|
split = urls[i].split("/")
|
||||||
|
query += key + ':' + 'repository(owner:"' + split[0] + '" name:"' + split[1] + '")' + query_param
|
||||||
|
query_repo_count += 1
|
||||||
|
i += 1
|
||||||
|
query += "}"
|
||||||
|
output.extend(parse_api_output(query_github_api(query), url_store))
|
||||||
|
logging.debug('Total: ' + str(len(urls)) + ' Checked: ' + str(len(url_store)))
|
||||||
|
return output
|
||||||
|
|
||||||
|
def main():
|
||||||
|
project_per_call = 100
|
||||||
|
urls = parse_github_projects()
|
||||||
|
check_github_remaining_limit(urls, project_per_call)
|
||||||
|
output = build_query(urls, project_per_call)
|
||||||
|
if len(output) > 0:
|
||||||
|
sorted_list = sorted(output, key=lambda x: x[0])
|
||||||
|
with open('github_commit_dates.md', 'w') as filehandle:
|
||||||
|
filehandle.write('%s\n' % '--------------------\n### Github commit date checks')
|
||||||
|
filehandle.write('%s\n' % '#### There were %s repos with issues.' % str(len(output)))
|
||||||
|
for l in sorted_list:
|
||||||
|
filehandle.write('* [ ] %s, %s%s \n' % (str(l[0]), l[1], add_comma(l[2])))
|
||||||
|
sys.exit(1)
|
||||||
|
else:
|
||||||
|
with open('github_commit_dates.md', 'w') as filehandle:
|
||||||
|
filehandle.write('%s\n' % '--------------------\n### Github commit date checks')
|
||||||
|
filehandle.write('%s\n' % '#### There were no repos with issues.')
|
||||||
|
exit(0)
|
||||||
|
|
||||||
|
main()
|
||||||
|
1
tests/link_whitelist.txt
Normal file
1
tests/link_whitelist.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
flaskbb.org,nitter.net,airsonic.github.io/docs/apps
|
@@ -8,6 +8,7 @@ let licenses = new Set();
|
|||||||
let pr = false;
|
let pr = false;
|
||||||
let readme;
|
let readme;
|
||||||
let diff;
|
let diff;
|
||||||
|
let mdOutput = [];
|
||||||
|
|
||||||
//Parse the command options and set the pr var
|
//Parse the command options and set the pr var
|
||||||
function parseArgs(args) {
|
function parseArgs(args) {
|
||||||
@@ -42,10 +43,11 @@ function split(text) {
|
|||||||
|
|
||||||
// All entries should match this pattern. If matches pattern returns true.
|
// All entries should match this pattern. If matches pattern returns true.
|
||||||
function findPattern(text) {
|
function findPattern(text) {
|
||||||
const patt = /^\s{0,2}-\s\[.*?\]\(.*?\) (`⚠` )?- .{0,249}?\.( \(\[(Demo|Source Code|Clients)\]\([^)\]]*\)(, \[(Source Code|Clients)\]\([^)\]]*\))?(, \[(Source Code|Clients)\]\([^)\]]*\))*\))? \`.*?\` \`.*?\`$/;
|
const patt = /^\s{0,2}-\s\[.*?\]\(.*?\) (`⚠` )?- .{0,249}?\.( \(\[(Demo|Source Code|Clients)\]\([^)\]]*\)(, \[(Source Code|Clients)\]\([^)\]]*\))?(, \[(Source Code|Clients)\]\([^)\]]*\))*\))? \`.*?\` \`.*?\`$/m;
|
||||||
if (patt.test(text) === true) {
|
if (patt.test(text) === true) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
console.log("Failed: "+text)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,9 +63,9 @@ function testMainLink(text) {
|
|||||||
const testA1 = /(- \W?\w*\W{0,2}.*?\)?)( .*$)/;
|
const testA1 = /(- \W?\w*\W{0,2}.*?\)?)( .*$)/;
|
||||||
if (!testA.test(text)) {
|
if (!testA.test(text)) {
|
||||||
let a1 = testA1.exec(text)[2];
|
let a1 = testA1.exec(text)[2];
|
||||||
return chalk.red(text.replace(a1, ''))
|
return [chalk.red(text.replace(a1, '')), '🢂' + text.replace(a1, '') + '🢀']
|
||||||
}
|
}
|
||||||
return chalk.green(testA.exec(text)[1])
|
return [chalk.green(testA.exec(text)[1]), testA.exec(text)[1]]
|
||||||
}
|
}
|
||||||
|
|
||||||
//Test '`⚠` - Short description, less than 250 characters.'
|
//Test '`⚠` - Short description, less than 250 characters.'
|
||||||
@@ -74,23 +76,23 @@ function testDescription(text) {
|
|||||||
if (!testB.test(text)) {
|
if (!testB.test(text)) {
|
||||||
let b1 = testA1.exec(text)[1];
|
let b1 = testA1.exec(text)[1];
|
||||||
let b2 = testB2.exec(text)[1];
|
let b2 = testB2.exec(text)[1];
|
||||||
return chalk.red(text.replace(b1, '').replace(b2, ''))
|
return [chalk.red(text.replace(b1, '').replace(b2, '')), '🢂' + text.replace(b1, '').replace(b2, '') + '🢀' ]
|
||||||
}
|
}
|
||||||
return chalk.green(testB.exec(text)[1])
|
return [chalk.green(testB.exec(text)[1]), testB.exec(text)[1]]
|
||||||
}
|
}
|
||||||
|
|
||||||
//If present, tests '([Demo](http://url.to/demo), [Source Code](http://url.of/source/code), [Clients](https://url.to/list/of/related/clients-or-apps))'
|
//If present, tests '([Demo](http://url.to/demo), [Source Code](http://url.of/source/code), [Clients](https://url.to/list/of/related/clients-or-apps))'
|
||||||
function testSrcDemCli(text) {
|
function testSrcDemCli(text) {
|
||||||
let testC = text.search(/\.\ \(|\.\ \[|\ \(\[[sSdDcC]/); // /\(\[|\)\,|\)\)/);
|
let testC = text.search(/\.\ \(|\.\ \[|\ \(\[[sSdDcC]/); // /\(\[|\)\,|\)\)/);
|
||||||
let testD = /(?<=\w. )(\(\[(Demo|Source Code|Clients)\]\([^)\]]*\)(, \[(Source Code|Clients)\]\([^)\]]*\))?(, \[(Source Code|Clients)\]\([^)\]]*\))*\))(?= \`?)/;
|
let testD = /(?<=\w. )(\(\[(Demo|Source Code|Clients)\]\([^)\]]*\)(, \[(Source Code|Clients)\]\([^)\]]*\))?(, \[(Source Code|Clients)\]\([^)\]]*\))*\) )(?=\`?)/;
|
||||||
const testD1 = /(^- \W[a-zA-Z0-9-_ .]*\W{0,2}http[^\[]*)(?<= )/;
|
const testD1 = /(^- \W[a-zA-Z0-9-_ .]*\W{0,2}http[^\[]*)(?<= )/;
|
||||||
const testD2 = /(\`.*\` \`.*\`$)/;
|
const testD2 = /\ ?(\`.*\` \`.*\`$)/;
|
||||||
if ((testC > -1) && (!testD.test(text))) {
|
if ((testC > -1) && (!testD.test(text))) {
|
||||||
let d1 = testD1.exec(text)[1];
|
let d1 = testD1.exec(text)[1];
|
||||||
let d2 = testD2.exec(text)[1];
|
let d2 = testD2.exec(text)[1];
|
||||||
return chalk.red(text.replace(d1, '').replace(d2, ''))
|
return [chalk.red(text.replace(d1, '').replace(d2, '')), '🢂' + text.replace(d1, '').replace(d2, '') + '🢀']
|
||||||
} else if (testC > -1) {
|
} else if (testC > -1) {
|
||||||
return chalk.green(testD.exec(text)[1])
|
return [chalk.green(testD.exec(text)[1]), testD.exec(text)[1]]
|
||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
@@ -102,19 +104,18 @@ function testLangLic(text) {
|
|||||||
const testE1 = /(^[^`]*)/;
|
const testE1 = /(^[^`]*)/;
|
||||||
if (!testE) {
|
if (!testE) {
|
||||||
let e1 = testE1.exec(text)[1];
|
let e1 = testE1.exec(text)[1];
|
||||||
return chalk.red(text.replace(e1, ''))
|
return [chalk.red(text.replace(e1, '')), '🢂' + text.replace(e1, '') + '🢀']
|
||||||
}
|
}
|
||||||
return chalk.green(testD2.exec(text)[1])
|
return [chalk.green(testD2.exec(text)[1]), + testD2.exec(text)[1]]
|
||||||
}
|
}
|
||||||
|
|
||||||
//Runs all the syntax tests...
|
//Runs all the syntax tests...
|
||||||
function findError(text) {
|
function findError(text) {
|
||||||
let res
|
resMainLink = testMainLink(text)
|
||||||
res = testMainLink(text)
|
resDesc= testDescription(text)
|
||||||
res += testDescription(text)
|
resSrcDemCli= testSrcDemCli(text)
|
||||||
res += testSrcDemCli(text)
|
resLangLic= testLangLic(text)
|
||||||
res += testLangLic(text)
|
return [resMainLink[0] + resDesc[0] + resSrcDemCli[0] + resLangLic[0] + `\n`, '```' + resMainLink[1] + resDesc[1] + resSrcDemCli[1] + resLangLic[1] + '```']
|
||||||
return res + `\n`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Check if license is in the list of licenses.
|
//Check if license is in the list of licenses.
|
||||||
@@ -122,7 +123,7 @@ function testLicense(md) {
|
|||||||
let pass = true;
|
let pass = true;
|
||||||
let lFailed = []
|
let lFailed = []
|
||||||
let lPassed = []
|
let lPassed = []
|
||||||
const regex = /.*\`(.*)\` .*$/;
|
const regex = /.*?\`([a-zA-Z0-9\-\./]*)\`.+$/;
|
||||||
try {
|
try {
|
||||||
for (l of regex.exec(md)[1].split("/")) {
|
for (l of regex.exec(md)[1].split("/")) {
|
||||||
if (!licenses.has(l)) {
|
if (!licenses.has(l)) {
|
||||||
@@ -136,11 +137,6 @@ function testLicense(md) {
|
|||||||
console.log(chalk.yellow("Error in License syntax, license not checked against list."))
|
console.log(chalk.yellow("Error in License syntax, license not checked against list."))
|
||||||
return [false, "", ""]
|
return [false, "", ""]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return [pass, lFailed, lPassed]
|
return [pass, lFailed, lPassed]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -195,14 +191,15 @@ function entryErrorCheck() {
|
|||||||
e.pass = true
|
e.pass = true
|
||||||
e.name = parseName(e.raw)
|
e.name = parseName(e.raw)
|
||||||
if (!findPattern(e.raw)) {
|
if (!findPattern(e.raw)) {
|
||||||
e.highlight = findError(e.raw);
|
errorRes = findError(e.raw);
|
||||||
|
e.highlight = errorRes[0];
|
||||||
e.pass = false;
|
e.pass = false;
|
||||||
console.log(e.highlight)
|
console.log(e.highlight)
|
||||||
}
|
}
|
||||||
e.licenseTest = testLicense(e.raw);
|
e.licenseTest = testLicense(e.raw);
|
||||||
if (!e.licenseTest) {
|
if (!e.licenseTest) {
|
||||||
e.pass = false;
|
e.pass = false;
|
||||||
console.log(chalk.red(`${e.name}'s license is not on License list.`))
|
console.log(chalk.red(`${e.name}'s license is not on the License list.`))
|
||||||
}
|
}
|
||||||
if (e.pass) {
|
if (e.pass) {
|
||||||
totalPass++
|
totalPass++
|
||||||
@@ -210,6 +207,7 @@ function entryErrorCheck() {
|
|||||||
totalFail++
|
totalFail++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
console.log(chalk.cyan("Testing entire README.md\n"))
|
console.log(chalk.cyan("Testing entire README.md\n"))
|
||||||
total = entries.length
|
total = entries.length
|
||||||
@@ -217,7 +215,9 @@ function entryErrorCheck() {
|
|||||||
e.pass = true
|
e.pass = true
|
||||||
e.name = parseName(e.raw)
|
e.name = parseName(e.raw)
|
||||||
if (!findPattern(e.raw)) {
|
if (!findPattern(e.raw)) {
|
||||||
e.highlight = findError(e.raw);
|
errorRes = findError(e.raw);
|
||||||
|
e.highlight = errorRes[0];
|
||||||
|
mdOutput.push("* [ ] Line: " + e.line + ": " + e.name + "\n" + errorRes[1]);
|
||||||
e.pass = false;
|
e.pass = false;
|
||||||
console.log(`${chalk.yellow(e.line + ": ")}${e.highlight}`);
|
console.log(`${chalk.yellow(e.line + ": ")}${e.highlight}`);
|
||||||
syntax = e.highlight;
|
syntax = e.highlight;
|
||||||
@@ -226,6 +226,7 @@ function entryErrorCheck() {
|
|||||||
if (!e.licenseTest[0]) {
|
if (!e.licenseTest[0]) {
|
||||||
e.pass = false;
|
e.pass = false;
|
||||||
console.log(chalk.yellow(e.line + ": ") + `${e.name}'s license ${chalk.red(`'${e.licenseTest[1]}'`)} is not on the License list.\n`)
|
console.log(chalk.yellow(e.line + ": ") + `${e.name}'s license ${chalk.red(`'${e.licenseTest[1]}'`)} is not on the License list.\n`)
|
||||||
|
mdOutput.push("* [ ] Line: " + e.line + "\n" + e.name + "'s license is not on the License list.")
|
||||||
}
|
}
|
||||||
if (e.pass) {
|
if (e.pass) {
|
||||||
totalPass++
|
totalPass++
|
||||||
@@ -238,6 +239,10 @@ function entryErrorCheck() {
|
|||||||
console.log(chalk.blue(`\n-----------------------------\n`))
|
console.log(chalk.blue(`\n-----------------------------\n`))
|
||||||
console.log(chalk.red(`${totalFail} Failed, `) + chalk.green(`${totalPass} Passed, `) + chalk.blue(`of ${total}`))
|
console.log(chalk.red(`${totalFail} Failed, `) + chalk.green(`${totalPass} Passed, `) + chalk.blue(`of ${total}`))
|
||||||
console.log(chalk.blue(`\n-----------------------------\n`))
|
console.log(chalk.blue(`\n-----------------------------\n`))
|
||||||
|
fs.writeFileSync('syntax_check.md', `--------------------\n### Syntax Checks\n#### ${totalFail} Failed, ${totalPass} Passed, of ${total}.\n`)
|
||||||
|
mdOutput.forEach(element => {
|
||||||
|
fs.appendFileSync('syntax_check.md', `${element}\n`)
|
||||||
|
});
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
} else {
|
} else {
|
||||||
console.log(chalk.blue(`\n-----------------------------\n`))
|
console.log(chalk.blue(`\n-----------------------------\n`))
|
||||||
|
Reference in New Issue
Block a user