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