{"action":"created","comment":{"url":"https://api.github.com/repos/solettaproject/soletta/pulls/comments/34592523","id":34592523,"diff_hunk":"@@ -58,87 +60,207 @@ sol_conffile_entry_sort_cb(const void *data1, const void *data2)\n     return strcasecmp(e1->id, e2->id);\n }\n \n-static struct sol_ptr_vector\n-sol_conffile_keyfile_to_vector(GKeyFile *keyfile)\n+static void\n+sol_free_conffile_entry(struct sol_conffile_entry *entry)\n {\n-    struct sol_ptr_vector pv;\n-    gchar **groups, **groups_ptr;\n-    struct sol_conffile_entry *entry = NULL;\n+    free(entry->id);\n+    free(entry->type);\n+    if (entry->options) {\n+        char **tmp = entry->options;\n+        while (*tmp) {\n+            free(*tmp);\n+            tmp++;\n+        }\n+        free(entry->options);\n+    }\n+    free(entry);\n+}\n \n-    sol_ptr_vector_init(&pv);\n+static int\n+sol_conffile_set_entry_options(struct sol_conffile_entry *entry, struct sol_json_token options_object)\n+{\n+    struct sol_json_scanner scanner;\n+    struct sol_json_token token, key, value;\n+    struct sol_ptr_vector vec_options;\n+    enum sol_json_loop_reason reason;\n+\n+    sol_ptr_vector_init(&vec_options);\n+\n+    sol_json_scanner_init_from_token(&scanner, &options_object);\n+    SOL_JSON_SCANNER_OBJECT_LOOP (&scanner, &token, &key, &value, reason) {\n+        int key_len, value_len;\n+        char *tmp;\n+        key_len = sol_json_token_get_size(&key) - 2; // remove quotes from the key.\n+        value_len = sol_json_token_get_size(&value); // do not remove quotes from the value. (not everything is a string here)\n+        if (asprintf(&tmp, \"%.*s=%.*s\", key_len, key.start + 1, value_len, value.start) <= 0) {\n+            SOL_WRN(\"Couldn't allocate memory for the config file, ignoring options.\");\n+            return -ENOMEM;\n+            break;\n+        }\n+        sol_ptr_vector_append(&vec_options, tmp);\n+    }\n+    if (reason != SOL_JSON_LOOP_REASON_OK) {\n+        int i;\n+        void *ptr;\n+        SOL_DBG(\"Error: Invalid Json.\");\n+        SOL_PTR_VECTOR_FOREACH_IDX(&vec_options, ptr, i) {\n+            free(ptr);\n+        }\n+        sol_ptr_vector_clear(&vec_options);\n+        sol_free_conffile_entry(entry);\n+        return -ENOKEY;\n+    }\n \n-    groups = g_key_file_get_groups(keyfile, NULL);\n-    for (groups_ptr = groups; *groups_ptr; groups_ptr++) {\n-        entry = calloc(1, sizeof(*entry));\n-        SOL_NULL_CHECK(entry, pv);\n+    sol_ptr_vector_append(&vec_options, NULL);\n+    entry->options = vec_options.base.data;\n+    return 0;\n+}\n \n-        entry->id = strdup(*groups_ptr);\n+static char *\n+sol_dup_json_str(struct sol_json_token token)\n+{\n+    char *ret = sol_json_token_get_size(&token) >= 2 ?\n+        strndup(token.start + 1, sol_json_token_get_size(&token) - 2) : NULL;\n \n-        entry->type = g_key_file_get_string(keyfile,\n-            *groups_ptr, \"Type\", NULL);\n+    if (!ret)\n+        SOL_WRN(\"Error alocating memory for string\");\n+    return ret;\n+}\n \n-        if (!entry->type) {\n-            SOL_DBG(\"could not find mandatory 'Type' key on group [%s],\"\n-                \" skipping entry\", *groups_ptr);\n-            free((void *)entry->id);\n-            free(entry);\n-            continue;\n+static int\n+sol_conffile_json_to_vector(struct sol_json_scanner scanner, struct sol_ptr_vector *pv)\n+{\n+    struct sol_conffile_entry *entry = NULL;\n+    const char *node_group = \"nodetypes\";\n+    const char *node_name = \"name\";\n+    const char *node_type = \"type\";\n+    const char *node_options = \"options\";\n+    struct sol_json_token token, key, value;\n+    struct sol_json_scanner obj_scanner;\n+    enum sol_json_loop_reason reason;\n+    bool found_nodes = false;\n+    int i;\n+\n+    sol_ptr_vector_init(pv);\n+\n+    SOL_JSON_SCANNER_OBJECT_LOOP (&scanner, &token, &key, &value, reason) {\n+        if (sol_json_token_str_eq(&key, node_group, strlen(node_group))) {\n+            found_nodes = true;\n+            break;\n         }\n+    }\n+    if (reason != SOL_JSON_LOOP_REASON_OK) {\n+        SOL_DBG(\"Error: Invalid Json.\");\n+        goto err;\n+    }\n \n-        entry->options = (const char **)g_key_file_get_string_list(keyfile,\n-            *groups_ptr, \"Options\", NULL, NULL);\n+    if (!found_nodes)\n+        return -ENOKEY;\n \n-        sol_ptr_vector_insert_sorted(&pv, entry,\n-            sol_conffile_entry_sort_cb);\n+    sol_json_scanner_init_from_token(&obj_scanner, &value);\n+    SOL_JSON_SCANNER_ARRAY_LOOP (&obj_scanner, &token, SOL_JSON_TYPE_OBJECT_START, reason) {\n+        entry = calloc(1, sizeof(*entry));\n+        SOL_NULL_CHECK(entry, -ENOMEM);\n+        SOL_JSON_SCANNER_OBJECT_LOOP_NEST (&obj_scanner, &token, &key, &value, reason) {\n+            if (reason != SOL_JSON_LOOP_REASON_OK) {\n+                SOL_DBG(\"Error: Invalid Json.\");\n+                break;\n+            }\n+            if (sol_json_token_str_eq(&key, node_name, strlen(node_name))) {\n+                entry->id = sol_dup_json_str(value);\n+                if (!entry->id) {\n+                    goto err;\n+                }\n+            } else if (sol_json_token_str_eq(&key, node_type, strlen(node_type))) {\n+                entry->type = sol_dup_json_str(value);\n+                if (!entry->type) {\n+                    goto err;\n+                }\n+            } else if (sol_json_token_str_eq(&key, node_options, strlen(node_options))) {\n+                if (sol_conffile_set_entry_options(entry, value) != 0) {\n+                    goto err;\n+                }\n+            }\n+        }\n+        if (reason != SOL_JSON_LOOP_REASON_OK) {\n+            SOL_DBG(\"Error: Invalid Json.\");\n+            goto err;\n+        }\n+        sol_ptr_vector_insert_sorted(pv, entry, sol_conffile_entry_sort_cb);\n     }\n-    g_strfreev(groups);\n+    if (reason != SOL_JSON_LOOP_REASON_OK) {\n+        SOL_DBG(\"Error: Invalid Json.\");\n+        goto err;\n+    }\n+\n+    return 0;\n \n-    return pv;\n+err:\n+    SOL_PTR_VECTOR_FOREACH_IDX(pv, entry, i) {\n+        sol_free_conffile_entry(entry);\n+        sol_ptr_vector_clear(pv);\n+    }\n+\n+    return -ENOMEM;\n }\n \n static void\n-sol_conffile_get_keyfile_include_paths(GKeyFile *keyfile,\n+sol_conffile_get_json_include_paths(\n+    struct sol_json_scanner json_scanner,\n     char **include,\n     char **include_fallbacks)\n {\n     const char *include_group = \"SolettaInclude\";\n-    GError *error = NULL;\n+    const char *include_str = \"Include\";\n+    const char *include_fallback = \"IncludeFallbacks\";\n \n-    if (!g_key_file_has_group(keyfile, include_group))\n-        return;\n+    bool found_include = false;\n \n-    *include = g_key_file_get_string(keyfile,\n-        include_group, \"Include\", &error);\n-    if (*include == NULL && error\n-        && error->code != G_KEY_FILE_ERROR_KEY_NOT_FOUND) {\n-        SOL_DBG(\"could not read value from %s group: %s\",\n-            include_group, error->message);\n-        g_error_free(error);\n-    }\n+    struct sol_json_token token, key, value;\n+    struct sol_json_scanner include_scanner;\n+    enum sol_json_loop_reason reason;\n \n-    *include_fallbacks = g_key_file_get_string(keyfile, include_group,\n-        \"IncludeFallbacks\", &error);\n-    if (*include_fallbacks == NULL && error\n-        && error->code != G_KEY_FILE_ERROR_KEY_NOT_FOUND) {\n-        SOL_DBG(\"could not read value from %s group: %s\",\n-            include_group, error->message);\n-        g_error_free(error);\n+    SOL_JSON_SCANNER_OBJECT_LOOP (&json_scanner, &token, &key, &value, reason) {\n+        if (reason != SOL_JSON_LOOP_REASON_OK) {\n+            SOL_DBG(\"Error: Invalid Json.\");\n+            break;\n+        }\n+\n+        if (sol_json_token_str_eq(&key, include_group, strlen(include_group))) {\n+            found_include = true;\n+            break;\n+        }\n     }\n \n-    if (!g_key_file_remove_group(keyfile, include_group, &error)) {\n-        SOL_DBG(\"could not remove %s group: %s\", include_group,\n-            error ? error->message : \"unknown error\");\n-        g_error_free(error);\n+    if (!found_include)\n+        return;\n+\n+    sol_json_scanner_init_from_token(&include_scanner, &value);\n+    SOL_JSON_SCANNER_OBJECT_LOOP (&include_scanner, &token, &key, &value, reason) {\n+        if (reason != SOL_JSON_LOOP_REASON_OK) {\n+            SOL_DBG(\"Error: Invalid Json.\");\n+            break;\n+        }\n+        if (sol_json_token_str_eq(&key, include_str, strlen(include_str))) {\n+            *include = strndup(value.start, sol_json_token_get_size(&value));\n+            if (!*include)\n+                SOL_DBG(\"Error: couldn't allocate memory for string.\");\n+            continue;\n+        }\n+        if (sol_json_token_str_eq(&key, include_fallback, strlen(include_fallback))) {\n+            *include_fallbacks = strndup(value.start, sol_json_token_get_size(&value));\n+            if (!*include_fallbacks)\n+                SOL_DBG(\"Error: couldn't allocate memory for string.\");\n+            continue;\n+        }\n     }\n }\n \n-static GKeyFile *\n-sol_conffile_load_keyfile_from_dirs(const char *file, char **full_path)\n+static struct sol_str_slice\n+sol_conffile_load_json_from_dirs(const char *file, char **full_path, struct sol_file_reader **file_reader)\n {\n-    char *cwd = NULL;\n-    GError *error = NULL;\n-    GKeyFile *keyfile = NULL;\n-    char cwdbuf[PATH_MAX + 1];\n+    size_t i;\n+    struct sol_str_slice config_file_contents;","path":"src/shared/sol-conffile.c","position":287,"original_position":287,"commit_id":"eb0cddc11e0bb1278393cf9ef816609cd03810db","original_commit_id":"eb0cddc11e0bb1278393cf9ef816609cd03810db","user":{"login":"lpereira","id":15001,"avatar_url":"https://avatars.githubusercontent.com/u/15001?v=3","gravatar_id":"","url":"https://api.github.com/users/lpereira","html_url":"https://github.com/lpereira","followers_url":"https://api.github.com/users/lpereira/followers","following_url":"https://api.github.com/users/lpereira/following{/other_user}","gists_url":"https://api.github.com/users/lpereira/gists{/gist_id}","starred_url":"https://api.github.com/users/lpereira/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lpereira/subscriptions","organizations_url":"https://api.github.com/users/lpereira/orgs","repos_url":"https://api.github.com/users/lpereira/repos","events_url":"https://api.github.com/users/lpereira/events{/privacy}","received_events_url":"https://api.github.com/users/lpereira/received_events","type":"User","site_admin":false},"body":"Initialize this slice with an empty slice (there's a macro for that in the slice include). This is because, if the `else` below fails, `config_file_contents` will be used uninitialized.","created_at":"2015-07-14T17:07:37Z","updated_at":"2015-07-14T17:07:37Z","html_url":"https://github.com/solettaproject/soletta/pull/312#discussion_r34592523","pull_request_url":"https://api.github.com/repos/solettaproject/soletta/pulls/312","_links":{"self":{"href":"https://api.github.com/repos/solettaproject/soletta/pulls/comments/34592523"},"html":{"href":"https://github.com/solettaproject/soletta/pull/312#discussion_r34592523"},"pull_request":{"href":"https://api.github.com/repos/solettaproject/soletta/pulls/312"}}},"pull_request":{"url":"https://api.github.com/repos/solettaproject/soletta/pulls/312","id":39936826,"html_url":"https://github.com/solettaproject/soletta/pull/312","diff_url":"https://github.com/solettaproject/soletta/pull/312.diff","patch_url":"https://github.com/solettaproject/soletta/pull/312.patch","issue_url":"https://api.github.com/repos/solettaproject/soletta/issues/312","number":312,"state":"open","locked":false,"title":"Json config try4","user":{"login":"tcanabrava","id":4027216,"avatar_url":"https://avatars.githubusercontent.com/u/4027216?v=3","gravatar_id":"","url":"https://api.github.com/users/tcanabrava","html_url":"https://github.com/tcanabrava","followers_url":"https://api.github.com/users/tcanabrava/followers","following_url":"https://api.github.com/users/tcanabrava/following{/other_user}","gists_url":"https://api.github.com/users/tcanabrava/gists{/gist_id}","starred_url":"https://api.github.com/users/tcanabrava/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tcanabrava/subscriptions","organizations_url":"https://api.github.com/users/tcanabrava/orgs","repos_url":"https://api.github.com/users/tcanabrava/repos","events_url":"https://api.github.com/users/tcanabrava/events{/privacy}","received_events_url":"https://api.github.com/users/tcanabrava/received_events","type":"User","site_admin":false},"body":"1 - removed 'const' from config entry struct \r\n2 - return sol_str_slice instead of char* in the functions\r\n3 - use sol_str_slice.len instead of strlen(sol_str_slice.data)\r\n4 - memory is finally freed.","created_at":"2015-07-14T16:50:19Z","updated_at":"2015-07-14T17:07:37Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5744da19a5e2edad09177876318a23258c6c9208","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/solettaproject/soletta/pulls/312/commits","review_comments_url":"https://api.github.com/repos/solettaproject/soletta/pulls/312/comments","review_comment_url":"https://api.github.com/repos/solettaproject/soletta/pulls/comments{/number}","comments_url":"https://api.github.com/repos/solettaproject/soletta/issues/312/comments","statuses_url":"https://api.github.com/repos/solettaproject/soletta/statuses/eb0cddc11e0bb1278393cf9ef816609cd03810db","head":{"label":"tcanabrava:json_config_try4","ref":"json_config_try4","sha":"eb0cddc11e0bb1278393cf9ef816609cd03810db","user":{"login":"tcanabrava","id":4027216,"avatar_url":"https://avatars.githubusercontent.com/u/4027216?v=3","gravatar_id":"","url":"https://api.github.com/users/tcanabrava","html_url":"https://github.com/tcanabrava","followers_url":"https://api.github.com/users/tcanabrava/followers","following_url":"https://api.github.com/users/tcanabrava/following{/other_user}","gists_url":"https://api.github.com/users/tcanabrava/gists{/gist_id}","starred_url":"https://api.github.com/users/tcanabrava/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tcanabrava/subscriptions","organizations_url":"https://api.github.com/users/tcanabrava/orgs","repos_url":"https://api.github.com/users/tcanabrava/repos","events_url":"https://api.github.com/users/tcanabrava/events{/privacy}","received_events_url":"https://api.github.com/users/tcanabrava/received_events","type":"User","site_admin":false},"repo":{"id":37602505,"name":"soletta","full_name":"tcanabrava/soletta","owner":{"login":"tcanabrava","id":4027216,"avatar_url":"https://avatars.githubusercontent.com/u/4027216?v=3","gravatar_id":"","url":"https://api.github.com/users/tcanabrava","html_url":"https://github.com/tcanabrava","followers_url":"https://api.github.com/users/tcanabrava/followers","following_url":"https://api.github.com/users/tcanabrava/following{/other_user}","gists_url":"https://api.github.com/users/tcanabrava/gists{/gist_id}","starred_url":"https://api.github.com/users/tcanabrava/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tcanabrava/subscriptions","organizations_url":"https://api.github.com/users/tcanabrava/orgs","repos_url":"https://api.github.com/users/tcanabrava/repos","events_url":"https://api.github.com/users/tcanabrava/events{/privacy}","received_events_url":"https://api.github.com/users/tcanabrava/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/tcanabrava/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/tcanabrava/soletta","forks_url":"https://api.github.com/repos/tcanabrava/soletta/forks","keys_url":"https://api.github.com/repos/tcanabrava/soletta/keys{/key_id}","collaborators_url":"https://api.github.com/repos/tcanabrava/soletta/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/tcanabrava/soletta/teams","hooks_url":"https://api.github.com/repos/tcanabrava/soletta/hooks","issue_events_url":"https://api.github.com/repos/tcanabrava/soletta/issues/events{/number}","events_url":"https://api.github.com/repos/tcanabrava/soletta/events","assignees_url":"https://api.github.com/repos/tcanabrava/soletta/assignees{/user}","branches_url":"https://api.github.com/repos/tcanabrava/soletta/branches{/branch}","tags_url":"https://api.github.com/repos/tcanabrava/soletta/tags","blobs_url":"https://api.github.com/repos/tcanabrava/soletta/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/tcanabrava/soletta/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/tcanabrava/soletta/git/refs{/sha}","trees_url":"https://api.github.com/repos/tcanabrava/soletta/git/trees{/sha}","statuses_url":"https://api.github.com/repos/tcanabrava/soletta/statuses/{sha}","languages_url":"https://api.github.com/repos/tcanabrava/soletta/languages","stargazers_url":"https://api.github.com/repos/tcanabrava/soletta/stargazers","contributors_url":"https://api.github.com/repos/tcanabrava/soletta/contributors","subscribers_url":"https://api.github.com/repos/tcanabrava/soletta/subscribers","subscription_url":"https://api.github.com/repos/tcanabrava/soletta/subscription","commits_url":"https://api.github.com/repos/tcanabrava/soletta/commits{/sha}","git_commits_url":"https://api.github.com/repos/tcanabrava/soletta/git/commits{/sha}","comments_url":"https://api.github.com/repos/tcanabrava/soletta/comments{/number}","issue_comment_url":"https://api.github.com/repos/tcanabrava/soletta/issues/comments{/number}","contents_url":"https://api.github.com/repos/tcanabrava/soletta/contents/{+path}","compare_url":"https://api.github.com/repos/tcanabrava/soletta/compare/{base}...{head}","merges_url":"https://api.github.com/repos/tcanabrava/soletta/merges","archive_url":"https://api.github.com/repos/tcanabrava/soletta/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/tcanabrava/soletta/downloads","issues_url":"https://api.github.com/repos/tcanabrava/soletta/issues{/number}","pulls_url":"https://api.github.com/repos/tcanabrava/soletta/pulls{/number}","milestones_url":"https://api.github.com/repos/tcanabrava/soletta/milestones{/number}","notifications_url":"https://api.github.com/repos/tcanabrava/soletta/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/tcanabrava/soletta/labels{/name}","releases_url":"https://api.github.com/repos/tcanabrava/soletta/releases{/id}","created_at":"2015-06-17T15:11:28Z","updated_at":"2015-06-17T15:11:30Z","pushed_at":"2015-07-14T15:19:26Z","git_url":"git://github.com/tcanabrava/soletta.git","ssh_url":"git@github.com:tcanabrava/soletta.git","clone_url":"https://github.com/tcanabrava/soletta.git","svn_url":"https://github.com/tcanabrava/soletta","homepage":"","size":2473,"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":"4defdec18a74c280d17e200494c5b85cbb25d47f","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-07-14T16:50:19Z","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":6493,"stargazers_count":39,"watchers_count":39,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":30,"mirror_url":null,"open_issues_count":22,"forks":30,"open_issues":22,"watchers":39,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/solettaproject/soletta/pulls/312"},"html":{"href":"https://github.com/solettaproject/soletta/pull/312"},"issue":{"href":"https://api.github.com/repos/solettaproject/soletta/issues/312"},"comments":{"href":"https://api.github.com/repos/solettaproject/soletta/issues/312/comments"},"review_comments":{"href":"https://api.github.com/repos/solettaproject/soletta/pulls/312/comments"},"review_comment":{"href":"https://api.github.com/repos/solettaproject/soletta/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/solettaproject/soletta/pulls/312/commits"},"statuses":{"href":"https://api.github.com/repos/solettaproject/soletta/statuses/eb0cddc11e0bb1278393cf9ef816609cd03810db"}}}}