##// END OF EJS Templates
docs: first pass of introducing documentation of repo groups API
Louis Bertrand -
r8755:3c55f6f1 stable
parent child Browse files
Show More
@@ -1,192 +1,193 b''
1 List of contributors to Kallithea project:
1 List of contributors to Kallithea project:
2
2
3 Mads Kiilerich <mads@kiilerich.com> 2016-2022
3 Mads Kiilerich <mads@kiilerich.com> 2016-2022
4 Asterios Dimitriou <steve@pci.gr> 2016-2017 2020 2022
4 Asterios Dimitriou <steve@pci.gr> 2016-2017 2020 2022
5 Manuel Jacob <me@manueljacob.de> 2019-2020 2022
5 Manuel Jacob <me@manueljacob.de> 2019-2020 2022
6 Jaime MarquΓ­nez FerrΓ‘ndiz <weblate@jregistros.fastmail.net> 2022
6 Jaime MarquΓ­nez FerrΓ‘ndiz <weblate@jregistros.fastmail.net> 2022
7 Louis Bertrand <louis.bertrand@durhamcollege.ca> 2022
7 toras9000 <toras9000@gmail.com> 2022
8 toras9000 <toras9000@gmail.com> 2022
8 yzqzss <yzqzss@othing.xyz> 2022
9 yzqzss <yzqzss@othing.xyz> 2022
9 МАН69К <weblate@mah69k.net> 2022
10 МАН69К <weblate@mah69k.net> 2022
10 Thomas De Schampheleire <thomas.de_schampheleire@nokia.com> 2014-2021
11 Thomas De Schampheleire <thomas.de_schampheleire@nokia.com> 2014-2021
11 ssantos <ssantos@web.de> 2018-2021
12 ssantos <ssantos@web.de> 2018-2021
12 Private <adamantine.sword@gmail.com> 2019-2021
13 Private <adamantine.sword@gmail.com> 2019-2021
13 Γ‰tienne Gilli <etienne@gilli.io> 2020-2021
14 Γ‰tienne Gilli <etienne@gilli.io> 2020-2021
14 fresh <fresh190@protonmail.com> 2020-2021
15 fresh <fresh190@protonmail.com> 2020-2021
15 robertus <robertuss12@gmail.com> 2020-2021
16 robertus <robertuss12@gmail.com> 2020-2021
16 Eugenia Russell <eugenia.russell2019@gmail.com> 2021
17 Eugenia Russell <eugenia.russell2019@gmail.com> 2021
17 Michalis <michalisntovas@yahoo.gr> 2021
18 Michalis <michalisntovas@yahoo.gr> 2021
18 vs <vsuhachev@yandex.ru> 2021
19 vs <vsuhachev@yandex.ru> 2021
19 АлСксандр <akonn7@mail.ru> 2021
20 АлСксандр <akonn7@mail.ru> 2021
20 Allan NordhΓΈy <epost@anotheragency.no> 2017-2020
21 Allan NordhΓΈy <epost@anotheragency.no> 2017-2020
21 Anton Schur <tonich.sh@gmail.com> 2017 2020
22 Anton Schur <tonich.sh@gmail.com> 2017 2020
22 Artem <kovalevartem.ru@gmail.com> 2020
23 Artem <kovalevartem.ru@gmail.com> 2020
23 David Ignjić <ignjic@gmail.com> 2020
24 David Ignjić <ignjic@gmail.com> 2020
24 Dennis Fink <dennis.fink@c3l.lu> 2020
25 Dennis Fink <dennis.fink@c3l.lu> 2020
25 J. Lavoie <j.lavoie@net-c.ca> 2020
26 J. Lavoie <j.lavoie@net-c.ca> 2020
26 Ross Thomas <ross@lns-nevasoft.com> 2020
27 Ross Thomas <ross@lns-nevasoft.com> 2020
27 Tim Ooms <tatankat@users.noreply.github.com> 2020
28 Tim Ooms <tatankat@users.noreply.github.com> 2020
28 Andrej Shadura <andrew@shadura.me> 2012 2014-2017 2019
29 Andrej Shadura <andrew@shadura.me> 2012 2014-2017 2019
29 Γ‰tienne Gilli <etienne.gilli@gmail.com> 2015-2017 2019
30 Γ‰tienne Gilli <etienne.gilli@gmail.com> 2015-2017 2019
30 Adi Kriegisch <adi@cg.tuwien.ac.at> 2019
31 Adi Kriegisch <adi@cg.tuwien.ac.at> 2019
31 Danni Randeris <danniranderis@gmail.com> 2019
32 Danni Randeris <danniranderis@gmail.com> 2019
32 Edmund Wong <ewong@crazy-cat.org> 2019
33 Edmund Wong <ewong@crazy-cat.org> 2019
33 Elizabeth Sherrock <lizzyd710@gmail.com> 2019
34 Elizabeth Sherrock <lizzyd710@gmail.com> 2019
34 Hüseyin Tunç <huseyin.tunc@bulutfon.com> 2019
35 Hüseyin Tunç <huseyin.tunc@bulutfon.com> 2019
35 leela <53352@protonmail.com> 2019
36 leela <53352@protonmail.com> 2019
36 Mateusz Mendel <mendelm9@gmail.com> 2019
37 Mateusz Mendel <mendelm9@gmail.com> 2019
37 Nathan <bonnemainsnathan@gmail.com> 2019
38 Nathan <bonnemainsnathan@gmail.com> 2019
38 Oleksandr Shtalinberg <o.shtalinberg@gmail.com> 2019
39 Oleksandr Shtalinberg <o.shtalinberg@gmail.com> 2019
39 THANOS SIOURDAKIS <siourdakisthanos@gmail.com> 2019
40 THANOS SIOURDAKIS <siourdakisthanos@gmail.com> 2019
40 Wolfgang Scherer <wolfgang.scherer@gmx.de> 2019
41 Wolfgang Scherer <wolfgang.scherer@gmx.de> 2019
41 Π₯ристо Π‘Ρ‚Π°Π½Π΅Π² <hstanev@gmail.com> 2019
42 Π₯ристо Π‘Ρ‚Π°Π½Π΅Π² <hstanev@gmail.com> 2019
42 Dominik Ruf <dominikruf@gmail.com> 2012 2014-2018
43 Dominik Ruf <dominikruf@gmail.com> 2012 2014-2018
43 Michal ČihaΕ™ <michal@cihar.com> 2014-2015 2018
44 Michal ČihaΕ™ <michal@cihar.com> 2014-2015 2018
44 Branko Majic <branko@majic.rs> 2015 2018
45 Branko Majic <branko@majic.rs> 2015 2018
45 Chris Rule <crule@aegistg.com> 2018
46 Chris Rule <crule@aegistg.com> 2018
46 JesΓΊs SΓ‘nchez <jsanchezfdz95@gmail.com> 2018
47 JesΓΊs SΓ‘nchez <jsanchezfdz95@gmail.com> 2018
47 Patrick Vane <patrick_vane@lowentry.com> 2018
48 Patrick Vane <patrick_vane@lowentry.com> 2018
48 Pheng Heong Tan <phtan90@gmail.com> 2018
49 Pheng Heong Tan <phtan90@gmail.com> 2018
49 Максим Π―ΠΊΠΈΠΌΡ‡ΡƒΠΊ <xpinovo@gmail.com> 2018
50 Максим Π―ΠΊΠΈΠΌΡ‡ΡƒΠΊ <xpinovo@gmail.com> 2018
50 ΠœΠ°Ρ€Ρ Π―ΠΌΠ±Π°Ρ€ <mjambarmeta@gmail.com> 2018
51 ΠœΠ°Ρ€Ρ Π―ΠΌΠ±Π°Ρ€ <mjambarmeta@gmail.com> 2018
51 Mads Kiilerich <madski@unity3d.com> 2012-2017
52 Mads Kiilerich <madski@unity3d.com> 2012-2017
52 Unity Technologies 2012-2017
53 Unity Technologies 2012-2017
53 SΓΈren LΓΈvborg <sorenl@unity3d.com> 2015-2017
54 SΓΈren LΓΈvborg <sorenl@unity3d.com> 2015-2017
54 Sam Jaques <sam.jaques@me.com> 2015 2017
55 Sam Jaques <sam.jaques@me.com> 2015 2017
55 Alessandro Molina <alessandro.molina@axant.it> 2017
56 Alessandro Molina <alessandro.molina@axant.it> 2017
56 Ching-Chen Mao <mao@lins.fju.edu.tw> 2017
57 Ching-Chen Mao <mao@lins.fju.edu.tw> 2017
57 Eivind Tagseth <eivindt@gmail.com> 2017
58 Eivind Tagseth <eivindt@gmail.com> 2017
58 FUJIWARA Katsunori <foozy@lares.dti.ne.jp> 2017
59 FUJIWARA Katsunori <foozy@lares.dti.ne.jp> 2017
59 Holger Schramm <info@schramm.by> 2017
60 Holger Schramm <info@schramm.by> 2017
60 Karl Goetz <karl@kgoetz.id.au> 2017
61 Karl Goetz <karl@kgoetz.id.au> 2017
61 Lars Kruse <devel@sumpfralle.de> 2017
62 Lars Kruse <devel@sumpfralle.de> 2017
62 Marko Semet <markosemet@googlemail.com> 2017
63 Marko Semet <markosemet@googlemail.com> 2017
63 Viktar Vauchkevich <victorenator@gmail.com> 2017
64 Viktar Vauchkevich <victorenator@gmail.com> 2017
64 Takumi IINO <trot.thunder@gmail.com> 2012-2016
65 Takumi IINO <trot.thunder@gmail.com> 2012-2016
65 Jan Heylen <heyleke@gmail.com> 2015-2016
66 Jan Heylen <heyleke@gmail.com> 2015-2016
66 Robert Martinez <ntttq@inboxen.org> 2015-2016
67 Robert Martinez <ntttq@inboxen.org> 2015-2016
67 Robert Rauch <mail@robertrauch.de> 2015-2016
68 Robert Rauch <mail@robertrauch.de> 2015-2016
68 Angel Ezquerra <angel.ezquerra@gmail.com> 2016
69 Angel Ezquerra <angel.ezquerra@gmail.com> 2016
69 Anton Shestakov <av6@dwimlabs.net> 2016
70 Anton Shestakov <av6@dwimlabs.net> 2016
70 Brandon Jones <bjones14@gmail.com> 2016
71 Brandon Jones <bjones14@gmail.com> 2016
71 Kateryna Musina <kateryna@unity3d.com> 2016
72 Kateryna Musina <kateryna@unity3d.com> 2016
72 Konstantin Veretennicov <kveretennicov@gmail.com> 2016
73 Konstantin Veretennicov <kveretennicov@gmail.com> 2016
73 Oscar Curero <oscar@naiandei.net> 2016
74 Oscar Curero <oscar@naiandei.net> 2016
74 Robert James Dennington <tinytimrob@googlemail.com> 2016
75 Robert James Dennington <tinytimrob@googlemail.com> 2016
75 timeless@gmail.com 2016
76 timeless@gmail.com 2016
76 YFdyh000 <yfdyh000@gmail.com> 2016
77 YFdyh000 <yfdyh000@gmail.com> 2016
77 Aras Pranckevičius <aras@unity3d.com> 2012-2013 2015
78 Aras Pranckevičius <aras@unity3d.com> 2012-2013 2015
78 Sean Farley <sean.michael.farley@gmail.com> 2013-2015
79 Sean Farley <sean.michael.farley@gmail.com> 2013-2015
79 Bradley M. Kuhn <bkuhn@sfconservancy.org> 2014-2015
80 Bradley M. Kuhn <bkuhn@sfconservancy.org> 2014-2015
80 Christian Oyarzun <oyarzun@gmail.com> 2014-2015
81 Christian Oyarzun <oyarzun@gmail.com> 2014-2015
81 Joseph Rivera <rivera.d.joseph@gmail.com> 2014-2015
82 Joseph Rivera <rivera.d.joseph@gmail.com> 2014-2015
82 Anatoly Bubenkov <bubenkoff@gmail.com> 2015
83 Anatoly Bubenkov <bubenkoff@gmail.com> 2015
83 Andrew Bartlett <abartlet@catalyst.net.nz> 2015
84 Andrew Bartlett <abartlet@catalyst.net.nz> 2015
84 BalÑzs Úr <urbalazs@gmail.com> 2015
85 BalÑzs Úr <urbalazs@gmail.com> 2015
85 Ben Finney <ben@benfinney.id.au> 2015
86 Ben Finney <ben@benfinney.id.au> 2015
86 Daniel Hobley <danielh@unity3d.com> 2015
87 Daniel Hobley <danielh@unity3d.com> 2015
87 David Avigni <david.avigni@ankapi.com> 2015
88 David Avigni <david.avigni@ankapi.com> 2015
88 Denis Blanchette <dblanchette@coveo.com> 2015
89 Denis Blanchette <dblanchette@coveo.com> 2015
89 duanhongyi <duanhongyi@doopai.com> 2015
90 duanhongyi <duanhongyi@doopai.com> 2015
90 EriCSN Chang <ericsning@gmail.com> 2015
91 EriCSN Chang <ericsning@gmail.com> 2015
91 Grzegorz Krason <grzegorz.krason@gmail.com> 2015
92 Grzegorz Krason <grzegorz.krason@gmail.com> 2015
92 JiΕ™Γ­ Suchan <yed@vanyli.net> 2015
93 JiΕ™Γ­ Suchan <yed@vanyli.net> 2015
93 Kazunari Kobayashi <kobanari@nifty.com> 2015
94 Kazunari Kobayashi <kobanari@nifty.com> 2015
94 Kevin Bullock <kbullock@ringworld.org> 2015
95 Kevin Bullock <kbullock@ringworld.org> 2015
95 kobanari <kobanari@nifty.com> 2015
96 kobanari <kobanari@nifty.com> 2015
96 Marc Abramowitz <marc@marc-abramowitz.com> 2015
97 Marc Abramowitz <marc@marc-abramowitz.com> 2015
97 Marc Villetard <marc.villetard@gmail.com> 2015
98 Marc Villetard <marc.villetard@gmail.com> 2015
98 Matthias Zilk <matthias.zilk@gmail.com> 2015
99 Matthias Zilk <matthias.zilk@gmail.com> 2015
99 Michael Pohl <michael@mipapo.de> 2015
100 Michael Pohl <michael@mipapo.de> 2015
100 Michael V. DePalatis <mike@depalatis.net> 2015
101 Michael V. DePalatis <mike@depalatis.net> 2015
101 Morten Skaaning <mortens@unity3d.com> 2015
102 Morten Skaaning <mortens@unity3d.com> 2015
102 Nick High <nick@silverchip.org> 2015
103 Nick High <nick@silverchip.org> 2015
103 Niemand Jedermann <predatorix@web.de> 2015
104 Niemand Jedermann <predatorix@web.de> 2015
104 Peter Vitt <petervitt@web.de> 2015
105 Peter Vitt <petervitt@web.de> 2015
105 Ronny Pfannschmidt <opensource@ronnypfannschmidt.de> 2015
106 Ronny Pfannschmidt <opensource@ronnypfannschmidt.de> 2015
106 Tuux <tuxa@galaxie.eu.org> 2015
107 Tuux <tuxa@galaxie.eu.org> 2015
107 Viktar Palstsiuk <vipals@gmail.com> 2015
108 Viktar Palstsiuk <vipals@gmail.com> 2015
108 Ante Ilic <ante@unity3d.com> 2014
109 Ante Ilic <ante@unity3d.com> 2014
109 Calinou <calinou@opmbx.org> 2014
110 Calinou <calinou@opmbx.org> 2014
110 Daniel Anderson <daniel@dattrix.com> 2014
111 Daniel Anderson <daniel@dattrix.com> 2014
111 Henrik Stuart <hg@hstuart.dk> 2014
112 Henrik Stuart <hg@hstuart.dk> 2014
112 Ingo von Borstel <kallithea@planetmaker.de> 2014
113 Ingo von Borstel <kallithea@planetmaker.de> 2014
113 invision70 <invision70@gmail.com> 2014
114 invision70 <invision70@gmail.com> 2014
114 Jelmer VernooΔ³ <jelmer@samba.org> 2014
115 Jelmer VernooΔ³ <jelmer@samba.org> 2014
115 Jim Hague <jim.hague@acm.org> 2014
116 Jim Hague <jim.hague@acm.org> 2014
116 Matt Fellows <kallithea@matt-fellows.me.uk> 2014
117 Matt Fellows <kallithea@matt-fellows.me.uk> 2014
117 Max Roman <max@choloclos.se> 2014
118 Max Roman <max@choloclos.se> 2014
118 Na'Tosha Bard <natosha@unity3d.com> 2014
119 Na'Tosha Bard <natosha@unity3d.com> 2014
119 Rasmus Selsmark <rasmuss@unity3d.com> 2014
120 Rasmus Selsmark <rasmuss@unity3d.com> 2014
120 SkryabinD <skryabind@gmail.com> 2014
121 SkryabinD <skryabind@gmail.com> 2014
121 Tim Freund <tim@freunds.net> 2014
122 Tim Freund <tim@freunds.net> 2014
122 Travis Burtrum <android@moparisthebest.com> 2014
123 Travis Burtrum <android@moparisthebest.com> 2014
123 whosaysni <whosaysni@gmail.com> 2014
124 whosaysni <whosaysni@gmail.com> 2014
124 Zoltan Gyarmati <mr.zoltan.gyarmati@gmail.com> 2014
125 Zoltan Gyarmati <mr.zoltan.gyarmati@gmail.com> 2014
125 Marcin KuΕΊmiΕ„ski <marcin@python-works.com> 2010-2013
126 Marcin KuΕΊmiΕ„ski <marcin@python-works.com> 2010-2013
126 Nemcio <areczek01@gmail.com> 2012-2013
127 Nemcio <areczek01@gmail.com> 2012-2013
127 xpol <xpolife@gmail.com> 2012-2013
128 xpol <xpolife@gmail.com> 2012-2013
128 Andrey Mivrenik <myvrenik@gmail.com> 2013
129 Andrey Mivrenik <myvrenik@gmail.com> 2013
129 Aparkar <aparkar@icloud.com> 2013
130 Aparkar <aparkar@icloud.com> 2013
130 ArcheR <aleclitvinov1980@gmail.com> 2013
131 ArcheR <aleclitvinov1980@gmail.com> 2013
131 Dennis Brakhane <brakhane@googlemail.com> 2013
132 Dennis Brakhane <brakhane@googlemail.com> 2013
132 gnustavo <gustavo@gnustavo.com> 2013
133 gnustavo <gustavo@gnustavo.com> 2013
133 Grzegorz RoΕΌniecki <xaerxess@gmail.com> 2013
134 Grzegorz RoΕΌniecki <xaerxess@gmail.com> 2013
134 Ilya Beda <ir4y.ix@gmail.com> 2013
135 Ilya Beda <ir4y.ix@gmail.com> 2013
135 ivlevdenis <ivlevdenis.ru@gmail.com> 2013
136 ivlevdenis <ivlevdenis.ru@gmail.com> 2013
136 Jonathan Sternberg <jonathansternberg@gmail.com> 2013
137 Jonathan Sternberg <jonathansternberg@gmail.com> 2013
137 Leonardo Carneiro <leonardo@unity3d.com> 2013
138 Leonardo Carneiro <leonardo@unity3d.com> 2013
138 Magnus Ericmats <magnus.ericmats@gmail.com> 2013
139 Magnus Ericmats <magnus.ericmats@gmail.com> 2013
139 Martin Vium <martinv@unity3d.com> 2013
140 Martin Vium <martinv@unity3d.com> 2013
140 Mikhail Zholobov <legal90@gmail.com> 2013
141 Mikhail Zholobov <legal90@gmail.com> 2013
141 mokeev1995 <mokeev_andre@mail.ru> 2013
142 mokeev1995 <mokeev_andre@mail.ru> 2013
142 Ruslan Bekenev <furyinbox@gmail.com> 2013
143 Ruslan Bekenev <furyinbox@gmail.com> 2013
143 shirou - しろう 2013
144 shirou - しろう 2013
144 Simon Lopez <simon.lopez@slopez.org> 2013
145 Simon Lopez <simon.lopez@slopez.org> 2013
145 softforwinxp <softforwinxp@gmail.com> 2013
146 softforwinxp <softforwinxp@gmail.com> 2013
146 stephanj <info@stephan-jauernick.de> 2013
147 stephanj <info@stephan-jauernick.de> 2013
147 Ton Plomp <tcplomp@gmail.com> 2013
148 Ton Plomp <tcplomp@gmail.com> 2013
148 zhmylove <zhmylove@narod.ru> 2013
149 zhmylove <zhmylove@narod.ru> 2013
149 こいんとす <tkondou@gmail.com> 2013
150 こいんとす <tkondou@gmail.com> 2013
150 Augusto Herrmann <augusto.herrmann@planejamento.gov.br> 2011-2012
151 Augusto Herrmann <augusto.herrmann@planejamento.gov.br> 2011-2012
151 Augusto Herrmann <augusto.herrmann@gmail.com> 2012
152 Augusto Herrmann <augusto.herrmann@gmail.com> 2012
152 Dan Sheridan <djs@adelard.com> 2012
153 Dan Sheridan <djs@adelard.com> 2012
153 Dies Koper <diesk@fast.au.fujitsu.com> 2012
154 Dies Koper <diesk@fast.au.fujitsu.com> 2012
154 Erwin Kroon <e.kroon@smartmetersolutions.nl> 2012
155 Erwin Kroon <e.kroon@smartmetersolutions.nl> 2012
155 H Waldo G <gwaldo@gmail.com> 2012
156 H Waldo G <gwaldo@gmail.com> 2012
156 hppj <hppj@postmage.biz> 2012
157 hppj <hppj@postmage.biz> 2012
157 Indra Talip <indra.talip@gmail.com> 2012
158 Indra Talip <indra.talip@gmail.com> 2012
158 mikespook <mikespook@gmail.com> 2012
159 mikespook <mikespook@gmail.com> 2012
159 nansenat16 <nansenat16@null.tw> 2012
160 nansenat16 <nansenat16@null.tw> 2012
160 Nemcio <bogdan114@g.pl> 2012
161 Nemcio <bogdan114@g.pl> 2012
161 Philip Jameson <philip.j@hostdime.com> 2012
162 Philip Jameson <philip.j@hostdime.com> 2012
162 Raoul Thill <raoul.thill@gmail.com> 2012
163 Raoul Thill <raoul.thill@gmail.com> 2012
163 Stefan Engel <mail@engel-stefan.de> 2012
164 Stefan Engel <mail@engel-stefan.de> 2012
164 Tony Bussieres <t.bussieres@gmail.com> 2012
165 Tony Bussieres <t.bussieres@gmail.com> 2012
165 Vincent Caron <vcaron@bearstech.com> 2012
166 Vincent Caron <vcaron@bearstech.com> 2012
166 Vincent Duvert <vincent@duvert.net> 2012
167 Vincent Duvert <vincent@duvert.net> 2012
167 Vladislav Poluhin <nuklea@gmail.com> 2012
168 Vladislav Poluhin <nuklea@gmail.com> 2012
168 Zachary Auclair <zach101@gmail.com> 2012
169 Zachary Auclair <zach101@gmail.com> 2012
169 Ankit Solanki <ankit.solanki@gmail.com> 2011
170 Ankit Solanki <ankit.solanki@gmail.com> 2011
170 Dmitri Kuznetsov 2011
171 Dmitri Kuznetsov 2011
171 Jared Bunting <jared.bunting@peachjean.com> 2011
172 Jared Bunting <jared.bunting@peachjean.com> 2011
172 Jason Harris <jason@jasonfharris.com> 2011
173 Jason Harris <jason@jasonfharris.com> 2011
173 Les Peabody <lpeabody@gmail.com> 2011
174 Les Peabody <lpeabody@gmail.com> 2011
174 Liad Shani <liadff@gmail.com> 2011
175 Liad Shani <liadff@gmail.com> 2011
175 Lorenzo M. Catucci <lorenzo@sancho.ccd.uniroma2.it> 2011
176 Lorenzo M. Catucci <lorenzo@sancho.ccd.uniroma2.it> 2011
176 Matt Zuba <matt.zuba@goodwillaz.org> 2011
177 Matt Zuba <matt.zuba@goodwillaz.org> 2011
177 Nicolas VINOT <aeris@imirhil.fr> 2011
178 Nicolas VINOT <aeris@imirhil.fr> 2011
178 Shawn K. O'Shea <shawn@eth0.net> 2011
179 Shawn K. O'Shea <shawn@eth0.net> 2011
179 Thayne Harbaugh <thayne@fusionio.com> 2011
180 Thayne Harbaugh <thayne@fusionio.com> 2011
180 Łukasz Balcerzak <lukaszbalcerzak@gmail.com> 2010
181 Łukasz Balcerzak <lukaszbalcerzak@gmail.com> 2010
181 Andrew Kesterson <andrew@aklabs.net>
182 Andrew Kesterson <andrew@aklabs.net>
182 cejones
183 cejones
183 David A. SjΓΈen <david.sjoen@westcon.no>
184 David A. SjΓΈen <david.sjoen@westcon.no>
184 James Rhodes <jrhodes@redpointsoftware.com.au>
185 James Rhodes <jrhodes@redpointsoftware.com.au>
185 Jonas Oberschweiber <jonas.oberschweiber@d-velop.de>
186 Jonas Oberschweiber <jonas.oberschweiber@d-velop.de>
186 larikale
187 larikale
187 RhodeCode GmbH
188 RhodeCode GmbH
188 Sebastian Kreutzberger <sebastian@rhodecode.com>
189 Sebastian Kreutzberger <sebastian@rhodecode.com>
189 Steve Romanow <slestak989@gmail.com>
190 Steve Romanow <slestak989@gmail.com>
190 SteveCohen
191 SteveCohen
191 Thomas <thomas@rhodecode.com>
192 Thomas <thomas@rhodecode.com>
192 Thomas Waldmann <tw-public@gmx.de>
193 Thomas Waldmann <tw-public@gmx.de>
@@ -1,1249 +1,1410 b''
1 .. _api:
1 .. _api:
2
2
3 ===
3 ===
4 API
4 API
5 ===
5 ===
6
6
7 Kallithea has a simple JSON RPC API with a single schema for calling all API
7 Kallithea has a simple JSON RPC API with a single schema for calling all API
8 methods. Everything is available by sending JSON encoded http(s) requests to
8 methods. Everything is available by sending JSON encoded http(s) requests to
9 ``<your_server>/_admin/api``.
9 ``<your_server>/_admin/api``.
10
10
11
11
12 API keys
12 API keys
13 --------
13 --------
14
14
15 Every Kallithea user automatically receives an API key, which they can
15 Every Kallithea user automatically receives an API key, which they can
16 view under "My Account". On this page, API keys can also be revoked, and
16 view under "My Account". On this page, API keys can also be revoked, and
17 additional API keys can be generated.
17 additional API keys can be generated.
18
18
19
19
20 API access
20 API access
21 ----------
21 ----------
22
22
23 Clients must send JSON encoded JSON-RPC requests::
23 Clients must send JSON encoded JSON-RPC requests::
24
24
25 {
25 {
26 "id": "<id>",
26 "id": "<id>",
27 "api_key": "<api_key>",
27 "api_key": "<api_key>",
28 "method": "<method_name>",
28 "method": "<method_name>",
29 "args": {"<arg_key>": "<arg_val>"}
29 "args": {"<arg_key>": "<arg_val>"}
30 }
30 }
31
31
32 For example, to pull to a local "CPython" mirror using curl::
32 For example, to pull to a local "CPython" mirror using curl::
33
33
34 curl https://kallithea.example.com/_admin/api -X POST -H 'content-type:text/plain' \
34 curl https://kallithea.example.com/_admin/api -X POST -H 'content-type:text/plain' \
35 --data-binary '{"id":1,"api_key":"xe7cdb2v278e4evbdf5vs04v832v0efvcbcve4a3","method":"pull","args":{"repoid":"CPython"}}'
35 --data-binary '{"id":1,"api_key":"xe7cdb2v278e4evbdf5vs04v832v0efvcbcve4a3","method":"pull","args":{"repoid":"CPython"}}'
36
36
37 In general, provide
37 In general, provide
38 - *id*, a value of any type, can be used to match the response with the request that it is replying to.
38 - *id*, a value of any type, can be used to match the response with the request that it is replying to.
39 - *api_key*, for authentication and permission validation.
39 - *api_key*, for authentication and permission validation.
40 - *method*, the name of the method to call -- a list of available methods can be found below.
40 - *method*, the name of the method to call -- a list of available methods can be found below.
41 - *args*, the arguments to pass to the method.
41 - *args*, the arguments to pass to the method.
42
42
43 .. note::
43 .. note::
44
44
45 api_key can be found or set on the user account page.
45 api_key can be found or set on the user account page.
46
46
47 The response to the JSON-RPC API call will always be a JSON structure::
47 The response to the JSON-RPC API call will always be a JSON structure::
48
48
49 {
49 {
50 "id": <id>, # the id that was used in the request
50 "id": <id>, # the id that was used in the request
51 "result": <result>|null, # JSON formatted result (null on error)
51 "result": <result>|null, # JSON formatted result (null on error)
52 "error": null|<error_message> # JSON formatted error (null on success)
52 "error": null|<error_message> # JSON formatted error (null on success)
53 }
53 }
54
54
55 All responses from the API will be ``HTTP/1.0 200 OK``. If an error occurs,
55 All responses from the API will be ``HTTP/1.0 200 OK``. If an error occurs,
56 the reponse will have a failure description in *error* and
56 the reponse will have a failure description in *error* and
57 *result* will be null.
57 *result* will be null.
58
58
59
59
60 API client
60 API client
61 ----------
61 ----------
62
62
63 Kallithea comes with a ``kallithea-api`` command line tool, providing a convenient
63 Kallithea comes with a ``kallithea-api`` command line tool, providing a convenient
64 way to call the JSON-RPC API.
64 way to call the JSON-RPC API.
65
65
66 For example, to call ``get_repo``::
66 For example, to call ``get_repo``::
67
67
68 kallithea-api --apihost=<Kallithea URL> --apikey=<API key> get_repo
68 kallithea-api --apihost=<Kallithea URL> --apikey=<API key> get_repo
69
69
70 Calling method get_repo => <Kallithea URL>
70 Calling method get_repo => <Kallithea URL>
71 Server response
71 Server response
72 ERROR:"Missing non optional `repoid` arg in JSON DATA"
72 ERROR:"Missing non optional `repoid` arg in JSON DATA"
73
73
74 Oops, looks like we forgot to add an argument. Let's try again, now
74 Oops, looks like we forgot to add an argument. Let's try again, now
75 providing the ``repoid`` as a parameter::
75 providing the ``repoid`` as a parameter::
76
76
77 kallithea-api --apihost=<Kallithea URL> --apikey=<API key> get_repo repoid:myrepo
77 kallithea-api --apihost=<Kallithea URL> --apikey=<API key> get_repo repoid:myrepo
78
78
79 Calling method get_repo => <Kallithea URL>
79 Calling method get_repo => <Kallithea URL>
80 Server response
80 Server response
81 {
81 {
82 "clone_uri": null,
82 "clone_uri": null,
83 "created_on": "2015-08-31T14:55:19.042",
83 "created_on": "2015-08-31T14:55:19.042",
84 ...
84 ...
85
85
86 To avoid specifying ``apihost`` and ``apikey`` every time, run::
86 To avoid specifying ``apihost`` and ``apikey`` every time, run::
87
87
88 kallithea-api --save-config --apihost=<Kallithea URL> --apikey=<API key>
88 kallithea-api --save-config --apihost=<Kallithea URL> --apikey=<API key>
89
89
90 This will create a ``~/.config/kallithea`` with the specified URL and API key
90 This will create a ``~/.config/kallithea`` with the specified URL and API key
91 so you don't have to specify them every time.
91 so you don't have to specify them every time.
92
92
93
93
94 API methods
94 API methods
95 -----------
95 -----------
96
96
97
97
98 pull
98 pull
99 ^^^^
99 ^^^^
100
100
101 Pull the given repo from remote location. Can be used to automatically keep
101 Pull the given repo from remote location. Can be used to automatically keep
102 remote repos up to date.
102 remote repos up to date.
103 This command can only be executed using the api_key of a user with admin rights.
103 This command can only be executed using the api_key of a user with admin rights.
104
104
105 INPUT::
105 INPUT::
106
106
107 id : <id_for_response>
107 id : <id_for_response>
108 api_key : "<api_key>"
108 api_key : "<api_key>"
109 method : "pull"
109 method : "pull"
110 args : {
110 args : {
111 "repoid" : "<reponame or repo_id>"
111 "repoid" : "<reponame or repo_id>"
112 }
112 }
113
113
114 OUTPUT::
114 OUTPUT::
115
115
116 id : <id_given_in_input>
116 id : <id_given_in_input>
117 result : "Pulled from `<reponame>`"
117 result : "Pulled from `<reponame>`"
118 error : null
118 error : null
119
119
120 rescan_repos
120 rescan_repos
121 ^^^^^^^^^^^^
121 ^^^^^^^^^^^^
122
122
123 Rescan repositories. If ``remove_obsolete`` is set,
123 Rescan repositories. If ``remove_obsolete`` is set,
124 Kallithea will delete repos that are in the database but not in the filesystem.
124 Kallithea will delete repos that are in the database but not in the filesystem.
125 This command can only be executed using the api_key of a user with admin rights.
125 This command can only be executed using the api_key of a user with admin rights.
126
126
127 INPUT::
127 INPUT::
128
128
129 id : <id_for_response>
129 id : <id_for_response>
130 api_key : "<api_key>"
130 api_key : "<api_key>"
131 method : "rescan_repos"
131 method : "rescan_repos"
132 args : {
132 args : {
133 "remove_obsolete" : "<boolean = Optional(False)>"
133 "remove_obsolete" : "<boolean = Optional(False)>"
134 }
134 }
135
135
136 OUTPUT::
136 OUTPUT::
137
137
138 id : <id_given_in_input>
138 id : <id_given_in_input>
139 result : "{'added': [<list of names of added repos>],
139 result : "{'added': [<list of names of added repos>],
140 'removed': [<list of names of removed repos>]}"
140 'removed': [<list of names of removed repos>]}"
141 error : null
141 error : null
142
142
143 invalidate_cache
143 invalidate_cache
144 ^^^^^^^^^^^^^^^^
144 ^^^^^^^^^^^^^^^^
145
145
146 Invalidate the cache for a repository.
146 Invalidate the cache for a repository.
147 This command can only be executed using the api_key of a user with admin rights,
147 This command can only be executed using the api_key of a user with admin rights,
148 or that of a regular user with admin or write access to the repository.
148 or that of a regular user with admin or write access to the repository.
149
149
150 INPUT::
150 INPUT::
151
151
152 id : <id_for_response>
152 id : <id_for_response>
153 api_key : "<api_key>"
153 api_key : "<api_key>"
154 method : "invalidate_cache"
154 method : "invalidate_cache"
155 args : {
155 args : {
156 "repoid" : "<reponame or repo_id>"
156 "repoid" : "<reponame or repo_id>"
157 }
157 }
158
158
159 OUTPUT::
159 OUTPUT::
160
160
161 id : <id_given_in_input>
161 id : <id_given_in_input>
162 result : "Caches of repository `<reponame>`"
162 result : "Caches of repository `<reponame>`"
163 error : null
163 error : null
164
164
165 get_ip
165 get_ip
166 ^^^^^^
166 ^^^^^^
167
167
168 Return IP address as seen from Kallithea server, together with all
168 Return IP address as seen from Kallithea server, together with all
169 defined IP addresses for given user.
169 defined IP addresses for given user.
170 This command can only be executed using the api_key of a user with admin rights.
170 This command can only be executed using the api_key of a user with admin rights.
171
171
172 INPUT::
172 INPUT::
173
173
174 id : <id_for_response>
174 id : <id_for_response>
175 api_key : "<api_key>"
175 api_key : "<api_key>"
176 method : "get_ip"
176 method : "get_ip"
177 args : {
177 args : {
178 "userid" : "<user_id or username>"
178 "userid" : "<user_id or username>"
179 }
179 }
180
180
181 OUTPUT::
181 OUTPUT::
182
182
183 id : <id_given_in_input>
183 id : <id_given_in_input>
184 result : {
184 result : {
185 "ip_addr_server" : <ip_from_client>",
185 "ip_addr_server" : <ip_from_client>",
186 "user_ips" : [
186 "user_ips" : [
187 {
187 {
188 "ip_addr" : "<ip_with_mask>",
188 "ip_addr" : "<ip_with_mask>",
189 "ip_range" : ["<start_ip>", "<end_ip>"]
189 "ip_range" : ["<start_ip>", "<end_ip>"]
190 },
190 },
191 ...
191 ...
192 ]
192 ]
193 }
193 }
194 error : null
194 error : null
195
195
196 get_user
196 get_user
197 ^^^^^^^^
197 ^^^^^^^^
198
198
199 Get a user by username or userid. The result is empty if user can't be found.
199 Get a user by username or userid. The result is empty if user can't be found.
200 If userid param is skipped, it is set to id of user who is calling this method.
200 If userid param is skipped, it is set to id of user who is calling this method.
201 Any userid can be specified when the command is executed using the api_key of a user with admin rights.
201 Any userid can be specified when the command is executed using the api_key of a user with admin rights.
202 Regular users can only specify their own userid.
202 Regular users can only specify their own userid.
203
203
204 INPUT::
204 INPUT::
205
205
206 id : <id_for_response>
206 id : <id_for_response>
207 api_key : "<api_key>"
207 api_key : "<api_key>"
208 method : "get_user"
208 method : "get_user"
209 args : {
209 args : {
210 "userid" : "<username or user_id Optional(=apiuser)>"
210 "userid" : "<username or user_id Optional(=apiuser)>"
211 }
211 }
212
212
213 OUTPUT::
213 OUTPUT::
214
214
215 id : <id_given_in_input>
215 id : <id_given_in_input>
216 result : None if user does not exist or
216 result : None if user does not exist or
217 {
217 {
218 "user_id" : "<user_id>",
218 "user_id" : "<user_id>",
219 "api_key" : "<api_key>",
219 "api_key" : "<api_key>",
220 "username" : "<username>",
220 "username" : "<username>",
221 "firstname" : "<firstname>",
221 "firstname" : "<firstname>",
222 "lastname" : "<lastname>",
222 "lastname" : "<lastname>",
223 "email" : "<email>",
223 "email" : "<email>",
224 "emails" : "<list_of_all_additional_emails>",
224 "emails" : "<list_of_all_additional_emails>",
225 "ip_addresses": "<list_of_ip_addresses_for_user>",
225 "ip_addresses": "<list_of_ip_addresses_for_user>",
226 "active" : "<bool>",
226 "active" : "<bool>",
227 "admin" : "<bool>",
227 "admin" : "<bool>",
228 "ldap_dn" : "<ldap_dn>",
228 "ldap_dn" : "<ldap_dn>",
229 "last_login" : "<last_login>",
229 "last_login" : "<last_login>",
230 "permissions": {
230 "permissions": {
231 "global": ["hg.create.repository",
231 "global": ["hg.create.repository",
232 "repository.read",
232 "repository.read",
233 "hg.register.manual_activate"],
233 "hg.register.manual_activate"],
234 "repositories" : {"repo1" : "repository.none"},
234 "repositories" : {"repo1" : "repository.none"},
235 "repositories_groups" : {"Group1" : "group.read"}
235 "repositories_groups" : {"Group1" : "group.read"}
236 }
236 }
237 }
237 }
238 error : null
238 error : null
239
239
240 get_users
240 get_users
241 ^^^^^^^^^
241 ^^^^^^^^^
242
242
243 List all existing users.
243 List all existing users.
244 This command can only be executed using the api_key of a user with admin rights.
244 This command can only be executed using the api_key of a user with admin rights.
245
245
246 INPUT::
246 INPUT::
247
247
248 id : <id_for_response>
248 id : <id_for_response>
249 api_key : "<api_key>"
249 api_key : "<api_key>"
250 method : "get_users"
250 method : "get_users"
251 args : { }
251 args : { }
252
252
253 OUTPUT::
253 OUTPUT::
254
254
255 id : <id_given_in_input>
255 id : <id_given_in_input>
256 result : [
256 result : [
257 {
257 {
258 "user_id" : "<user_id>",
258 "user_id" : "<user_id>",
259 "api_key" : "<api_key>",
259 "api_key" : "<api_key>",
260 "username" : "<username>",
260 "username" : "<username>",
261 "firstname" : "<firstname>",
261 "firstname" : "<firstname>",
262 "lastname" : "<lastname>",
262 "lastname" : "<lastname>",
263 "email" : "<email>",
263 "email" : "<email>",
264 "emails" : "<list_of_all_additional_emails>",
264 "emails" : "<list_of_all_additional_emails>",
265 "ip_addresses": "<list_of_ip_addresses_for_user>",
265 "ip_addresses": "<list_of_ip_addresses_for_user>",
266 "active" : "<bool>",
266 "active" : "<bool>",
267 "admin" : "<bool>",
267 "admin" : "<bool>",
268 "ldap_dn" : "<ldap_dn>",
268 "ldap_dn" : "<ldap_dn>",
269 "last_login" : "<last_login>"
269 "last_login" : "<last_login>"
270 },
270 },
271 …
271 …
272 ]
272 ]
273 error : null
273 error : null
274
274
275 .. _create-user:
275 .. _create-user:
276
276
277 create_user
277 create_user
278 ^^^^^^^^^^^
278 ^^^^^^^^^^^
279
279
280 Create new user.
280 Create new user.
281 This command can only be executed using the api_key of a user with admin rights.
281 This command can only be executed using the api_key of a user with admin rights.
282
282
283 INPUT::
283 INPUT::
284
284
285 id : <id_for_response>
285 id : <id_for_response>
286 api_key : "<api_key>"
286 api_key : "<api_key>"
287 method : "create_user"
287 method : "create_user"
288 args : {
288 args : {
289 "username" : "<username>",
289 "username" : "<username>",
290 "email" : "<useremail>",
290 "email" : "<useremail>",
291 "password" : "<password = Optional(None)>",
291 "password" : "<password = Optional(None)>",
292 "firstname" : "<firstname> = Optional(None)",
292 "firstname" : "<firstname> = Optional(None)",
293 "lastname" : "<lastname> = Optional(None)",
293 "lastname" : "<lastname> = Optional(None)",
294 "active" : "<bool> = Optional(True)",
294 "active" : "<bool> = Optional(True)",
295 "admin" : "<bool> = Optional(False)",
295 "admin" : "<bool> = Optional(False)",
296 "ldap_dn" : "<ldap_dn> = Optional(None)"
296 "ldap_dn" : "<ldap_dn> = Optional(None)"
297 }
297 }
298
298
299 OUTPUT::
299 OUTPUT::
300
300
301 id : <id_given_in_input>
301 id : <id_given_in_input>
302 result : {
302 result : {
303 "msg" : "created new user `<username>`",
303 "msg" : "created new user `<username>`",
304 "user" : {
304 "user" : {
305 "user_id" : "<user_id>",
305 "user_id" : "<user_id>",
306 "username" : "<username>",
306 "username" : "<username>",
307 "firstname": "<firstname>",
307 "firstname": "<firstname>",
308 "lastname" : "<lastname>",
308 "lastname" : "<lastname>",
309 "email" : "<email>",
309 "email" : "<email>",
310 "emails" : "<list_of_all_additional_emails>",
310 "emails" : "<list_of_all_additional_emails>",
311 "active" : "<bool>",
311 "active" : "<bool>",
312 "admin" : "<bool>",
312 "admin" : "<bool>",
313 "ldap_dn" : "<ldap_dn>",
313 "ldap_dn" : "<ldap_dn>",
314 "last_login": "<last_login>"
314 "last_login": "<last_login>"
315 }
315 }
316 }
316 }
317 error : null
317 error : null
318
318
319 Example::
319 Example::
320
320
321 kallithea-api create_user username:bent email:bent@example.com firstname:Bent lastname:Bentsen extern_type:ldap extern_name:uid=bent,dc=example,dc=com
321 kallithea-api create_user username:bent email:bent@example.com firstname:Bent lastname:Bentsen extern_type:ldap extern_name:uid=bent,dc=example,dc=com
322
322
323 update_user
323 update_user
324 ^^^^^^^^^^^
324 ^^^^^^^^^^^
325
325
326 Update the given user if such user exists.
326 Update the given user if such user exists.
327 This command can only be executed using the api_key of a user with admin rights.
327 This command can only be executed using the api_key of a user with admin rights.
328
328
329 INPUT::
329 INPUT::
330
330
331 id : <id_for_response>
331 id : <id_for_response>
332 api_key : "<api_key>"
332 api_key : "<api_key>"
333 method : "update_user"
333 method : "update_user"
334 args : {
334 args : {
335 "userid" : "<user_id or username>",
335 "userid" : "<user_id or username>",
336 "username" : "<username> = Optional(None)",
336 "username" : "<username> = Optional(None)",
337 "email" : "<useremail> = Optional(None)",
337 "email" : "<useremail> = Optional(None)",
338 "password" : "<password> = Optional(None)",
338 "password" : "<password> = Optional(None)",
339 "firstname" : "<firstname> = Optional(None)",
339 "firstname" : "<firstname> = Optional(None)",
340 "lastname" : "<lastname> = Optional(None)",
340 "lastname" : "<lastname> = Optional(None)",
341 "active" : "<bool> = Optional(None)",
341 "active" : "<bool> = Optional(None)",
342 "admin" : "<bool> = Optional(None)",
342 "admin" : "<bool> = Optional(None)",
343 "ldap_dn" : "<ldap_dn> = Optional(None)"
343 "ldap_dn" : "<ldap_dn> = Optional(None)"
344 }
344 }
345
345
346 OUTPUT::
346 OUTPUT::
347
347
348 id : <id_given_in_input>
348 id : <id_given_in_input>
349 result : {
349 result : {
350 "msg" : "updated user ID:<userid> <username>",
350 "msg" : "updated user ID:<userid> <username>",
351 "user" : {
351 "user" : {
352 "user_id" : "<user_id>",
352 "user_id" : "<user_id>",
353 "api_key" : "<api_key>",
353 "api_key" : "<api_key>",
354 "username" : "<username>",
354 "username" : "<username>",
355 "firstname": "<firstname>",
355 "firstname": "<firstname>",
356 "lastname" : "<lastname>",
356 "lastname" : "<lastname>",
357 "email" : "<email>",
357 "email" : "<email>",
358 "emails" : "<list_of_all_additional_emails>",
358 "emails" : "<list_of_all_additional_emails>",
359 "active" : "<bool>",
359 "active" : "<bool>",
360 "admin" : "<bool>",
360 "admin" : "<bool>",
361 "ldap_dn" : "<ldap_dn>",
361 "ldap_dn" : "<ldap_dn>",
362 "last_login": "<last_login>"
362 "last_login": "<last_login>"
363 }
363 }
364 }
364 }
365 error : null
365 error : null
366
366
367 delete_user
367 delete_user
368 ^^^^^^^^^^^
368 ^^^^^^^^^^^
369
369
370 Delete the given user if such a user exists.
370 Delete the given user if such a user exists.
371 This command can only be executed using the api_key of a user with admin rights.
371 This command can only be executed using the api_key of a user with admin rights.
372
372
373 INPUT::
373 INPUT::
374
374
375 id : <id_for_response>
375 id : <id_for_response>
376 api_key : "<api_key>"
376 api_key : "<api_key>"
377 method : "delete_user"
377 method : "delete_user"
378 args : {
378 args : {
379 "userid" : "<user_id or username>"
379 "userid" : "<user_id or username>"
380 }
380 }
381
381
382 OUTPUT::
382 OUTPUT::
383
383
384 id : <id_given_in_input>
384 id : <id_given_in_input>
385 result : {
385 result : {
386 "msg" : "deleted user ID:<userid> <username>",
386 "msg" : "deleted user ID:<userid> <username>",
387 "user" : null
387 "user" : null
388 }
388 }
389 error : null
389 error : null
390
390
391 get_user_group
391 get_user_group
392 ^^^^^^^^^^^^^^
392 ^^^^^^^^^^^^^^
393
393
394 Get an existing user group.
394 Get an existing user group.
395 This command can only be executed using the api_key of a user with admin rights.
395 This command can only be executed using the api_key of a user with admin rights.
396
396
397 INPUT::
397 INPUT::
398
398
399 id : <id_for_response>
399 id : <id_for_response>
400 api_key : "<api_key>"
400 api_key : "<api_key>"
401 method : "get_user_group"
401 method : "get_user_group"
402 args : {
402 args : {
403 "usergroupid" : "<user group id or name>"
403 "usergroupid" : "<user group id or name>"
404 }
404 }
405
405
406 OUTPUT::
406 OUTPUT::
407
407
408 id : <id_given_in_input>
408 id : <id_given_in_input>
409 result : None if group not exist
409 result : None if group not exist
410 {
410 {
411 "users_group_id" : "<id>",
411 "users_group_id" : "<id>",
412 "group_name" : "<groupname>",
412 "group_name" : "<groupname>",
413 "active" : "<bool>",
413 "active" : "<bool>",
414 "members" : [
414 "members" : [
415 {
415 {
416 "user_id" : "<user_id>",
416 "user_id" : "<user_id>",
417 "api_key" : "<api_key>",
417 "api_key" : "<api_key>",
418 "username" : "<username>",
418 "username" : "<username>",
419 "firstname": "<firstname>",
419 "firstname": "<firstname>",
420 "lastname" : "<lastname>",
420 "lastname" : "<lastname>",
421 "email" : "<email>",
421 "email" : "<email>",
422 "emails" : "<list_of_all_additional_emails>",
422 "emails" : "<list_of_all_additional_emails>",
423 "active" : "<bool>",
423 "active" : "<bool>",
424 "admin" : "<bool>",
424 "admin" : "<bool>",
425 "ldap_dn" : "<ldap_dn>",
425 "ldap_dn" : "<ldap_dn>",
426 "last_login": "<last_login>"
426 "last_login": "<last_login>"
427 },
427 },
428 …
428 …
429 ]
429 ]
430 }
430 }
431 error : null
431 error : null
432
432
433 get_user_groups
433 get_user_groups
434 ^^^^^^^^^^^^^^^
434 ^^^^^^^^^^^^^^^
435
435
436 List all existing user groups.
436 List all existing user groups.
437 This command can only be executed using the api_key of a user with admin rights.
437 This command can only be executed using the api_key of a user with admin rights.
438
438
439 INPUT::
439 INPUT::
440
440
441 id : <id_for_response>
441 id : <id_for_response>
442 api_key : "<api_key>"
442 api_key : "<api_key>"
443 method : "get_user_groups"
443 method : "get_user_groups"
444 args : { }
444 args : { }
445
445
446 OUTPUT::
446 OUTPUT::
447
447
448 id : <id_given_in_input>
448 id : <id_given_in_input>
449 result : [
449 result : [
450 {
450 {
451 "users_group_id" : "<id>",
451 "users_group_id" : "<id>",
452 "group_name" : "<groupname>",
452 "group_name" : "<groupname>",
453 "active" : "<bool>"
453 "active" : "<bool>"
454 },
454 },
455 …
455 …
456 ]
456 ]
457 error : null
457 error : null
458
458
459 create_user_group
459 create_user_group
460 ^^^^^^^^^^^^^^^^^
460 ^^^^^^^^^^^^^^^^^
461
461
462 Create a new user group.
462 Create a new user group.
463 This command can only be executed using the api_key of a user with admin rights.
463 This command can only be executed using the api_key of a user with admin rights.
464
464
465 INPUT::
465 INPUT::
466
466
467 id : <id_for_response>
467 id : <id_for_response>
468 api_key : "<api_key>"
468 api_key : "<api_key>"
469 method : "create_user_group"
469 method : "create_user_group"
470 args : {
470 args : {
471 "group_name": "<groupname>",
471 "group_name": "<groupname>",
472 "owner" : "<owner_name_or_id = Optional(=apiuser)>",
472 "owner" : "<owner_name_or_id = Optional(=apiuser)>",
473 "active" : "<bool> = Optional(True)"
473 "active" : "<bool> = Optional(True)"
474 }
474 }
475
475
476 OUTPUT::
476 OUTPUT::
477
477
478 id : <id_given_in_input>
478 id : <id_given_in_input>
479 result : {
479 result : {
480 "msg" : "created new user group `<groupname>`",
480 "msg" : "created new user group `<groupname>`",
481 "users_group" : {
481 "users_group" : {
482 "users_group_id" : "<id>",
482 "users_group_id" : "<id>",
483 "group_name" : "<groupname>",
483 "group_name" : "<groupname>",
484 "active" : "<bool>"
484 "active" : "<bool>"
485 }
485 }
486 }
486 }
487 error : null
487 error : null
488
488
489 add_user_to_user_group
489 add_user_to_user_group
490 ^^^^^^^^^^^^^^^^^^^^^^
490 ^^^^^^^^^^^^^^^^^^^^^^
491
491
492 Add a user to a user group. If the user already is in that group, success will be
492 Add a user to a user group. If the user already is in that group, success will be
493 ``false``.
493 ``false``.
494 This command can only be executed using the api_key of a user with admin rights.
494 This command can only be executed using the api_key of a user with admin rights.
495
495
496 INPUT::
496 INPUT::
497
497
498 id : <id_for_response>
498 id : <id_for_response>
499 api_key : "<api_key>"
499 api_key : "<api_key>"
500 method : "add_user_user_group"
500 method : "add_user_user_group"
501 args : {
501 args : {
502 "usersgroupid" : "<user group id or name>",
502 "usersgroupid" : "<user group id or name>",
503 "userid" : "<user_id or username>"
503 "userid" : "<user_id or username>"
504 }
504 }
505
505
506 OUTPUT::
506 OUTPUT::
507
507
508 id : <id_given_in_input>
508 id : <id_given_in_input>
509 result : {
509 result : {
510 "success" : True|False, # depends on if member is in group
510 "success" : True|False, # depends on if member is in group
511 "msg" : "added member `<username>` to a user group `<groupname>` |
511 "msg" : "added member `<username>` to a user group `<groupname>` |
512 User is already in that group"
512 User is already in that group"
513 }
513 }
514 error : null
514 error : null
515
515
516 remove_user_from_user_group
516 remove_user_from_user_group
517 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
517 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
518
518
519 Remove a user from a user group. If the user isn't in the given group, success will
519 Remove a user from a user group. If the user isn't in the given group, success will
520 be ``false``.
520 be ``false``.
521 This command can only be executed using the api_key of a user with admin rights.
521 This command can only be executed using the api_key of a user with admin rights.
522
522
523 INPUT::
523 INPUT::
524
524
525 id : <id_for_response>
525 id : <id_for_response>
526 api_key : "<api_key>"
526 api_key : "<api_key>"
527 method : "remove_user_from_user_group"
527 method : "remove_user_from_user_group"
528 args : {
528 args : {
529 "usersgroupid" : "<user group id or name>",
529 "usersgroupid" : "<user group id or name>",
530 "userid" : "<user_id or username>"
530 "userid" : "<user_id or username>"
531 }
531 }
532
532
533 OUTPUT::
533 OUTPUT::
534
534
535 id : <id_given_in_input>
535 id : <id_given_in_input>
536 result : {
536 result : {
537 "success" : True|False, # depends on if member is in group
537 "success" : True|False, # depends on if member is in group
538 "msg" : "removed member <username> from user group <groupname> |
538 "msg" : "removed member <username> from user group <groupname> |
539 User wasn't in group"
539 User wasn't in group"
540 }
540 }
541 error : null
541 error : null
542
542
543 get_repo_group
544 ^^^^^^^^^^^^^^
545
546 Get an existing repository group.
547 This command can only be executed using the api_key of a user with admin rights.
548
549 INPUT::
550
551 id : <id_for_response>
552 api_key : "<api_key>"
553 method : "get_repo_group"
554 args : {
555 "repogroupid" : "<repo group id or name>"
556 }
557
558 OUTPUT::
559
560 id : <id_given_in_input>
561 result :
562 {
563 "group_id" : "<id>",
564 "group_name" : "<groupname>",
565 "group_description" : "<groupdescription>",
566 "parent_group" : "<groupid>"|null,
567 "repositories" : "<list_of_all_repo_names_in_group>",
568 "owner" : "<owner>",
569 "members" : [
570 {
571 "name" : "<name>",
572 "type" : "user",
573 "permission" : "group.(none|read|write|admin)"
574 },
575 {
576 "name" : "<name>",
577 "type" : "user_group",
578 "permission" : "group.(none|read|write|admin)"
579 },
580 …
581 ]
582
583 },
584 error : null
585
586 get_repo_groups
587 ^^^^^^^^^^^^^^^
588
589 List all existing repository groups.
590 This command can only be executed using the api_key of a user with admin rights.
591
592 INPUT::
593
594 id : <id_for_response>
595 api_key : "<api_key>"
596 method : "get_repo_groups"
597 args : { }
598
599 OUTPUT::
600
601 id : <id_given_in_input>
602 result : [
603 {
604 "group_id" : "<id>",
605 "group_name" : "<groupname>",
606 "group_description" : "<groupdescription>",
607 "parent_group" : "<groupid>"|null,
608 "repositories" : "<list_of_all_repo_names_in_group>",
609 "owner" : "<owner>"
610 },
611 …
612 ]
613 error : null
614
615 create_repo_group
616 ^^^^^^^^^^^^^^^^^
617
618 Create a new repository group.
619 This command can only be executed using the api_key of a user with admin rights.
620
621 INPUT::
622
623 id : <id_for_response>
624 api_key : "<api_key>"
625 method : "create_repo_group"
626 args : {
627 "group_name" : "<group_name>",
628 "description" : "<description> = Optional("")",
629 "owner" : "<username or user_id> = Optional(None)",
630 "parent" : "<reponame or id> = Optional(None)",
631 "copy_permissions" : "<bool> = Optional(False)"
632 }
633
634 OUTPUT::
635
636 id : <id_given_in_input>
637 result : {
638 "msg" : "created new repo group `<group_name>`",
639 "repo_group" : {
640 "group_id" : <id>,
641 "group_name" : "<parent_group>/<group_name>",
642 "group_description" : "<description>",
643 "parent_group" : <id>|null,
644 "repositories" : <list of repositories>,
645 "owner" : "<user_name>"
646 }
647
648 update_repo_group
649 ^^^^^^^^^^^^^^^^^
650
651 Update a repository group.
652 This command can only be executed using the api_key of a user with admin rights.
653
654 INPUT::
655
656 id : <id_for_response>
657 api_key : "<api_key>"
658 method : "update_repo_group"
659 args : {
660 "repogroupid" : "<id>",
661 "group_name" : "<group_name> = Optional(None)",
662 "description" : "<description> = Optional(None)",
663 "owner" : "<username or user_id> = Optional(None)",
664 "parent" : "<reponame or id> = Optional(None)"
665 }
666
667 OUTPUT::
668
669 id : <id_given_in_input>
670 result : {
671 "msg" : "updated repository group ID:<id> <group_name>",
672 "repo_group" : {
673 "group_id" : <id>,
674 "group_name" : "<parent_group>/<group_name>",
675 "group_description" : "<description>",
676 "parent_group" : <id>|null,
677 "repositories" : <list of repositories>,
678 "owner" : "<user_name>"
679 }
680
681 delete_repo_group
682 ^^^^^^^^^^^^^^^^^
683
684 Delete a repository group.
685 This command can only be executed using the api_key of a user with admin rights.
686
687 INPUT::
688
689 id : <id_for_response>
690 api_key : "<api_key>"
691 method : "delete_repo_group"
692 args : {
693 "repogroupid" : "<id>"
694 }
695
696 OUTPUT::
697
698 id : <id_given_in_input>
699 result : {
700 "msg" : "deleted repo group ID:<id> <group_name>",
701 "repo_group" : null
702 }
703
543 get_repo
704 get_repo
544 ^^^^^^^^
705 ^^^^^^^^
545
706
546 Get an existing repository by its name or repository_id. Members will contain
707 Get an existing repository by its name or repository_id. Members will contain
547 either users_group or users associated to that repository.
708 either users_group or users associated to that repository.
548 This command can only be executed using the api_key of a user with admin rights,
709 This command can only be executed using the api_key of a user with admin rights,
549 or that of a regular user with at least read access to the repository.
710 or that of a regular user with at least read access to the repository.
550
711
551 INPUT::
712 INPUT::
552
713
553 id : <id_for_response>
714 id : <id_for_response>
554 api_key : "<api_key>"
715 api_key : "<api_key>"
555 method : "get_repo"
716 method : "get_repo"
556 args : {
717 args : {
557 "repoid" : "<reponame or repo_id>",
718 "repoid" : "<reponame or repo_id>",
558 "with_revision_names" : "<bool> = Optional(False)",
719 "with_revision_names" : "<bool> = Optional(False)",
559 "with_pullrequests" : "<bool> = Optional(False)"
720 "with_pullrequests" : "<bool> = Optional(False)"
560 }
721 }
561
722
562 OUTPUT::
723 OUTPUT::
563
724
564 id : <id_given_in_input>
725 id : <id_given_in_input>
565 result : None if repository does not exist or
726 result : None if repository does not exist or
566 {
727 {
567 "repo_id" : "<repo_id>",
728 "repo_id" : "<repo_id>",
568 "repo_name" : "<reponame>",
729 "repo_name" : "<reponame>",
569 "repo_type" : "<repo_type>",
730 "repo_type" : "<repo_type>",
570 "clone_uri" : "<clone_uri>",
731 "clone_uri" : "<clone_uri>",
571 "enable_downloads" : "<bool>",
732 "enable_downloads" : "<bool>",
572 "enable_statistics": "<bool>",
733 "enable_statistics": "<bool>",
573 "private" : "<bool>",
734 "private" : "<bool>",
574 "created_on" : "<date_time_created>",
735 "created_on" : "<date_time_created>",
575 "description" : "<description>",
736 "description" : "<description>",
576 "landing_rev" : "<landing_rev>",
737 "landing_rev" : "<landing_rev>",
577 "last_changeset" : {
738 "last_changeset" : {
578 "author" : "<full_author>",
739 "author" : "<full_author>",
579 "date" : "<date_time_of_commit>",
740 "date" : "<date_time_of_commit>",
580 "message" : "<commit_message>",
741 "message" : "<commit_message>",
581 "raw_id" : "<raw_id>",
742 "raw_id" : "<raw_id>",
582 "revision": "<numeric_revision>",
743 "revision": "<numeric_revision>",
583 "short_id": "<short_id>"
744 "short_id": "<short_id>"
584 },
745 },
585 "owner" : "<repo_owner>",
746 "owner" : "<repo_owner>",
586 "fork_of" : "<name_of_fork_parent>",
747 "fork_of" : "<name_of_fork_parent>",
587 "members" : [
748 "members" : [
588 {
749 {
589 "type" : "user",
750 "type" : "user",
590 "user_id" : "<user_id>",
751 "user_id" : "<user_id>",
591 "api_key" : "<api_key>",
752 "api_key" : "<api_key>",
592 "username" : "<username>",
753 "username" : "<username>",
593 "firstname" : "<firstname>",
754 "firstname" : "<firstname>",
594 "lastname" : "<lastname>",
755 "lastname" : "<lastname>",
595 "email" : "<email>",
756 "email" : "<email>",
596 "emails" : "<list_of_all_additional_emails>",
757 "emails" : "<list_of_all_additional_emails>",
597 "active" : "<bool>",
758 "active" : "<bool>",
598 "admin" : "<bool>",
759 "admin" : "<bool>",
599 "ldap_dn" : "<ldap_dn>",
760 "ldap_dn" : "<ldap_dn>",
600 "last_login" : "<last_login>",
761 "last_login" : "<last_login>",
601 "permission" : "repository.(read|write|admin)"
762 "permission" : "repository.(read|write|admin)"
602 },
763 },
603 …
764 …
604 {
765 {
605 "type" : "users_group",
766 "type" : "users_group",
606 "id" : "<usersgroupid>",
767 "id" : "<usersgroupid>",
607 "name" : "<usersgroupname>",
768 "name" : "<usersgroupname>",
608 "active" : "<bool>",
769 "active" : "<bool>",
609 "permission" : "repository.(read|write|admin)"
770 "permission" : "repository.(read|write|admin)"
610 },
771 },
611 …
772 …
612 ],
773 ],
613 "followers" : [
774 "followers" : [
614 {
775 {
615 "user_id" : "<user_id>",
776 "user_id" : "<user_id>",
616 "username" : "<username>",
777 "username" : "<username>",
617 "api_key" : "<api_key>",
778 "api_key" : "<api_key>",
618 "firstname" : "<firstname>",
779 "firstname" : "<firstname>",
619 "lastname" : "<lastname>",
780 "lastname" : "<lastname>",
620 "email" : "<email>",
781 "email" : "<email>",
621 "emails" : "<list_of_all_additional_emails>",
782 "emails" : "<list_of_all_additional_emails>",
622 "ip_addresses": "<list_of_ip_addresses_for_user>",
783 "ip_addresses": "<list_of_ip_addresses_for_user>",
623 "active" : "<bool>",
784 "active" : "<bool>",
624 "admin" : "<bool>",
785 "admin" : "<bool>",
625 "ldap_dn" : "<ldap_dn>",
786 "ldap_dn" : "<ldap_dn>",
626 "last_login" : "<last_login>"
787 "last_login" : "<last_login>"
627 },
788 },
628 …
789 …
629 ],
790 ],
630 <if with_revision_names == True>
791 <if with_revision_names == True>
631 "tags" : {
792 "tags" : {
632 "<tagname>" : "<raw_id>",
793 "<tagname>" : "<raw_id>",
633 ...
794 ...
634 },
795 },
635 "branches" : {
796 "branches" : {
636 "<branchname>" : "<raw_id>",
797 "<branchname>" : "<raw_id>",
637 ...
798 ...
638 },
799 },
639 "bookmarks" : {
800 "bookmarks" : {
640 "<bookmarkname>" : "<raw_id>",
801 "<bookmarkname>" : "<raw_id>",
641 ...
802 ...
642 },
803 },
643 <if with_pullrequests == True>
804 <if with_pullrequests == True>
644 "pull_requests" : [
805 "pull_requests" : [
645 {
806 {
646 "status" : "<pull_request_status>",
807 "status" : "<pull_request_status>",
647 "pull_request_id" : <pull_request_id>,
808 "pull_request_id" : <pull_request_id>,
648 "description" : "<pull_request_description>",
809 "description" : "<pull_request_description>",
649 "title" : "<pull_request_title>",
810 "title" : "<pull_request_title>",
650 "url" : "<pull_request_url>",
811 "url" : "<pull_request_url>",
651 "reviewers" : [
812 "reviewers" : [
652 {
813 {
653 "username" : "<user_id>"
814 "username" : "<user_id>"
654 },
815 },
655 ...
816 ...
656 ],
817 ],
657 "org_repo_url" : "<repo_url>",
818 "org_repo_url" : "<repo_url>",
658 "org_ref_parts" : [
819 "org_ref_parts" : [
659 "<ref_type>",
820 "<ref_type>",
660 "<ref_name>",
821 "<ref_name>",
661 "<raw_id>"
822 "<raw_id>"
662 ],
823 ],
663 "other_ref_parts" : [
824 "other_ref_parts" : [
664 "<ref_type>",
825 "<ref_type>",
665 "<ref_name>",
826 "<ref_name>",
666 "<raw_id>"
827 "<raw_id>"
667 ],
828 ],
668 "comments" : [
829 "comments" : [
669 {
830 {
670 "username" : "<user_id>",
831 "username" : "<user_id>",
671 "text" : "<comment text>",
832 "text" : "<comment text>",
672 "comment_id" : "<comment_id>"
833 "comment_id" : "<comment_id>"
673 },
834 },
674 ...
835 ...
675 ],
836 ],
676 "owner" : "<username>",
837 "owner" : "<username>",
677 "statuses" : [
838 "statuses" : [
678 {
839 {
679 "status" : "<status_of_review>", # "under_review", "approved" or "rejected"
840 "status" : "<status_of_review>", # "under_review", "approved" or "rejected"
680 "reviewer" : "<user_id>",
841 "reviewer" : "<user_id>",
681 "modified_at" : "<date_time_of_review>" # iso 8601 date, server's timezone
842 "modified_at" : "<date_time_of_review>" # iso 8601 date, server's timezone
682 },
843 },
683 ...
844 ...
684 ],
845 ],
685 "revisions" : [
846 "revisions" : [
686 "<raw_id>",
847 "<raw_id>",
687 ...
848 ...
688 ]
849 ]
689 },
850 },
690 ...
851 ...
691 ]
852 ]
692 }
853 }
693 error : null
854 error : null
694
855
695 get_repos
856 get_repos
696 ^^^^^^^^^
857 ^^^^^^^^^
697
858
698 List all existing repositories.
859 List all existing repositories.
699 This command can only be executed using the api_key of a user with admin rights,
860 This command can only be executed using the api_key of a user with admin rights,
700 or that of a regular user with at least read access to the repository.
861 or that of a regular user with at least read access to the repository.
701
862
702 INPUT::
863 INPUT::
703
864
704 id : <id_for_response>
865 id : <id_for_response>
705 api_key : "<api_key>"
866 api_key : "<api_key>"
706 method : "get_repos"
867 method : "get_repos"
707 args : { }
868 args : { }
708
869
709 OUTPUT::
870 OUTPUT::
710
871
711 id : <id_given_in_input>
872 id : <id_given_in_input>
712 result : [
873 result : [
713 {
874 {
714 "repo_id" : "<repo_id>",
875 "repo_id" : "<repo_id>",
715 "repo_name" : "<reponame>",
876 "repo_name" : "<reponame>",
716 "repo_type" : "<repo_type>",
877 "repo_type" : "<repo_type>",
717 "clone_uri" : "<clone_uri>",
878 "clone_uri" : "<clone_uri>",
718 "private" : "<bool>",
879 "private" : "<bool>",
719 "created_on" : "<datetimecreated>",
880 "created_on" : "<datetimecreated>",
720 "description" : "<description>",
881 "description" : "<description>",
721 "landing_rev" : "<landing_rev>",
882 "landing_rev" : "<landing_rev>",
722 "owner" : "<repo_owner>",
883 "owner" : "<repo_owner>",
723 "fork_of" : "<name_of_fork_parent>",
884 "fork_of" : "<name_of_fork_parent>",
724 "enable_downloads" : "<bool>",
885 "enable_downloads" : "<bool>",
725 "enable_statistics": "<bool>"
886 "enable_statistics": "<bool>"
726 },
887 },
727 …
888 …
728 ]
889 ]
729 error : null
890 error : null
730
891
731 get_repo_nodes
892 get_repo_nodes
732 ^^^^^^^^^^^^^^
893 ^^^^^^^^^^^^^^
733
894
734 Return a list of files and directories for a given path at the given revision.
895 Return a list of files and directories for a given path at the given revision.
735 It is possible to specify ret_type to show only ``files`` or ``dirs``.
896 It is possible to specify ret_type to show only ``files`` or ``dirs``.
736 This command can only be executed using the api_key of a user with admin rights.
897 This command can only be executed using the api_key of a user with admin rights.
737
898
738 INPUT::
899 INPUT::
739
900
740 id : <id_for_response>
901 id : <id_for_response>
741 api_key : "<api_key>"
902 api_key : "<api_key>"
742 method : "get_repo_nodes"
903 method : "get_repo_nodes"
743 args : {
904 args : {
744 "repoid" : "<reponame or repo_id>",
905 "repoid" : "<reponame or repo_id>",
745 "revision" : "<revision>",
906 "revision" : "<revision>",
746 "root_path" : "<root_path>",
907 "root_path" : "<root_path>",
747 "ret_type" : "<ret_type> = Optional('all')"
908 "ret_type" : "<ret_type> = Optional('all')"
748 }
909 }
749
910
750 OUTPUT::
911 OUTPUT::
751
912
752 id : <id_given_in_input>
913 id : <id_given_in_input>
753 result : [
914 result : [
754 {
915 {
755 "name" : "<name>",
916 "name" : "<name>",
756 "type" : "<type>"
917 "type" : "<type>"
757 },
918 },
758 …
919 …
759 ]
920 ]
760 error : null
921 error : null
761
922
762 create_repo
923 create_repo
763 ^^^^^^^^^^^
924 ^^^^^^^^^^^
764
925
765 Create a repository. If the repository name contains "/", the repository will be
926 Create a repository. If the repository name contains "/", the repository will be
766 created in the repository group indicated by that path. Any such repository
927 created in the repository group indicated by that path. Any such repository
767 groups need to exist before calling this method, or the call will fail.
928 groups need to exist before calling this method, or the call will fail.
768 For example "foo/bar/baz" will create a repository "baz" inside the repository
929 For example "foo/bar/baz" will create a repository "baz" inside the repository
769 group "bar" which itself is in a repository group "foo", but both "foo" and
930 group "bar" which itself is in a repository group "foo", but both "foo" and
770 "bar" already need to exist before calling this method.
931 "bar" already need to exist before calling this method.
771 This command can only be executed using the api_key of a user with admin rights,
932 This command can only be executed using the api_key of a user with admin rights,
772 or that of a regular user with create repository permission.
933 or that of a regular user with create repository permission.
773 Regular users cannot specify owner parameter.
934 Regular users cannot specify owner parameter.
774
935
775 INPUT::
936 INPUT::
776
937
777 id : <id_for_response>
938 id : <id_for_response>
778 api_key : "<api_key>"
939 api_key : "<api_key>"
779 method : "create_repo"
940 method : "create_repo"
780 args : {
941 args : {
781 "repo_name" : "<reponame>",
942 "repo_name" : "<reponame>",
782 "owner" : "<owner_name_or_id = Optional(=apiuser)>",
943 "owner" : "<owner_name_or_id = Optional(=apiuser)>",
783 "repo_type" : "<repo_type> = Optional('hg')",
944 "repo_type" : "<repo_type> = Optional('hg')",
784 "description" : "<description> = Optional('')",
945 "description" : "<description> = Optional('')",
785 "private" : "<bool> = Optional(False)",
946 "private" : "<bool> = Optional(False)",
786 "clone_uri" : "<clone_uri> = Optional(None)",
947 "clone_uri" : "<clone_uri> = Optional(None)",
787 "landing_rev" : "<landing_rev> = Optional('tip')",
948 "landing_rev" : "<landing_rev> = Optional('tip')",
788 "enable_downloads" : "<bool> = Optional(False)",
949 "enable_downloads" : "<bool> = Optional(False)",
789 "enable_statistics": "<bool> = Optional(False)"
950 "enable_statistics": "<bool> = Optional(False)"
790 }
951 }
791
952
792 OUTPUT::
953 OUTPUT::
793
954
794 id : <id_given_in_input>
955 id : <id_given_in_input>
795 result : {
956 result : {
796 "msg" : "Created new repository `<reponame>`",
957 "msg" : "Created new repository `<reponame>`",
797 "repo" : {
958 "repo" : {
798 "repo_id" : "<repo_id>",
959 "repo_id" : "<repo_id>",
799 "repo_name" : "<reponame>",
960 "repo_name" : "<reponame>",
800 "repo_type" : "<repo_type>",
961 "repo_type" : "<repo_type>",
801 "clone_uri" : "<clone_uri>",
962 "clone_uri" : "<clone_uri>",
802 "private" : "<bool>",
963 "private" : "<bool>",
803 "created_on" : "<datetimecreated>",
964 "created_on" : "<datetimecreated>",
804 "description" : "<description>",
965 "description" : "<description>",
805 "landing_rev" : "<landing_rev>",
966 "landing_rev" : "<landing_rev>",
806 "owner" : "<username or user_id>",
967 "owner" : "<username or user_id>",
807 "fork_of" : "<name_of_fork_parent>",
968 "fork_of" : "<name_of_fork_parent>",
808 "enable_downloads" : "<bool>",
969 "enable_downloads" : "<bool>",
809 "enable_statistics": "<bool>"
970 "enable_statistics": "<bool>"
810 }
971 }
811 }
972 }
812 error : null
973 error : null
813
974
814 update_repo
975 update_repo
815 ^^^^^^^^^^^
976 ^^^^^^^^^^^
816
977
817 Update a repository.
978 Update a repository.
818 This command can only be executed using the api_key of a user with admin rights,
979 This command can only be executed using the api_key of a user with admin rights,
819 or that of a regular user with create repository permission.
980 or that of a regular user with create repository permission.
820 Regular users cannot specify owner parameter.
981 Regular users cannot specify owner parameter.
821
982
822 INPUT::
983 INPUT::
823
984
824 id : <id_for_response>
985 id : <id_for_response>
825 api_key : "<api_key>"
986 api_key : "<api_key>"
826 method : "update_repo"
987 method : "update_repo"
827 args : {
988 args : {
828 "repoid" : "<reponame or repo_id>",
989 "repoid" : "<reponame or repo_id>",
829 "name" : "<reponame> = Optional('')",
990 "name" : "<reponame> = Optional('')",
830 "group" : "<group_id> = Optional(None)",
991 "group" : "<group_id> = Optional(None)",
831 "owner" : "<owner_name_or_id = Optional(=apiuser)>",
992 "owner" : "<owner_name_or_id = Optional(=apiuser)>",
832 "description" : "<description> = Optional('')",
993 "description" : "<description> = Optional('')",
833 "private" : "<bool> = Optional(False)",
994 "private" : "<bool> = Optional(False)",
834 "clone_uri" : "<clone_uri> = Optional(None)",
995 "clone_uri" : "<clone_uri> = Optional(None)",
835 "landing_rev" : "<landing_rev> = Optional('tip')",
996 "landing_rev" : "<landing_rev> = Optional('tip')",
836 "enable_downloads" : "<bool> = Optional(False)",
997 "enable_downloads" : "<bool> = Optional(False)",
837 "enable_statistics": "<bool> = Optional(False)"
998 "enable_statistics": "<bool> = Optional(False)"
838 }
999 }
839
1000
840 OUTPUT::
1001 OUTPUT::
841
1002
842 id : <id_given_in_input>
1003 id : <id_given_in_input>
843 result : {
1004 result : {
844 "msg" : "updated repo ID:repo_id `<reponame>`",
1005 "msg" : "updated repo ID:repo_id `<reponame>`",
845 "repository" : {
1006 "repository" : {
846 "repo_id" : "<repo_id>",
1007 "repo_id" : "<repo_id>",
847 "repo_name" : "<reponame>",
1008 "repo_name" : "<reponame>",
848 "repo_type" : "<repo_type>",
1009 "repo_type" : "<repo_type>",
849 "clone_uri" : "<clone_uri>",
1010 "clone_uri" : "<clone_uri>",
850 "private" : "<bool>",
1011 "private" : "<bool>",
851 "created_on" : "<datetimecreated>",
1012 "created_on" : "<datetimecreated>",
852 "description" : "<description>",
1013 "description" : "<description>",
853 "landing_rev" : "<landing_rev>",
1014 "landing_rev" : "<landing_rev>",
854 "owner" : "<username or user_id>",
1015 "owner" : "<username or user_id>",
855 "fork_of" : "<name_of_fork_parent>",
1016 "fork_of" : "<name_of_fork_parent>",
856 "enable_downloads" : "<bool>",
1017 "enable_downloads" : "<bool>",
857 "enable_statistics": "<bool>",
1018 "enable_statistics": "<bool>",
858 "last_changeset" : {
1019 "last_changeset" : {
859 "author" : "<full_author>",
1020 "author" : "<full_author>",
860 "date" : "<date_time_of_commit>",
1021 "date" : "<date_time_of_commit>",
861 "message" : "<commit_message>",
1022 "message" : "<commit_message>",
862 "raw_id" : "<raw_id>",
1023 "raw_id" : "<raw_id>",
863 "revision": "<numeric_revision>",
1024 "revision": "<numeric_revision>",
864 "short_id": "<short_id>"
1025 "short_id": "<short_id>"
865 }
1026 }
866 }
1027 }
867 }
1028 }
868 error : null
1029 error : null
869
1030
870 fork_repo
1031 fork_repo
871 ^^^^^^^^^
1032 ^^^^^^^^^
872
1033
873 Create a fork of the given repo. If using Celery, this will
1034 Create a fork of the given repo. If using Celery, this will
874 return success message immediately and a fork will be created
1035 return success message immediately and a fork will be created
875 asynchronously.
1036 asynchronously.
876 This command can only be executed using the api_key of a user with admin
1037 This command can only be executed using the api_key of a user with admin
877 rights, or with the global fork permission, by a regular user with create
1038 rights, or with the global fork permission, by a regular user with create
878 repository permission and at least read access to the repository.
1039 repository permission and at least read access to the repository.
879 Regular users cannot specify owner parameter.
1040 Regular users cannot specify owner parameter.
880
1041
881 INPUT::
1042 INPUT::
882
1043
883 id : <id_for_response>
1044 id : <id_for_response>
884 api_key : "<api_key>"
1045 api_key : "<api_key>"
885 method : "fork_repo"
1046 method : "fork_repo"
886 args : {
1047 args : {
887 "repoid" : "<reponame or repo_id>",
1048 "repoid" : "<reponame or repo_id>",
888 "fork_name" : "<forkname>",
1049 "fork_name" : "<forkname>",
889 "owner" : "<username or user_id = Optional(=apiuser)>",
1050 "owner" : "<username or user_id = Optional(=apiuser)>",
890 "description" : "<description>",
1051 "description" : "<description>",
891 "copy_permissions": "<bool>",
1052 "copy_permissions": "<bool>",
892 "private" : "<bool>",
1053 "private" : "<bool>",
893 "landing_rev" : "<landing_rev>"
1054 "landing_rev" : "<landing_rev>"
894 }
1055 }
895
1056
896 OUTPUT::
1057 OUTPUT::
897
1058
898 id : <id_given_in_input>
1059 id : <id_given_in_input>
899 result : {
1060 result : {
900 "msg" : "Created fork of `<reponame>` as `<forkname>`",
1061 "msg" : "Created fork of `<reponame>` as `<forkname>`",
901 "success" : true
1062 "success" : true
902 }
1063 }
903 error : null
1064 error : null
904
1065
905 delete_repo
1066 delete_repo
906 ^^^^^^^^^^^
1067 ^^^^^^^^^^^
907
1068
908 Delete a repository.
1069 Delete a repository.
909 This command can only be executed using the api_key of a user with admin rights,
1070 This command can only be executed using the api_key of a user with admin rights,
910 or that of a regular user with admin access to the repository.
1071 or that of a regular user with admin access to the repository.
911 When ``forks`` param is set it is possible to detach or delete forks of the deleted repository.
1072 When ``forks`` param is set it is possible to detach or delete forks of the deleted repository.
912
1073
913 INPUT::
1074 INPUT::
914
1075
915 id : <id_for_response>
1076 id : <id_for_response>
916 api_key : "<api_key>"
1077 api_key : "<api_key>"
917 method : "delete_repo"
1078 method : "delete_repo"
918 args : {
1079 args : {
919 "repoid" : "<reponame or repo_id>",
1080 "repoid" : "<reponame or repo_id>",
920 "forks" : "`delete` or `detach` = Optional(None)"
1081 "forks" : "`delete` or `detach` = Optional(None)"
921 }
1082 }
922
1083
923 OUTPUT::
1084 OUTPUT::
924
1085
925 id : <id_given_in_input>
1086 id : <id_given_in_input>
926 result : {
1087 result : {
927 "msg" : "Deleted repository `<reponame>`",
1088 "msg" : "Deleted repository `<reponame>`",
928 "success" : true
1089 "success" : true
929 }
1090 }
930 error : null
1091 error : null
931
1092
932 grant_user_permission
1093 grant_user_permission
933 ^^^^^^^^^^^^^^^^^^^^^
1094 ^^^^^^^^^^^^^^^^^^^^^
934
1095
935 Grant permission for a user on the given repository, or update the existing one if found.
1096 Grant permission for a user on the given repository, or update the existing one if found.
936 This command can only be executed using the api_key of a user with admin rights.
1097 This command can only be executed using the api_key of a user with admin rights.
937
1098
938 INPUT::
1099 INPUT::
939
1100
940 id : <id_for_response>
1101 id : <id_for_response>
941 api_key : "<api_key>"
1102 api_key : "<api_key>"
942 method : "grant_user_permission"
1103 method : "grant_user_permission"
943 args : {
1104 args : {
944 "repoid" : "<reponame or repo_id>",
1105 "repoid" : "<reponame or repo_id>",
945 "userid" : "<username or user_id>",
1106 "userid" : "<username or user_id>",
946 "perm" : "(repository.(none|read|write|admin))"
1107 "perm" : "(repository.(none|read|write|admin))"
947 }
1108 }
948
1109
949 OUTPUT::
1110 OUTPUT::
950
1111
951 id : <id_given_in_input>
1112 id : <id_given_in_input>
952 result : {
1113 result : {
953 "msg" : "Granted perm: `<perm>` for user: `<username>` in repo: `<reponame>`",
1114 "msg" : "Granted perm: `<perm>` for user: `<username>` in repo: `<reponame>`",
954 "success" : true
1115 "success" : true
955 }
1116 }
956 error : null
1117 error : null
957
1118
958 revoke_user_permission
1119 revoke_user_permission
959 ^^^^^^^^^^^^^^^^^^^^^^
1120 ^^^^^^^^^^^^^^^^^^^^^^
960
1121
961 Revoke permission for a user on the given repository.
1122 Revoke permission for a user on the given repository.
962 This command can only be executed using the api_key of a user with admin rights.
1123 This command can only be executed using the api_key of a user with admin rights.
963
1124
964 INPUT::
1125 INPUT::
965
1126
966 id : <id_for_response>
1127 id : <id_for_response>
967 api_key : "<api_key>"
1128 api_key : "<api_key>"
968 method : "revoke_user_permission"
1129 method : "revoke_user_permission"
969 args : {
1130 args : {
970 "repoid" : "<reponame or repo_id>",
1131 "repoid" : "<reponame or repo_id>",
971 "userid" : "<username or user_id>"
1132 "userid" : "<username or user_id>"
972 }
1133 }
973
1134
974 OUTPUT::
1135 OUTPUT::
975
1136
976 id : <id_given_in_input>
1137 id : <id_given_in_input>
977 result : {
1138 result : {
978 "msg" : "Revoked perm for user: `<username>` in repo: `<reponame>`",
1139 "msg" : "Revoked perm for user: `<username>` in repo: `<reponame>`",
979 "success" : true
1140 "success" : true
980 }
1141 }
981 error : null
1142 error : null
982
1143
983 grant_user_group_permission
1144 grant_user_group_permission
984 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
1145 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
985
1146
986 Grant permission for a user group on the given repository, or update the
1147 Grant permission for a user group on the given repository, or update the
987 existing one if found.
1148 existing one if found.
988 This command can only be executed using the api_key of a user with admin rights.
1149 This command can only be executed using the api_key of a user with admin rights.
989
1150
990 INPUT::
1151 INPUT::
991
1152
992 id : <id_for_response>
1153 id : <id_for_response>
993 api_key : "<api_key>"
1154 api_key : "<api_key>"
994 method : "grant_user_group_permission"
1155 method : "grant_user_group_permission"
995 args : {
1156 args : {
996 "repoid" : "<reponame or repo_id>",
1157 "repoid" : "<reponame or repo_id>",
997 "usersgroupid" : "<user group id or name>",
1158 "usersgroupid" : "<user group id or name>",
998 "perm" : "(repository.(none|read|write|admin))"
1159 "perm" : "(repository.(none|read|write|admin))"
999 }
1160 }
1000
1161
1001 OUTPUT::
1162 OUTPUT::
1002
1163
1003 id : <id_given_in_input>
1164 id : <id_given_in_input>
1004 result : {
1165 result : {
1005 "msg" : "Granted perm: `<perm>` for group: `<usersgroupname>` in repo: `<reponame>`",
1166 "msg" : "Granted perm: `<perm>` for group: `<usersgroupname>` in repo: `<reponame>`",
1006 "success" : true
1167 "success" : true
1007 }
1168 }
1008 error : null
1169 error : null
1009
1170
1010 revoke_user_group_permission
1171 revoke_user_group_permission
1011 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1172 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1012
1173
1013 Revoke permission for a user group on the given repository.
1174 Revoke permission for a user group on the given repository.
1014 This command can only be executed using the api_key of a user with admin rights.
1175 This command can only be executed using the api_key of a user with admin rights.
1015
1176
1016 INPUT::
1177 INPUT::
1017
1178
1018 id : <id_for_response>
1179 id : <id_for_response>
1019 api_key : "<api_key>"
1180 api_key : "<api_key>"
1020 method : "revoke_user_group_permission"
1181 method : "revoke_user_group_permission"
1021 args : {
1182 args : {
1022 "repoid" : "<reponame or repo_id>",
1183 "repoid" : "<reponame or repo_id>",
1023 "usersgroupid" : "<user group id or name>"
1184 "usersgroupid" : "<user group id or name>"
1024 }
1185 }
1025
1186
1026 OUTPUT::
1187 OUTPUT::
1027
1188
1028 id : <id_given_in_input>
1189 id : <id_given_in_input>
1029 result : {
1190 result : {
1030 "msg" : "Revoked perm for group: `<usersgroupname>` in repo: `<reponame>`",
1191 "msg" : "Revoked perm for group: `<usersgroupname>` in repo: `<reponame>`",
1031 "success" : true
1192 "success" : true
1032 }
1193 }
1033 error : null
1194 error : null
1034
1195
1035 get_changesets
1196 get_changesets
1036 ^^^^^^^^^^^^^^
1197 ^^^^^^^^^^^^^^
1037
1198
1038 Get changesets of a given repository. This command can only be executed using the api_key
1199 Get changesets of a given repository. This command can only be executed using the api_key
1039 of a user with read permissions to the repository.
1200 of a user with read permissions to the repository.
1040
1201
1041 INPUT::
1202 INPUT::
1042
1203
1043 id : <id_for_response>
1204 id : <id_for_response>
1044 api_key : "<api_key>"
1205 api_key : "<api_key>"
1045 method : "get_changesets"
1206 method : "get_changesets"
1046 args : {
1207 args : {
1047 "repoid" : "<reponame or repo_id>",
1208 "repoid" : "<reponame or repo_id>",
1048 "start" : "<revision number> = Optional(None)",
1209 "start" : "<revision number> = Optional(None)",
1049 "end" : "<revision number> = Optional(None)",
1210 "end" : "<revision number> = Optional(None)",
1050 "start_date" : "<date> = Optional(None)", # in "%Y-%m-%dT%H:%M:%S" format
1211 "start_date" : "<date> = Optional(None)", # in "%Y-%m-%dT%H:%M:%S" format
1051 "end_date" : "<date> = Optional(None)", # in "%Y-%m-%dT%H:%M:%S" format
1212 "end_date" : "<date> = Optional(None)", # in "%Y-%m-%dT%H:%M:%S" format
1052 "branch_name" : "<branch name filter> = Optional(None)",
1213 "branch_name" : "<branch name filter> = Optional(None)",
1053 "reverse" : "<bool> = Optional(False)",
1214 "reverse" : "<bool> = Optional(False)",
1054 "with_file_list" : "<bool> = Optional(False)"
1215 "with_file_list" : "<bool> = Optional(False)"
1055 }
1216 }
1056
1217
1057 OUTPUT::
1218 OUTPUT::
1058
1219
1059 id : <id_given_in_input>
1220 id : <id_given_in_input>
1060 result : [
1221 result : [
1061 {
1222 {
1062 "raw_id" : "<raw_id>",
1223 "raw_id" : "<raw_id>",
1063 "short_id" : "<short_id>",
1224 "short_id" : "<short_id>",
1064 "author" : "<full_author>",
1225 "author" : "<full_author>",
1065 "date" : "<date_time_of_commit>",
1226 "date" : "<date_time_of_commit>",
1066 "message" : "<commit_message>",
1227 "message" : "<commit_message>",
1067 "revision" : "<numeric_revision>",
1228 "revision" : "<numeric_revision>",
1068 <if with_file_list == True>
1229 <if with_file_list == True>
1069 "added" : [<list of added files>],
1230 "added" : [<list of added files>],
1070 "changed" : [<list of changed files>],
1231 "changed" : [<list of changed files>],
1071 "removed" : [<list of removed files>]
1232 "removed" : [<list of removed files>]
1072 },
1233 },
1073 ...
1234 ...
1074 ]
1235 ]
1075 error : null
1236 error : null
1076
1237
1077 get_changeset
1238 get_changeset
1078 ^^^^^^^^^^^^^
1239 ^^^^^^^^^^^^^
1079
1240
1080 Get information and review status for a given changeset. This command can only
1241 Get information and review status for a given changeset. This command can only
1081 be executed using the api_key of a user with read permissions to the
1242 be executed using the api_key of a user with read permissions to the
1082 repository.
1243 repository.
1083
1244
1084 INPUT::
1245 INPUT::
1085
1246
1086 id : <id_for_response>
1247 id : <id_for_response>
1087 api_key : "<api_key>"
1248 api_key : "<api_key>"
1088 method : "get_changeset"
1249 method : "get_changeset"
1089 args : {
1250 args : {
1090 "repoid" : "<reponame or repo_id>",
1251 "repoid" : "<reponame or repo_id>",
1091 "raw_id" : "<raw_id>",
1252 "raw_id" : "<raw_id>",
1092 "with_reviews" : "<bool> = Optional(False)"
1253 "with_reviews" : "<bool> = Optional(False)"
1093 }
1254 }
1094
1255
1095 OUTPUT::
1256 OUTPUT::
1096
1257
1097 id : <id_given_in_input>
1258 id : <id_given_in_input>
1098 result : {
1259 result : {
1099 "author" : "<full_author>",
1260 "author" : "<full_author>",
1100 "date" : "<date_time_of_commit>",
1261 "date" : "<date_time_of_commit>",
1101 "message" : "<commit_message>",
1262 "message" : "<commit_message>",
1102 "raw_id" : "<raw_id>",
1263 "raw_id" : "<raw_id>",
1103 "revision": "<numeric_revision>",
1264 "revision": "<numeric_revision>",
1104 "short_id": "<short_id>",
1265 "short_id": "<short_id>",
1105 "reviews" : [{
1266 "reviews" : [{
1106 "reviewer" : "<username>",
1267 "reviewer" : "<username>",
1107 "modified_at" : "<date_time_of_review>", # iso 8601 date, server's timezone
1268 "modified_at" : "<date_time_of_review>", # iso 8601 date, server's timezone
1108 "status" : "<status_of_review>", # "under_review", "approved" or "rejected"
1269 "status" : "<status_of_review>", # "under_review", "approved" or "rejected"
1109 },
1270 },
1110 ...
1271 ...
1111 ]
1272 ]
1112 }
1273 }
1113 error : null
1274 error : null
1114
1275
1115 Example output::
1276 Example output::
1116
1277
1117 {
1278 {
1118 "id" : 1,
1279 "id" : 1,
1119 "error" : null,
1280 "error" : null,
1120 "result" : {
1281 "result" : {
1121 "author" : {
1282 "author" : {
1122 "email" : "user@example.com",
1283 "email" : "user@example.com",
1123 "name" : "Kallithea Admin"
1284 "name" : "Kallithea Admin"
1124 },
1285 },
1125 "changed" : [],
1286 "changed" : [],
1126 "short_id" : "e1022d3d28df",
1287 "short_id" : "e1022d3d28df",
1127 "date" : "2017-03-28T09:09:03",
1288 "date" : "2017-03-28T09:09:03",
1128 "added" : [
1289 "added" : [
1129 "README.rst"
1290 "README.rst"
1130 ],
1291 ],
1131 "removed" : [],
1292 "removed" : [],
1132 "revision" : 0,
1293 "revision" : 0,
1133 "raw_id" : "e1022d3d28dfba02f626cde65dbe08f4ceb0e4e7",
1294 "raw_id" : "e1022d3d28dfba02f626cde65dbe08f4ceb0e4e7",
1134 "message" : "Added file via Kallithea",
1295 "message" : "Added file via Kallithea",
1135 "id" : "e1022d3d28dfba02f626cde65dbe08f4ceb0e4e7",
1296 "id" : "e1022d3d28dfba02f626cde65dbe08f4ceb0e4e7",
1136 "reviews" : [
1297 "reviews" : [
1137 {
1298 {
1138 "status" : "under_review",
1299 "status" : "under_review",
1139 "modified_at" : "2017-03-28T09:17:08.618",
1300 "modified_at" : "2017-03-28T09:17:08.618",
1140 "reviewer" : "user"
1301 "reviewer" : "user"
1141 }
1302 }
1142 ]
1303 ]
1143 }
1304 }
1144 }
1305 }
1145
1306
1146 get_pullrequest
1307 get_pullrequest
1147 ^^^^^^^^^^^^^^^
1308 ^^^^^^^^^^^^^^^
1148
1309
1149 Get information and review status for a given pull request. This command can only be executed
1310 Get information and review status for a given pull request. This command can only be executed
1150 using the api_key of a user with read permissions to the original repository.
1311 using the api_key of a user with read permissions to the original repository.
1151
1312
1152 INPUT::
1313 INPUT::
1153
1314
1154 id : <id_for_response>
1315 id : <id_for_response>
1155 api_key : "<api_key>"
1316 api_key : "<api_key>"
1156 method : "get_pullrequest"
1317 method : "get_pullrequest"
1157 args : {
1318 args : {
1158 "pullrequest_id" : "<pullrequest_id>"
1319 "pullrequest_id" : "<pullrequest_id>"
1159 }
1320 }
1160
1321
1161 OUTPUT::
1322 OUTPUT::
1162
1323
1163 id : <id_given_in_input>
1324 id : <id_given_in_input>
1164 result : {
1325 result : {
1165 "status" : "<pull_request_status>",
1326 "status" : "<pull_request_status>",
1166 "pull_request_id" : <pull_request_id>,
1327 "pull_request_id" : <pull_request_id>,
1167 "description" : "<pull_request_description>",
1328 "description" : "<pull_request_description>",
1168 "title" : "<pull_request_title>",
1329 "title" : "<pull_request_title>",
1169 "url" : "<pull_request_url>",
1330 "url" : "<pull_request_url>",
1170 "reviewers" : [
1331 "reviewers" : [
1171 {
1332 {
1172 "username" : "<user_name>"
1333 "username" : "<user_name>"
1173 },
1334 },
1174 ...
1335 ...
1175 ],
1336 ],
1176 "org_repo_url" : "<repo_url>",
1337 "org_repo_url" : "<repo_url>",
1177 "org_ref_parts" : [
1338 "org_ref_parts" : [
1178 "<ref_type>",
1339 "<ref_type>",
1179 "<ref_name>",
1340 "<ref_name>",
1180 "<raw_id>"
1341 "<raw_id>"
1181 ],
1342 ],
1182 "other_ref_parts" : [
1343 "other_ref_parts" : [
1183 "<ref_type>",
1344 "<ref_type>",
1184 "<ref_name>",
1345 "<ref_name>",
1185 "<raw_id>"
1346 "<raw_id>"
1186 ],
1347 ],
1187 "comments" : [
1348 "comments" : [
1188 {
1349 {
1189 "username" : "<user_name>",
1350 "username" : "<user_name>",
1190 "text" : "<comment text>",
1351 "text" : "<comment text>",
1191 "comment_id" : "<comment_id>"
1352 "comment_id" : "<comment_id>"
1192 },
1353 },
1193 ...
1354 ...
1194 ],
1355 ],
1195 "owner" : "<username>",
1356 "owner" : "<username>",
1196 "statuses" : [
1357 "statuses" : [
1197 {
1358 {
1198 "status" : "<status_of_review>", # "under_review", "approved" or "rejected"
1359 "status" : "<status_of_review>", # "under_review", "approved" or "rejected"
1199 "reviewer" : "<user_name>",
1360 "reviewer" : "<user_name>",
1200 "modified_at" : "<date_time_of_review>" # iso 8601 date, server's timezone
1361 "modified_at" : "<date_time_of_review>" # iso 8601 date, server's timezone
1201 },
1362 },
1202 ...
1363 ...
1203 ],
1364 ],
1204 "revisions" : [
1365 "revisions" : [
1205 "<raw_id>",
1366 "<raw_id>",
1206 ...
1367 ...
1207 ]
1368 ]
1208 },
1369 },
1209 error : null
1370 error : null
1210
1371
1211 comment_pullrequest
1372 comment_pullrequest
1212 ^^^^^^^^^^^^^^^^^^^
1373 ^^^^^^^^^^^^^^^^^^^
1213
1374
1214 Add comment, change status or close a given pull request. This command can only be executed
1375 Add comment, change status or close a given pull request. This command can only be executed
1215 using the api_key of a user with read permissions to the original repository.
1376 using the api_key of a user with read permissions to the original repository.
1216
1377
1217 INPUT::
1378 INPUT::
1218
1379
1219 id : <id_for_response>
1380 id : <id_for_response>
1220 api_key : "<api_key>"
1381 api_key : "<api_key>"
1221 method : "comment_pullrequest"
1382 method : "comment_pullrequest"
1222 args : {
1383 args : {
1223 "pull_request_id" : "<pull_request_id>",
1384 "pull_request_id" : "<pull_request_id>",
1224 "comment_msg" : Optional(''),
1385 "comment_msg" : Optional(''),
1225 "status" : Optional(None), # "under_review", "approved" or "rejected"
1386 "status" : Optional(None), # "under_review", "approved" or "rejected"
1226 "close_pr" : Optional(False)"
1387 "close_pr" : Optional(False)"
1227 }
1388 }
1228
1389
1229 OUTPUT::
1390 OUTPUT::
1230
1391
1231 id : <id_given_in_input>
1392 id : <id_given_in_input>
1232 result : True
1393 result : True
1233 error : null
1394 error : null
1234
1395
1235
1396
1236 API access for web views
1397 API access for web views
1237 ------------------------
1398 ------------------------
1238
1399
1239 Kallithea HTTP entry points can also be accessed without login using bearer
1400 Kallithea HTTP entry points can also be accessed without login using bearer
1240 authentication by including this header with the request::
1401 authentication by including this header with the request::
1241
1402
1242 Authentication: Bearer <api_key>
1403 Authentication: Bearer <api_key>
1243
1404
1244 Alternatively, the API key can be passed in the URL query string using
1405 Alternatively, the API key can be passed in the URL query string using
1245 ``?api_key=<api_key>``, though this is not recommended due to the increased
1406 ``?api_key=<api_key>``, though this is not recommended due to the increased
1246 risk of API key leaks, and support will likely be removed in the future.
1407 risk of API key leaks, and support will likely be removed in the future.
1247
1408
1248 Exposing raw diffs is a good way to integrate with
1409 Exposing raw diffs is a good way to integrate with
1249 third-party services like code review, or build farms that can download archives.
1410 third-party services like code review, or build farms that can download archives.
@@ -1,228 +1,229 b''
1 ## -*- coding: utf-8 -*-
1 ## -*- coding: utf-8 -*-
2 <%inherit file="/base/base.html"/>
2 <%inherit file="/base/base.html"/>
3 <%block name="title">
3 <%block name="title">
4 ${_('About')}
4 ${_('About')}
5 </%block>
5 </%block>
6 <%block name="header_menu">
6 <%block name="header_menu">
7 ${self.menu('about')}
7 ${self.menu('about')}
8 </%block>
8 </%block>
9 <%def name="main()">
9 <%def name="main()">
10
10
11 <div class="panel panel-primary">
11 <div class="panel panel-primary">
12 <div class="panel-heading">
12 <div class="panel-heading">
13 <h5 class="panel-title">${_('About')} Kallithea</h5>
13 <h5 class="panel-title">${_('About')} Kallithea</h5>
14 </div>
14 </div>
15
15
16 <div class="panel-body panel-about">
16 <div class="panel-body panel-about">
17 <p><a href="https://kallithea-scm.org/">Kallithea</a> is a project of the
17 <p><a href="https://kallithea-scm.org/">Kallithea</a> is a project of the
18 <a href="http://sfconservancy.org/">Software Freedom Conservancy, Inc.</a>
18 <a href="http://sfconservancy.org/">Software Freedom Conservancy, Inc.</a>
19 and is released under the terms of the
19 and is released under the terms of the
20 <a href="http://www.gnu.org/copyleft/gpl.html">GNU General Public License,
20 <a href="http://www.gnu.org/copyleft/gpl.html">GNU General Public License,
21 v 3.0 (GPLv3)</a>.</p>
21 v 3.0 (GPLv3)</a>.</p>
22
22
23 <p>Kallithea is copyrighted by various authors, including but not
23 <p>Kallithea is copyrighted by various authors, including but not
24 necessarily limited to the following:</p>
24 necessarily limited to the following:</p>
25 <ul>
25 <ul>
26
26
27 <li>Copyright &copy; 2012&ndash;2022, Mads Kiilerich</li>
27 <li>Copyright &copy; 2012&ndash;2022, Mads Kiilerich</li>
28 <li>Copyright &copy; 2016&ndash;2017, 2020, 2022, Asterios Dimitriou</li>
28 <li>Copyright &copy; 2016&ndash;2017, 2020, 2022, Asterios Dimitriou</li>
29 <li>Copyright &copy; 2019&ndash;2020, 2022, Manuel Jacob</li>
29 <li>Copyright &copy; 2019&ndash;2020, 2022, Manuel Jacob</li>
30 <li>Copyright &copy; 2022, Jaime MarquΓ­nez FerrΓ‘ndiz</li>
30 <li>Copyright &copy; 2022, Jaime MarquΓ­nez FerrΓ‘ndiz</li>
31 <li>Copyright &copy; 2022, Louis Bertrand</li>
31 <li>Copyright &copy; 2022, toras9000</li>
32 <li>Copyright &copy; 2022, toras9000</li>
32 <li>Copyright &copy; 2022, yzqzss</li>
33 <li>Copyright &copy; 2022, yzqzss</li>
33 <li>Copyright &copy; 2022, МАН69К</li>
34 <li>Copyright &copy; 2022, МАН69К</li>
34 <li>Copyright &copy; 2014&ndash;2021, Thomas De Schampheleire</li>
35 <li>Copyright &copy; 2014&ndash;2021, Thomas De Schampheleire</li>
35 <li>Copyright &copy; 2015&ndash;2017, 2019&ndash;2021, Γ‰tienne Gilli</li>
36 <li>Copyright &copy; 2015&ndash;2017, 2019&ndash;2021, Γ‰tienne Gilli</li>
36 <li>Copyright &copy; 2018&ndash;2021, ssantos</li>
37 <li>Copyright &copy; 2018&ndash;2021, ssantos</li>
37 <li>Copyright &copy; 2019&ndash;2021, Private</li>
38 <li>Copyright &copy; 2019&ndash;2021, Private</li>
38 <li>Copyright &copy; 2020&ndash;2021, fresh</li>
39 <li>Copyright &copy; 2020&ndash;2021, fresh</li>
39 <li>Copyright &copy; 2020&ndash;2021, robertus</li>
40 <li>Copyright &copy; 2020&ndash;2021, robertus</li>
40 <li>Copyright &copy; 2021, Eugenia Russell</li>
41 <li>Copyright &copy; 2021, Eugenia Russell</li>
41 <li>Copyright &copy; 2021, Michalis</li>
42 <li>Copyright &copy; 2021, Michalis</li>
42 <li>Copyright &copy; 2021, vs</li>
43 <li>Copyright &copy; 2021, vs</li>
43 <li>Copyright &copy; 2021, АлСксандр</li>
44 <li>Copyright &copy; 2021, АлСксандр</li>
44 <li>Copyright &copy; 2017&ndash;2020, Allan NordhΓΈy</li>
45 <li>Copyright &copy; 2017&ndash;2020, Allan NordhΓΈy</li>
45 <li>Copyright &copy; 2017, 2020, Anton Schur</li>
46 <li>Copyright &copy; 2017, 2020, Anton Schur</li>
46 <li>Copyright &copy; 2020, Artem</li>
47 <li>Copyright &copy; 2020, Artem</li>
47 <li>Copyright &copy; 2020, David Ignjić</li>
48 <li>Copyright &copy; 2020, David Ignjić</li>
48 <li>Copyright &copy; 2020, Dennis Fink</li>
49 <li>Copyright &copy; 2020, Dennis Fink</li>
49 <li>Copyright &copy; 2020, J. Lavoie</li>
50 <li>Copyright &copy; 2020, J. Lavoie</li>
50 <li>Copyright &copy; 2020, Ross Thomas</li>
51 <li>Copyright &copy; 2020, Ross Thomas</li>
51 <li>Copyright &copy; 2020, Tim Ooms</li>
52 <li>Copyright &copy; 2020, Tim Ooms</li>
52 <li>Copyright &copy; 2012, 2014&ndash;2017, 2019, Andrej Shadura</li>
53 <li>Copyright &copy; 2012, 2014&ndash;2017, 2019, Andrej Shadura</li>
53 <li>Copyright &copy; 2019, Adi Kriegisch</li>
54 <li>Copyright &copy; 2019, Adi Kriegisch</li>
54 <li>Copyright &copy; 2019, Danni Randeris</li>
55 <li>Copyright &copy; 2019, Danni Randeris</li>
55 <li>Copyright &copy; 2019, Edmund Wong</li>
56 <li>Copyright &copy; 2019, Edmund Wong</li>
56 <li>Copyright &copy; 2019, Elizabeth Sherrock</li>
57 <li>Copyright &copy; 2019, Elizabeth Sherrock</li>
57 <li>Copyright &copy; 2019, Hüseyin Tunç</li>
58 <li>Copyright &copy; 2019, Hüseyin Tunç</li>
58 <li>Copyright &copy; 2019, leela</li>
59 <li>Copyright &copy; 2019, leela</li>
59 <li>Copyright &copy; 2019, Mateusz Mendel</li>
60 <li>Copyright &copy; 2019, Mateusz Mendel</li>
60 <li>Copyright &copy; 2019, Nathan</li>
61 <li>Copyright &copy; 2019, Nathan</li>
61 <li>Copyright &copy; 2019, Oleksandr Shtalinberg</li>
62 <li>Copyright &copy; 2019, Oleksandr Shtalinberg</li>
62 <li>Copyright &copy; 2019, THANOS SIOURDAKIS</li>
63 <li>Copyright &copy; 2019, THANOS SIOURDAKIS</li>
63 <li>Copyright &copy; 2019, Wolfgang Scherer</li>
64 <li>Copyright &copy; 2019, Wolfgang Scherer</li>
64 <li>Copyright &copy; 2019, Π₯ристо Π‘Ρ‚Π°Π½Π΅Π²</li>
65 <li>Copyright &copy; 2019, Π₯ристо Π‘Ρ‚Π°Π½Π΅Π²</li>
65 <li>Copyright &copy; 2012, 2014&ndash;2018, Dominik Ruf</li>
66 <li>Copyright &copy; 2012, 2014&ndash;2018, Dominik Ruf</li>
66 <li>Copyright &copy; 2014&ndash;2015, 2018, Michal ČihaΕ™</li>
67 <li>Copyright &copy; 2014&ndash;2015, 2018, Michal ČihaΕ™</li>
67 <li>Copyright &copy; 2015, 2018, Branko Majic</li>
68 <li>Copyright &copy; 2015, 2018, Branko Majic</li>
68 <li>Copyright &copy; 2018, Chris Rule</li>
69 <li>Copyright &copy; 2018, Chris Rule</li>
69 <li>Copyright &copy; 2018, JesΓΊs SΓ‘nchez</li>
70 <li>Copyright &copy; 2018, JesΓΊs SΓ‘nchez</li>
70 <li>Copyright &copy; 2018, Patrick Vane</li>
71 <li>Copyright &copy; 2018, Patrick Vane</li>
71 <li>Copyright &copy; 2018, Pheng Heong Tan</li>
72 <li>Copyright &copy; 2018, Pheng Heong Tan</li>
72 <li>Copyright &copy; 2018, Максим Π―ΠΊΠΈΠΌΡ‡ΡƒΠΊ</li>
73 <li>Copyright &copy; 2018, Максим Π―ΠΊΠΈΠΌΡ‡ΡƒΠΊ</li>
73 <li>Copyright &copy; 2018, ΠœΠ°Ρ€Ρ Π―ΠΌΠ±Π°Ρ€</li>
74 <li>Copyright &copy; 2018, ΠœΠ°Ρ€Ρ Π―ΠΌΠ±Π°Ρ€</li>
74 <li>Copyright &copy; 2012&ndash;2017, Unity Technologies</li>
75 <li>Copyright &copy; 2012&ndash;2017, Unity Technologies</li>
75 <li>Copyright &copy; 2015&ndash;2017, SΓΈren LΓΈvborg</li>
76 <li>Copyright &copy; 2015&ndash;2017, SΓΈren LΓΈvborg</li>
76 <li>Copyright &copy; 2015, 2017, Sam Jaques</li>
77 <li>Copyright &copy; 2015, 2017, Sam Jaques</li>
77 <li>Copyright &copy; 2017, Alessandro Molina</li>
78 <li>Copyright &copy; 2017, Alessandro Molina</li>
78 <li>Copyright &copy; 2017, Ching-Chen Mao</li>
79 <li>Copyright &copy; 2017, Ching-Chen Mao</li>
79 <li>Copyright &copy; 2017, Eivind Tagseth</li>
80 <li>Copyright &copy; 2017, Eivind Tagseth</li>
80 <li>Copyright &copy; 2017, FUJIWARA Katsunori</li>
81 <li>Copyright &copy; 2017, FUJIWARA Katsunori</li>
81 <li>Copyright &copy; 2017, Holger Schramm</li>
82 <li>Copyright &copy; 2017, Holger Schramm</li>
82 <li>Copyright &copy; 2017, Karl Goetz</li>
83 <li>Copyright &copy; 2017, Karl Goetz</li>
83 <li>Copyright &copy; 2017, Lars Kruse</li>
84 <li>Copyright &copy; 2017, Lars Kruse</li>
84 <li>Copyright &copy; 2017, Marko Semet</li>
85 <li>Copyright &copy; 2017, Marko Semet</li>
85 <li>Copyright &copy; 2017, Viktar Vauchkevich</li>
86 <li>Copyright &copy; 2017, Viktar Vauchkevich</li>
86 <li>Copyright &copy; 2012&ndash;2016, Takumi IINO</li>
87 <li>Copyright &copy; 2012&ndash;2016, Takumi IINO</li>
87 <li>Copyright &copy; 2015&ndash;2016, Jan Heylen</li>
88 <li>Copyright &copy; 2015&ndash;2016, Jan Heylen</li>
88 <li>Copyright &copy; 2015&ndash;2016, Robert Martinez</li>
89 <li>Copyright &copy; 2015&ndash;2016, Robert Martinez</li>
89 <li>Copyright &copy; 2015&ndash;2016, Robert Rauch</li>
90 <li>Copyright &copy; 2015&ndash;2016, Robert Rauch</li>
90 <li>Copyright &copy; 2016, Angel Ezquerra</li>
91 <li>Copyright &copy; 2016, Angel Ezquerra</li>
91 <li>Copyright &copy; 2016, Anton Shestakov</li>
92 <li>Copyright &copy; 2016, Anton Shestakov</li>
92 <li>Copyright &copy; 2016, Brandon Jones</li>
93 <li>Copyright &copy; 2016, Brandon Jones</li>
93 <li>Copyright &copy; 2016, Kateryna Musina</li>
94 <li>Copyright &copy; 2016, Kateryna Musina</li>
94 <li>Copyright &copy; 2016, Konstantin Veretennicov</li>
95 <li>Copyright &copy; 2016, Konstantin Veretennicov</li>
95 <li>Copyright &copy; 2016, Oscar Curero</li>
96 <li>Copyright &copy; 2016, Oscar Curero</li>
96 <li>Copyright &copy; 2016, Robert James Dennington</li>
97 <li>Copyright &copy; 2016, Robert James Dennington</li>
97 <li>Copyright &copy; 2016, timeless@gmail.com</li>
98 <li>Copyright &copy; 2016, timeless@gmail.com</li>
98 <li>Copyright &copy; 2016, YFdyh000</li>
99 <li>Copyright &copy; 2016, YFdyh000</li>
99 <li>Copyright &copy; 2012&ndash;2013, 2015, Aras Pranckevičius</li>
100 <li>Copyright &copy; 2012&ndash;2013, 2015, Aras Pranckevičius</li>
100 <li>Copyright &copy; 2014&ndash;2015, Bradley M. Kuhn</li>
101 <li>Copyright &copy; 2014&ndash;2015, Bradley M. Kuhn</li>
101 <li>Copyright &copy; 2014&ndash;2015, Christian Oyarzun</li>
102 <li>Copyright &copy; 2014&ndash;2015, Christian Oyarzun</li>
102 <li>Copyright &copy; 2014&ndash;2015, Joseph Rivera</li>
103 <li>Copyright &copy; 2014&ndash;2015, Joseph Rivera</li>
103 <li>Copyright &copy; 2014&ndash;2015, Sean Farley</li>
104 <li>Copyright &copy; 2014&ndash;2015, Sean Farley</li>
104 <li>Copyright &copy; 2015, Anatoly Bubenkov</li>
105 <li>Copyright &copy; 2015, Anatoly Bubenkov</li>
105 <li>Copyright &copy; 2015, Andrew Bartlett</li>
106 <li>Copyright &copy; 2015, Andrew Bartlett</li>
106 <li>Copyright &copy; 2015, BalÑzs Úr</li>
107 <li>Copyright &copy; 2015, BalÑzs Úr</li>
107 <li>Copyright &copy; 2015, Ben Finney</li>
108 <li>Copyright &copy; 2015, Ben Finney</li>
108 <li>Copyright &copy; 2015, Daniel Hobley</li>
109 <li>Copyright &copy; 2015, Daniel Hobley</li>
109 <li>Copyright &copy; 2015, David Avigni</li>
110 <li>Copyright &copy; 2015, David Avigni</li>
110 <li>Copyright &copy; 2015, Denis Blanchette</li>
111 <li>Copyright &copy; 2015, Denis Blanchette</li>
111 <li>Copyright &copy; 2015, duanhongyi</li>
112 <li>Copyright &copy; 2015, duanhongyi</li>
112 <li>Copyright &copy; 2015, EriCSN Chang</li>
113 <li>Copyright &copy; 2015, EriCSN Chang</li>
113 <li>Copyright &copy; 2015, Grzegorz Krason</li>
114 <li>Copyright &copy; 2015, Grzegorz Krason</li>
114 <li>Copyright &copy; 2015, JiΕ™Γ­ Suchan</li>
115 <li>Copyright &copy; 2015, JiΕ™Γ­ Suchan</li>
115 <li>Copyright &copy; 2015, Kazunari Kobayashi</li>
116 <li>Copyright &copy; 2015, Kazunari Kobayashi</li>
116 <li>Copyright &copy; 2015, Kevin Bullock</li>
117 <li>Copyright &copy; 2015, Kevin Bullock</li>
117 <li>Copyright &copy; 2015, kobanari</li>
118 <li>Copyright &copy; 2015, kobanari</li>
118 <li>Copyright &copy; 2015, Marc Abramowitz</li>
119 <li>Copyright &copy; 2015, Marc Abramowitz</li>
119 <li>Copyright &copy; 2015, Marc Villetard</li>
120 <li>Copyright &copy; 2015, Marc Villetard</li>
120 <li>Copyright &copy; 2015, Matthias Zilk</li>
121 <li>Copyright &copy; 2015, Matthias Zilk</li>
121 <li>Copyright &copy; 2015, Michael Pohl</li>
122 <li>Copyright &copy; 2015, Michael Pohl</li>
122 <li>Copyright &copy; 2015, Michael V. DePalatis</li>
123 <li>Copyright &copy; 2015, Michael V. DePalatis</li>
123 <li>Copyright &copy; 2015, Morten Skaaning</li>
124 <li>Copyright &copy; 2015, Morten Skaaning</li>
124 <li>Copyright &copy; 2015, Nick High</li>
125 <li>Copyright &copy; 2015, Nick High</li>
125 <li>Copyright &copy; 2015, Niemand Jedermann</li>
126 <li>Copyright &copy; 2015, Niemand Jedermann</li>
126 <li>Copyright &copy; 2015, Peter Vitt</li>
127 <li>Copyright &copy; 2015, Peter Vitt</li>
127 <li>Copyright &copy; 2015, Ronny Pfannschmidt</li>
128 <li>Copyright &copy; 2015, Ronny Pfannschmidt</li>
128 <li>Copyright &copy; 2015, Tuux</li>
129 <li>Copyright &copy; 2015, Tuux</li>
129 <li>Copyright &copy; 2015, Viktar Palstsiuk</li>
130 <li>Copyright &copy; 2015, Viktar Palstsiuk</li>
130 <li>Copyright &copy; 2014, Ante Ilic</li>
131 <li>Copyright &copy; 2014, Ante Ilic</li>
131 <li>Copyright &copy; 2014, Calinou</li>
132 <li>Copyright &copy; 2014, Calinou</li>
132 <li>Copyright &copy; 2014, Daniel Anderson</li>
133 <li>Copyright &copy; 2014, Daniel Anderson</li>
133 <li>Copyright &copy; 2014, Henrik Stuart</li>
134 <li>Copyright &copy; 2014, Henrik Stuart</li>
134 <li>Copyright &copy; 2014, Ingo von Borstel</li>
135 <li>Copyright &copy; 2014, Ingo von Borstel</li>
135 <li>Copyright &copy; 2014, invision70</li>
136 <li>Copyright &copy; 2014, invision70</li>
136 <li>Copyright &copy; 2014, Jelmer VernooΔ³</li>
137 <li>Copyright &copy; 2014, Jelmer VernooΔ³</li>
137 <li>Copyright &copy; 2014, Jim Hague</li>
138 <li>Copyright &copy; 2014, Jim Hague</li>
138 <li>Copyright &copy; 2014, Matt Fellows</li>
139 <li>Copyright &copy; 2014, Matt Fellows</li>
139 <li>Copyright &copy; 2014, Max Roman</li>
140 <li>Copyright &copy; 2014, Max Roman</li>
140 <li>Copyright &copy; 2014, Na'Tosha Bard</li>
141 <li>Copyright &copy; 2014, Na'Tosha Bard</li>
141 <li>Copyright &copy; 2014, Rasmus Selsmark</li>
142 <li>Copyright &copy; 2014, Rasmus Selsmark</li>
142 <li>Copyright &copy; 2014, SkryabinD</li>
143 <li>Copyright &copy; 2014, SkryabinD</li>
143 <li>Copyright &copy; 2014, Tim Freund</li>
144 <li>Copyright &copy; 2014, Tim Freund</li>
144 <li>Copyright &copy; 2014, Travis Burtrum</li>
145 <li>Copyright &copy; 2014, Travis Burtrum</li>
145 <li>Copyright &copy; 2014, whosaysni</li>
146 <li>Copyright &copy; 2014, whosaysni</li>
146 <li>Copyright &copy; 2014, Zoltan Gyarmati</li>
147 <li>Copyright &copy; 2014, Zoltan Gyarmati</li>
147 <li>Copyright &copy; 2010&ndash;2013, Marcin KuΕΊmiΕ„ski</li>
148 <li>Copyright &copy; 2010&ndash;2013, Marcin KuΕΊmiΕ„ski</li>
148 <li>Copyright &copy; 2010&ndash;2013, RhodeCode GmbH</li>
149 <li>Copyright &copy; 2010&ndash;2013, RhodeCode GmbH</li>
149 <li>Copyright &copy; 2011, 2013, Aparkar</li>
150 <li>Copyright &copy; 2011, 2013, Aparkar</li>
150 <li>Copyright &copy; 2012&ndash;2013, Nemcio</li>
151 <li>Copyright &copy; 2012&ndash;2013, Nemcio</li>
151 <li>Copyright &copy; 2012&ndash;2013, xpol</li>
152 <li>Copyright &copy; 2012&ndash;2013, xpol</li>
152 <li>Copyright &copy; 2013, Andrey Mivrenik</li>
153 <li>Copyright &copy; 2013, Andrey Mivrenik</li>
153 <li>Copyright &copy; 2013, ArcheR</li>
154 <li>Copyright &copy; 2013, ArcheR</li>
154 <li>Copyright &copy; 2013, Dennis Brakhane</li>
155 <li>Copyright &copy; 2013, Dennis Brakhane</li>
155 <li>Copyright &copy; 2013, gnustavo</li>
156 <li>Copyright &copy; 2013, gnustavo</li>
156 <li>Copyright &copy; 2013, Grzegorz RoΕΌniecki</li>
157 <li>Copyright &copy; 2013, Grzegorz RoΕΌniecki</li>
157 <li>Copyright &copy; 2013, Ilya Beda</li>
158 <li>Copyright &copy; 2013, Ilya Beda</li>
158 <li>Copyright &copy; 2013, ivlevdenis</li>
159 <li>Copyright &copy; 2013, ivlevdenis</li>
159 <li>Copyright &copy; 2013, Jonathan Sternberg</li>
160 <li>Copyright &copy; 2013, Jonathan Sternberg</li>
160 <li>Copyright &copy; 2013, Leonardo Carneiro</li>
161 <li>Copyright &copy; 2013, Leonardo Carneiro</li>
161 <li>Copyright &copy; 2013, Magnus Ericmats</li>
162 <li>Copyright &copy; 2013, Magnus Ericmats</li>
162 <li>Copyright &copy; 2013, Martin Vium</li>
163 <li>Copyright &copy; 2013, Martin Vium</li>
163 <li>Copyright &copy; 2013, Mikhail Zholobov</li>
164 <li>Copyright &copy; 2013, Mikhail Zholobov</li>
164 <li>Copyright &copy; 2013, mokeev1995</li>
165 <li>Copyright &copy; 2013, mokeev1995</li>
165 <li>Copyright &copy; 2013, Ruslan Bekenev</li>
166 <li>Copyright &copy; 2013, Ruslan Bekenev</li>
166 <li>Copyright &copy; 2013, shirou - しろう</li>
167 <li>Copyright &copy; 2013, shirou - しろう</li>
167 <li>Copyright &copy; 2013, Simon Lopez</li>
168 <li>Copyright &copy; 2013, Simon Lopez</li>
168 <li>Copyright &copy; 2013, softforwinxp</li>
169 <li>Copyright &copy; 2013, softforwinxp</li>
169 <li>Copyright &copy; 2013, stephanj</li>
170 <li>Copyright &copy; 2013, stephanj</li>
170 <li>Copyright &copy; 2013, zhmylove</li>
171 <li>Copyright &copy; 2013, zhmylove</li>
171 <li>Copyright &copy; 2013, こいんとす</li>
172 <li>Copyright &copy; 2013, こいんとす</li>
172 <li>Copyright &copy; 2011&ndash;2012, Augusto Herrmann</li>
173 <li>Copyright &copy; 2011&ndash;2012, Augusto Herrmann</li>
173 <li>Copyright &copy; 2012, Dan Sheridan</li>
174 <li>Copyright &copy; 2012, Dan Sheridan</li>
174 <li>Copyright &copy; 2012, H Waldo G</li>
175 <li>Copyright &copy; 2012, H Waldo G</li>
175 <li>Copyright &copy; 2012, hppj</li>
176 <li>Copyright &copy; 2012, hppj</li>
176 <li>Copyright &copy; 2012, Indra Talip</li>
177 <li>Copyright &copy; 2012, Indra Talip</li>
177 <li>Copyright &copy; 2012, mikespook</li>
178 <li>Copyright &copy; 2012, mikespook</li>
178 <li>Copyright &copy; 2012, nansenat16</li>
179 <li>Copyright &copy; 2012, nansenat16</li>
179 <li>Copyright &copy; 2012, Philip Jameson</li>
180 <li>Copyright &copy; 2012, Philip Jameson</li>
180 <li>Copyright &copy; 2012, Raoul Thill</li>
181 <li>Copyright &copy; 2012, Raoul Thill</li>
181 <li>Copyright &copy; 2012, Tony Bussieres</li>
182 <li>Copyright &copy; 2012, Tony Bussieres</li>
182 <li>Copyright &copy; 2012, Vincent Duvert</li>
183 <li>Copyright &copy; 2012, Vincent Duvert</li>
183 <li>Copyright &copy; 2012, Vladislav Poluhin</li>
184 <li>Copyright &copy; 2012, Vladislav Poluhin</li>
184 <li>Copyright &copy; 2012, Zachary Auclair</li>
185 <li>Copyright &copy; 2012, Zachary Auclair</li>
185 <li>Copyright &copy; 2011, Ankit Solanki</li>
186 <li>Copyright &copy; 2011, Ankit Solanki</li>
186 <li>Copyright &copy; 2011, Dmitri Kuznetsov</li>
187 <li>Copyright &copy; 2011, Dmitri Kuznetsov</li>
187 <li>Copyright &copy; 2011, Jared Bunting</li>
188 <li>Copyright &copy; 2011, Jared Bunting</li>
188 <li>Copyright &copy; 2011, Jason Harris</li>
189 <li>Copyright &copy; 2011, Jason Harris</li>
189 <li>Copyright &copy; 2011, Les Peabody</li>
190 <li>Copyright &copy; 2011, Les Peabody</li>
190 <li>Copyright &copy; 2011, Liad Shani</li>
191 <li>Copyright &copy; 2011, Liad Shani</li>
191 <li>Copyright &copy; 2011, Lorenzo M. Catucci</li>
192 <li>Copyright &copy; 2011, Lorenzo M. Catucci</li>
192 <li>Copyright &copy; 2011, Matt Zuba</li>
193 <li>Copyright &copy; 2011, Matt Zuba</li>
193 <li>Copyright &copy; 2011, Nicolas VINOT</li>
194 <li>Copyright &copy; 2011, Nicolas VINOT</li>
194 <li>Copyright &copy; 2011, Shawn K. O'Shea</li>
195 <li>Copyright &copy; 2011, Shawn K. O'Shea</li>
195 <li>Copyright &copy; 2010, Łukasz Balcerzak</li>
196 <li>Copyright &copy; 2010, Łukasz Balcerzak</li>
196
197
197 ## We did not list the following copyright holders, given that they appeared
198 ## We did not list the following copyright holders, given that they appeared
198 ## to use for-profit company affiliations in their contribution in the
199 ## to use for-profit company affiliations in their contribution in the
199 ## Mercurial log and therefore I didn't know if copyright was theirs or
200 ## Mercurial log and therefore I didn't know if copyright was theirs or
200 ## their company's.
201 ## their company's.
201 ## Copyright &copy; 2011 Thayne Harbaugh <thayne@fusionio.com>
202 ## Copyright &copy; 2011 Thayne Harbaugh <thayne@fusionio.com>
202 ## Copyright &copy; 2012 Dies Koper <diesk@fast.au.fujitsu.com>
203 ## Copyright &copy; 2012 Dies Koper <diesk@fast.au.fujitsu.com>
203 ## Copyright &copy; 2012 Erwin Kroon <e.kroon@smartmetersolutions.nl>
204 ## Copyright &copy; 2012 Erwin Kroon <e.kroon@smartmetersolutions.nl>
204 ## Copyright &copy; 2012 Vincent Caron <vcaron@bearstech.com>
205 ## Copyright &copy; 2012 Vincent Caron <vcaron@bearstech.com>
205 ##
206 ##
206 ## These contributors' contributions may not be copyrightable:
207 ## These contributors' contributions may not be copyrightable:
207 ## philip.j@hostdime.com in 2012
208 ## philip.j@hostdime.com in 2012
208 ## Stefan Engel <mail@engel-stefan.de> in 2012
209 ## Stefan Engel <mail@engel-stefan.de> in 2012
209 ## Ton Plomp <tcplomp@gmail.com> in 2013
210 ## Ton Plomp <tcplomp@gmail.com> in 2013
210 ##
211 ##
211 </ul>
212 </ul>
212
213
213 <p>The above are the copyright holders who have submitted direct
214 <p>The above are the copyright holders who have submitted direct
214 contributions to the Kallithea repository.</p>
215 contributions to the Kallithea repository.</p>
215
216
216 <p>In the <a href="https://kallithea-scm.org/repos/kallithea">Kallithea
217 <p>In the <a href="https://kallithea-scm.org/repos/kallithea">Kallithea
217 source code</a>, there is a
218 source code</a>, there is a
218 <a href="https://kallithea-scm.org/repos/kallithea/files/tip/LICENSE.md">list
219 <a href="https://kallithea-scm.org/repos/kallithea/files/tip/LICENSE.md">list
219 of third-party libraries and code that Kallithea incorporates</a>.</p>
220 of third-party libraries and code that Kallithea incorporates</a>.</p>
220
221
221 <p>The front-end contains a <a href="${h.url('/LICENSES.txt')}">list of
222 <p>The front-end contains a <a href="${h.url('/LICENSES.txt')}">list of
222 software that is used to build the front-end</a> but isn't distributed as a
223 software that is used to build the front-end</a> but isn't distributed as a
223 part of Kallithea.</p>
224 part of Kallithea.</p>
224
225
225 </div>
226 </div>
226 </div>
227 </div>
227
228
228 </%def>
229 </%def>
General Comments 0
You need to be logged in to leave comments. Login now