{"action":"created","comment":{"url":"https://api.github.com/repos/solettaproject/soletta/pulls/comments/43167147","id":43167147,"diff_hunk":"@@ -263,3 +307,581 @@ sol_platform_impl_get_os_version(char **version)\n \n     return 0;\n }\n+\n+static bool\n+mountopt_str_to_mask(const struct sol_str_slice slice, unsigned long *flags)\n+{\n+    unsigned int i;\n+    struct opt_mapping {\n+        const char *opt;\n+        unsigned long flag;\n+    } table[] = {\n+        { \"bind\", MS_BIND },\n+        { \"dirsync\", MS_DIRSYNC },\n+        { \"mand\", MS_MANDLOCK },\n+        { \"move\", MS_MOVE },\n+        { \"noatime\", MS_NOATIME },\n+        { \"nodev\", MS_NODEV },\n+        { \"nodiratime\", MS_NODIRATIME },\n+        { \"noexec\", MS_NOEXEC },\n+        { \"nosuid\", MS_NOSUID },\n+        { \"ro\", MS_RDONLY },\n+        { \"relatime\", MS_RELATIME },\n+        { \"remount\", MS_REMOUNT },\n+        { \"silent\", MS_SILENT },\n+        { \"strictatime\", MS_STRICTATIME },\n+        { \"sync\", MS_SYNCHRONOUS },\n+        { \"defaults\", ~MS_RDONLY | ~MS_NOSUID | ~MS_NODEV | ~MS_NOEXEC | ~MS_SYNCHRONOUS },\n+    };\n+\n+    for (i = 0; i < ARRAY_SIZE(table); i++) {\n+        if (sol_str_slice_str_eq(slice, table[i].opt)) {\n+            *flags |= table[i].flag;\n+            return true;\n+        }\n+    }\n+\n+    return false;\n+}\n+\n+static unsigned long\n+get_mountflags(char *mnt_opts, struct sol_buffer *custom_opts, bool *noauto)\n+{\n+    struct sol_vector opts;\n+    struct sol_str_slice *itr;\n+    unsigned long flags = 0;\n+    uint16_t idx;\n+    bool first_custom = true;\n+    struct sol_str_slice slice = sol_str_slice_from_str(mnt_opts);\n+\n+    opts = sol_util_str_split(slice, \",\", 0);\n+    SOL_VECTOR_FOREACH_IDX (&opts, itr, idx) {\n+        if (mountopt_str_to_mask(*itr, &flags)) {\n+            continue;\n+        } else if (sol_str_slice_str_eq(*itr, \"noauto\")) {\n+            *noauto = true;\n+            continue;\n+        }\n+\n+        if (!first_custom)\n+            sol_buffer_append_char(custom_opts, ',');\n+        sol_buffer_append_slice(custom_opts, *itr);\n+        first_custom = false;\n+\n+    }\n+    return flags;\n+}\n+\n+static int\n+parse_mount_point_file(const char *file, struct sol_ptr_vector *vector)\n+{\n+    struct mntent mbuf;\n+    struct mntent *m;\n+    char strings[4096];\n+    struct sol_mount_point *mp;\n+    uint16_t i;\n+    FILE *tab = setmntent(file, \"re\");\n+\n+    if (!tab) {\n+        if (errno == ENOENT) {\n+            SOL_INF(\"No such %s\", file);\n+            return -errno;\n+        } else {\n+            SOL_WRN(\"Unable to open %s file: %s\", file,\n+                sol_util_strerrora(-errno));\n+            return -errno;\n+        }\n+    }\n+\n+    while ((m = getmntent_r(tab, &mbuf, strings, sizeof(strings)))) {\n+        struct sol_buffer custom_opts;\n+        struct sol_mount_point *mpoint;\n+        bool noauto = false;\n+\n+        mpoint = calloc(1, sizeof(struct sol_mount_point));\n+        if (!mpoint) {\n+            SOL_ERR(\"Could not allocate mount point memory\");\n+            goto err;\n+        }\n+\n+        if (mbuf.mnt_fsname)\n+            mpoint->dev = strdup(mbuf.mnt_fsname);\n+\n+        if (mbuf.mnt_dir)\n+            mpoint->mpoint = strdup(mbuf.mnt_dir);\n+\n+        if (mbuf.mnt_type)\n+            mpoint->fstype = strdup(mbuf.mnt_type);\n+\n+        sol_buffer_init(&custom_opts);\n+        mpoint->flags = get_mountflags(mbuf.mnt_opts, &custom_opts, &noauto);\n+        mpoint->noauto = noauto;\n+\n+        if (custom_opts.used)\n+            mpoint->opts = sol_buffer_steal(&custom_opts, NULL);\n+\n+        sol_buffer_fini(&custom_opts);\n+\n+        if (sol_ptr_vector_append(vector, mpoint) < 0) {\n+            SOL_ERR(\"Could not append mount point to vector\");\n+            goto err;\n+        }\n+    }\n+    endmntent(tab);\n+    return 0;\n+\n+err:\n+    SOL_PTR_VECTOR_FOREACH_IDX (vector, mp, i) {\n+        sol_mount_point_free(mp);\n+    }\n+    sol_ptr_vector_clear(vector);\n+    return -ENOMEM;\n+}\n+\n+int\n+sol_platform_impl_get_mount_points(bool hplug_only, struct sol_ptr_vector *vector)\n+{\n+    struct sol_ptr_vector mtab, sol_mtab, delete;\n+    struct sol_mount_point *mp, *mp2;\n+    uint16_t i, j;\n+    int err;\n+\n+    if (!hplug_only) {\n+        return parse_mount_point_file(SYS_MTAB_FILE, vector);\n+    }\n+\n+    sol_ptr_vector_init(&mtab);\n+    err = parse_mount_point_file(SYS_MTAB_FILE, &mtab);\n+    SOL_INT_CHECK_GOTO(err, < 0, err_mtab);\n+\n+    sol_ptr_vector_init(&sol_mtab);\n+    err = parse_mount_point_file(SOL_MTAB_FILE, &sol_mtab);\n+    SOL_INT_CHECK_GOTO(err, < 0, err_sol_mtab);\n+\n+    sol_ptr_vector_init(&delete);\n+    SOL_PTR_VECTOR_FOREACH_IDX (&sol_mtab, mp, i) {\n+        SOL_PTR_VECTOR_FOREACH_IDX (&mtab, mp2, j) {\n+            if (streq(mp2->dev, mp->dev) && streq(mp2->mpoint, mp->mpoint)) {\n+                sol_ptr_vector_append(vector, mp2);\n+                sol_ptr_vector_remove(&mtab, mp2);\n+            } else {\n+                sol_ptr_vector_append(&delete, mp2);\n+            }\n+        }\n+        sol_mount_point_free(mp);\n+    }\n+\n+    SOL_PTR_VECTOR_FOREACH_IDX (&delete, mp, i) {\n+        sol_mount_point_free(mp);\n+    }\n+\n+    sol_ptr_vector_clear(&delete);\n+    sol_ptr_vector_clear(&sol_mtab);\n+    sol_ptr_vector_clear(&mtab);\n+\n+    return 0;\n+\n+err_sol_mtab:\n+    sol_ptr_vector_clear(&sol_mtab);\n+err_mtab:\n+    sol_ptr_vector_clear(&mtab);\n+    return err;\n+}\n+\n+static int\n+sol_mtab_remove_entry(const char *mpoint, struct sol_buffer *output)\n+{\n+    int fd = 0;\n+    struct sol_vector lines;\n+    struct sol_str_slice content = SOL_STR_SLICE_EMPTY;\n+    struct sol_str_slice *itr;\n+    struct sol_file_reader *reader;\n+    uint16_t idx;\n+\n+    fd = open(SOL_MTAB_FILE, O_RDONLY | O_CLOEXEC);\n+    if (!fd) {\n+        SOL_ERR(\"Could not open \"SOL_MTAB_FILE \" - %s\",\n+            sol_util_strerrora(errno));\n+        return -errno;\n+    }\n+\n+    reader = sol_file_reader_fd(fd);\n+    if (!reader) {\n+        SOL_ERR(\"Could not read \"SOL_MTAB_FILE \" file - %s\",\n+            sol_util_strerrora(errno));\n+        return -errno;\n+    }\n+\n+    content = sol_file_reader_get_all(reader);\n+    lines = sol_util_str_split(content, \"\\n\", 0);\n+    SOL_VECTOR_FOREACH_IDX (&lines, itr, idx) {\n+        char buff[512];\n+        snprintf(buff, itr->len, \"%s\", itr->data);\n+        if (!strstr(buff, mpoint))\n+            sol_buffer_append_printf(output, \"%s\", buff);\n+    }\n+\n+    sol_vector_clear(&lines);\n+    sol_file_reader_close(reader);\n+    close(fd);\n+    return 0;\n+}\n+\n+// since we don't have a mtab entry remove function we must implement it ourselves\n+static int\n+sol_mtab_cleanup(const char *mpoint)\n+{\n+    int res, err, fd;\n+    struct sol_buffer output;\n+\n+    res = fd = 0;\n+    sol_buffer_init(&output);\n+\n+    err = sol_mtab_remove_entry(mpoint, &output);\n+    SOL_INT_CHECK(err, < 0, err);\n+\n+    fd = open(SOL_MTAB_FILE, O_RDWR | O_CLOEXEC | O_TRUNC);\n+    if (!fd) {\n+        SOL_ERR(\"Could not open \" SOL_MTAB_FILE);\n+        return -errno;\n+    }\n+\n+    err = write(fd, output.data, sizeof(output.data));\n+    if (err < -1) {\n+        SOL_ERR(\"Could not write \"SOL_MTAB_FILE \" file - %s\",\n+            sol_util_strerrora(errno));\n+        res = -errno;\n+    }\n+\n+    err = close(fd);\n+    if (err < -1) {\n+        SOL_ERR(\"Could not close \"SOL_MTAB_FILE \" file - %s\",\n+            sol_util_strerrora(errno));\n+        res = -errno;\n+    }\n+\n+    sol_buffer_fini(&output);\n+    return res;\n+}\n+\n+static int\n+run_umount(const char *mpoint)\n+{\n+    int err;\n+\n+    err = sol_mtab_cleanup(mpoint);\n+    SOL_INT_CHECK(err, < 0, err);\n+\n+    err = umount(mpoint);\n+    if (err != 0) {\n+        SOL_ERR(\"Couldn't umount %s - %s\", mpoint, sol_util_strerrora(errno));\n+        return -errno;\n+    }\n+\n+    return err;\n+}\n+\n+static void\n+on_umount_fork(void *data)\n+{\n+    int err;\n+    struct umount_data *udata = data;\n+\n+    err = run_umount(udata->mpoint);\n+    sol_platform_linux_fork_run_exit(err);\n+}\n+\n+static void\n+on_umount_fork_exit(void *data, uint64_t pid, int status)\n+{\n+    struct umount_data *udata = data;\n+\n+    udata->async_cb(udata->mpoint, udata->data, pid, status);","path":"src/lib/common/sol-platform-linux-common.c","position":366,"original_position":366,"commit_id":"cc94700b9e317995bbe3f2632306b641e4e13a5f","original_commit_id":"cc94700b9e317995bbe3f2632306b641e4e13a5f","user":{"login":"barbieri","id":1838,"avatar_url":"https://avatars.githubusercontent.com/u/1838?v=3","gravatar_id":"","url":"https://api.github.com/users/barbieri","html_url":"https://github.com/barbieri","followers_url":"https://api.github.com/users/barbieri/followers","following_url":"https://api.github.com/users/barbieri/following{/other_user}","gists_url":"https://api.github.com/users/barbieri/gists{/gist_id}","starred_url":"https://api.github.com/users/barbieri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/barbieri/subscriptions","organizations_url":"https://api.github.com/users/barbieri/orgs","repos_url":"https://api.github.com/users/barbieri/repos","events_url":"https://api.github.com/users/barbieri/events{/privacy}","received_events_url":"https://api.github.com/users/barbieri/received_events","type":"User","site_admin":false},"body":"if you want to keep the list of mount points, here you'd be checking the `status`, if 0, then you append to the list before calling user's callback. Simple as that.","created_at":"2015-10-27T18:40:02Z","updated_at":"2015-10-27T18:40:02Z","html_url":"https://github.com/solettaproject/soletta/pull/960#discussion_r43167147","pull_request_url":"https://api.github.com/repos/solettaproject/soletta/pulls/960","_links":{"self":{"href":"https://api.github.com/repos/solettaproject/soletta/pulls/comments/43167147"},"html":{"href":"https://github.com/solettaproject/soletta/pull/960#discussion_r43167147"},"pull_request":{"href":"https://api.github.com/repos/solettaproject/soletta/pulls/960"}}},"pull_request":{"url":"https://api.github.com/repos/solettaproject/soletta/pulls/960","id":48794156,"html_url":"https://github.com/solettaproject/soletta/pull/960","diff_url":"https://github.com/solettaproject/soletta/pull/960.diff","patch_url":"https://github.com/solettaproject/soletta/pull/960.patch","issue_url":"https://api.github.com/repos/solettaproject/soletta/issues/960","number":960,"state":"open","locked":false,"title":"Linux micro kmod v5","user":{"login":"dorileo","id":960327,"avatar_url":"https://avatars.githubusercontent.com/u/960327?v=3","gravatar_id":"","url":"https://api.github.com/users/dorileo","html_url":"https://github.com/dorileo","followers_url":"https://api.github.com/users/dorileo/followers","following_url":"https://api.github.com/users/dorileo/following{/other_user}","gists_url":"https://api.github.com/users/dorileo/gists{/gist_id}","starred_url":"https://api.github.com/users/dorileo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dorileo/subscriptions","organizations_url":"https://api.github.com/users/dorileo/orgs","repos_url":"https://api.github.com/users/dorileo/repos","events_url":"https://api.github.com/users/dorileo/events{/privacy}","received_events_url":"https://api.github.com/users/dorileo/received_events","type":"User","site_admin":false},"body":"## Changes\r\n  + v2 (since #844)\r\n    - impemented coldplug;\r\n    - implemented hotplug;\r\n    - fixed issues pointed in the last version;\r\n    - introduced patches:\r\n         - str-slice: implement trailing + leading whitespace helpers\r\n         - file-reader: introduce sol_file_reader_fd() API\r\n         - linux-micro: fix sysctl directory traversal\r\n\r\n  + v3 (since #877)\r\n      - fixed issues pointed by @lpereira and @barbieri in the last review (#877);\r\n\r\n  + v4 (since #916)\r\n     - fixed issues pointed by @lpereira in the last review (#916);\r\n     - split the uevent handling function to its own source code (sharing between modules);\r\n     - added the ```linux-micro: automount``` patch;\r\n     - added unit tests to the patch ```str-slice: implement trailing + leading whitespace helpers```;\r\n\r\n  + v5 (since #935)\r\n    - fixed issues pointed by @lpereira in the last review (#935);\r\n    - moved uevent api to ```sol_platform_linux```;\r\n    - added ```mount/umount/list mount points``` api's - with async options;\r\n    - migrated the fstab linux-micro service to use the ```sol_platform_mount()``` api;\r\n    - migrated the automount linux-micro service to use the ```sol_platform_mount()``` api;\r\n    - changed the general approach for the ```str-slice: implement trailing + leading whitespace helpers``` and fixed the addr sanitizer issue;\r\n\r\n## Rationale\r\nImplements the modprobe process following the systemd's modules-load.d\r\nspecification, also does the coldplug module loading - which consists in\r\nlooking up devices described in the sysfs and loading their respective\r\nmodules based on the modalias descriptors.\r\n\r\nThis module will also handle the hotplug events, notified by the kernel\r\nvia uevent netlink channel.","created_at":"2015-10-26T20:41:18Z","updated_at":"2015-10-27T18:40:02Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c9b21f3c57ddf9bcd246041b769a05a83092c276","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/solettaproject/soletta/pulls/960/commits","review_comments_url":"https://api.github.com/repos/solettaproject/soletta/pulls/960/comments","review_comment_url":"https://api.github.com/repos/solettaproject/soletta/pulls/comments{/number}","comments_url":"https://api.github.com/repos/solettaproject/soletta/issues/960/comments","statuses_url":"https://api.github.com/repos/solettaproject/soletta/statuses/cc94700b9e317995bbe3f2632306b641e4e13a5f","head":{"label":"dorileo:linux-micro-kmod-v5","ref":"linux-micro-kmod-v5","sha":"cc94700b9e317995bbe3f2632306b641e4e13a5f","user":{"login":"dorileo","id":960327,"avatar_url":"https://avatars.githubusercontent.com/u/960327?v=3","gravatar_id":"","url":"https://api.github.com/users/dorileo","html_url":"https://github.com/dorileo","followers_url":"https://api.github.com/users/dorileo/followers","following_url":"https://api.github.com/users/dorileo/following{/other_user}","gists_url":"https://api.github.com/users/dorileo/gists{/gist_id}","starred_url":"https://api.github.com/users/dorileo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dorileo/subscriptions","organizations_url":"https://api.github.com/users/dorileo/orgs","repos_url":"https://api.github.com/users/dorileo/repos","events_url":"https://api.github.com/users/dorileo/events{/privacy}","received_events_url":"https://api.github.com/users/dorileo/received_events","type":"User","site_admin":false},"repo":{"id":37610388,"name":"soletta","full_name":"dorileo/soletta","owner":{"login":"dorileo","id":960327,"avatar_url":"https://avatars.githubusercontent.com/u/960327?v=3","gravatar_id":"","url":"https://api.github.com/users/dorileo","html_url":"https://github.com/dorileo","followers_url":"https://api.github.com/users/dorileo/followers","following_url":"https://api.github.com/users/dorileo/following{/other_user}","gists_url":"https://api.github.com/users/dorileo/gists{/gist_id}","starred_url":"https://api.github.com/users/dorileo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dorileo/subscriptions","organizations_url":"https://api.github.com/users/dorileo/orgs","repos_url":"https://api.github.com/users/dorileo/repos","events_url":"https://api.github.com/users/dorileo/events{/privacy}","received_events_url":"https://api.github.com/users/dorileo/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/dorileo/soletta","description":"Soletta Project is a framework for making IoT devices.  With Soletta Project's libraries developers can easily write software for devices that control actuators/sensors and communicate using standard technologies. It enables adding smartness even on the smallest edge devices.  Portable and scalable, it abstracts details of hardware and OS, enabling developers to reuse their code and knowledge on different targets.","fork":true,"url":"https://api.github.com/repos/dorileo/soletta","forks_url":"https://api.github.com/repos/dorileo/soletta/forks","keys_url":"https://api.github.com/repos/dorileo/soletta/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dorileo/soletta/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dorileo/soletta/teams","hooks_url":"https://api.github.com/repos/dorileo/soletta/hooks","issue_events_url":"https://api.github.com/repos/dorileo/soletta/issues/events{/number}","events_url":"https://api.github.com/repos/dorileo/soletta/events","assignees_url":"https://api.github.com/repos/dorileo/soletta/assignees{/user}","branches_url":"https://api.github.com/repos/dorileo/soletta/branches{/branch}","tags_url":"https://api.github.com/repos/dorileo/soletta/tags","blobs_url":"https://api.github.com/repos/dorileo/soletta/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dorileo/soletta/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dorileo/soletta/git/refs{/sha}","trees_url":"https://api.github.com/repos/dorileo/soletta/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dorileo/soletta/statuses/{sha}","languages_url":"https://api.github.com/repos/dorileo/soletta/languages","stargazers_url":"https://api.github.com/repos/dorileo/soletta/stargazers","contributors_url":"https://api.github.com/repos/dorileo/soletta/contributors","subscribers_url":"https://api.github.com/repos/dorileo/soletta/subscribers","subscription_url":"https://api.github.com/repos/dorileo/soletta/subscription","commits_url":"https://api.github.com/repos/dorileo/soletta/commits{/sha}","git_commits_url":"https://api.github.com/repos/dorileo/soletta/git/commits{/sha}","comments_url":"https://api.github.com/repos/dorileo/soletta/comments{/number}","issue_comment_url":"https://api.github.com/repos/dorileo/soletta/issues/comments{/number}","contents_url":"https://api.github.com/repos/dorileo/soletta/contents/{+path}","compare_url":"https://api.github.com/repos/dorileo/soletta/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dorileo/soletta/merges","archive_url":"https://api.github.com/repos/dorileo/soletta/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dorileo/soletta/downloads","issues_url":"https://api.github.com/repos/dorileo/soletta/issues{/number}","pulls_url":"https://api.github.com/repos/dorileo/soletta/pulls{/number}","milestones_url":"https://api.github.com/repos/dorileo/soletta/milestones{/number}","notifications_url":"https://api.github.com/repos/dorileo/soletta/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dorileo/soletta/labels{/name}","releases_url":"https://api.github.com/repos/dorileo/soletta/releases{/id}","created_at":"2015-06-17T17:36:30Z","updated_at":"2015-06-17T17:36:31Z","pushed_at":"2015-10-26T20:36:49Z","git_url":"git://github.com/dorileo/soletta.git","ssh_url":"git@github.com:dorileo/soletta.git","clone_url":"https://github.com/dorileo/soletta.git","svn_url":"https://github.com/dorileo/soletta","homepage":"","size":9471,"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":"solettaproject:master","ref":"master","sha":"114cf120a7f4720c91e8ce1f5b3bdb7020694888","user":{"login":"solettaproject","id":12736897,"avatar_url":"https://avatars.githubusercontent.com/u/12736897?v=3","gravatar_id":"","url":"https://api.github.com/users/solettaproject","html_url":"https://github.com/solettaproject","followers_url":"https://api.github.com/users/solettaproject/followers","following_url":"https://api.github.com/users/solettaproject/following{/other_user}","gists_url":"https://api.github.com/users/solettaproject/gists{/gist_id}","starred_url":"https://api.github.com/users/solettaproject/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/solettaproject/subscriptions","organizations_url":"https://api.github.com/users/solettaproject/orgs","repos_url":"https://api.github.com/users/solettaproject/repos","events_url":"https://api.github.com/users/solettaproject/events{/privacy}","received_events_url":"https://api.github.com/users/solettaproject/received_events","type":"Organization","site_admin":false},"repo":{"id":37087063,"name":"soletta","full_name":"solettaproject/soletta","owner":{"login":"solettaproject","id":12736897,"avatar_url":"https://avatars.githubusercontent.com/u/12736897?v=3","gravatar_id":"","url":"https://api.github.com/users/solettaproject","html_url":"https://github.com/solettaproject","followers_url":"https://api.github.com/users/solettaproject/followers","following_url":"https://api.github.com/users/solettaproject/following{/other_user}","gists_url":"https://api.github.com/users/solettaproject/gists{/gist_id}","starred_url":"https://api.github.com/users/solettaproject/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/solettaproject/subscriptions","organizations_url":"https://api.github.com/users/solettaproject/orgs","repos_url":"https://api.github.com/users/solettaproject/repos","events_url":"https://api.github.com/users/solettaproject/events{/privacy}","received_events_url":"https://api.github.com/users/solettaproject/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/solettaproject/soletta","description":"Soletta Project is a framework for making IoT devices.  With Soletta Project's libraries developers can easily write software for devices that control actuators/sensors and communicate using standard technologies. It enables adding smartness even on the smallest edge devices.  ","fork":false,"url":"https://api.github.com/repos/solettaproject/soletta","forks_url":"https://api.github.com/repos/solettaproject/soletta/forks","keys_url":"https://api.github.com/repos/solettaproject/soletta/keys{/key_id}","collaborators_url":"https://api.github.com/repos/solettaproject/soletta/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/solettaproject/soletta/teams","hooks_url":"https://api.github.com/repos/solettaproject/soletta/hooks","issue_events_url":"https://api.github.com/repos/solettaproject/soletta/issues/events{/number}","events_url":"https://api.github.com/repos/solettaproject/soletta/events","assignees_url":"https://api.github.com/repos/solettaproject/soletta/assignees{/user}","branches_url":"https://api.github.com/repos/solettaproject/soletta/branches{/branch}","tags_url":"https://api.github.com/repos/solettaproject/soletta/tags","blobs_url":"https://api.github.com/repos/solettaproject/soletta/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/solettaproject/soletta/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/solettaproject/soletta/git/refs{/sha}","trees_url":"https://api.github.com/repos/solettaproject/soletta/git/trees{/sha}","statuses_url":"https://api.github.com/repos/solettaproject/soletta/statuses/{sha}","languages_url":"https://api.github.com/repos/solettaproject/soletta/languages","stargazers_url":"https://api.github.com/repos/solettaproject/soletta/stargazers","contributors_url":"https://api.github.com/repos/solettaproject/soletta/contributors","subscribers_url":"https://api.github.com/repos/solettaproject/soletta/subscribers","subscription_url":"https://api.github.com/repos/solettaproject/soletta/subscription","commits_url":"https://api.github.com/repos/solettaproject/soletta/commits{/sha}","git_commits_url":"https://api.github.com/repos/solettaproject/soletta/git/commits{/sha}","comments_url":"https://api.github.com/repos/solettaproject/soletta/comments{/number}","issue_comment_url":"https://api.github.com/repos/solettaproject/soletta/issues/comments{/number}","contents_url":"https://api.github.com/repos/solettaproject/soletta/contents/{+path}","compare_url":"https://api.github.com/repos/solettaproject/soletta/compare/{base}...{head}","merges_url":"https://api.github.com/repos/solettaproject/soletta/merges","archive_url":"https://api.github.com/repos/solettaproject/soletta/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/solettaproject/soletta/downloads","issues_url":"https://api.github.com/repos/solettaproject/soletta/issues{/number}","pulls_url":"https://api.github.com/repos/solettaproject/soletta/pulls{/number}","milestones_url":"https://api.github.com/repos/solettaproject/soletta/milestones{/number}","notifications_url":"https://api.github.com/repos/solettaproject/soletta/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/solettaproject/soletta/labels{/name}","releases_url":"https://api.github.com/repos/solettaproject/soletta/releases{/id}","created_at":"2015-06-08T19:13:18Z","updated_at":"2015-10-26T23:09:45Z","pushed_at":"2015-10-27T17:46:01Z","git_url":"git://github.com/solettaproject/soletta.git","ssh_url":"git@github.com:solettaproject/soletta.git","clone_url":"https://github.com/solettaproject/soletta.git","svn_url":"https://github.com/solettaproject/soletta","homepage":"http://solettaproject.org","size":27655,"stargazers_count":50,"watchers_count":50,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":33,"mirror_url":null,"open_issues_count":46,"forks":33,"open_issues":46,"watchers":50,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/solettaproject/soletta/pulls/960"},"html":{"href":"https://github.com/solettaproject/soletta/pull/960"},"issue":{"href":"https://api.github.com/repos/solettaproject/soletta/issues/960"},"comments":{"href":"https://api.github.com/repos/solettaproject/soletta/issues/960/comments"},"review_comments":{"href":"https://api.github.com/repos/solettaproject/soletta/pulls/960/comments"},"review_comment":{"href":"https://api.github.com/repos/solettaproject/soletta/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/solettaproject/soletta/pulls/960/commits"},"statuses":{"href":"https://api.github.com/repos/solettaproject/soletta/statuses/cc94700b9e317995bbe3f2632306b641e4e13a5f"}}}}