From a468a7d5e6c42737aa3d2df2728e7f31295d7fd6 Mon Sep 17 00:00:00 2001 From: Humzaa Omar <70377687+hfomar-nafcs@users.noreply.github.com> Date: Thu, 12 Nov 2020 12:00:41 -0500 Subject: [PATCH] Uploaded Docsify Docs --- docs/Info/Authors.md | 685 ++++++++++++++++++++++++ docs/Info/CONTRIBUTING.md | 16 + docs/Info/LICENSE.md | 377 +++++++++++++ docs/Makefile | 52 ++ docs/_coverpage.md | 16 + docs/img/selfhosted.png | Bin 0 -> 7589 bytes docs/index.html | 26 + docs/test.md | 1 + docs/tests/Dangerfile | 39 ++ docs/tests/check-github-commit-dates.py | 60 +++ docs/tests/test.js | 251 +++++++++ 11 files changed, 1523 insertions(+) create mode 100644 docs/Info/Authors.md create mode 100644 docs/Info/CONTRIBUTING.md create mode 100644 docs/Info/LICENSE.md create mode 100644 docs/Makefile create mode 100644 docs/_coverpage.md create mode 100644 docs/img/selfhosted.png create mode 100644 docs/index.html create mode 100644 docs/test.md create mode 100644 docs/tests/Dangerfile create mode 100644 docs/tests/check-github-commit-dates.py create mode 100644 docs/tests/test.js diff --git a/docs/Info/Authors.md b/docs/Info/Authors.md new file mode 100644 index 00000000..2f0c02bf --- /dev/null +++ b/docs/Info/Authors.md @@ -0,0 +1,685 @@ +|Commits | Author | +| :---: | --- | +|1032|nodiscc | +|319|Kickball | +|253|n8225 | +|122|Andrew Rylatt | +|77|Meitar M | +|35|Kovah | +|31|DJCrashdummy | +|26|worldworm <13227454+worldworm@users.noreply.github.com>| +|23|cave beat | +|17|Thomas Dalichow | +|14|Miguel Piedrafita | +|13|jungle-boogie | +|12|Alex | +|12|Ferdinand Mütsch | +|12|Pe46dro | +|11|Pietro Marangon | +|9|Andrew Peng | +|9|Joubert RedRat | +|9|Lance M | +|9|cave | +|8|CooperBarrett | +|8|Nick Busey | +|7|Hammy Havoc | +|7|Ilian | +|7|aubrel | +|7|n1trux | +|7|phre4k | +|7|édouard u. | +|6|Jorge E. Gomez | +|6|Per Guth | +|6|Quinn Comendant | +|6|Touhid Arastu | +|5|Chris McCormick | +|5|James Cole | +|5|Jean Champémont | +|5|Johannes Zellner | +|5|Karl Coelho | +|5|Kevin Lin | +|5|Max Maischein | +|5|Mohammad Faisal | +|5|Moti Korets | +|5|Muhammad Hussein Fattahizadeh | +|5|Philip Kirkbride | +|5|Surgie Finesse | +|5|azlux | +|5|mestaritonttu | +|4|/c² | +|4|Alejandro Celaya | +|4|AlessioCasco | +|4|Alexander Litreev | +|4|Alexandr Emelin | +|4|AndrewCz | +|4|Andrey Semakin | +|4|Aravindo Wingeier | +|4|Arda Kılıçdağı | +|4|Bob van Luijt | +|4|Christian Bayer | +|4|Cody Heimberger | +|4|Colin Pokowitz | +|4|Colin Pokowitz | +|4|Cory Gibbons | +|4|D | +|4|Dave Lockwood <1261876+deamos@users.noreply.github.com>| +|4|Dominik Pfaffenbauer | +|4|Dr. Azrael Tod | +|4|Eliot Whalan | +|4|Ilya Sevostyanov | +|4|Jan Vlnas | +|4|Jan-Lukas Else | +|4|Jason Robinson | +|4|Jean Elchinger | +|4|Joery Zegers | +|4|Jorge E. Gomez | +|4|Joshua Westerheide | +|4|Koichi MATSUMOTO | +|4|MK | +|4|Mancy | +|4|Marius Voila | +|4|Meitar M | +|4|Rodolfo Berrios | +|4|Sebastian Stehle | +|4|Tony | +|4|Valmik | +|4|apacketofsweets <19573127+apacketofsweets@users.noreply.github.com>| +|4|bysslord | +|4|cthu1hoo <47687909+cthu1hoo@users.noreply.github.com>| +|4|dattaz | +|4|dpfaffenbauer | +|4|dyu | +|4|hebbet | +|4|paddo | +|3|Aguay | +|3|Akhyar Amarullah | +|3|Alexey Velikiy | +|3|BernsteinA <4685390+BernsteinA@users.noreply.github.com>| +|3|Brandon Jones | +|3|Burak Emre Kabakcı | +|3|Conor O'Callaghan | +|3|Cédric Krier | +|3|Daniel Mason | +|3|Danja Vasiliev | +|3|Erik | +|3|Ethan Lowman | +|3|FoxMaSk | +|3|Francisco Gálvez | +|3|François-Xavier Lyonnet du Moutier | +|3|Gabin | +|3|Garrett Martin | +|3|George C. Privon | +|3|Görkem Çetin | +|3|Harvey Kandola | +|3|Ilya Pirozhenko | +|3|IrosTheBeggar | +|3|James Cole | +|3|Jiří Komárek | +|3|Kevin Hinterlong | +|3|Lee Watson | +|3|Leo Gaggl | +|3|Marc Picaud | +|3|MarceauKa | +|3|Mariusz Kozakowski <11mariom+wordpress@gmail.com>| +|3|Martin Gontovnikas | +|3|Mathieu Leplatre | +|3|Matt Baer | +|3|Mitchell Urgero | +|3|Morris Jobke | +|3|Nick Fox | +|3|No GUI | +|3|Ovidiu Dan | +|3|Pavan Yara | +|3|Peter Thaleikis | +|3|Pierre Blanes | +|3|Pierre Tinard | +|3|Prashant Singh | +|3|PrplHaz4 | +|3|Roland Whitehead <4478022+qururoland@users.noreply.github.com>| +|3|Ryan DeShone | +|3|Sergio Brighenti | +|3|Sung Won Cho | +|3|Tobi Schäfer | +|3|Yann Forget | +|3|Ye Lin Aung | +|3|Yuchen Ying | +|3|ddffnn | +|3|icterine | +|3|jungle-boogie | +|3|moba | +|3|oknozor | +|3|pszlazak | +|3|rett gerst | +|3|sapioit | +|3|slauzon | +|3|xBytez | +|2|0xflotus <0xflotus@gmail.com>| +|2|132ikl <132@ikl.sh>| +|2|A. Cynic | +|2|Aditya Nagla | +|2|Adminrezo (Nico Dewaele) | +|2|Albert Cervera i Areny | +|2|Alex Bogdanovski | +|2|Alexander Ryzhov | +|2|Alexis Metaireau | +|2|Amos | +|2|Andrei Poenaru | +|2|Andrew Hayworth | +|2|Andrew Rabert | +|2|Arik Fraimovich | +|2|Ave | +|2|Bartłomiej Kurzeja | +|2|Ben Yanke | +|2|Benjamin Gamard | +|2|Braintelligence | +|2|Brendan Abolivier | +|2|Brian Morin | +|2|Carlo F. Quaglia | +|2|Charles Farence III | +|2|Chris Missal | +|2|Christopher Charbonneau Wells | +|2|Cleberson Ramirio | +|2|Costin Moise | +|2|Daniel Heath | +|2|Daniel Ramirez Grave de Peralta | +|2|David Leonard | +|2|David Wayne Baxter | +|2|Derek Viera | +|2|Deryck | +|2|Dhruv Sharma | +|2|Dillon Stadther | +|2|Dominic Pratt | +|2|Dr. Ridgewell | +|2|Eliot Berriot | +|2|Fabian Schliski | +|2|Feleg | +|2|Felix Bartels | +|2|Gabin Aureche | +|2|Gabriel Cossette | +|2|Gerardo Baez | +|2|Gleb Mazovetskiy | +|2|Gonçalo Valério | +|2|Greg Slepak | +|2|Greg V | +|2|Haukur Rosinkranz | +|2|Henry Ruhs | +|2|Hilmi Tolga Sahin | +|2|Ivan Krutov | +|2|Jake Breindel | +|2|Jake Jarvis | +|2|Jan | +|2|Jan Soendermann | +|2|Jared Shields | +|2|Jipok | +|2|Jonas L | +|2|Jordon Replogle | +|2|Joseph Dykstra | +|2|Julien Bisconti | +|2|Jérémie Astori | +|2|Keith Thibodeaux | +|2|Kevin Vandenborne | +|2|Klaus-Uwe Mitterer | +|2|Kukielka | +|2|Lanre Adelowo | +|2|Liam Demafelix | +|2|Madhu GB | +|2|Malte Kiefer | +|2|Manuel Uberti | +|2|Marc Laporte | +|2|Marcel Brückner | +|2|Marien Fressinaud | +|2|Marius Lindvall | +|2|Markus M. Deuerlein | +|2|MarkusMcNugen | +|2|Martijn | +|2|Massimo Santini | +|2|Mats Estensen | +|2|Matt Hazinski | +|2|Matthieu Aubry | +|2|Melvin Loos | +|2|Michael Tunnell | +|2|Mikael Peigney | +|2|Murali Govardhana | +|2|Nehal Hasnayeen | +|2|Nicolas Carlier | +|2|Oliver Giles | +|2|Patrik Ragnarsson | +|2|Pavel Korotkiy | +|2|Pavel Lobashov | +|2|Pernat1y | +|2|Peter Demin | +|2|Peter Ivanov | +|2|Phil | +|2|Phonic Mouse | +|2|Pierre Buyle | +|2|Pierre Ozoux | +|2|Poorchop | +|2|Prabhanjan | +|2|Raymond Berger | +|2|ReadmeCritic | +|2|Ricardo Torres | +|2|Rid | +|2|Rodolfo Berrios | +|2|Roland Geider | +|2|Ryan Mulligan | +|2|Sam Tuke | +|2|Sameer Al-Sakran | +|2|Sandeep S | +|2|Sandro | +|2|Scot Hacker | +|2|Shane Cooke | +|2|Simon Vieille | +|2|Simone Grignola | +|2|Sjoerd van der Hoorn | +|2|Spark <24642451+Sparkenstein@users.noreply.github.com>| +|2|Stefan Bohacek | +|2|Stefane Fermigier | +|2|Stefano | +|2|Suraj Patil | +|2|Think | +|2|Thomas Citharel | +|2|Tomer | +|2|Tomer Cohen | +|2|Tony Xu | +|2|Vadim Rutkovsky | +|2|Valentino Pesce | +|2|Van-Duyet Le | +|2|Vladimir Avgustov | +|2|Will Bennett | +|2|William Notowidagdo | +|2|Yann | +|2|Zeniic | +|2|agetic | +|2|charsi | +|2|cornerot | +|2|cron410 | +|2|digiou | +|2|emeric | +|2|erdihu | +|2|fengshaun | +|2|fuerbringer | +|2|gseva | +|2|jciskey | +|2|jganobsik <39414138+jganobsik@users.noreply.github.com>| +|2|jimykk | +|2|jtagcat <38327267+jtagcat@users.noreply.github.com>| +|2|markkrj | +|2|maximesrd | +|2|rafael-santiago | +|2|thomasfrivold | +|2|tillarnold | +|2|tomc3 | +|2|xy2z | +|2|yuche | +|2|ziλa sarikaya | +|2|znegva | +|2|Žygimantas Medelis | +|2|王可森 | +|1|4oo4 <4oo4@users.noreply.github.com>| +|1|Aaron <44198148+whalehub@users.noreply.github.com>| +|1|Adam C <39806482+adam-redcort@users.noreply.github.com>| +|1|Adam Johnson | +|1|Adrian Kumpf | +|1|Akos Veres | +|1|Alashov Berkeli | +|1|Alberto Bertogli | +|1|Alejandro Rodríguez | +|1|Alex Fornuto | +|1|Alex Yumashev <33555768+alex-jitbit@users.noreply.github.com>| +|1|Alexandr Nesterenko | +|1|Alexandre Abita | +|1|Alexey Strokach | +|1|Alfred Bez | +|1|Algram | +|1|Alys | +|1|Anders Pitman | +|1|Andre | +|1|Andrew Murray | +|1|Andrew Nesbitt | +|1|Andrew Prokhorenkov | +|1|Andrey | +|1|Andrey Kuznetsov | +|1|André Rodier | +|1|Andy Olsen | +|1|Andyyyyy94 | +|1|Angel Velasquez | +|1|Antoine | +|1|Antoine Gersant | +|1|Anton Troyanov | +|1|Arkady Asuratov | +|1|Armando Lüscher | +|1|Arnold Schrijver | +|1|ArthurHoaro | +|1|Austin | +|1|BN | +|1|Bas | +|1|Bastien Wirtz | +|1|Beard of War | +|1|Ben | +|1|Ben Abbott | +|1|Benj Fassbind | +|1|Benjamin Lange | +|1|Bernd Bestel | +|1|Bharat Kalluri | +|1|Blake Bourque | +|1|Bob "Wombat" Hogg | +|1|Bob Mottram | +|1|Brett | +|1|Brian | +|1|Burung Hantu | +|1|Buster "Silver Eagle" Neece | +|1|C.J. Jameson | +|1|Caleb Xu | +|1|Calle Wolff | +|1|Carlos Rodriguez | +|1|Chanchal Kumar Ghosh | +|1|Chandan Rai | +|1|Charles Barnes | +|1|Charles Barnes | +|1|Charlotte Tan | +|1|Chema | +|1|Chris Legault | +|1|Christoph (Sheogorath) Kern | +|1|Christoph Kappestein | +|1|Christoph Wiechert | +|1|Christophe Hamerling | +|1|Clément AUBIN | +|1|Colin <16247799+cpdevelops@users.noreply.github.com>| +|1|Colin Shea | +|1|Craig Davison | +|1|Cristian Menghi | +|1|CyrilPepito <18053589+CyrilPepito@users.noreply.github.com>| +|1|Cédric | +|1|Damir Gainetdinov | +|1|Dan | +|1|Danny | +|1|Danny van Kooten | +|1|David | +|1|David Baldwynn | +|1|David Ng | +|1|David Stephens | +|1|David Yu | +|1|Denis | +|1|Denis | +|1|Diego Molina | +|1|Dimitri Steinel | +|1|Dirk Krause | +|1|Dmitriy Volkov | +|1|Dmitry Khomutov | +|1|Doğan Çelik | +|1|Dražen Lučanin | +|1|Ed Tewiah | +|1|Edoardo Putti | +|1|Edreih Aldana | +|1|Eike Kettner | +|1|Emeric POUPON | +|1|Emlembow <36314674+Emlembow@users.noreply.github.com>| +|1|Eran Chetz | +|1|Eren Hatırnaz | +|1|Eric Moon | +|1|Eric Nemchik | +|1|Eric Park | +|1|Error1000 <50962908+Error1000@users.noreply.github.com>| +|1|Ethan Hampton | +|1|Ethan Madden | +|1|Eugen | +|1|Evelthon Prodromou | +|1|Evgeny Petrov | +|1|Fabian Patzke | +|1|Fazal Majid | +|1|Florian | +|1|Florian Kaiser | +|1|Florian Kaldowski | +|1|Florian Wilhelm | +|1|FortressBuilder | +|1|François Jacquet | +|1|FreeScout <40499291+freescout-helpdesk@users.noreply.github.com>| +|1|Galen Abell | +|1|Gio | +|1|Girish Ramakrishnan | +|1|Greg Chetcuti | +|1|Guilherme Oenning | +|1|Henrique Holanda | +|1|Herman Zvonimir Došilović | +|1|IAlwaysBeCoding | +|1|Icantcodeatall | +|1|Igor Antun | +|1|Igor Petrov | +|1|Imron RA <42175898+imronra@users.noreply.github.com>| +|1|Isaac | +|1|Izac Lorimer | +|1|Jack | +|1|Jackson Delahunt | +|1|Jakob Gillich | +|1|James Mills | +|1|Jan | +|1|Jannik Anker | +|1|Janos Dobronszki | +|1|Jarek Lipski | +|1|Jay Williams | +|1|Jay Yu <265551+GitHubGeek@users.noreply.github.com>| +|1|Jay Yu | +|1|Jean Menezes da Rocha | +|1|Jelmer Vernooij | +|1|Jeremiah Marks | +|1|Joel Calado | +|1|Jon Schoning | +|1|Jonas | +|1|Jonas Hellmann | +|1|Jordan <15741144+jrdnlc@users.noreply.github.com>| +|1|Jordan Doyle | +|1|Jordan Doyle | +|1|Josh Harmon | +|1|Joshua Hamilton | +|1|José Castro | +|1|Julien | +|1|Julien Bisconti | +|1|Julien Reichardt | +|1|Justin Clift | +|1|Justin O'Reilly | +|1|Kacper | +|1|Karl Gumerlock | +|1|KarloLuiten | +|1|Kaveet Laxmidas | +|1|Kelvin | +|1|Ketrel | +|1|Kevin Lin | +|1|Keyhaku | +|1|Kieran | +|1|Kim Jahn | +|1|Koichi MATSUMOTO | +|1|Konstantin Sorokin | +|1|Kyle Farwell | +|1|Kyle Stetz | +|1|L1Cafe | +|1|LB (Ben Johnston) | +|1|Leonard Thomas Wall | +|1|Lescaudron Mathieu | +|1|Liran Tal | +|1|Lorenz Hübschle-Schneider | +|1|Louis Grenard | +|1|Lukas Masuch | +|1|Luuk Nieuwdorp | +|1|Marcin Karpezo | +|1|Marco Dickert | +|1|Marco Kamner | +|1|Marcus Ramberg | +|1|Mark Ide | +|1|Mark Ide | +|1|Mark Railton | +|1|Markus Dieckmann | +|1|Martin Malinda | +|1|Martin Tournoij | +|1|Marvin | +|1|Marvin Gülker | +|1|MatFluor | +|1|Matt Lee | +|1|Matteo Piccina | +|1|Matthew Dews | +|1|Matthew East | +|1|Matthias De Bie | +|1|Max <2843450+b-m-f@users.noreply.github.com>| +|1|Michael Barrow | +|1|Michael Burns | +|1|Michael Malura | +|1|Michael van Tricht | +|1|Michael van Tricht | +|1|Mike Goodwin | +|1|Mike Steele | +|1|Minghe | +|1|MinorTom | +|1|Mitchell R | +|1|Moritz Kröger | +|1|Murali K G | +|1|Murdoc Bates | +|1|Nick Sweeting | +|1|NicolasCARPi | +|1|Norman Xu | +|1|Nÿco | +|1|Ober7 | +|1|Oleg Agafonov | +|1|Oliver Kopp | +|1|Opeyemi Obembe | +|1|PMK | +|1|Paolo Pustorino | +|1|Pau Kiat Wee | +|1|Paul | +|1|Paul Libbrecht | +|1|Paul Libbrecht | +|1|Pavlo Vodopyan | +|1|Paweł Jakimowski | +|1|Paweł Kapała | +|1|Peter Brunner | +|1|Peter Tonoli | +|1|Peter van den Hurk | +|1|Philipp Kutyla | +|1|Phill | +|1|Phonic Mouse | +|1|Pierre <21216829+pedrom34@users.noreply.github.com>| +|1|Pierre Dubouilh | +|1|Pietro Pe46dro Marangon | +|1|Pouria Ezzati | +|1|Prahalad Belavadi | +|1|Rafael Milewski | +|1|Raphael Fetzer | +|1|Remi Rampin | +|1|Remy Adriaanse | +|1|Remy Honig | +|1|Richard Thornton | +|1|Riddler | +|1|Robert Charusta | +|1|Roberto Rosario | +|1|Rouven Bauer | +|1|RussellAult | +|1|Ryan Halliday | +|1|Ryan Noelk | +|1|Rzeszow <6783135+Rzeszow@users.noreply.github.com>| +|1|Sahin Boydas | +|1|Salvatore Gentile | +|1|Sam Patterson | +|1|Sam Wilson | +|1|Samuel Garneau | +|1|Sartaj | +|1|Scott Humphries | +|1|Scott Miller | +|1|Senan Kelly | +|1|Sergey Bronnikov | +|1|Sergey Ponomarev | +|1|Sheldon Rupp | +|1|Simon Alberny | +|1|Simon Hanna | +|1|Sourabh Joshi <38150665+sourabh-joshi@users.noreply.github.com>| +|1|Spencer McIntyre | +|1|Spencer Muise | +|1|Starbeamrainbowlabs | +|1|Stefan Weil | +|1|Steve Divskinsy | +|1|Sylvain Boily | +|1|THS-on | +|1|Tanner Collin | +|1|The Scorpion | +|1|Thomas Ferney | +|1|Thomas Hansen | +|1|Thomas Rohlik | +|1|Thorsten Rinne | +|1|Tim Allingham | +|1|Timur Bublik | +|1|Tobias Diekershoff | +|1|Tobias Kunze | +|1|Tobias Reich | +|1|Tobias Zeising | +|1|Todd Hoffmann | +|1|Tom Hacohen | +|1|Tomer Shvueli | +|1|Tommy Ku | +|1|Trevor Ford | +|1|Vadim Markovtsev | +|1|Vidas P | +|1|Viktor Geringer | +|1|Vincent Dauce | +|1|Webmasterish | +|1|William Gathoye | +|1|Yurii Rashkovskii | +|1|axeloz | +|1|benmaynard11 | +|1|bitcoinshirt <36959754+bitcoinshirt@users.noreply.github.com>| +|1|bricej13 | +|1|c22 | +|1|cbdev | +|1|costpermille | +|1|cpdev | +|1|dimqua | +|1|disk0x | +|1|domainzero | +|1|dsx | +|1|ePirat | +|1|emmanouil | +|1|evitalis | +|1|fghhfg | +|1|fi78 <31729946+fi78@users.noreply.github.com>| +|1|florianl | +|1|foorb | +|1|ghaseminya | +|1|golangci <35628013+golangci@users.noreply.github.com>| +|1|ice-92 | +|1|ilsi | +|1|itsnotv | +|1|jake | +|1|jarek91 | +|1|jgi | +|1|josh | +|1|lachlan-00 | +|1|lardbit <45122868+lardbit@users.noreply.github.com>| +|1|littleguga | +|1|lsascha | +|1|macmusz | +|1|memorex258 | +|1|mertinop | +|1|mrkpl125 <33229813+mrkpl125@users.noreply.github.com>| +|1|mxroute <37432698+mxroute@users.noreply.github.com>| +|1|n2i | +|1|nodomain | +|1|norstbox | +|1|pastapojken | +|1|phobot | +|1|pips | +|1|pnhofmann | +|1|poVoq | +|1|railscard | +|1|sc0repi0 | +|1|skarphet | +|1|sqozz | +|1|steven jacobs | +|1|stevesbrain | +|1|t1st3 | +|1|teaberryy | +|1|timbe16 | +|1|trebonius0 | +|1|ttoups | +|1|uchchishta | +|1|vincent-clipet | +|1|vinz243 | +|1|wxcafé | +|1|xuansamdinh | +|1|zotlabs | +|1|Руслан Корнев | \ No newline at end of file diff --git a/docs/Info/CONTRIBUTING.md b/docs/Info/CONTRIBUTING.md new file mode 100644 index 00000000..377867b0 --- /dev/null +++ b/docs/Info/CONTRIBUTING.md @@ -0,0 +1,16 @@ +# Contributing + +Please open a new issue to clarify any questions, or post in the [General discussion issue](https://github.com/awesome-selfhosted/awesome-selfhosted/issues/89). + +All guidelines for adding new software to the list are listed in [PULL_REQUEST_TEMPLATE.md](PULL_REQUEST_TEMPLATE.md). + +Other recommendations: + +- To add a new entry, [edit the README.md file](https://github.com/awesome-selfhosted/awesome-selfhosted/edit/master/README.md) through Github's web interface or a text editor, and send a Pull Request. +- See [Editing files in another user's repository](https://help.github.com/articles/editing-files-in-another-user-s-repository/), [Creating Pull Requests](https://help.github.com/articles/creating-a-pull-request/), [Using Pull Requests](https://help.github.com/articles/using-pull-requests/) for help on sending your patch. +- A script to help you format new entries is available at (it requires `make` to be installed): `git clone`/[download](https://github.com/awesome-selfhosted/awesome-selfhosted/archive/master.zip) and enter the repository, run `make add` and follow the instructions. +- A website to help you format new entries is available at https://n8225.github.io/ +- The list of contributors can be updated with `make contrib`. +- Software with no development activity for 6-12 months may be removed from the list. +- Don't know where to start? Check issues labeled [`help wanted`](https://github.com/awesome-selfhosted/awesome-selfhosted/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) and [`fix`](https://github.com/awesome-selfhosted/awesome-selfhosted/issues?q=is%3Aissue+is%3Aopen+label%3Afix). + diff --git a/docs/Info/LICENSE.md b/docs/Info/LICENSE.md new file mode 100644 index 00000000..a0398377 --- /dev/null +++ b/docs/Info/LICENSE.md @@ -0,0 +1,377 @@ +# License +`CC-BY-SA-3.0 + Creative Commons Attribution-ShareAlike 3.0 Unported + . + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION + ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE + INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + ITS USE. + . + License + . + THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE + COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY + COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS + AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + . + BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE + TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY + BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS + CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND + CONDITIONS. + . + 1. Definitions + . + a. "Adaptation" means a work based upon the Work, or upon the Work and + other pre-existing works, such as a translation, adaptation, derivative + work, arrangement of music or other alterations of a literary or + artistic work, or phonogram or performance and includes cinematographic + adaptations or any other form in which the Work may be recast, + transformed, or adapted including in any form recognizably derived from + the original, except that a work that constitutes a Collection will not + be considered an Adaptation for the purpose of this License. For the + avoidance of doubt, where the Work is a musical work, performance or + phonogram, the synchronization of the Work in timed-relation with a + moving image ("synching") will be considered an Adaptation for the + purpose of this License. + . + b. "Collection" means a collection of literary or artistic works, such + as encyclopedias and anthologies, or performances, phonograms or + broadcasts, or other works or subject matter other than works listed in + Section 1(f) below, which, by reason of the selection and arrangement of + their contents, constitute intellectual creations, in which the Work is + included in its entirety in unmodified form along with one or more other + contributions, each constituting separate and independent works in + themselves, which together are assembled into a collective whole. A work + that constitutes a Collection will not be considered an Adaptation (as + defined below) for the purposes of this License. + . + c. "Creative Commons Compatible License" means a license that is listed + at http://creativecommons.org/compatiblelicenses that has been approved + by Creative Commons as being essentially equivalent to this License, + including, at a minimum, because that license: (i) contains terms that + have the same purpose, meaning and effect as the License Elements of + this License; and, (ii) explicitly permits the relicensing of + adaptations of works made available under that license under this + License or a Creative Commons jurisdiction license with the same License + Elements as this License. + . + d. "Distribute" means to make available to the public the original and + copies of the Work or Adaptation, as appropriate, through sale or other + transfer of ownership. + . + e. "License Elements" means the following high-level license attributes + as selected by Licensor and indicated in the title of this License: + Attribution, ShareAlike. + . + f. "Licensor" means the individual, individuals, entity or entities that + offer(s) the Work under the terms of this License. + . + g. "Original Author" means, in the case of a literary or artistic work, + the individual, individuals, entity or entities who created the Work or + if no individual or entity can be identified, the publisher; and in + addition (i) in the case of a performance the actors, singers, + musicians, dancers, and other persons who act, sing, deliver, declaim, + play in, interpret or otherwise perform literary or artistic works or + expressions of folklore; (ii) in the case of a phonogram the producer + being the person or legal entity who first fixes the sounds of a + performance or other sounds; and, (iii) in the case of broadcasts, the + organization that transmits the broadcast. + . + h. "Work" means the literary and/or artistic work offered under the + terms of this License including without limitation any production in the + literary, scientific and artistic domain, whatever may be the mode or + form of its expression including digital form, such as a book, pamphlet + and other writing; a lecture, address, sermon or other work of the same + nature; a dramatic or dramatico-musical work; a choreographic work or + entertainment in dumb show; a musical composition with or without words; + a cinematographic work to which are assimilated works expressed by a + process analogous to cinematography; a work of drawing, painting, + architecture, sculpture, engraving or lithography; a photographic work + to which are assimilated works expressed by a process analogous to + photography; a work of applied art; an illustration, map, plan, sketch + or three-dimensional work relative to geography, topography, + architecture or science; a performance; a broadcast; a phonogram; a + compilation of data to the extent it is protected as a copyrightable + work; or a work performed by a variety or circus performer to the extent + it is not otherwise considered a literary or artistic work. + . + i. "You" means an individual or entity exercising rights under this + License who has not previously violated the terms of this License with + respect to the Work, or who has received express permission from the + Licensor to exercise rights under this License despite a previous + violation. + . + j. "Publicly Perform" means to perform public recitations of the Work + and to communicate to the public those public recitations, by any means + or process, including by wire or wireless means or public digital + performances; to make available to the public Works in such a way that + members of the public may access these Works from a place and at a place + individually chosen by them; to perform the Work to the public by any + means or process and the communication to the public of the performances + of the Work, including by public digital performance; to broadcast and + rebroadcast the Work by any means including signs, sounds or images. + . + k. "Reproduce" means to make copies of the Work by any means including + without limitation by sound or visual recordings and the right of + fixation and reproducing fixations of the Work, including storage of a + protected performance or phonogram in digital form or other electronic + medium. + . + 2. Fair Dealing Rights. Nothing in this License is intended to reduce, + limit, or restrict any uses free from copyright or rights arising from + limitations or exceptions that are provided for in connection with the + copyright protection under copyright law or other applicable laws. + . + 3. License Grant. Subject to the terms and conditions of this License, + Licensor hereby grants You a worldwide, royalty-free, non-exclusive, + perpetual (for the duration of the applicable copyright) license to + exercise the rights in the Work as stated below: + . + a. to Reproduce the Work, to incorporate the Work into one or more + Collections, and to Reproduce the Work as incorporated in the + Collections; + . + b. to create and Reproduce Adaptations provided that any such + Adaptation, including any translation in any medium, takes reasonable + steps to clearly label, demarcate or otherwise identify that changes + were made to the original Work. For example, a translation could be + marked "The original work was translated from English to Spanish," or a + modification could indicate "The original work has been modified."; + . + c. to Distribute and Publicly Perform the Work including as incorporated + in Collections; and, + . + d. to Distribute and Publicly Perform Adaptations. + . + e. For the avoidance of doubt: + . + i. Non-waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or compulsory + licensing scheme cannot be waived, the Licensor reserves the exclusive + right to collect such royalties for any exercise by You of the rights + granted under this License; + . + ii. Waivable Compulsory License Schemes. In those jurisdictions in which + the right to collect royalties through any statutory or compulsory + licensing scheme can be waived, the Licensor waives the exclusive right + to collect such royalties for any exercise by You of the rights granted + under this License; and, + . + iii. Voluntary License Schemes. The Licensor waives the right to collect + royalties, whether individually or, in the event that the Licensor is a + member of a collecting society that administers voluntary licensing + schemes, via that society, from any exercise by You of the rights + granted under this License. + . + The above rights may be exercised in all media and formats whether now + known or hereafter devised. The above rights include the right to make + such modifications as are technically necessary to exercise the rights + in other media and formats. Subject to Section 8(f), all rights not + expressly granted by Licensor are hereby reserved. + . + 4. Restrictions. The license granted in Section 3 above is expressly + made subject to and limited by the following restrictions: + . + a. You may Distribute or Publicly Perform the Work only under the terms + of this License. You must include a copy of, or the Uniform Resource + Identifier (URI) for, this License with every copy of the Work You + Distribute or Publicly Perform. You may not offer or impose any terms on + the Work that restrict the terms of this License or the ability of the + recipient of the Work to exercise the rights granted to that recipient + under the terms of the License. You may not sublicense the Work. You + must keep intact all notices that refer to this License and to the + disclaimer of warranties with every copy of the Work You Distribute or + Publicly Perform. When You Distribute or Publicly Perform the Work, You + may not impose any effective technological measures on the Work that + restrict the ability of a recipient of the Work from You to exercise the + rights granted to that recipient under the terms of the License. This + Section 4(a) applies to the Work as incorporated in a Collection, but + this does not require the Collection apart from the Work itself to be + made subject to the terms of this License. If You create a Collection, + upon notice from any Licensor You must, to the extent practicable, + remove from the Collection any credit as required by Section 4(c), as + requested. If You create an Adaptation, upon notice from any Licensor + You must, to the extent practicable, remove from the Adaptation any + credit as required by Section 4(c), as requested. + . + b. You may Distribute or Publicly Perform an Adaptation only under the + terms of: (i) this License; (ii) a later version of this License with + the same License Elements as this License; (iii) a Creative Commons + jurisdiction license (either this or a later license version) that + contains the same License Elements as this License (e.g., + Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons Compatible + License. If you license the Adaptation under one of the licenses + mentioned in (iv), you must comply with the terms of that license. If + you license the Adaptation under the terms of any of the licenses + mentioned in (i), (ii) or (iii) (the "Applicable License"), you must + comply with the terms of the Applicable License generally and the + following provisions: (I) You must include a copy of, or the URI for, + the Applicable License with every copy of each Adaptation You Distribute + or Publicly Perform; (II) You may not offer or impose any terms on the + Adaptation that restrict the terms of the Applicable License or the + ability of the recipient of the Adaptation to exercise the rights + granted to that recipient under the terms of the Applicable License; + (III) You must keep intact all notices that refer to the Applicable + License and to the disclaimer of warranties with every copy of the Work + as included in the Adaptation You Distribute or Publicly Perform; (IV) + when You Distribute or Publicly Perform the Adaptation, You may not + impose any effective technological measures on the Adaptation that + restrict the ability of a recipient of the Adaptation from You to + exercise the rights granted to that recipient under the terms of the + Applicable License. This Section 4(b) applies to the Adaptation as + incorporated in a Collection, but this does not require the Collection + apart from the Adaptation itself to be made subject to the terms of the + Applicable License. + . + c. If You Distribute, or Publicly Perform the Work or any Adaptations or + Collections, You must, unless a request has been made pursuant to + Section 4(a), keep intact all copyright notices for the Work and + provide, reasonable to the medium or means You are utilizing: (i) the + name of the Original Author (or pseudonym, if applicable) if supplied, + and/or if the Original Author and/or Licensor designate another party or + parties (e.g., a sponsor institute, publishing entity, journal) for + attribution ("Attribution Parties") in Licensor's copyright notice, + terms of service or by other reasonable means, the name of such party or + parties; (ii) the title of the Work if supplied; (iii) to the extent + reasonably practicable, the URI, if any, that Licensor specifies to be + associated with the Work, unless such URI does not refer to the + copyright notice or licensing information for the Work; and (iv) , + consistent with Ssection 3(b), in the case of an Adaptation, a credit + identifying the use of the Work in the Adaptation (e.g., "French + translation of the Work by Original Author," or "Screenplay based on + original Work by Original Author"). The credit required by this Section + 4(c) may be implemented in any reasonable manner; provided, however, + that in the case of a Adaptation or Collection, at a minimum such credit + will appear, if a credit for all contributing authors of the Adaptation + or Collection appears, then as part of these credits and in a manner at + least as prominent as the credits for the other contributing authors. + For the avoidance of doubt, You may only use the credit required by this + Section for the purpose of attribution in the manner set out above and, + by exercising Your rights under this License, You may not implicitly or + explicitly assert or imply any connection with, sponsorship or + endorsement by the Original Author, Licensor and/or Attribution Parties, + as appropriate, of You or Your use of the Work, without the separate, + express prior written permission of the Original Author, Licensor and/or + Attribution Parties. + . + d. Except as otherwise agreed in writing by the Licensor or as may be + otherwise permitted by applicable law, if You Reproduce, Distribute or + Publicly Perform the Work either by itself or as part of any Adaptations + or Collections, You must not distort, mutilate, modify or take other + derogatory action in relation to the Work which would be prejudicial to + the Original Author's honor or reputation. Licensor agrees that in those + jurisdictions (e.g. Japan), in which any exercise of the right granted + in Section 3(b) of this License (the right to make Adaptations) would be + deemed to be a distortion, mutilation, modification or other derogatory + action prejudicial to the Original Author's honor and reputation, the + Licensor will waive or not assert, as appropriate, this Section, to the + fullest extent permitted by the applicable national law, to enable You + to reasonably exercise Your right under Section 3(b) of this License + (right to make Adaptations) but not otherwise. + . + 5. Representations, Warranties and Disclaimer + . + UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR + OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY + KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, + INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, + FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF + LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, + WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE + EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + . + 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE + LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR + ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES + ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS + BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + . + 7. Termination + . + a. This License and the rights granted hereunder will terminate + automatically upon any breach by You of the terms of this License. + Individuals or entities who have received Adaptations or Collections + from You under this License, however, will not have their licenses + terminated provided such individuals or entities remain in full + compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will + survive any termination of this License. + . + b. Subject to the above terms and conditions, the license granted here + is perpetual (for the duration of the applicable copyright in the Work). + Notwithstanding the above, Licensor reserves the right to release the + Work under different license terms or to stop distributing the Work at + any time; provided, however that any such election will not serve to + withdraw this License (or any other license that has been, or is + required to be, granted under the terms of this License), and this + License will continue in full force and effect unless terminated as + stated above. + . + 8. Miscellaneous + . + a. Each time You Distribute or Publicly Perform the Work or a + Collection, the Licensor offers to the recipient a license to the Work + on the same terms and conditions as the license granted to You under + this License. + . + b. Each time You Distribute or Publicly Perform an Adaptation, Licensor + offers to the recipient a license to the original Work on the same terms + and conditions as the license granted to You under this License. + . + c. If any provision of this License is invalid or unenforceable under + applicable law, it shall not affect the validity or enforceability of + the remainder of the terms of this License, and without further action + by the parties to this agreement, such provision shall be reformed to + the minimum extent necessary to make such provision valid and + enforceable. + . + d. No term or provision of this License shall be deemed waived and no + breach consented to unless such waiver or consent shall be in writing + and signed by the party to be charged with such waiver or consent. + . + e. This License constitutes the entire agreement between the parties + with respect to the Work licensed here. There are no understandings, + agreements or representations with respect to the Work not specified + here. Licensor shall not be bound by any additional provisions that may + appear in any communication from You. This License may not be modified + without the mutual written agreement of the Licensor and You. + . + f. The rights granted under, and the subject matter referenced, in this + License were drafted utilizing the terminology of the Berne Convention + for the Protection of Literary and Artistic Works (as amended on + September 28, 1979), the Rome Convention of 1961, the WIPO Copyright + Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and + the Universal Copyright Convention (as revised on July 24, 1971). These + rights and subject matter take effect in the relevant jurisdiction in + which the License terms are sought to be enforced according to the + corresponding provisions of the implementation of those treaty + provisions in the applicable national law. If the standard suite of + rights granted under applicable copyright law includes additional rights + not granted under this License, such additional rights are deemed to be + included in the License; this License is not intended to restrict the + license of any rights under applicable law. + . + Creative Commons Notice + . + Creative Commons is not a party to this License, and makes no warranty + whatsoever in connection with the Work. Creative Commons will not be + liable to You or any party on any legal theory for any damages + whatsoever, including without limitation any general, special, + incidental or consequential damages arising in connection to this + license. Notwithstanding the foregoing two (2) sentences, if Creative + Commons has expressly identified itself as the Licensor hereunder, it + shall have all rights and obligations of Licensor. + . + Except for the limited purpose of indicating to the public that the Work + is licensed under the CCPL, Creative Commons does not authorize the use + by either party of the trademark "Creative Commons" or any related + trademark or logo of Creative Commons without the prior written consent + of Creative Commons. Any permitted use will be in compliance with + Creative Commons' then-current trademark usage guidelines, as may be + published on its website or otherwise made available upon request from + time to time. For the avoidance of doubt, this trademark restriction + does not form part of the License. + . + Creative Commons may be contacted at http://creativecommons.org/.` diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 00000000..5b95e08d --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,52 @@ +#!/usr/bin/make -f +SHELL = /bin/bash +AWESOME_BOT_OPTIONS = --allow-redirect --skip-save-results --allow 202 --white-list airsonic.github.io/docs/apps + +all: check_all + +# run all checks +check_all: check_syntax_full awesome_bot check_github_commit_dates + +# check pull requests +check_pr: check_syntax_diff + +# check syntax in whole file +check_syntax_full: + node tests/test.js -r README.md + +# check syntax in the diff from master to current branch +check_syntax_diff: + git diff origin/master -U0 README.md | grep --perl-regexp --only-matching "(?<=^\+).*" >> temp.md && \ + node tests/test.js -r README.md -d temp.md && \ + awesome_bot -f temp.md $(AWESOME_BOT_OPTIONS) + +# check dead links +# https://github.com/dkhamsing/awesome_bot +awesome_bot: + awesome_bot -f README.md $(AWESOME_BOT_OPTIONS) + +# check date of last commit for github.com repository URLs +check_github_commit_dates: + pip3 install PyGithub + python3 tests/check-github-commit-dates.py + +################################# + +# update the AUTHORS.md file +contrib: + @mv .github/.mailmap . && printf "|Commits | Author |\n| :---: | --- |\n" > AUTHORS.md && git shortlog -sne | sed -r 's/^\s*([[:digit:]]*?)\s*?(.*?)/|\1|\2|/' >> AUTHORS.md && mv .mailmap .github/.mailmap + +# add a new entry +add: + @read -r -p "Software name: " Name && [[ ! -z "$$Name" ]] && \ + read -r -p "Homepage/URL: " Url && [[ ! -z "$$Url" ]] && \ + read -r -p "Description (max 250 characters, ending with .): " Description && [[ ! -z "$$Description" ]] && \ + read -r -p "License: " License && [[ ! -z "$$License" ]] && \ + read -r -p "Main server-side language/platform/requirement: " Language && [[ ! -z "$$Language" ]] && \ + read -r -p "Demo URL (optional,leave empty): " Demo && \ + if [[ "$$Demo" == "" ]]; then CDemo=""; else CDemo="[Demo]($$Demo)"; fi; \ + read -r -p "Source code URL (if different from homepage): " Source && \ + if [[ "$$Source" == "" ]]; then CSource=""; else CSource="[Source Code]($$Source)"; fi; \ + if [[ "$$CSource" == "" && "$$Demo" == "" ]]; then Moreinfo=""; else Moreinfo="($$CDemo $$CSource)"; fi; \ + echo "Copy this entry to your clipboard, paste it in the appropriate category:" ;\ + echo "- [$$Name]($$Url) - $${Description} $${Moreinfo} \`$$License\` \`$$Language\`" diff --git a/docs/_coverpage.md b/docs/_coverpage.md new file mode 100644 index 00000000..9e6e0857 --- /dev/null +++ b/docs/_coverpage.md @@ -0,0 +1,16 @@ +![logo](https://i.imgur.com/JtLGn1s.png) + +# Awesome Selfhosted + +> This is a list of [Free](https://en.wikipedia.org/wiki/Free_software) Software [network services](https://en.wikipedia.org/wiki/Network_service) and [web applications](https://en.wikipedia.org/wiki/Web_application)

which can be +hosted locally. + + +- Non-Free software is listed on the [Non-Free](non-free.md) page. + +- Docs Page by Humzaa Omar + +[GitHub](https://github.com/awesome-selfhosted/awesome-selfhosted) +[Reddit](https://reddit.com/r/selfhosted) +[Non-Free](non-free.md) +[Free](#Awesome-Selfhosted) \ No newline at end of file diff --git a/docs/img/selfhosted.png b/docs/img/selfhosted.png new file mode 100644 index 0000000000000000000000000000000000000000..af7aa591ab7b72dc69b9817ebd2720895e4a381d GIT binary patch literal 7589 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 d + + + + Awesome Selfhosted + + + + + + + +
+ + + + diff --git a/docs/test.md b/docs/test.md new file mode 100644 index 00000000..78ab8ee7 --- /dev/null +++ b/docs/test.md @@ -0,0 +1 @@ +@import "https://raw.githubusercontent.com/awesome-selfhosted/awesome-selfhosted/master/non-free.md" \ No newline at end of file diff --git a/docs/tests/Dangerfile b/docs/tests/Dangerfile new file mode 100644 index 00000000..a0efc2f8 --- /dev/null +++ b/docs/tests/Dangerfile @@ -0,0 +1,39 @@ +# Danger CI configuration file +# https://danger.systems/guides/getting_started.html + +# Check for changes to README.md +has_readme_changes = git.modified_files.include?("README.md") + +# Ensure there is a summary for a pull request +fail 'Please provide a summary in the Pull Request description' if github.pr_body.length < 5 + +# Warn if PR guideline boxes are not checked. +warn 'Please check PR guidelines and check the boxes.' if github.pr_body.include? '- [ ]' + +# Warn if pull request is not updated +warn 'Please provide a descriptive title for the Pull Request' if github.pr_title.include? 'Update README.md' + +# Warn when there are merge commits in the diff +warn 'Please rebase to get rid of the merge commits in this Pull Request' if git.commits.any? { |c| c.message =~ /^Merge branch 'master'/ } + +# Check links +if has_readme_changes + require 'json' + results = File.read 'ab-results-temp.md-markdown-table.json' + j = JSON.parse results + if j['error']==true + warn j['title'] + markdown j['message'] + end +end + +# Check syntax +if has_readme_changes + require 'json' + syntaxresults = File.read 'syntaxcheck.json' + sj = JSON.parse syntaxresults + if sj['error']==true + fail sj['title'] + markdown sj['message'] + end +end diff --git a/docs/tests/check-github-commit-dates.py b/docs/tests/check-github-commit-dates.py new file mode 100644 index 00000000..ea9805c6 --- /dev/null +++ b/docs/tests/check-github-commit-dates.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 + +""" A script to find github repo links and last commit dates in a markdown file + +Requirements: + - python3 github module (sudo apt install python3-github on Debian) + - 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 + - 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 + - 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 + with updated_at + +""" + +from github import Github +import sys +import time +import re +import os + +__author__ = "nodiscc" +__copyright__ = "Copyright 2019, nodiscc" +__credits__ = ["https://github.com/awesome-selfhosted/awesome-selfhosted"] +__license__ = "MIT" +__version__ = "1.0" +__maintainer__ = "nodiscc" +__email__ = "nodiscc@gmail.com" +__status__ = "Production" + +############################################################################### + +access_token = os.environ['GITHUB_TOKEN'] + +""" find all URLs of the form https://github.com/owner/repo """ +with open('README.md', 'r') as readme: + data = readme.read() + project_urls = re.findall('https://github.com/[A-z]*/[A-z|0-9|\-|_|\.]+', data) + +urls = sorted(set(project_urls)) + +""" Uncomment this to debug the list of matched URLs """ +# print(str(urls)) +# exit(0) + +""" login to github API """ +g = Github(access_token) + +""" 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) diff --git a/docs/tests/test.js b/docs/tests/test.js new file mode 100644 index 00000000..fd82b79b --- /dev/null +++ b/docs/tests/test.js @@ -0,0 +1,251 @@ +// USAGE: +// node test.js -r README.md (Checks whole file) +// node test.js -r README.md -d temp.md (Checks just the diff) + +const fs = require('fs'); +const chalk = require('chalk'); +let licenses = new Set(); +let pr = false; +let readme; +let diff; + +//Parse the command options and set the pr var +function parseArgs(args) { + if ( args.indexOf('-r', 2) > 0 ) { + readme = fs.readFileSync(args[args.indexOf('-r', 2)+1], 'utf8') + } + if (args.indexOf('-d', 2) > 0) { + pr = true; + diff = fs.readFileSync(args[args.indexOf('-d', 2)+1], 'utf8'); + } + if ( pr === true) { + console.log(chalk.blue(`Running on PR. README.md: ${args[args.indexOf('-r', 2)+1]} diff: ${args[args.indexOf('-d', 2)+1]}`)) + } +} + +// Function to find lines with entries +function entryFilter(md) { + const linepatt = /^\s{0,2}-\s\[.*`/; + return linepatt.test(md); +} + +// Function to find lines with licenses +function licenseFilter(md) { + const linepatt = /^- `.*` - .*/; + return linepatt.test(md) +} + +// Function to split lines into array +function split(text) { + return text.split(/\r?\n/); +} + +// 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)\]\([^)\]]*\))*\))? \`.*?\` \`.*?\`$/; + if (patt.test(text) === true) { + return true; + } + return false; +} + +// Parses SPDX identifiers from list of licenses +function parseLicense(md) { + const patt = /^- `(.*)` - .*/ + return patt.exec(md)[1] +} + +//Test '- [Name](http://homepage/)' +function testMainLink(text) { + let testA = /(^ {0,2}- \[.*?\]\([^)]*\.[^)]*?\))(?=\ ?\-?\ ?\w)/ // /(^ {0,2}- \[.*?\]\(.*\))(?=.?-? ?\w)/; + 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.green(testA.exec(text)[1]) +} + +//Test '`⚠` - Short description, less than 250 characters.' +function testDescription(text) { + const testB = /( - .*\. )(?:(\(?\[?|\`))/; + const testA1 = /(- \W?\w*\W{0,2}.*?\)?)( .*$)/; + const testB2 = /((\(\[|\`).*$)/; + 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.green(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)\]\([^)\]]*\))*\))(?= \`?)/; + const testD1 = /(^- \W[a-zA-Z0-9-_ .]*\W{0,2}http[^\[]*)(?<= )/; + 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, '')) +} else if (testC > -1) { + return chalk.green(testD.exec(text)[1]) +} +return "" +} + +// Tests '`License` `Language`' +function testLangLic(text) { + const testD2 = /(\`.*\` \`.*\`$)/; + let testE = testD2.test(text); + const testE1 = /(^[^`]*)/; + if (!testE) { + let e1 = testE1.exec(text)[1]; + return chalk.red(text.replace(e1, '')) + } + return chalk.green(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` +} + +//Check if license is in the list of licenses. +function testLicense(md) { + let pass = true; + let lFailed = [] + let lPassed = [] + const regex = /.*\`(.*)\` .*$/; + try { + for (l of regex.exec(md)[1].split("/")) { + if (!licenses.has(l)) { + pass = false; + lPassed.push(l) + } + lFailed.push(l) + } + } + catch(err) { + console.log(chalk.yellow("Error in License syntax, license not checked against list.")) + return [false, "", ""] + } + + + + + + return [pass, lFailed, lPassed] +} + + +//Parses name from entry +function parseName(md) { + const regex = /^\W*(.*?)\W/ + return regex.exec(md)[1] +} + +function entryErrorCheck() { + const lines = split(readme); // Inserts each line into the entries array + let totalFail = 0; + let totalPass = 0; + let total = 0; + let entries = []; + let diffEntries = []; + + if (lines[0] === "") { + console.log(chalk.red("0 Entries Found, check your commandline arguments")) + process.exit(0) + } + for (let i = 0; i < lines.length; i ++) { // Loop through array of lines + if (entryFilter(lines[i]) === true) { // filter out lines that don't start with * [) + e = {}; + e.raw = lines[i]; + e.line = i + 1 + entries.push(e); + } else if (licenseFilter(lines[i]) === true) { + licenses.add(parseLicense(lines[i])) + } + } + + if (pr === true) { + console.log(chalk.cyan("Only testing the diff from the PR.\n")) + const diffLines = split(diff); // Inserts each line of diff into an array + for (let l of diffLines) { + if (entryFilter(l) === true) { // filter out lines that don't start with * [) + e = {}; + e.raw = l; + diffEntries.push(e); + } else if (licenseFilter(l) === true) { + licenses.add(parseLicense(l)) + } + } + if (diffEntries.length === 0) { + console.log("No entries changed in README.md, Exiting...") + process.exit(0) + } + total = diffEntries.length + for (let e of diffEntries) { + e.pass = true + e.name = parseName(e.raw) + if (!findPattern(e.raw)) { + e.highlight = findError(e.raw); + 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.`)) + } + if (e.pass) { + totalPass++ + } else { + totalFail++ + } + } + } else { + console.log(chalk.cyan("Testing entire README.md\n")) + total = entries.length + for (let e of entries) { + e.pass = true + e.name = parseName(e.raw) + if (!findPattern(e.raw)) { + e.highlight = findError(e.raw); + e.pass = false; + console.log(`${chalk.yellow(e.line + ": ")}${e.highlight}`); + syntax = e.highlight; + } + e.licenseTest = testLicense(e.raw); + 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`) + } + if (e.pass) { + totalPass++ + } else { + totalFail++ + } + } + } + if (totalFail > 0) { + 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`)) + process.exit(1); + } else { + console.log(chalk.blue(`\n-----------------------------\n`)) + console.log(chalk.green(`${totalPass} Passed of ${total}`)) + console.log(chalk.blue(`\n-----------------------------\n`)) + process.exit(0) + } +} + +parseArgs(process.argv) +entryErrorCheck();