{"action":"created","comment":{"url":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/comments/241103938","pull_request_review_id":184292333,"id":241103938,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI0MTEwMzkzOA==","diff_hunk":"@@ -0,0 +1,90 @@\n+/*\n+ * Copyright (C) 2017 Kaspar Schleiser <kaspar@schleiser.de>\n+ *                    Inria\n+ *\n+ * This file is subject to the terms and conditions of the GNU Lesser\n+ * General Public License v2.1. See the file LICENSE in the top level\n+ * directory for more details.\n+ */\n+\n+/**\n+ * @ingroup     sys_riotboot_slot\n+ * @{\n+ *\n+ * @file\n+ * @brief       Slot management functions\n+ *\n+ * @author      Kaspar Schleiser <kaspar@schleiser.de>\n+ * @author      Francisco Acosta <francisco.acosta@inria.fr>\n+ *\n+ * @}\n+ */\n+#include <string.h>\n+\n+#include \"cpu.h\"\n+#include \"riotboot/slot.h\"\n+#include \"riotboot/hdr.h\"\n+\n+/*\n+ * Store the start addresses of each slot.\n+ * Take into account that CPU_FLASH_BASE represents the starting\n+ * address of the bootloader, thus the header is located after the\n+ * space reserved to the bootloader.\n+ */\n+const riotboot_hdr_t * const riotboot_slots[] = {\n+    (riotboot_hdr_t*)(CPU_FLASH_BASE + SLOT0_OFFSET),   /* First slot address -> firmware image */\n+};\n+\n+/* Calculate the number of slots */\n+const unsigned riotboot_slot_numof = sizeof(riotboot_slots) / sizeof(riotboot_hdr_t*);\n+\n+static void _riotboot_slot_jump_to_image(const riotboot_hdr_t *hdr)\n+{\n+    cpu_jump_to_image(hdr->start_addr);\n+}\n+\n+int riotboot_slot_current(void)\n+{\n+    uint32_t base_addr = cpu_get_image_baseaddr();\n+\n+    for (unsigned i = 0; i < riotboot_slot_numof; i++) {\n+        const riotboot_hdr_t *hdr = riotboot_slot_get_hdr(i);\n+        if (base_addr == hdr->start_addr) {\n+            return i;\n+        }\n+    }\n+\n+    return -1;\n+}\n+\n+void riotboot_slot_jump(unsigned slot)\n+{\n+    _riotboot_slot_jump_to_image(riotboot_slot_get_hdr(slot));\n+}\n+\n+uint32_t riotboot_slot_get_image_startaddr(unsigned slot)\n+{\n+    return riotboot_slot_get_hdr(slot)->start_addr;","path":"sys/riotboot/slot.c","position":67,"original_position":67,"commit_id":"10aca80f58d6dd2d70fb405fa57b1b1fc93fefc3","original_commit_id":"2c2bf33038a1ad7e51fc112c77ddad4801661834","user":{"login":"danpetry","id":11301549,"node_id":"MDQ6VXNlcjExMzAxNTQ5","avatar_url":"https://avatars2.githubusercontent.com/u/11301549?v=4","gravatar_id":"","url":"https://api.github.com/users/danpetry","html_url":"https://github.com/danpetry","followers_url":"https://api.github.com/users/danpetry/followers","following_url":"https://api.github.com/users/danpetry/following{/other_user}","gists_url":"https://api.github.com/users/danpetry/gists{/gist_id}","starred_url":"https://api.github.com/users/danpetry/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danpetry/subscriptions","organizations_url":"https://api.github.com/users/danpetry/orgs","repos_url":"https://api.github.com/users/danpetry/repos","events_url":"https://api.github.com/users/danpetry/events{/privacy}","received_events_url":"https://api.github.com/users/danpetry/received_events","type":"User","site_admin":false},"body":"Merged, thanks","created_at":"2018-12-12T17:09:11Z","updated_at":"2018-12-12T17:09:11Z","html_url":"https://github.com/RIOT-OS/RIOT/pull/10065#discussion_r241103938","pull_request_url":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/10065","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/comments/241103938"},"html":{"href":"https://github.com/RIOT-OS/RIOT/pull/10065#discussion_r241103938"},"pull_request":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/10065"}},"in_reply_to_id":240667776},"pull_request":{"url":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/10065","id":218736787,"node_id":"MDExOlB1bGxSZXF1ZXN0MjE4NzM2Nzg3","html_url":"https://github.com/RIOT-OS/RIOT/pull/10065","diff_url":"https://github.com/RIOT-OS/RIOT/pull/10065.diff","patch_url":"https://github.com/RIOT-OS/RIOT/pull/10065.patch","issue_url":"https://api.github.com/repos/RIOT-OS/RIOT/issues/10065","number":10065,"state":"open","locked":false,"title":"bootloader: add riotboot minimal bootloader","user":{"login":"kYc0o","id":5419775,"node_id":"MDQ6VXNlcjU0MTk3NzU=","avatar_url":"https://avatars1.githubusercontent.com/u/5419775?v=4","gravatar_id":"","url":"https://api.github.com/users/kYc0o","html_url":"https://github.com/kYc0o","followers_url":"https://api.github.com/users/kYc0o/followers","following_url":"https://api.github.com/users/kYc0o/following{/other_user}","gists_url":"https://api.github.com/users/kYc0o/gists{/gist_id}","starred_url":"https://api.github.com/users/kYc0o/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kYc0o/subscriptions","organizations_url":"https://api.github.com/users/kYc0o/orgs","repos_url":"https://api.github.com/users/kYc0o/repos","events_url":"https://api.github.com/users/kYc0o/events{/privacy}","received_events_url":"https://api.github.com/users/kYc0o/received_events","type":"User","site_admin":false},"body":"<!--\r\nThe RIOT community cares a lot about code quality.\r\nTherefore, before describing what your contribution is about, we would like\r\nyou to make sure that your modifications are compliant with the RIOT\r\ncoding conventions, see https://github.com/RIOT-OS/RIOT/wiki/Coding-conventions.\r\n-->\r\n<!--\r\nPut here the description of your contribution:\r\n- describe which part(s) of RIOT is (are) involved\r\n- if it's a bug fix, describe the bug that it solves and how it is solved\r\n- you can also give more information to reviewers about how to test your changes\r\n-->\r\n\r\n### Contribution description\r\n#### RIOT image header and \"riotboot\" bootloader\r\n##### Overview\r\n \r\n`riotboot` is the name of a minimal bootloader application and infrastructure.\r\nIt consists of\r\n  - the application \"riotboot\" in the bootloaders folder which serves as minimal bootloader\r\n  - the module \"riot_hdr\" used to recognise RIOT firmware images which riotboot can boot.\r\n  - the module \"slot_util\" used to manage the images (slots) with a RIOT header attached to them\r\n  - a tool in dist/tools/riot_hdr for header generation.\r\n  - several make targets to glue everything together\r\n\r\n##### Concept\r\n`riotboot` expects the flash to be separated in slots: at CPU_FLASH_BASE address resides the bootloader, which is followed by a slot 0 with a firmware image.\r\n\r\nA RIOT image with a single slot looks like:\r\n```\r\n|------------------------------- FLASH -------------------------------------|\r\n|----- RIOTBOOT_LEN ----|----------- RIOTBOOT_SLOT_SIZE (slot 0) -----------|\r\n                        |--- RIOTBOOT_HDR_LEN ----|\r\n ---------------------------------------------------------------------------\r\n|       bootloader      | riot_hdr_t + filler (0) |     RIOT firmware       |\r\n ---------------------------------------------------------------------------\r\n```\r\nPlease note that `RIOTBOOT_HDR_LEN` depends on the architecture of the MCU, since it needs to be aligned to 256B. This is fixed regardless of `sizeof(riot_hdr_t)`.\r\n\r\nThe bootloader will, on reset, verify the checksum of the first slot, then boot it. If the slot doesn't have a valid checksum, no image will be booted and the bootloader will enter `while(1);`.\r\n\r\nThe header contains\r\n```c\r\n/**\r\n * @brief Structure to store image header - All members are little endian\r\n * @{\r\n */\r\ntypedef struct {\r\n    uint32_t magic_number;         /**< header magic_number (always \"RIOT\")    */\r\n    uint32_t version;              /**< Integer representing firmware version  */\r\n    uint32_t start_addr;           /**< Start address in flash                 */\r\n    uint32_t chksum;               /**< checksum of riot_hdr                   */\r\n} riot_hdr_t;\r\n/** @} */\r\n```\r\nThe bootloader \"riotboot\" only cares about checksum.\r\n\r\n\r\n### Testing procedure\r\n\r\n<!--\r\nDetails steps to test your contribution:\r\n- which test/example to compile for which board and is there a 'test' command\r\n- how to know that it was not working/available in master\r\n- the expected success test output\r\n-->\r\nThere's a test provided in tests/riotboot. This has only tested for now in:\r\n  - [x] samr21-xpro\r\n  - [x] iotlab-m3 (desk)\r\n  - [x] nucleo-l152re\r\n\r\nPlease add above the boards that you have tested and worked.\r\n\r\n### Issues/PRs references\r\n\r\n<!--\r\nExamples: Fixes #1234. See also #5678. Depends on PR #9876.\r\n\r\nPlease use keywords (e.g., fixes, resolve) with the links to the issues you\r\nresolved, this way they will be automatically closed when your pull request\r\nis merged. See https://help.github.com/articles/closing-issues-using-keywords/.\r\n-->\r\n#9342 \r\n#9969 ","created_at":"2018-09-27T17:50:21Z","updated_at":"2018-12-12T17:09:11Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9f975227f09080ff818f836859b9ebfa75979ea8","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":895678065,"node_id":"MDU6TGFiZWw4OTU2NzgwNjU=","url":"https://api.github.com/repos/RIOT-OS/RIOT/labels/Area:%20OTA","name":"Area: OTA","color":"6600ff","default":false},{"id":214816571,"node_id":"MDU6TGFiZWwyMTQ4MTY1NzE=","url":"https://api.github.com/repos/RIOT-OS/RIOT/labels/CI:%20ready%20for%20build","name":"CI: ready for build","color":"66ffcc","default":false},{"id":872251341,"node_id":"MDU6TGFiZWw4NzIyNTEzNDE=","url":"https://api.github.com/repos/RIOT-OS/RIOT/labels/CI:%20run%20tests","name":"CI: run tests","color":"66ffcc","default":false},{"id":76555437,"node_id":"MDU6TGFiZWw3NjU1NTQzNw==","url":"https://api.github.com/repos/RIOT-OS/RIOT/labels/Platform:%20ARM","name":"Platform: ARM","color":"999999","default":false},{"id":1075449391,"node_id":"MDU6TGFiZWwxMDc1NDQ5Mzkx","url":"https://api.github.com/repos/RIOT-OS/RIOT/labels/Reviewed:%201-fundamentals","name":"Reviewed: 1-fundamentals","color":"00dd00","default":false},{"id":1075452917,"node_id":"MDU6TGFiZWwxMDc1NDUyOTE3","url":"https://api.github.com/repos/RIOT-OS/RIOT/labels/Reviewed:%205-documentation","name":"Reviewed: 5-documentation","color":"00dd00","default":false},{"id":97458574,"node_id":"MDU6TGFiZWw5NzQ1ODU3NA==","url":"https://api.github.com/repos/RIOT-OS/RIOT/labels/Type:%20new%20feature","name":"Type: new feature","color":"ffff66","default":false}],"milestone":{"url":"https://api.github.com/repos/RIOT-OS/RIOT/milestones/25","html_url":"https://github.com/RIOT-OS/RIOT/milestone/25","labels_url":"https://api.github.com/repos/RIOT-OS/RIOT/milestones/25/labels","id":3745672,"node_id":"MDk6TWlsZXN0b25lMzc0NTY3Mg==","number":25,"title":"Release 2019.01","description":"","creator":{"login":"jia200x","id":1260616,"node_id":"MDQ6VXNlcjEyNjA2MTY=","avatar_url":"https://avatars3.githubusercontent.com/u/1260616?v=4","gravatar_id":"","url":"https://api.github.com/users/jia200x","html_url":"https://github.com/jia200x","followers_url":"https://api.github.com/users/jia200x/followers","following_url":"https://api.github.com/users/jia200x/following{/other_user}","gists_url":"https://api.github.com/users/jia200x/gists{/gist_id}","starred_url":"https://api.github.com/users/jia200x/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jia200x/subscriptions","organizations_url":"https://api.github.com/users/jia200x/orgs","repos_url":"https://api.github.com/users/jia200x/repos","events_url":"https://api.github.com/users/jia200x/events{/privacy}","received_events_url":"https://api.github.com/users/jia200x/received_events","type":"User","site_admin":false},"open_issues":103,"closed_issues":101,"state":"open","created_at":"2018-10-17T08:14:28Z","updated_at":"2018-12-12T16:26:15Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/10065/commits","review_comments_url":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/10065/comments","review_comment_url":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/comments{/number}","comments_url":"https://api.github.com/repos/RIOT-OS/RIOT/issues/10065/comments","statuses_url":"https://api.github.com/repos/RIOT-OS/RIOT/statuses/10aca80f58d6dd2d70fb405fa57b1b1fc93fefc3","head":{"label":"kYc0o:pr/riotboot","ref":"pr/riotboot","sha":"10aca80f58d6dd2d70fb405fa57b1b1fc93fefc3","user":{"login":"kYc0o","id":5419775,"node_id":"MDQ6VXNlcjU0MTk3NzU=","avatar_url":"https://avatars1.githubusercontent.com/u/5419775?v=4","gravatar_id":"","url":"https://api.github.com/users/kYc0o","html_url":"https://github.com/kYc0o","followers_url":"https://api.github.com/users/kYc0o/followers","following_url":"https://api.github.com/users/kYc0o/following{/other_user}","gists_url":"https://api.github.com/users/kYc0o/gists{/gist_id}","starred_url":"https://api.github.com/users/kYc0o/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kYc0o/subscriptions","organizations_url":"https://api.github.com/users/kYc0o/orgs","repos_url":"https://api.github.com/users/kYc0o/repos","events_url":"https://api.github.com/users/kYc0o/events{/privacy}","received_events_url":"https://api.github.com/users/kYc0o/received_events","type":"User","site_admin":false},"repo":{"id":41047111,"node_id":"MDEwOlJlcG9zaXRvcnk0MTA0NzExMQ==","name":"RIOT","full_name":"kYc0o/RIOT","private":false,"owner":{"login":"kYc0o","id":5419775,"node_id":"MDQ6VXNlcjU0MTk3NzU=","avatar_url":"https://avatars1.githubusercontent.com/u/5419775?v=4","gravatar_id":"","url":"https://api.github.com/users/kYc0o","html_url":"https://github.com/kYc0o","followers_url":"https://api.github.com/users/kYc0o/followers","following_url":"https://api.github.com/users/kYc0o/following{/other_user}","gists_url":"https://api.github.com/users/kYc0o/gists{/gist_id}","starred_url":"https://api.github.com/users/kYc0o/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kYc0o/subscriptions","organizations_url":"https://api.github.com/users/kYc0o/orgs","repos_url":"https://api.github.com/users/kYc0o/repos","events_url":"https://api.github.com/users/kYc0o/events{/privacy}","received_events_url":"https://api.github.com/users/kYc0o/received_events","type":"User","site_admin":false},"html_url":"https://github.com/kYc0o/RIOT","description":"RIOT -  The friendly OS for IoT","fork":true,"url":"https://api.github.com/repos/kYc0o/RIOT","forks_url":"https://api.github.com/repos/kYc0o/RIOT/forks","keys_url":"https://api.github.com/repos/kYc0o/RIOT/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kYc0o/RIOT/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kYc0o/RIOT/teams","hooks_url":"https://api.github.com/repos/kYc0o/RIOT/hooks","issue_events_url":"https://api.github.com/repos/kYc0o/RIOT/issues/events{/number}","events_url":"https://api.github.com/repos/kYc0o/RIOT/events","assignees_url":"https://api.github.com/repos/kYc0o/RIOT/assignees{/user}","branches_url":"https://api.github.com/repos/kYc0o/RIOT/branches{/branch}","tags_url":"https://api.github.com/repos/kYc0o/RIOT/tags","blobs_url":"https://api.github.com/repos/kYc0o/RIOT/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kYc0o/RIOT/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kYc0o/RIOT/git/refs{/sha}","trees_url":"https://api.github.com/repos/kYc0o/RIOT/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kYc0o/RIOT/statuses/{sha}","languages_url":"https://api.github.com/repos/kYc0o/RIOT/languages","stargazers_url":"https://api.github.com/repos/kYc0o/RIOT/stargazers","contributors_url":"https://api.github.com/repos/kYc0o/RIOT/contributors","subscribers_url":"https://api.github.com/repos/kYc0o/RIOT/subscribers","subscription_url":"https://api.github.com/repos/kYc0o/RIOT/subscription","commits_url":"https://api.github.com/repos/kYc0o/RIOT/commits{/sha}","git_commits_url":"https://api.github.com/repos/kYc0o/RIOT/git/commits{/sha}","comments_url":"https://api.github.com/repos/kYc0o/RIOT/comments{/number}","issue_comment_url":"https://api.github.com/repos/kYc0o/RIOT/issues/comments{/number}","contents_url":"https://api.github.com/repos/kYc0o/RIOT/contents/{+path}","compare_url":"https://api.github.com/repos/kYc0o/RIOT/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kYc0o/RIOT/merges","archive_url":"https://api.github.com/repos/kYc0o/RIOT/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kYc0o/RIOT/downloads","issues_url":"https://api.github.com/repos/kYc0o/RIOT/issues{/number}","pulls_url":"https://api.github.com/repos/kYc0o/RIOT/pulls{/number}","milestones_url":"https://api.github.com/repos/kYc0o/RIOT/milestones{/number}","notifications_url":"https://api.github.com/repos/kYc0o/RIOT/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kYc0o/RIOT/labels{/name}","releases_url":"https://api.github.com/repos/kYc0o/RIOT/releases{/id}","deployments_url":"https://api.github.com/repos/kYc0o/RIOT/deployments","created_at":"2015-08-19T16:49:55Z","updated_at":"2018-12-07T16:28:02Z","pushed_at":"2018-12-12T16:32:38Z","git_url":"git://github.com/kYc0o/RIOT.git","ssh_url":"git@github.com:kYc0o/RIOT.git","clone_url":"https://github.com/kYc0o/RIOT.git","svn_url":"https://github.com/kYc0o/RIOT","homepage":"https://github.com/RIOT-OS/RIOT/wiki","size":60110,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"archived":false,"open_issues_count":4,"license":{"key":"lgpl-2.1","name":"GNU Lesser General Public License v2.1","spdx_id":"LGPL-2.1","url":"https://api.github.com/licenses/lgpl-2.1","node_id":"MDc6TGljZW5zZTEx"},"forks":2,"open_issues":4,"watchers":0,"default_branch":"master"}},"base":{"label":"RIOT-OS:master","ref":"master","sha":"35626eda50bb693a06daf7f60de0048eb797cae6","user":{"login":"RIOT-OS","id":3079480,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMwNzk0ODA=","avatar_url":"https://avatars2.githubusercontent.com/u/3079480?v=4","gravatar_id":"","url":"https://api.github.com/users/RIOT-OS","html_url":"https://github.com/RIOT-OS","followers_url":"https://api.github.com/users/RIOT-OS/followers","following_url":"https://api.github.com/users/RIOT-OS/following{/other_user}","gists_url":"https://api.github.com/users/RIOT-OS/gists{/gist_id}","starred_url":"https://api.github.com/users/RIOT-OS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/RIOT-OS/subscriptions","organizations_url":"https://api.github.com/users/RIOT-OS/orgs","repos_url":"https://api.github.com/users/RIOT-OS/repos","events_url":"https://api.github.com/users/RIOT-OS/events{/privacy}","received_events_url":"https://api.github.com/users/RIOT-OS/received_events","type":"Organization","site_admin":false},"repo":{"id":7370241,"node_id":"MDEwOlJlcG9zaXRvcnk3MzcwMjQx","name":"RIOT","full_name":"RIOT-OS/RIOT","private":false,"owner":{"login":"RIOT-OS","id":3079480,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMwNzk0ODA=","avatar_url":"https://avatars2.githubusercontent.com/u/3079480?v=4","gravatar_id":"","url":"https://api.github.com/users/RIOT-OS","html_url":"https://github.com/RIOT-OS","followers_url":"https://api.github.com/users/RIOT-OS/followers","following_url":"https://api.github.com/users/RIOT-OS/following{/other_user}","gists_url":"https://api.github.com/users/RIOT-OS/gists{/gist_id}","starred_url":"https://api.github.com/users/RIOT-OS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/RIOT-OS/subscriptions","organizations_url":"https://api.github.com/users/RIOT-OS/orgs","repos_url":"https://api.github.com/users/RIOT-OS/repos","events_url":"https://api.github.com/users/RIOT-OS/events{/privacy}","received_events_url":"https://api.github.com/users/RIOT-OS/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/RIOT-OS/RIOT","description":"RIOT -  The friendly OS for IoT","fork":false,"url":"https://api.github.com/repos/RIOT-OS/RIOT","forks_url":"https://api.github.com/repos/RIOT-OS/RIOT/forks","keys_url":"https://api.github.com/repos/RIOT-OS/RIOT/keys{/key_id}","collaborators_url":"https://api.github.com/repos/RIOT-OS/RIOT/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/RIOT-OS/RIOT/teams","hooks_url":"https://api.github.com/repos/RIOT-OS/RIOT/hooks","issue_events_url":"https://api.github.com/repos/RIOT-OS/RIOT/issues/events{/number}","events_url":"https://api.github.com/repos/RIOT-OS/RIOT/events","assignees_url":"https://api.github.com/repos/RIOT-OS/RIOT/assignees{/user}","branches_url":"https://api.github.com/repos/RIOT-OS/RIOT/branches{/branch}","tags_url":"https://api.github.com/repos/RIOT-OS/RIOT/tags","blobs_url":"https://api.github.com/repos/RIOT-OS/RIOT/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/RIOT-OS/RIOT/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/RIOT-OS/RIOT/git/refs{/sha}","trees_url":"https://api.github.com/repos/RIOT-OS/RIOT/git/trees{/sha}","statuses_url":"https://api.github.com/repos/RIOT-OS/RIOT/statuses/{sha}","languages_url":"https://api.github.com/repos/RIOT-OS/RIOT/languages","stargazers_url":"https://api.github.com/repos/RIOT-OS/RIOT/stargazers","contributors_url":"https://api.github.com/repos/RIOT-OS/RIOT/contributors","subscribers_url":"https://api.github.com/repos/RIOT-OS/RIOT/subscribers","subscription_url":"https://api.github.com/repos/RIOT-OS/RIOT/subscription","commits_url":"https://api.github.com/repos/RIOT-OS/RIOT/commits{/sha}","git_commits_url":"https://api.github.com/repos/RIOT-OS/RIOT/git/commits{/sha}","comments_url":"https://api.github.com/repos/RIOT-OS/RIOT/comments{/number}","issue_comment_url":"https://api.github.com/repos/RIOT-OS/RIOT/issues/comments{/number}","contents_url":"https://api.github.com/repos/RIOT-OS/RIOT/contents/{+path}","compare_url":"https://api.github.com/repos/RIOT-OS/RIOT/compare/{base}...{head}","merges_url":"https://api.github.com/repos/RIOT-OS/RIOT/merges","archive_url":"https://api.github.com/repos/RIOT-OS/RIOT/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/RIOT-OS/RIOT/downloads","issues_url":"https://api.github.com/repos/RIOT-OS/RIOT/issues{/number}","pulls_url":"https://api.github.com/repos/RIOT-OS/RIOT/pulls{/number}","milestones_url":"https://api.github.com/repos/RIOT-OS/RIOT/milestones{/number}","notifications_url":"https://api.github.com/repos/RIOT-OS/RIOT/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/RIOT-OS/RIOT/labels{/name}","releases_url":"https://api.github.com/repos/RIOT-OS/RIOT/releases{/id}","deployments_url":"https://api.github.com/repos/RIOT-OS/RIOT/deployments","created_at":"2012-12-29T20:38:40Z","updated_at":"2018-12-12T15:45:10Z","pushed_at":"2018-12-12T16:49:55Z","git_url":"git://github.com/RIOT-OS/RIOT.git","ssh_url":"git@github.com:RIOT-OS/RIOT.git","clone_url":"https://github.com/RIOT-OS/RIOT.git","svn_url":"https://github.com/RIOT-OS/RIOT","homepage":"https://github.com/RIOT-OS/RIOT/wiki","size":60047,"stargazers_count":2158,"watchers_count":2158,"language":"C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1193,"mirror_url":null,"archived":false,"open_issues_count":935,"license":{"key":"lgpl-2.1","name":"GNU Lesser General Public License v2.1","spdx_id":"LGPL-2.1","url":"https://api.github.com/licenses/lgpl-2.1","node_id":"MDc6TGljZW5zZTEx"},"forks":1193,"open_issues":935,"watchers":2158,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/10065"},"html":{"href":"https://github.com/RIOT-OS/RIOT/pull/10065"},"issue":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/issues/10065"},"comments":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/issues/10065/comments"},"review_comments":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/10065/comments"},"review_comment":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/10065/commits"},"statuses":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/statuses/10aca80f58d6dd2d70fb405fa57b1b1fc93fefc3"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"danpetry"}}