{"action":"created","comment":{"url":"https://api.github.com/repos/solettaproject/soletta/pulls/comments/36107076","id":36107076,"diff_hunk":"@@ -0,0 +1,990 @@\n+#include <ctype.h>\n+#include <dirent.h>\n+#include <errno.h>\n+#include <fcntl.h>\n+#include <limits.h>\n+#include <stdio.h>\n+#include <sys/stat.h>\n+#include <sys/types.h>\n+#include <unistd.h>\n+\n+#include <sol-log.h>\n+#include <sol-mainloop.h>\n+#include <sol-str-slice.h>\n+#include <sol-util.h>\n+#include <sol-util-linux.h>\n+#include <sol-vector.h>\n+\n+#include \"sol-iio.h\"\n+\n+struct sol_iio_device {\n+    char *trigger_name;\n+    sol_iio_reader_cb reader_cb;\n+    void *reader_cb_data;\n+    struct sol_fd *fd_handler;\n+    struct sol_ptr_vector channels;\n+    int device_id;\n+    int trigger_id;\n+    int fd;\n+    bool buffer_enabled : 1;\n+    bool manual_triggering : 1;\n+};\n+\n+struct sol_iio_channel {\n+    struct sol_iio_device *device;\n+    char *name;\n+    double scale;\n+    int index;\n+    int offset;\n+\n+    int storagebits;\n+    int bits;\n+    int shift;\n+    int offset_in_buffer;\n+\n+    bool little_endian : 1;\n+    bool is_signed : 1;\n+};\n+\n+struct sol_iio_buffer {\n+    size_t size;\n+    uint8_t *data;\n+};\n+\n+#define DEVICE_PATH \"/dev/iio:device%d\"\n+#define SYSFS_DEVICES_PATH \"/sys/bus/iio/devices\"\n+#define BUFFER_ENABLE_DEVICE_PATH \"/sys/bus/iio/devices/iio:device%d/buffer/enable\"\n+#define BUFFER_LENGHT_DEVICE_PATH \"/sys/bus/iio/devices/iio:device%d/buffer/length\"\n+#define CURRENT_TRIGGER_DEVICE_PATH \"/sys/bus/iio/devices/iio:device%d/trigger/current_trigger\"\n+\n+#define SYSFS_TRIGGER_NOW_PATH \"/sys/bus/iio/devices/%s/trigger_now\"\n+#define SYSFS_TRIGGER_NOW_BY_ID_PATH \"/sys/bus/iio/devices/trigger%d/trigger_now\"\n+#define SYSFS_TRIGGER_NAME_PATH \"/sys/bus/iio/devices/%s/name\"\n+#define SYSFS_TRIGGER_SYSFS_ADD_TRIGGER \"/sys/bus/iio/devices/iio_sysfs_trigger/add_trigger\"\n+#define SYSFS_TRIGGER_SYSFS_PATH \"/sys/bus/iio/devices/iio_sysfs_trigger\"\n+\n+#define CHANNEL_RAW_PATH \"/sys/bus/iio/devices/iio:device%d/%s_raw\"\n+#define CHANNEL_OFFSET_PATH \"/sys/bus/iio/devices/iio:device%d/%s_offset\"\n+#define CHANNEL_SCALE_PATH \"/sys/bus/iio/devices/iio:device%d/%s_scale\"\n+\n+#define CHANNEL_SCAN_ENABLE_PATH \"/sys/bus/iio/devices/iio:device%d/scan_elements/%s_en\"\n+#define CHANNEL_SCAN_INDEX_PATH \"/sys/bus/iio/devices/iio:device%d/scan_elements/%s_index\"\n+#define CHANNEL_SCAN_TYPE_PATH \"/sys/bus/iio/devices/iio:device%d/scan_elements/%s_type\"\n+\n+#define SAMPLING_FREQUENCY_DEVICE_PATH \"/sys/bus/iio/devices/iio:device%d/sampling_frequency\"\n+#define SAMPLING_FREQUENCY_BUFFER_PATH \"/sys/bus/iio/devices/iio:device%d/buffer/sampling_frequency\"\n+#define SAMPLING_FREQUENCY_TRIGGER_PATH \"/sys/bus/iio/devices/trigger%d/sampling_frequency\"\n+\n+static bool\n+craft_filename_path(char *path, size_t size, const char *base, ...)\n+{\n+    va_list args;\n+    int len;\n+\n+    va_start(args, base);\n+    len = vsnprintf(path, size, base, args);\n+    va_end(args);\n+\n+    return len >= 0 && len <= PATH_MAX;\n+}\n+\n+static bool\n+write_file(const char *path, const char *format, ...)\n+{\n+    va_list args;\n+    char *content;\n+    int fd;\n+    size_t len;\n+    bool result = true;\n+\n+    va_start(args, format);\n+    vasprintf(&content, format, args);\n+    va_end(args);\n+\n+    fd = open(path, O_WRONLY | O_CLOEXEC);\n+    if (fd < 0)\n+        result = false;\n+\n+    if (result) {\n+        len = strlen(content);\n+        result = write(fd, content, len) == (ssize_t)len;\n+    }\n+\n+    free(content);\n+    close(fd);\n+\n+    return result;\n+}\n+\n+static bool\n+check_trigger_now_file(const char *trigger_dir)\n+{\n+    int len;\n+    char path[PATH_MAX + 1];\n+    struct stat st;\n+\n+    len = snprintf(path, sizeof(path), SYSFS_TRIGGER_NOW_PATH, trigger_dir);\n+\n+    // TODO check permissions of file trigger_now too, not only existence\n+    return len > 0 && len <= PATH_MAX && !stat(path, &st);\n+}\n+\n+static bool\n+check_trigger_name(const char *trigger_dir, const char *trigger_name)\n+{\n+    char path[PATH_MAX + 1];\n+    char *name;\n+    int len;\n+    bool result;\n+\n+    len = snprintf(path, sizeof(path), SYSFS_TRIGGER_NAME_PATH, trigger_dir);\n+    if (len < 0 || len > PATH_MAX) {\n+        SOL_WRN(\"Could not open IIO trigger (%s) name on sysfs\", trigger_dir);\n+        return false;\n+    }\n+\n+    len = sol_util_read_file(path, \"%ms\", &name);\n+    if (len < 0) {\n+        SOL_WRN(\"Could not read IIO trigger (%s) name on sysfs\", trigger_dir);\n+        return false;\n+    }\n+\n+    result = streq(trigger_name, name);\n+    free(name);\n+\n+    return result;\n+}\n+\n+static bool\n+check_manual_triggering(struct sol_iio_device *device)\n+{\n+    DIR *dir;\n+    const struct dirent *ent;\n+\n+    /* The only way I've found to relact trigger name and trigger is\n+     * by opening all triggers on /sys/bus/iio/devices\n+     * and checking name by name =/ */\n+\n+    dir = opendir(SYSFS_DEVICES_PATH);\n+    if (!dir) {\n+        SOL_WRN(\"No IIO devices available\");\n+        return false;\n+    }\n+\n+    while (ent = readdir(dir), ent != NULL) {\n+        if (strstr(ent->d_name, \"trigger\") == ent->d_name) {\n+            if (check_trigger_name(ent->d_name, device->trigger_name)) {\n+                device->manual_triggering = check_trigger_now_file(ent->d_name);\n+                /* triggers dirs are of the form triggerX, so here we save X */\n+                device->trigger_id = atoi(ent->d_name + strlen(\"trigger\"));\n+                return true;\n+            }\n+        }\n+    }\n+\n+    return false;\n+}\n+\n+static bool\n+set_current_trigger(struct sol_iio_device *device, const char *trigger_name)\n+{\n+    char path[PATH_MAX + 1];\n+    int len;\n+\n+    len = snprintf(path, sizeof(path), CURRENT_TRIGGER_DEVICE_PATH, device->device_id);\n+    if (len < 0 || len > PATH_MAX) {\n+        SOL_WRN(\"Could not open device current_trigger file\");\n+        return false;\n+    }\n+\n+    if (!write_file(path, \"%s\", trigger_name)) {\n+        SOL_WRN(\"Could not write to device current_trigger file\");\n+        return false;\n+    }\n+\n+    return true;\n+}\n+\n+static bool\n+create_sysfs_trigger(struct sol_iio_device *device)\n+{\n+    int len, i;\n+    struct stat st;\n+    char *trigger_name;\n+    bool result = false;\n+\n+    /* First, check if 'iio_sysfs_trigger' is available */\n+    if (stat(SYSFS_TRIGGER_SYSFS_ADD_TRIGGER, &st)) {\n+        SOL_WRN(\"No 'iio_sysfs_tigger' under '/sys/bus/iio/devices'.\"\n+            \" Missing 'modprobe iio-trig-sysfs'?\");\n+        return false;\n+    }\n+\n+    /* TODO check available trigger indice instead of using a random one */\n+    /* Create new trigger */\n+    i = rand();\n+    if (!write_file(SYSFS_TRIGGER_SYSFS_ADD_TRIGGER, \"%d\", i))\n+        goto error;\n+\n+    /* Set device current trigger */\n+    len = asprintf(&trigger_name, \"sysfstrig%d\", i);\n+    if (len < 0)\n+        goto error;\n+    result = set_current_trigger(device, trigger_name);\n+\n+    if (result)\n+        device->trigger_name = strdup(trigger_name);\n+\n+    free(trigger_name);\n+\n+    return result;\n+\n+error:\n+    SOL_WRN(\"Could not create sysfs trigger.\");\n+\n+    return false;\n+}\n+\n+static bool\n+check_trigger(struct sol_iio_device *device)\n+{\n+    char path[PATH_MAX + 1];\n+    char *name = NULL;\n+    int len;\n+\n+    len = snprintf(path, sizeof(path), CURRENT_TRIGGER_DEVICE_PATH, device->device_id);\n+    if (len < 0 || len > PATH_MAX) {\n+        SOL_WRN(\"Could not open IIO device%d trigger on sysfs\", device->device_id);\n+        return false;\n+    }\n+\n+    len = sol_util_read_file(path, \"%ms\", &name);\n+    if (len < 0) {\n+        SOL_INF(\"No current trigger for iio:device%d. Creating a sysfs one.\",\n+            device->device_id);\n+        if (!create_sysfs_trigger(device))\n+            return false;\n+    } else\n+        device->trigger_name = name;\n+\n+    return check_manual_triggering(device);\n+}\n+\n+static void\n+set_buffer_size(struct sol_iio_device *device, int buffer_size)\n+{\n+    char path[PATH_MAX + 1];\n+\n+    if (craft_filename_path(path, sizeof(path), BUFFER_LENGHT_DEVICE_PATH, device->device_id)) {\n+        SOL_WRN(\"Could not set IIO device buffer size\");\n+        return;\n+    }\n+\n+    if (!write_file(path, \"%d\", buffer_size)) {\n+        SOL_WRN(\"Could not set IIO device buffer size\");\n+    }\n+\n+    return;\n+}\n+\n+static bool\n+set_buffer_enabled(struct sol_iio_device *device, bool enabled)\n+{\n+    char path[PATH_MAX + 1];\n+    int len;\n+\n+    len = snprintf(path, sizeof(path), BUFFER_ENABLE_DEVICE_PATH, device->device_id);\n+    if (len < 0 || len > PATH_MAX)\n+        return false;\n+\n+    if (!write_file(path, \"%d\", enabled))\n+        return false;\n+\n+    return true;\n+}\n+\n+static size_t\n+calc_buffer_size(struct sol_iio_device *device)","path":"src/shared/sol-iio.c","position":307,"original_position":307,"commit_id":"d3c810c43fa7ab3f51f5bf5618779573d96e8140","original_commit_id":"d3c810c43fa7ab3f51f5bf5618779573d96e8140","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":"const struct...","created_at":"2015-08-03T17:13:36Z","updated_at":"2015-08-03T17:13:36Z","html_url":"https://github.com/solettaproject/soletta/pull/412#discussion_r36107076","pull_request_url":"https://api.github.com/repos/solettaproject/soletta/pulls/412","_links":{"self":{"href":"https://api.github.com/repos/solettaproject/soletta/pulls/comments/36107076"},"html":{"href":"https://github.com/solettaproject/soletta/pull/412#discussion_r36107076"},"pull_request":{"href":"https://api.github.com/repos/solettaproject/soletta/pulls/412"}}},"pull_request":{"url":"https://api.github.com/repos/solettaproject/soletta/pulls/412","id":41376028,"html_url":"https://github.com/solettaproject/soletta/pull/412","diff_url":"https://github.com/solettaproject/soletta/pull/412.diff","patch_url":"https://github.com/solettaproject/soletta/pull/412.patch","issue_url":"https://api.github.com/repos/solettaproject/soletta/issues/412","number":412,"state":"open","locked":false,"title":"Iio","user":{"login":"edersondisouza","id":3177551,"avatar_url":"https://avatars.githubusercontent.com/u/3177551?v=3","gravatar_id":"","url":"https://api.github.com/users/edersondisouza","html_url":"https://github.com/edersondisouza","followers_url":"https://api.github.com/users/edersondisouza/followers","following_url":"https://api.github.com/users/edersondisouza/following{/other_user}","gists_url":"https://api.github.com/users/edersondisouza/gists{/gist_id}","starred_url":"https://api.github.com/users/edersondisouza/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/edersondisouza/subscriptions","organizations_url":"https://api.github.com/users/edersondisouza/orgs","repos_url":"https://api.github.com/users/edersondisouza/repos","events_url":"https://api.github.com/users/edersondisouza/events{/privacy}","received_events_url":"https://api.github.com/users/edersondisouza/received_events","type":"User","site_admin":false},"body":"Adding some support functions to ease creation of Linux Industrial I/O nodes. Also added a node for iio-gyroscope, that tests the code.","created_at":"2015-07-31T20:07:13Z","updated_at":"2015-08-03T17:13:36Z","closed_at":null,"merged_at":null,"merge_commit_sha":"7169057b5ecc732f2b2238e6ca7b6c1f3fc65893","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/solettaproject/soletta/pulls/412/commits","review_comments_url":"https://api.github.com/repos/solettaproject/soletta/pulls/412/comments","review_comment_url":"https://api.github.com/repos/solettaproject/soletta/pulls/comments{/number}","comments_url":"https://api.github.com/repos/solettaproject/soletta/issues/412/comments","statuses_url":"https://api.github.com/repos/solettaproject/soletta/statuses/d3c810c43fa7ab3f51f5bf5618779573d96e8140","head":{"label":"edersondisouza:iio","ref":"iio","sha":"d3c810c43fa7ab3f51f5bf5618779573d96e8140","user":{"login":"edersondisouza","id":3177551,"avatar_url":"https://avatars.githubusercontent.com/u/3177551?v=3","gravatar_id":"","url":"https://api.github.com/users/edersondisouza","html_url":"https://github.com/edersondisouza","followers_url":"https://api.github.com/users/edersondisouza/followers","following_url":"https://api.github.com/users/edersondisouza/following{/other_user}","gists_url":"https://api.github.com/users/edersondisouza/gists{/gist_id}","starred_url":"https://api.github.com/users/edersondisouza/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/edersondisouza/subscriptions","organizations_url":"https://api.github.com/users/edersondisouza/orgs","repos_url":"https://api.github.com/users/edersondisouza/repos","events_url":"https://api.github.com/users/edersondisouza/events{/privacy}","received_events_url":"https://api.github.com/users/edersondisouza/received_events","type":"User","site_admin":false},"repo":{"id":37655085,"name":"soletta","full_name":"edersondisouza/soletta","owner":{"login":"edersondisouza","id":3177551,"avatar_url":"https://avatars.githubusercontent.com/u/3177551?v=3","gravatar_id":"","url":"https://api.github.com/users/edersondisouza","html_url":"https://github.com/edersondisouza","followers_url":"https://api.github.com/users/edersondisouza/followers","following_url":"https://api.github.com/users/edersondisouza/following{/other_user}","gists_url":"https://api.github.com/users/edersondisouza/gists{/gist_id}","starred_url":"https://api.github.com/users/edersondisouza/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/edersondisouza/subscriptions","organizations_url":"https://api.github.com/users/edersondisouza/orgs","repos_url":"https://api.github.com/users/edersondisouza/repos","events_url":"https://api.github.com/users/edersondisouza/events{/privacy}","received_events_url":"https://api.github.com/users/edersondisouza/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/edersondisouza/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":true,"url":"https://api.github.com/repos/edersondisouza/soletta","forks_url":"https://api.github.com/repos/edersondisouza/soletta/forks","keys_url":"https://api.github.com/repos/edersondisouza/soletta/keys{/key_id}","collaborators_url":"https://api.github.com/repos/edersondisouza/soletta/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/edersondisouza/soletta/teams","hooks_url":"https://api.github.com/repos/edersondisouza/soletta/hooks","issue_events_url":"https://api.github.com/repos/edersondisouza/soletta/issues/events{/number}","events_url":"https://api.github.com/repos/edersondisouza/soletta/events","assignees_url":"https://api.github.com/repos/edersondisouza/soletta/assignees{/user}","branches_url":"https://api.github.com/repos/edersondisouza/soletta/branches{/branch}","tags_url":"https://api.github.com/repos/edersondisouza/soletta/tags","blobs_url":"https://api.github.com/repos/edersondisouza/soletta/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/edersondisouza/soletta/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/edersondisouza/soletta/git/refs{/sha}","trees_url":"https://api.github.com/repos/edersondisouza/soletta/git/trees{/sha}","statuses_url":"https://api.github.com/repos/edersondisouza/soletta/statuses/{sha}","languages_url":"https://api.github.com/repos/edersondisouza/soletta/languages","stargazers_url":"https://api.github.com/repos/edersondisouza/soletta/stargazers","contributors_url":"https://api.github.com/repos/edersondisouza/soletta/contributors","subscribers_url":"https://api.github.com/repos/edersondisouza/soletta/subscribers","subscription_url":"https://api.github.com/repos/edersondisouza/soletta/subscription","commits_url":"https://api.github.com/repos/edersondisouza/soletta/commits{/sha}","git_commits_url":"https://api.github.com/repos/edersondisouza/soletta/git/commits{/sha}","comments_url":"https://api.github.com/repos/edersondisouza/soletta/comments{/number}","issue_comment_url":"https://api.github.com/repos/edersondisouza/soletta/issues/comments{/number}","contents_url":"https://api.github.com/repos/edersondisouza/soletta/contents/{+path}","compare_url":"https://api.github.com/repos/edersondisouza/soletta/compare/{base}...{head}","merges_url":"https://api.github.com/repos/edersondisouza/soletta/merges","archive_url":"https://api.github.com/repos/edersondisouza/soletta/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/edersondisouza/soletta/downloads","issues_url":"https://api.github.com/repos/edersondisouza/soletta/issues{/number}","pulls_url":"https://api.github.com/repos/edersondisouza/soletta/pulls{/number}","milestones_url":"https://api.github.com/repos/edersondisouza/soletta/milestones{/number}","notifications_url":"https://api.github.com/repos/edersondisouza/soletta/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/edersondisouza/soletta/labels{/name}","releases_url":"https://api.github.com/repos/edersondisouza/soletta/releases{/id}","created_at":"2015-06-18T11:16:56Z","updated_at":"2015-06-18T11:16:57Z","pushed_at":"2015-08-03T16:01:23Z","git_url":"git://github.com/edersondisouza/soletta.git","ssh_url":"git@github.com:edersondisouza/soletta.git","clone_url":"https://github.com/edersondisouza/soletta.git","svn_url":"https://github.com/edersondisouza/soletta","homepage":"","size":2182,"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":"21de9bf60c8e7b09a1b49406b4e87b4bd06473fb","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-07-12T18:54:34Z","pushed_at":"2015-08-03T16:54:26Z","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":"","size":6231,"stargazers_count":39,"watchers_count":39,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":30,"mirror_url":null,"open_issues_count":25,"forks":30,"open_issues":25,"watchers":39,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/solettaproject/soletta/pulls/412"},"html":{"href":"https://github.com/solettaproject/soletta/pull/412"},"issue":{"href":"https://api.github.com/repos/solettaproject/soletta/issues/412"},"comments":{"href":"https://api.github.com/repos/solettaproject/soletta/issues/412/comments"},"review_comments":{"href":"https://api.github.com/repos/solettaproject/soletta/pulls/412/comments"},"review_comment":{"href":"https://api.github.com/repos/solettaproject/soletta/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/solettaproject/soletta/pulls/412/commits"},"statuses":{"href":"https://api.github.com/repos/solettaproject/soletta/statuses/d3c810c43fa7ab3f51f5bf5618779573d96e8140"}}}}