{"action":"created","comment":{"url":"https://api.github.com/repos/ElektraInitiative/libelektra/pulls/comments/89539393","pull_request_review_id":10078662,"id":89539393,"diff_hunk":"@@ -0,0 +1,298 @@\n+#ifndef ELEKTRA_REST_MODEL_USER_HEADER_GUARD\n+#define ELEKTRA_REST_MODEL_USER_HEADER_GUARD\n+\n+#include <map>\n+#include <string>\n+#include <utility>\n+\n+#include <boost/algorithm/string/compare.hpp>\n+#include <boost/algorithm/string/predicate.hpp>\n+\n+#include \"config.hpp\"\n+#include \"exceptions.hpp\"\n+#include \"kdb_includes.hpp\"\n+\n+namespace kdbrest\n+{\n+\n+namespace model\n+{\n+\n+typedef bool (*comp_func) ();\n+\n+class User : public kdb::Key\n+{\n+\n+public:\n+\t/**\n+                 * Constructs an User object based on a kdb::Key object.\n+                 * It is an alternative for an upwards cast.\n+                 * @param key A kdb::Key object\n+                 */\n+\tinline User (kdb::Key & k) : kdb::Key (k)\n+\t{\n+\t}\n+\t/**\n+                 * Constructs an User object based on a username.\n+                 * It implicitely constructs a kdb::Key object by super().\n+                 * Adds the base user repository path to the username, so it\n+                 * is a valid key to be use with KDB.\n+                 * @param username The username to be used for the key\n+                 */\n+\tinline User (std::string username) : kdb::Key (ELEKTRA_REST_USER_REPOSITORY_PATH + std::string (\"/\") + username, KEY_END)\n+\t{\n+\t}\n+\n+\t/**\n+                 * Adds a key as sub key. Does check if the given key is really\n+                 * a sub key. If not, nothing is changed.\n+                 * @param key The key do be added as sub key, if it is one.\n+                 */\n+\tvoid addSubkey (kdb::Key & k)\n+\t{\n+\t\tif (k.isBelow (static_cast<kdb::Key &> (*this)))\n+\t\t{\n+\t\t\tm_subkeys.append (k);\n+\t\t}\n+\t}\n+\t/**\n+                 * Adds several keys as sub key. Relies on addSubkey(), so the\n+                 * conditional checks are done also for the mass add function.\n+                 * @param iter_start A KeySet iterator from where on sub keys should be added\n+\t\t\t\t * @param iter_end The end of the KeySet until we can read\n+\t\t\t\t * @return The iterator of the first non-child element\n+                 */\n+\tkdb::KeySet::iterator addSubkeys (kdb::KeySet::iterator iter_start, kdb::KeySet::iterator iter_end)\n+\t{\n+\t\tkdb::Key & k = static_cast<kdb::Key &> (*this);\n+\t\tauto elem = iter_start;\n+\t\twhile (elem != iter_end)\n+\t\t{\n+\t\t\tif (elem.get ().isBelow (k))\n+\t\t\t{\n+\t\t\t\tm_subkeys.append (elem.get ());\n+\t\t\t}\n+\t\t\telse\n+\t\t\t{\n+\t\t\t\tbreak; // because keyset is sorted, following keys can't be children\n+\t\t\t}\n+\t\t\telem++;\n+\t\t}\n+\t\treturn elem;\n+\t}\n+\t/**\n+                 * Getter for the kdb::KeySet containing all added sub keys.\n+                 * Returned will be a reference. That means changes to the\n+                 * subkeys keyset will affect the user. This allows for\n+                 * removal of subkeys.\n+                 * @return kdb::KeySet with all sub keys\n+                 */\n+\tkdb::KeySet & getSubkeys ()\n+\t{\n+\t\treturn m_subkeys;\n+\t}\n+\t/**\n+                 * Getter for a sub key by name. If no sub key with the\n+                 * given name exists, an exception will be returned.\n+                 * @param name The name of the sub key to look for\n+                 * @return The requested sub key\n+                 * @throws kdbrest::exception::SubkeyNotFoundException\n+                 */\n+\tkdb::Key getSubkey (const std::string name)\n+\t{\n+\t\tfor (auto elem : this->getSubkeys ())\n+\t\t{\n+\t\t\tif (elem.getName ().compare (this->getName () + std::string (\"/\") + name) == 0)\n+\t\t\t{\n+\t\t\t\treturn elem;\n+\t\t\t}\n+\t\t}\n+\t\tthrow kdbrest::exception::SubkeyNotFoundException ();\n+\t}\n+\n+\t/**\n+                 * Getter for the username.\n+                 * @return Username as string\n+                 */\n+\tstd::string getUsername () const\n+\t{\n+\t\treturn this->getName ().erase (0, sizeof (ELEKTRA_REST_USER_REPOSITORY_PATH));\n+\t}\n+\n+\t/**\n+                 * Setter for the password hash.\n+                 * @param passwordHash Password hash as string\n+                 */\n+\tvoid setPasswordHash (std::string passwordHash)\n+\t{\n+\t\tthis->set (passwordHash);\n+\t}\n+\t/**\n+                 * Getter for the password hash.\n+                 * @return Password hash as string\n+                 */\n+\tstd::string getPasswordHash () const\n+\t{\n+\t\treturn this->get<std::string> ();\n+\t}\n+\n+\t/**\n+                 * Setter for the email\n+                 * @param email Email as string\n+                 */\n+\tvoid setEmail (std::string email)\n+\t{\n+\t\tkdb::Key k;\n+\t\ttry\n+\t\t{\n+\t\t\tk = this->getSubkey (ELEKTRA_REST_MODEL_USER_META_EMAIL);\n+\t\t}\n+\t\tcatch (kdbrest::exception::SubkeyNotFoundException & e)\n+\t\t{\n+\t\t\tk.setName (this->getName () + std::string (\"/\") + ELEKTRA_REST_MODEL_USER_META_EMAIL);\n+\t\t}\n+\t\tk.set<std::string> (email);\n+\t\tthis->addSubkey (k);\n+\t}\n+\t/**\n+                 * Getter for the email.\n+                 * @return Email as string\n+                 */\n+\tstd::string getEmail ()\n+\t{\n+\t\ttry\n+\t\t{\n+\t\t\tkdb::Key k = this->getSubkey (ELEKTRA_REST_MODEL_USER_META_EMAIL);\n+\t\t\treturn k.get<std::string> ();\n+\t\t}\n+\t\tcatch (kdbrest::exception::SubkeyNotFoundException & e)\n+\t\t{\n+\t\t\treturn \"\";\n+\t\t}\n+\t}\n+\n+\t/**\n+                 * Setter for the rank.\n+                 * 3 = Admin\n+                 * 2 = Moderator\n+                 * 1 = User\n+                 * @param rank Rank as integer\n+                 */\n+\tvoid setRank (int rank)\n+\t{\n+\t\tkdb::Key k;\n+\t\ttry\n+\t\t{\n+\t\t\tk = this->getSubkey (ELEKTRA_REST_MODEL_USER_META_RANK);\n+\t\t}\n+\t\tcatch (kdbrest::exception::SubkeyNotFoundException & e)\n+\t\t{\n+\t\t\tk.setName (this->getName () + std::string (\"/\") + ELEKTRA_REST_MODEL_USER_META_RANK);\n+\t\t}\n+\t\tk.set<int> (rank);\n+\t\tthis->addSubkey (k);\n+\t}\n+\t/**\n+                 * Getter for the rank.\n+                 * 3 = Admin\n+                 * 2 = Moderator\n+                 * 1 = User\n+                 * @return Rank as integer\n+                 */\n+\tint getRank ()\n+\t{\n+\t\ttry\n+\t\t{\n+\t\t\tkdb::Key k = this->getSubkey (ELEKTRA_REST_MODEL_USER_META_RANK);\n+\t\t\treturn k.get<int> ();\n+\t\t}\n+\t\tcatch (kdbrest::exception::SubkeyNotFoundException & e)\n+\t\t{\n+\t\t\treturn 1; // default is user rank","path":"src/tools/rest-backend/model_user.hpp","position":211,"original_position":211,"commit_id":"b6ee6bf3c5c92a5029f743f3f9ecfc1a537608bb","original_commit_id":"b6ee6bf3c5c92a5029f743f3f9ecfc1a537608bb","user":{"login":"markus2330","id":7949075,"avatar_url":"https://avatars.githubusercontent.com/u/7949075?v=3","gravatar_id":"","url":"https://api.github.com/users/markus2330","html_url":"https://github.com/markus2330","followers_url":"https://api.github.com/users/markus2330/followers","following_url":"https://api.github.com/users/markus2330/following{/other_user}","gists_url":"https://api.github.com/users/markus2330/gists{/gist_id}","starred_url":"https://api.github.com/users/markus2330/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/markus2330/subscriptions","organizations_url":"https://api.github.com/users/markus2330/orgs","repos_url":"https://api.github.com/users/markus2330/repos","events_url":"https://api.github.com/users/markus2330/events{/privacy}","received_events_url":"https://api.github.com/users/markus2330/received_events","type":"User","site_admin":false},"body":"should be documented above.","created_at":"2016-11-24T19:02:51Z","updated_at":"2016-11-24T19:02:51Z","html_url":"https://github.com/ElektraInitiative/libelektra/pull/829#discussion_r89539393","pull_request_url":"https://api.github.com/repos/ElektraInitiative/libelektra/pulls/829","_links":{"self":{"href":"https://api.github.com/repos/ElektraInitiative/libelektra/pulls/comments/89539393"},"html":{"href":"https://github.com/ElektraInitiative/libelektra/pull/829#discussion_r89539393"},"pull_request":{"href":"https://api.github.com/repos/ElektraInitiative/libelektra/pulls/829"}}},"pull_request":{"url":"https://api.github.com/repos/ElektraInitiative/libelektra/pulls/829","id":76877954,"html_url":"https://github.com/ElektraInitiative/libelektra/pull/829","diff_url":"https://github.com/ElektraInitiative/libelektra/pull/829.diff","patch_url":"https://github.com/ElektraInitiative/libelektra/pull/829.patch","issue_url":"https://api.github.com/repos/ElektraInitiative/libelektra/issues/829","number":829,"state":"open","locked":false,"title":"rest-backend: sharing of configuration snippets","user":{"login":"Namoshek","id":8877609,"avatar_url":"https://avatars.githubusercontent.com/u/8877609?v=3","gravatar_id":"","url":"https://api.github.com/users/Namoshek","html_url":"https://github.com/Namoshek","followers_url":"https://api.github.com/users/Namoshek/followers","following_url":"https://api.github.com/users/Namoshek/following{/other_user}","gists_url":"https://api.github.com/users/Namoshek/gists{/gist_id}","starred_url":"https://api.github.com/users/Namoshek/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Namoshek/subscriptions","organizations_url":"https://api.github.com/users/Namoshek/orgs","repos_url":"https://api.github.com/users/Namoshek/repos","events_url":"https://api.github.com/users/Namoshek/events{/privacy}","received_events_url":"https://api.github.com/users/Namoshek/received_events","type":"User","site_admin":false},"body":"This is a first prototype of my REST backend. It has been developed outside of the Elektra source tree and has just been integrated into CMake, so there might be lots of bugs and possible improvements (I'm quite sure the compiling of the tests can be massively improved because all source files are compiled again for each test, I just don't have a clue how to separate this). I'm aware of all compiler warnings; I developed with less flags, so these need to be resolved first. I'll also try to minimize the cryptlite library to what is used (or get rid of it by using boost directly).\r\n\r\nWhen installing the tool, four files are copied into the elektra tool directory (elektra-rest-backend, run.sh, stop.sh and a config.js). Obviously the run.sh starts the application with the configuration of the config.js file. The service can also be tested with normal `make` (then everything remains in the directory).\r\n\r\nTo be able to use the convertion function, it is necessary to add some storage plugins to the following kdb-key `system/elektra/tools/kdbrest/formats`. This value should have a format in form of a string like `ini:ni xml:xmltool dump:dump`. Changes to this key require a restart of the REST service because the plugins are cached (on first use of the service).\r\nIt can also be a good idea to add individual mountpoints for `dir/repository` and `dir/users` (which can be changed in the config.hpp if necessary).\r\n\r\nImportant: The service caches all repository entries in-memory to increase performance (and that quite significantly). Direct changes to the database (without usage of the service) will only be visible after restart of the service.\r\n\r\nThe test suite is not complete yet.\r\n\r\n---\r\n# TODOs\r\n- [x] Change `users` endpoint to `user`\r\n- [x] Change format list of conversion endpoint\r\n- [x] Change output of list for snippet conversions (add plugin name)\r\n- [x] Fix issue: request raw format of snippet\r\n- [x] Find better email regex\r\n- [x] Remove unused warnings\r\n- [x] Function documentation\r\n- [x] Output of supported formats should be sorted by status of plugins\r\n- [x] Find replacement for `cryptlite` lib\r\n","created_at":"2016-07-10T16:52:36Z","updated_at":"2016-11-24T19:25:13Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5f254cef924f696b9c8cd818b59e53b18cb5dda7","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/ElektraInitiative/libelektra/pulls/829/commits","review_comments_url":"https://api.github.com/repos/ElektraInitiative/libelektra/pulls/829/comments","review_comment_url":"https://api.github.com/repos/ElektraInitiative/libelektra/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ElektraInitiative/libelektra/issues/829/comments","statuses_url":"https://api.github.com/repos/ElektraInitiative/libelektra/statuses/b6ee6bf3c5c92a5029f743f3f9ecfc1a537608bb","head":{"label":"Namoshek:elektra-rest","ref":"elektra-rest","sha":"b6ee6bf3c5c92a5029f743f3f9ecfc1a537608bb","user":{"login":"Namoshek","id":8877609,"avatar_url":"https://avatars.githubusercontent.com/u/8877609?v=3","gravatar_id":"","url":"https://api.github.com/users/Namoshek","html_url":"https://github.com/Namoshek","followers_url":"https://api.github.com/users/Namoshek/followers","following_url":"https://api.github.com/users/Namoshek/following{/other_user}","gists_url":"https://api.github.com/users/Namoshek/gists{/gist_id}","starred_url":"https://api.github.com/users/Namoshek/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Namoshek/subscriptions","organizations_url":"https://api.github.com/users/Namoshek/orgs","repos_url":"https://api.github.com/users/Namoshek/repos","events_url":"https://api.github.com/users/Namoshek/events{/privacy}","received_events_url":"https://api.github.com/users/Namoshek/received_events","type":"User","site_admin":false},"repo":{"id":53196992,"name":"libelektra","full_name":"Namoshek/libelektra","owner":{"login":"Namoshek","id":8877609,"avatar_url":"https://avatars.githubusercontent.com/u/8877609?v=3","gravatar_id":"","url":"https://api.github.com/users/Namoshek","html_url":"https://github.com/Namoshek","followers_url":"https://api.github.com/users/Namoshek/followers","following_url":"https://api.github.com/users/Namoshek/following{/other_user}","gists_url":"https://api.github.com/users/Namoshek/gists{/gist_id}","starred_url":"https://api.github.com/users/Namoshek/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Namoshek/subscriptions","organizations_url":"https://api.github.com/users/Namoshek/orgs","repos_url":"https://api.github.com/users/Namoshek/repos","events_url":"https://api.github.com/users/Namoshek/events{/privacy}","received_events_url":"https://api.github.com/users/Namoshek/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Namoshek/libelektra","description":"Elektra serves as a universal and secure framework to access configuration parameters in a global, hierarchical key database.","fork":true,"url":"https://api.github.com/repos/Namoshek/libelektra","forks_url":"https://api.github.com/repos/Namoshek/libelektra/forks","keys_url":"https://api.github.com/repos/Namoshek/libelektra/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Namoshek/libelektra/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Namoshek/libelektra/teams","hooks_url":"https://api.github.com/repos/Namoshek/libelektra/hooks","issue_events_url":"https://api.github.com/repos/Namoshek/libelektra/issues/events{/number}","events_url":"https://api.github.com/repos/Namoshek/libelektra/events","assignees_url":"https://api.github.com/repos/Namoshek/libelektra/assignees{/user}","branches_url":"https://api.github.com/repos/Namoshek/libelektra/branches{/branch}","tags_url":"https://api.github.com/repos/Namoshek/libelektra/tags","blobs_url":"https://api.github.com/repos/Namoshek/libelektra/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Namoshek/libelektra/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Namoshek/libelektra/git/refs{/sha}","trees_url":"https://api.github.com/repos/Namoshek/libelektra/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Namoshek/libelektra/statuses/{sha}","languages_url":"https://api.github.com/repos/Namoshek/libelektra/languages","stargazers_url":"https://api.github.com/repos/Namoshek/libelektra/stargazers","contributors_url":"https://api.github.com/repos/Namoshek/libelektra/contributors","subscribers_url":"https://api.github.com/repos/Namoshek/libelektra/subscribers","subscription_url":"https://api.github.com/repos/Namoshek/libelektra/subscription","commits_url":"https://api.github.com/repos/Namoshek/libelektra/commits{/sha}","git_commits_url":"https://api.github.com/repos/Namoshek/libelektra/git/commits{/sha}","comments_url":"https://api.github.com/repos/Namoshek/libelektra/comments{/number}","issue_comment_url":"https://api.github.com/repos/Namoshek/libelektra/issues/comments{/number}","contents_url":"https://api.github.com/repos/Namoshek/libelektra/contents/{+path}","compare_url":"https://api.github.com/repos/Namoshek/libelektra/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Namoshek/libelektra/merges","archive_url":"https://api.github.com/repos/Namoshek/libelektra/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Namoshek/libelektra/downloads","issues_url":"https://api.github.com/repos/Namoshek/libelektra/issues{/number}","pulls_url":"https://api.github.com/repos/Namoshek/libelektra/pulls{/number}","milestones_url":"https://api.github.com/repos/Namoshek/libelektra/milestones{/number}","notifications_url":"https://api.github.com/repos/Namoshek/libelektra/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Namoshek/libelektra/labels{/name}","releases_url":"https://api.github.com/repos/Namoshek/libelektra/releases{/id}","deployments_url":"https://api.github.com/repos/Namoshek/libelektra/deployments","created_at":"2016-03-05T10:57:01Z","updated_at":"2016-05-07T21:43:07Z","pushed_at":"2016-11-24T09:44:40Z","git_url":"git://github.com/Namoshek/libelektra.git","ssh_url":"git@github.com:Namoshek/libelektra.git","clone_url":"https://github.com/Namoshek/libelektra.git","svn_url":"https://github.com/Namoshek/libelektra","homepage":"http://libelektra.org","size":35588,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"ElektraInitiative:master","ref":"master","sha":"100d1d08bf0f9f8a62e6a31bdbfba28af321e0c3","user":{"login":"ElektraInitiative","id":7949092,"avatar_url":"https://avatars.githubusercontent.com/u/7949092?v=3","gravatar_id":"","url":"https://api.github.com/users/ElektraInitiative","html_url":"https://github.com/ElektraInitiative","followers_url":"https://api.github.com/users/ElektraInitiative/followers","following_url":"https://api.github.com/users/ElektraInitiative/following{/other_user}","gists_url":"https://api.github.com/users/ElektraInitiative/gists{/gist_id}","starred_url":"https://api.github.com/users/ElektraInitiative/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ElektraInitiative/subscriptions","organizations_url":"https://api.github.com/users/ElektraInitiative/orgs","repos_url":"https://api.github.com/users/ElektraInitiative/repos","events_url":"https://api.github.com/users/ElektraInitiative/events{/privacy}","received_events_url":"https://api.github.com/users/ElektraInitiative/received_events","type":"Organization","site_admin":false},"repo":{"id":21063580,"name":"libelektra","full_name":"ElektraInitiative/libelektra","owner":{"login":"ElektraInitiative","id":7949092,"avatar_url":"https://avatars.githubusercontent.com/u/7949092?v=3","gravatar_id":"","url":"https://api.github.com/users/ElektraInitiative","html_url":"https://github.com/ElektraInitiative","followers_url":"https://api.github.com/users/ElektraInitiative/followers","following_url":"https://api.github.com/users/ElektraInitiative/following{/other_user}","gists_url":"https://api.github.com/users/ElektraInitiative/gists{/gist_id}","starred_url":"https://api.github.com/users/ElektraInitiative/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ElektraInitiative/subscriptions","organizations_url":"https://api.github.com/users/ElektraInitiative/orgs","repos_url":"https://api.github.com/users/ElektraInitiative/repos","events_url":"https://api.github.com/users/ElektraInitiative/events{/privacy}","received_events_url":"https://api.github.com/users/ElektraInitiative/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ElektraInitiative/libelektra","description":"Elektra serves as a universal and secure framework to access configuration parameters in a global, hierarchical key database.","fork":false,"url":"https://api.github.com/repos/ElektraInitiative/libelektra","forks_url":"https://api.github.com/repos/ElektraInitiative/libelektra/forks","keys_url":"https://api.github.com/repos/ElektraInitiative/libelektra/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ElektraInitiative/libelektra/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ElektraInitiative/libelektra/teams","hooks_url":"https://api.github.com/repos/ElektraInitiative/libelektra/hooks","issue_events_url":"https://api.github.com/repos/ElektraInitiative/libelektra/issues/events{/number}","events_url":"https://api.github.com/repos/ElektraInitiative/libelektra/events","assignees_url":"https://api.github.com/repos/ElektraInitiative/libelektra/assignees{/user}","branches_url":"https://api.github.com/repos/ElektraInitiative/libelektra/branches{/branch}","tags_url":"https://api.github.com/repos/ElektraInitiative/libelektra/tags","blobs_url":"https://api.github.com/repos/ElektraInitiative/libelektra/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ElektraInitiative/libelektra/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ElektraInitiative/libelektra/git/refs{/sha}","trees_url":"https://api.github.com/repos/ElektraInitiative/libelektra/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ElektraInitiative/libelektra/statuses/{sha}","languages_url":"https://api.github.com/repos/ElektraInitiative/libelektra/languages","stargazers_url":"https://api.github.com/repos/ElektraInitiative/libelektra/stargazers","contributors_url":"https://api.github.com/repos/ElektraInitiative/libelektra/contributors","subscribers_url":"https://api.github.com/repos/ElektraInitiative/libelektra/subscribers","subscription_url":"https://api.github.com/repos/ElektraInitiative/libelektra/subscription","commits_url":"https://api.github.com/repos/ElektraInitiative/libelektra/commits{/sha}","git_commits_url":"https://api.github.com/repos/ElektraInitiative/libelektra/git/commits{/sha}","comments_url":"https://api.github.com/repos/ElektraInitiative/libelektra/comments{/number}","issue_comment_url":"https://api.github.com/repos/ElektraInitiative/libelektra/issues/comments{/number}","contents_url":"https://api.github.com/repos/ElektraInitiative/libelektra/contents/{+path}","compare_url":"https://api.github.com/repos/ElektraInitiative/libelektra/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ElektraInitiative/libelektra/merges","archive_url":"https://api.github.com/repos/ElektraInitiative/libelektra/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ElektraInitiative/libelektra/downloads","issues_url":"https://api.github.com/repos/ElektraInitiative/libelektra/issues{/number}","pulls_url":"https://api.github.com/repos/ElektraInitiative/libelektra/pulls{/number}","milestones_url":"https://api.github.com/repos/ElektraInitiative/libelektra/milestones{/number}","notifications_url":"https://api.github.com/repos/ElektraInitiative/libelektra/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ElektraInitiative/libelektra/labels{/name}","releases_url":"https://api.github.com/repos/ElektraInitiative/libelektra/releases{/id}","deployments_url":"https://api.github.com/repos/ElektraInitiative/libelektra/deployments","created_at":"2014-06-21T08:01:04Z","updated_at":"2016-11-15T09:52:49Z","pushed_at":"2016-11-24T15:20:44Z","git_url":"git://github.com/ElektraInitiative/libelektra.git","ssh_url":"git@github.com:ElektraInitiative/libelektra.git","clone_url":"https://github.com/ElektraInitiative/libelektra.git","svn_url":"https://github.com/ElektraInitiative/libelektra","homepage":"http://libelektra.org","size":37118,"stargazers_count":41,"watchers_count":41,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":32,"mirror_url":null,"open_issues_count":161,"forks":32,"open_issues":161,"watchers":41,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ElektraInitiative/libelektra/pulls/829"},"html":{"href":"https://github.com/ElektraInitiative/libelektra/pull/829"},"issue":{"href":"https://api.github.com/repos/ElektraInitiative/libelektra/issues/829"},"comments":{"href":"https://api.github.com/repos/ElektraInitiative/libelektra/issues/829/comments"},"review_comments":{"href":"https://api.github.com/repos/ElektraInitiative/libelektra/pulls/829/comments"},"review_comment":{"href":"https://api.github.com/repos/ElektraInitiative/libelektra/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ElektraInitiative/libelektra/pulls/829/commits"},"statuses":{"href":"https://api.github.com/repos/ElektraInitiative/libelektra/statuses/b6ee6bf3c5c92a5029f743f3f9ecfc1a537608bb"}}}}
{"actor":{"display_login":"markus2330"}}