Compare commits

..

6 Commits

Author SHA1 Message Date
n8225
329d16b330
Fix CRON 2021-07-01 07:22:27 -05:00
Nathan Rew
5debc514d6 fix pull_request workflow
Signed-off-by: Nathan Rew <nrew225@gmail.com>
2021-06-30 19:48:26 -05:00
Nathan Rew
af89e7930f fix pull_request workflow
Signed-off-by: Nathan Rew <nrew225@gmail.com>
2021-06-30 16:49:40 -05:00
Nathan Rew
becb838708 fix pull_request workflow
Signed-off-by: Nathan Rew <nrew225@gmail.com>
2021-06-30 16:40:03 -05:00
Nathan Rew
27071cb9c8 Add github actions workflows
Signed-off-by: Nathan Rew <nrew225@gmail.com>
2021-06-30 15:28:52 -05:00
Nathan Rew
19937e41db Add github actions workflows
Signed-off-by: Nathan Rew <nrew225@gmail.com>
2021-06-30 08:24:57 -05:00
9 changed files with 1013 additions and 794 deletions

110
.github/workflows/monthly.yml vendored Normal file
View 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 '[![Monthly Checks](https://github.com/n8225/awesome-selfhosted/actions/workflows/monthly.yml/badge.svg)](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
View 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

View File

@ -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

View File

@ -1,7 +1,7 @@
|Commits | Author |
| :---: | --- |
|1560|nodiscc <nodiscc@gmail.com>|
|334|n8225 <n8225@users.noreply.github.com>|
|1494|nodiscc <nodiscc@gmail.com>|
|327|n8225 <n8225@users.noreply.github.com>|
|319|Kickball <ed.kickball@hotmail.com>|
|122|Andrew Rylatt <arylatt@users.noreply.github.com>|
|77|Meitar M <meitarm@gmail.com>|
@ -12,12 +12,10 @@
|23|cave beat <cave@cavebeat.org>|
|17|Thomas Dalichow <info@thomasdalichow.de>|
|14|Miguel Piedrafita <github@miguelpiedrafita.com>|
|14|kokomo123 <70863536+kokomo123@users.noreply.github.com>|
|13|Ferdinand Mütsch <mail@ferdinand-muetsch.de>|
|13|jungle-boogie <sean@jungleboogie.me>|
|12|Alex <alex@maximum.guru>|
|12|Pe46dro <pietro@marangon.me>|
|11|Akashdeep Dhar <akashdeep.dhar@gmail.com>|
|11|Pietro Marangon <pietro.marangon@gmail.com>|
|10|Kevin <kevin@kevink.dev>|
|9|Andrew Peng <pengc99@gmail.com>|
@ -28,6 +26,7 @@
|8|CooperBarrett <anthony.lhuissier@openmailbox.org>|
|8|Martijn <martijn@mrtijn.nl>|
|8|Rodrigo Avelino <rodrigo@avelino.org>|
|8|kokomo123 <70863536+kokomo123@users.noreply.github.com>|
|7|Hammy Havoc <hammy@splitanatom.com>|
|7|Ilian <ugg.rock@gmail.com>|
|7|James Mills <prologic@shortcircuit.net.au>|
@ -38,11 +37,11 @@
|7|n1trux <n1trux@users.noreply.github.com>|
|7|phre4k <me@phre4k.at>|
|7|édouard u. <mail@edouard.us>|
|6|Alexander <46561566+AlexKnowsIt@users.noreply.github.com>|
|6|Chris McCormick <chris@mccormick.cx>|
|6|Per Guth <mail@perguth.de>|
|6|Quinn Comendant <quinn@strangecode.com>|
|6|Touhid Arastu <touhid.arastu@gmail.com>|
|5|Alexander <46561566+AlexKnowsIt@users.noreply.github.com>|
|5|Bob van Luijt <bob@semi.technology>|
|5|Dariusz <37488679+Volmarg@users.noreply.github.com>|
|5|Deluan Quintão <github@deluan.com>|
@ -108,7 +107,6 @@
|4|Meitar M <meitarm+github.1djyXhCkVsRYzZRk@gmail.com>|
|4|Praveen Durairaju <praveend.web@gmail.com>|
|4|Rodolfo Berrios <inbox@rodolfoberrios.com>|
|4|Ryan DeShone <rfdeshon@gmail.com>|
|4|Sandro <sandro.jaeckel@posteo.de>|
|4|Sebastian Stehle <sebastian@squidex.io>|
|4|Sergio Brighenti <sergio@brighenti.me>|
@ -123,7 +121,6 @@
|4|dpfaffenbauer <dominik@lineofcode.at>|
|4|dyu <david.yu.ftw@gmail.com>|
|4|hebbet <pascal.herbert@gmail.com>|
|4|oof2win2 <honza.koco44@gmail.com>|
|4|paddo <mail@patrickrichter.net>|
|3|132ikl <132@ikl.sh>|
|3|Aguay <baraise.valentin@gmail.com>|
@ -134,7 +131,6 @@
|3|BernsteinA <4685390+BernsteinA@users.noreply.github.com>|
|3|Brandon Jones <brandon@radroot.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|Cédric Krier <cedk@users.noreply.github.com>|
|3|Daniel Mason <danielmason@catalyst.net.nz>|
@ -191,9 +187,9 @@
|3|Prashant Singh <prashant.singh852@webkul.com>|
|3|PrplHaz4 <PrplHaz4@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|Sheshbabu <sheshbabu@gmail.com>|
|3|Sjoerd van der Hoorn <sjoerdvanderhoorn@hotmail.com>|
|3|Tobi Schäfer <interface@p3k.org>|
|3|Tom Pansino <2768420+tpansino@users.noreply.github.com>|
|3|Yann Forget <forget.yann31@gmail.com>|
@ -258,6 +254,7 @@
|2|Chris Lu <chrislusf@users.noreply.github.com>|
|2|Chris Missal <chris.missal@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|Corentin Brossault <corentin.brossault@gmail.com>|
|2|Costin Moise <necenzurat@gmail.com>|
@ -381,6 +378,7 @@
|2|Shane Cooke <shanecooke@mac.com>|
|2|Simon Vieille <simon@deblan.fr>|
|2|Simone Grignola <sito@grignola.ch>|
|2|Sjoerd van der Hoorn <sjoerdvanderhoorn@hotmail.com>|
|2|Spark <24642451+Sparkenstein@users.noreply.github.com>|
|2|Stefan Bohacek <stefan.bohacek@gmail.com>|
|2|Stefane Fermigier <sf@fermigier.com>|
@ -406,7 +404,6 @@
|2|Yurii Dubinka <yurii.dubinka@gmail.com>|
|2|Zeniic <Zeniic@users.noreply.github.com>|
|2|Zeyphros <robin@decker.cx>|
|2|Ziga Zajc <ziga.zajc007@gmail.com>|
|2|agetic <agetic@debian>|
|2|ahaenggli <adriano@haenggli.net>|
|2|aldevar <aldevar@alaben.net>|
@ -421,7 +418,6 @@
|2|fengshaun <amoradi@fedoraproject.org>|
|2|fuerbringer <severin@protonmail.ch>|
|2|gseva <gavrilovseva@gmail.com>|
|2|horahoradev <horahora1567@gmail.com>|
|2|jciskey <jciskey@gmail.com>|
|2|jganobsik <39414138+jganobsik@users.noreply.github.com>|
|2|jimykk <JimyKK@users.noreply.github.com>|
@ -458,13 +454,11 @@
|1|Aditya Nagla <me@cdadityang.xyz>|
|1|Adrian Kumpf <adrian.kumpf@posteo.de>|
|1|Aimee <16459597+Aimeedeer@users.noreply.github.com>|
|1|Aimeos <aimeos@aimeos.org>|
|1|Akos Veres <veres@akos.me>|
|1|Alashov Berkeli <yunus.alashow@gmail.com>|
|1|Alberto Bertogli <albertito@blitiri.com.ar>|
|1|Alejandro Rodríguez <arcxyz@users.noreply.github.com>|
|1|Alex <alexta69@gmail.com>|
|1|Alex Cureton-Griffiths <alexcg1@users.noreply.github.com>|
|1|Alex Fornuto <alex@fornuto.com>|
|1|Alex Ling <hkalexling@gmail.com>|
|1|Alex Tselegidis <alextselegidis@gmail.com>|
@ -475,8 +469,6 @@
|1|Alexey Strokach <alex.strokach@utoronto.ca>|
|1|Alfred Bez <alfred.bez@googlemail.com>|
|1|Algram <aliasgram@gmail.com>|
|1|Alicia Sykes <gh@d0h.co>|
|1|AltumCode <hello@altumcode.com>|
|1|Alys <alice.harris@oldgods.net>|
|1|Andre <andre.lehmann@posteo.de>|
|1|Andrei Marcu <andrei@marcu.net>|
@ -495,7 +487,6 @@
|1|Anton Troyanov <anton@troyanov.net>|
|1|Arkady Asuratov <arkady.asuratov@dubas.pro>|
|1|Armando Lüscher <armando@noplanman.ch>|
|1|Arnav Jindal <arnav.jindal7@gmail.com>|
|1|Arnold Schrijver <aschrijver@users.noreply.github.com>|
|1|ArthurHoaro <arthur@hoa.ro>|
|1|Ash Leece <ash@leece.im>|
@ -560,17 +551,13 @@
|1|David Stephens <dave@force9.org>|
|1|David Yu <david.yu.ftw@gmail.com>|
|1|Deeoon <25846405+Deeoon@users.noreply.github.com>|
|1|Deihim007 <deihim007@gmail.com>|
|1|Denis <isdn@users.noreply.github.com>|
|1|Denis <issden@gmail.com>|
|1|Diego Molina <diemol@users.noreply.github.com>|
|1|Dimitri Steinel <d.steinel@de.edenspiekermann.com>|
|1|Dirk Krause <dirkk0@googlemail.com>|
|1|Dmitrii Poddubnyi <dpoddubny@gmail.com>|
|1|Dmitriy Volkov <wldhx+vcs+github_com@wldhx.me>|
|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|Doğan Çelik <dogancelik@users.noreply.github.com>|
|1|Dražen Lučanin <kermit666@gmail.com>|
@ -583,7 +570,6 @@
|1|Edreih Aldana <edreihaldana@yahoo.com>|
|1|Eldad A. Fux <eldad.fux@gmail.com>|
|1|Emeric POUPON <epoupon@users.noreply.github.com>|
|1|Emiliano <emiliano@sturniolo.com.ar>|
|1|Emlembow <36314674+Emlembow@users.noreply.github.com>|
|1|Eran Chetz <eran.chetzroni@algolia.com>|
|1|Eren Hatırnaz <erenhatirnaz@hotmail.com.tr>|
@ -600,7 +586,6 @@
|1|Fabian Patzke <github@patzi.de>|
|1|Farhan Ghumra <Xyroid@users.noreply.github.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 Kaiser <florian.kaiser@fnkr.net>|
|1|Florian Kaldowski <flokX@users.noreply.github.com>|
@ -611,7 +596,6 @@
|1|FreeScout <40499291+freescout-helpdesk@users.noreply.github.com>|
|1|G <w_i_n_d_y_o@hotmail.com>|
|1|Galen Abell <galen@galenabell.com>|
|1|Gervwyk <gervwyk@gmail.com>|
|1|Gio <giodi@users.noreply.github.com>|
|1|Giorgos Logiotatidis <glogiotatidis@users.noreply.github.com>|
|1|Girish Ramakrishnan <mail@girish.in>|
@ -624,10 +608,8 @@
|1|Henrique Holanda <contato@henriqueholanda.com.br>|
|1|Herman Zvonimir Došilović <hermanz.dosilovic@gmail.com>|
|1|Hooopo <Hoooopo@gmail.com>|
|1|Hunter Wittenborn <hunter@hunterwittenborn.com>|
|1|IAlwaysBeCoding <erik.dominguez1003@gmail.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 Petrov <garik.piton@gmail.com>|
|1|Imron RA <42175898+imronra@users.noreply.github.com>|
@ -636,8 +618,6 @@
|1|Jack <jackdev@mailbox.org>|
|1|Jackson Delahunt <jackson@jacksondelahunt.com>|
|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 Dietrich <jan.dietrich.12@gmail.com>|
|1|Jannik Anker <jannikanker@users.noreply.github.com>|
@ -661,7 +641,6 @@
|1|Jordan Doyle <jordan@9t9t9.com>|
|1|Jordan Doyle <jordan@doyle.la>|
|1|Josh Harmon <me@joshharmon.me>|
|1|Josh Moore <josh.moore@jmoore.dev>|
|1|Joshua Hamilton <joshua.hamilton@fabricut.com>|
|1|José Castro <cogurov@gmail.com>|
|1|Julien <bibich@users.noreply.github.com>|
@ -693,10 +672,8 @@
|1|Lorenz Hübschle-Schneider <lorenzhs@users.noreply.github.com>|
|1|Louis Grenard <louis.grenard@gmail.com>|
|1|Lukas Masuch <Lukas.Masuch@gmail.com>|
|1|Lukas Schulte Pelkum <kbrt@protonmail.com>|
|1|Luke Hoersten <Luke@Hoersten.org>|
|1|Luke Singham <lukesingham@gmail.com>|
|1|Luke Whrit <lukewhrit@pm.me>|
|1|Luuk Nieuwdorp <luuknieuwdorp@users.noreply.github.com>|
|1|Lyz <lyz@riseup.net>|
|1|Marcin Karpezo <m.karpezo@nencki.gov.pl>|
@ -710,7 +687,6 @@
|1|Mark Railton <mark@markrailton.com>|
|1|Markus Dieckmann <markus.dieckmann@posteo.de>|
|1|Martin Allien <1965795+AllienWorks@users.noreply.github.com>|
|1|Martin Kucej <i.librarian.software@gmail.com>|
|1|Martin Malinda <malindacz@gmail.com>|
|1|Marvin <Groruk@uberdoge.network>|
|1|Marvin Gülker <post+git@guelker.eu>|
@ -723,22 +699,18 @@
|1|Matthew Dews <matthew-dews@users.noreply.github.com>|
|1|Matthew East <matthew@mattheweast.me>|
|1|Matthew McEachen <matthew@photostructure.com>|
|1|Matthew Wild <mwild1@gmail.com>|
|1|Matthias De Bie <mattydebie@gmail.com>|
|1|Max <2843450+b-m-f@users.noreply.github.com>|
|1|Max Hollmann <maxhollmann@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 Burns <michael@mirwin.net>|
|1|Michael Lynch <mtlynch@users.noreply.github.com>|
|1|Michael M. Chang <michael@mchang.name>|
|1|Michael Malura <github@malura.me>|
|1|Michael Stegeman <michael@stegeman.me>|
|1|Michael van Tricht <metricht@gmail.com>|
|1|Michael van Tricht <mvantricht@expandonline.nl>|
|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 Steele <mike@steel.fm>|
|1|Miloš Kroulík <milos.kroulik@gmail.com>|
@ -758,7 +730,6 @@
|1|Nicolas Mattiocco <nicolas.mattiocco@gmail.com>|
|1|NicolasCARPi <nicolas.carpi@curie.fr>|
|1|Niels Robin-Aubertin <nrobinaubertin@users.noreply.github.com>|
|1|Nikita Kolmogorov <backmeupplz@gmail.com>|
|1|Nikodem Deja <nikodem@nikodemdeja.pl>|
|1|Nirmal Almara <yo@mysticmode.org>|
|1|Nisar Hassan Naqvi <syednisarhassan12@gmail.com>|
@ -772,7 +743,6 @@
|1|Owen Young <theowenyoung@gmail.com>|
|1|PMK <webmaster@pmklaassen.com>|
|1|Paolo Pustorino <stickgrinder@gmail.com>|
|1|Pasha Finkelshteyn <pavel.finkelshtein@gmail.com>|
|1|Pau Kiat Wee <paukiatwee@gmail.com>|
|1|Paul <paul@rosanbo.com>|
|1|Paul Götzinger <paul70079@gmail.com>|
@ -797,11 +767,9 @@
|1|Pouria Ezzati <ezzati.upt@gmail.com>|
|1|Prahalad Belavadi <prahaladbelavadi@gmail.com>|
|1|Pranav Raj S <pranav@chatwoot.com>|
|1|Qb <github@qbit.moe>|
|1|Quentin de Quelen <quentin@meilisearch.com>|
|1|R. Miles McCain <milesmcc@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|RblSb <msrblsb@gmail.com>|
|1|Remi Rampin <remirampin@gmail.com>|
@ -814,7 +782,6 @@
|1|Roberto Rosario <roberto.rosario.gonzalez@gmail.com>|
|1|Robin Schneider <ypid@riseup.net>|
|1|Roman Nesterov <me@rhrn.ru>|
|1|Ross Parker <rossdotparker@gmail.com>|
|1|Rouven Bauer <robsdedude@gmail.com>|
|1|RussellAult <RussellAult@users.noreply.github.com>|
|1|Ryan Halliday <ry167@ry167.com>|
@ -830,11 +797,9 @@
|1|Scott Humphries <sscotth@users.noreply.github.com>|
|1|Scott Miller <scott.miller.utah@gmail.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|Sergey Bronnikov <sergeyb@bronevichok.ru>|
|1|Sergey Ponomarev <me@sergey-ponomarev.ru>|
|1|Sergey Romanenko <sergey.romanenko@flextype.org>|
|1|Sheldon Rupp <me@shel.io>|
|1|Shikiryu <Chouchen@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 Ramsay <nexus-uw@users.noreply.github.com>|
|1|Simon Vandevelde <simon.vandevelde@hotmail.com>|
|1|SlidingHorn <slidinghorn@protonmail.com>|
|1|Sourabh Joshi <38150665+sourabh-joshi@users.noreply.github.com>|
|1|Spencer McIntyre <zeroSteiner@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|Stefan Fernandez <stefan.fernandez@gmail.com>|
|1|Stefan Weil <sw@weilnetz.de>|
|1|Stephen Smith <stephen304@gmail.com>|
|1|Steve Divskinsy <stevesbrain@users.noreply.github.com>|
@ -883,7 +844,6 @@
|1|Tom Tamaira <admin@tomtamaira.com>|
|1|Tomer Shvueli <tomer@shvueli.com>|
|1|Tommy Ku <tommyku@users.noreply.github.com>|
|1|Totonyus <Totonyus@users.noreply.github.com>|
|1|Travis Carr <tmcarr89@gmail.com>|
|1|Trevor Ford <trvrfrd@users.noreply.github.com>|
|1|Uli <github@uli-fahrer.de>|
@ -899,7 +859,6 @@
|1|Wonno <Wonno@users.noreply.github.com>|
|1|WordsPerMinute <59267072+WordsPerMinute@users.noreply.github.com>|
|1|Wundark <weavp001@gmail.com>|
|1|Yuli <stremovsky@gmail.com>|
|1|Yurii Rashkovskii <yrashk@gmail.com>|
|1|Zoran Pandovski <zoran.pandovski@gmail.com>|
|1|aeruower <65504420+aeruower@users.noreply.github.com>|
@ -909,16 +868,13 @@
|1|benmaynard11 <allowin-217941-github@vhost244.maynardnetworks.com>|
|1|bitcoinshirt <36959754+bitcoinshirt@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|buzz <buzz@users.noreply.github.com>|
|1|c22 <c22@users.noreply.github.com>|
|1|cbdev <cb@cbcdn.com>|
|1|cinwell.li <cinwell.li@gmail.com>|
|1|clach04 <clach04@gmail.com>|
|1|costpermille <costpermille@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|dgtlmoon <leigh@morresi.net>|
|1|dicedtomato <35403473+diced@users.noreply.github.com>|
@ -943,9 +899,7 @@
|1|gloriafolaron <55953099+gloriafolaron@users.noreply.github.com>|
|1|golangci <35628013+golangci@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|inkhey <guenael.muller@algoo.fr>|
|1|itsnotv <itsnotv@users.noreply.github.com>|
|1|jake <jake@diesel>|
|1|jarek91 <jarek91@users.noreply.github.com>|
@ -956,7 +910,6 @@
|1|kn0wmad <kn0wmad@protonmail.com>|
|1|lachlan-00 <lachlan.00@gmail.com>|
|1|lardbit <45122868+lardbit@users.noreply.github.com>|
|1|larspontoppidan <36330737+larspontoppidan@users.noreply.github.com>|
|1|lemon24 <damian.adrian24@gmail.com>|
|1|littleguga <littleguga@users.noreply.github.com>|
|1|londonatil <65257173+londonatil@users.noreply.github.com>|
@ -971,14 +924,11 @@
|1|mundurragacl <mundurragacl@gmail.com>|
|1|mxroute <37432698+mxroute@users.noreply.github.com>|
|1|n2i <xuansamdinh.n2i@gmail.com>|
|1|nicod_ <nicod@lerebooteux.fr>|
|1|niedev <luca.martino181@gmail.com>|
|1|nodomain <ff@nodomain.cc>|
|1|norstbox <norstbox@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|pawelmalak <pawel999@icloud.com>|
|1|philipp-r || 333 <philipp-r@users.noreply.github.com>|
|1|phobot <piter90@gmail.com>|
|1|pips <pips@e5150.fr>|
@ -986,7 +936,6 @@
|1|poVoq <wm_jkm@yahoo.com>|
|1|railscard <railscard@gmail.com>|
|1|raman325 <7243222+raman325@users.noreply.github.com>|
|1|ran88dom99 <rain8dome9@gmail.com>|
|1|reddec <owner@reddec.net>|
|1|sc0repi0 <sc0repi0@gmx.de>|
|1|skarphet <skarphet@users.noreply.github.com>|

1313
README.md

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,6 @@
## 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`
- [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`

View File

@ -7,12 +7,10 @@ Requirements:
- A personal access token (https://github.com/settings/tokens)
Usage:
- Run awesome_bot --allow-redirect -f README.md beforehand to detect any error(4xx, 5xx) that would
cause the script to abort
- Github API calls are limited to 5000 requests/hour https://developer.github.com/v3/#rate-limiting
- Github graphql API calls are limited to 5000 points/hour https://docs.github.com/en/graphql/overview/resource-limitations
- Put the token in your environment variables:
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
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
@ -20,11 +18,15 @@ Usage:
"""
from github import Github
import math
import sys
import time
import re
import os
import logging
import requests
from requests.adapters import HTTPAdapter
from requests.exceptions import ConnectionError
from datetime import *
__author__ = "nodiscc"
__copyright__ = "Copyright 2019, nodiscc"
@ -36,25 +38,172 @@ __email__ = "nodiscc@gmail.com"
__status__ = "Production"
###############################################################################
access_token = os.environ['GITHUB_TOKEN']
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s', datefmt='%d-%b-%y %H:%M:%S')
""" find all URLs of the form https://github.com/owner/repo """
with open('README.md', 'r') as readme:
def parse_github_projects():
with open(sys.argv[1], 'r') as readme:
logging.info('Testing ' + sys.argv[1])
data = readme.read()
project_urls = re.findall('https://github.com/[A-z]*/[A-z|0-9|\-|_|\.]+', data)
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 """
g = Github(access_token)
""" function to query Github graphql API """
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 """
for url in urls:
project = re.sub('https://github.com/', '', url)
repo = g.get_repo(project)
print(str(repo.pushed_at) + ' https://github.com/' + project)
""" function to add commas for prettier output"""
def add_comma(s):
if s != '':
s = ', ' + s
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
View File

@ -0,0 +1 @@
flaskbb.org,nitter.net,airsonic.github.io/docs/apps

View File

@ -8,6 +8,7 @@ let licenses = new Set();
let pr = false;
let readme;
let diff;
let mdOutput = [];
//Parse the command options and set the pr var
function parseArgs(args) {
@ -42,10 +43,11 @@ function split(text) {
// All entries should match this pattern. If matches pattern returns true.
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) {
return true;
}
console.log("Failed: "+text)
return false;
}
@ -61,9 +63,9 @@ function testMainLink(text) {
const testA1 = /(- \W?\w*\W{0,2}.*?\)?)( .*$)/;
if (!testA.test(text)) {
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.'
@ -74,23 +76,23 @@ function testDescription(text) {
if (!testB.test(text)) {
let b1 = testA1.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))'
function testSrcDemCli(text) {
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 testD2 = /(\`.*\` \`.*\`$)/;
const testD2 = /\ ?(\`.*\` \`.*\`$)/;
if ((testC > -1) && (!testD.test(text))) {
let d1 = testD1.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) {
return chalk.green(testD.exec(text)[1])
return [chalk.green(testD.exec(text)[1]), testD.exec(text)[1]]
}
return ""
}
@ -102,19 +104,18 @@ function testLangLic(text) {
const testE1 = /(^[^`]*)/;
if (!testE) {
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...
function findError(text) {
let res
res = testMainLink(text)
res += testDescription(text)
res += testSrcDemCli(text)
res += testLangLic(text)
return res + `\n`
resMainLink = testMainLink(text)
resDesc= testDescription(text)
resSrcDemCli= testSrcDemCli(text)
resLangLic= testLangLic(text)
return [resMainLink[0] + resDesc[0] + resSrcDemCli[0] + resLangLic[0] + `\n`, '```' + resMainLink[1] + resDesc[1] + resSrcDemCli[1] + resLangLic[1] + '```']
}
//Check if license is in the list of licenses.
@ -122,7 +123,7 @@ function testLicense(md) {
let pass = true;
let lFailed = []
let lPassed = []
const regex = /.*\`(.*)\` .*$/;
const regex = /.*?\`([a-zA-Z0-9\-\./]*)\`.+$/;
try {
for (l of regex.exec(md)[1].split("/")) {
if (!licenses.has(l)) {
@ -136,11 +137,6 @@ function testLicense(md) {
console.log(chalk.yellow("Error in License syntax, license not checked against list."))
return [false, "", ""]
}
return [pass, lFailed, lPassed]
}
@ -195,14 +191,15 @@ function entryErrorCheck() {
e.pass = true
e.name = parseName(e.raw)
if (!findPattern(e.raw)) {
e.highlight = findError(e.raw);
errorRes = findError(e.raw);
e.highlight = errorRes[0];
e.pass = false;
console.log(e.highlight)
}
e.licenseTest = testLicense(e.raw);
if (!e.licenseTest) {
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) {
totalPass++
@ -210,6 +207,7 @@ function entryErrorCheck() {
totalFail++
}
}
} else {
console.log(chalk.cyan("Testing entire README.md\n"))
total = entries.length
@ -217,7 +215,9 @@ function entryErrorCheck() {
e.pass = true
e.name = parseName(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;
console.log(`${chalk.yellow(e.line + ": ")}${e.highlight}`);
syntax = e.highlight;
@ -226,6 +226,7 @@ function entryErrorCheck() {
if (!e.licenseTest[0]) {
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`)
mdOutput.push("* [ ] Line: " + e.line + "\n" + e.name + "'s license is not on the License list.")
}
if (e.pass) {
totalPass++
@ -238,6 +239,10 @@ function entryErrorCheck() {
console.log(chalk.blue(`\n-----------------------------\n`))
console.log(chalk.red(`${totalFail} Failed, `) + chalk.green(`${totalPass} Passed, `) + chalk.blue(`of ${total}`))
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);
} else {
console.log(chalk.blue(`\n-----------------------------\n`))