{"action":"created","comment":{"url":"https://api.github.com/repos/realm/realm-object-store/pulls/comments/83369951","pull_request_review_id":4217591,"id":83369951,"diff_hunk":"@@ -0,0 +1,262 @@\n+////////////////////////////////////////////////////////////////////////////\n+//\n+// Copyright 2016 Realm Inc.\n+//\n+// Licensed under the Apache License, Version 2.0 (the \"License\");\n+// you may not use this file except in compliance with the License.\n+// You may obtain a copy of the License at\n+//\n+// http://www.apache.org/licenses/LICENSE-2.0\n+//\n+// Unless required by applicable law or agreed to in writing, software\n+// distributed under the License is distributed on an \"AS IS\" BASIS,\n+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+// See the License for the specific language governing permissions and\n+// limitations under the License.\n+//\n+////////////////////////////////////////////////////////////////////////////\n+\n+#include \"sync_file.hpp\"\n+\n+#include <realm/util/file.hpp>\n+\n+using File = realm::util::File;\n+\n+namespace realm {\n+\n+static uint8_t value_of_hex_digit(char hex_digit)\n+{\n+    if (hex_digit >= '0' && hex_digit <= '9') {\n+        return hex_digit - '0';\n+    } else if (hex_digit >= 'A' && hex_digit <= 'F') {\n+        return 10 + hex_digit - 'A';\n+    } else if (hex_digit >= 'a' && hex_digit <= 'f') {\n+        return 10 + hex_digit - 'a';\n+    } else {\n+        throw std::invalid_argument(\"Cannot get the value of a character that isn't a hex digit.\");\n+    }\n+}\n+\n+static bool character_is_unreserved(char character)\n+{\n+    bool is_capital_letter = (character >= 'A' && character <= 'Z');\n+    bool is_lowercase_letter = (character >= 'a' && character <= 'z');\n+    bool is_number = (character >= '0' && character <= '9');\n+    bool is_allowed_symbol = (character == '-' || character == '_');\n+    return is_capital_letter || is_lowercase_letter || is_number || is_allowed_symbol;\n+}\n+\n+static char decoded_char_for(const std::string& percent_encoding, size_t index)\n+{\n+    if (index+2 >= percent_encoding.length()) {\n+        throw std::invalid_argument(\"Malformed string: not enough characters after '%' before end of string.\");\n+    }\n+    REALM_ASSERT(percent_encoding[index] == '%');\n+    return (16*value_of_hex_digit(percent_encoding[index + 1])) + value_of_hex_digit(percent_encoding[index + 2]);\n+}\n+\n+void remove_nonempty_dir(const std::string& path)\n+{\n+#ifdef _WIN32\n+    // Not implemented yet.\n+    REALM_ASSERT(false);\n+#else\n+    // Open the directory and list all the files.\n+    DIR *dir_listing = opendir(path.c_str());\n+    if (!dir_listing) {\n+        return;\n+    }\n+    while (struct dirent *file = readdir(dir_listing)) {\n+        auto file_type = file->d_type;\n+        std::string file_name = file->d_name;\n+        if (file_name == \".\" || file_name == \"..\") {\n+            continue;\n+        }\n+        if (file_type == DT_REG || file_type == DT_FIFO) {\n+            // Regular file (this really shouldn't ever throw, so if it does don't bother catching the exception).\n+            File::remove(file_path_by_appending_component(path, file_name));\n+        } else if (file_type == DT_DIR) {\n+            // Directory, recurse\n+            remove_nonempty_dir(file_path_by_appending_component(path, file_name, true));\n+        }\n+    }\n+    closedir(dir_listing);\n+    // Delete the directory itself\n+    util::remove_dir(path);\n+#endif\n+}\n+\n+std::string make_percent_encoded_string(const std::string& raw_string)\n+{\n+    std::string buffer;\n+    buffer.reserve(raw_string.length());\n+    for (char character : raw_string) {\n+        if (character_is_unreserved(character)) {\n+            buffer.push_back(character);\n+        } else {\n+            char b[4] = {0, 0, 0, 0};\n+            snprintf(b, 4, \"%%%2X\", character);\n+            buffer.append(b);\n+        }\n+    }\n+    return buffer;\n+}\n+\n+std::string make_raw_string(const std::string& percent_encoded_string)\n+{\n+    std::string buffer;\n+    size_t input_len = percent_encoded_string.length();\n+    buffer.reserve(input_len);\n+    size_t idx = 0;\n+    while (idx < input_len) {\n+        char current = percent_encoded_string[idx];\n+        if (current == '%') {\n+            // Decode. +3.\n+            buffer.push_back(decoded_char_for(percent_encoded_string, idx));\n+            idx += 3;\n+        } else {\n+            // No need to decode. +1.\n+            if (!character_is_unreserved(current)) {\n+                throw std::invalid_argument(\"Input string is invalid: contains reserved characters.\");\n+            }\n+            buffer.push_back(current);\n+            idx++;\n+        }\n+    }\n+    return buffer;\n+}\n+\n+std::string file_path_by_appending_component(const std::string& path, const std::string& component, bool is_directory)\n+{\n+    // FIXME: Does this have to be changed to accomodate Windows platforms?\n+    std::string terminal = \"\";\n+    if (is_directory && component[component.length() - 1] != '/') {\n+        terminal = \"/\";\n+    }\n+    char path_last = path[path.length() - 1];\n+    char component_first = component[0];\n+    if (path_last == '/' && component_first == '/') {\n+        return path + component.substr(1) + terminal;\n+    } else if (path_last == '/' || component_first == '/') {\n+        return path + component + terminal;\n+    } else {\n+        return path + \"/\" + component + terminal;\n+    }\n+}\n+\n+std::string file_path_by_appending_extension(const std::string& path, const std::string& extension)\n+{\n+    char path_last = path[path.length() - 1];\n+    char extension_first = extension[0];\n+    if (path_last == '.' && extension_first == '.') {\n+        return path + extension.substr(1);\n+    } else if (path_last == '.' || extension_first == '.') {\n+        return path + extension;\n+    } else {\n+        return path + \".\" + extension;\n+    }\n+}\n+\n+std::string SyncFileManager::get_utility_directory()\n+{\n+    auto util_path = file_path_by_appending_component(get_base_sync_directory(), c_utility_directory, true);\n+    util::try_make_dir(util_path);\n+    return util_path;\n+}\n+\n+std::string SyncFileManager::get_base_sync_directory()\n+{\n+    auto sync_path = file_path_by_appending_component(m_base_path, c_sync_directory, true);\n+    util::try_make_dir(sync_path);\n+    return sync_path;\n+}\n+\n+std::string SyncFileManager::user_directory(std::string user_identity)","path":"src/sync/impl/sync_file.cpp","position":174,"original_position":174,"commit_id":"0ec034f5471ec06dce3ac07bfab0fccb30f4082e","original_commit_id":"0ec034f5471ec06dce3ac07bfab0fccb30f4082e","user":{"login":"simonask","id":23115,"avatar_url":"https://avatars.githubusercontent.com/u/23115?v=3","gravatar_id":"","url":"https://api.github.com/users/simonask","html_url":"https://github.com/simonask","followers_url":"https://api.github.com/users/simonask/followers","following_url":"https://api.github.com/users/simonask/following{/other_user}","gists_url":"https://api.github.com/users/simonask/gists{/gist_id}","starred_url":"https://api.github.com/users/simonask/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/simonask/subscriptions","organizations_url":"https://api.github.com/users/simonask/orgs","repos_url":"https://api.github.com/users/simonask/repos","events_url":"https://api.github.com/users/simonask/events{/privacy}","received_events_url":"https://api.github.com/users/simonask/received_events","type":"User","site_admin":false},"body":"Should this be `const std::string&` instead of by value?","created_at":"2016-10-14T07:28:05Z","updated_at":"2016-10-14T08:00:43Z","html_url":"https://github.com/realm/realm-object-store/pull/193#discussion_r83369951","pull_request_url":"https://api.github.com/repos/realm/realm-object-store/pulls/193","_links":{"self":{"href":"https://api.github.com/repos/realm/realm-object-store/pulls/comments/83369951"},"html":{"href":"https://github.com/realm/realm-object-store/pull/193#discussion_r83369951"},"pull_request":{"href":"https://api.github.com/repos/realm/realm-object-store/pulls/193"}}},"pull_request":{"url":"https://api.github.com/repos/realm/realm-object-store/pulls/193","id":88935215,"html_url":"https://github.com/realm/realm-object-store/pull/193","diff_url":"https://github.com/realm/realm-object-store/pull/193.diff","patch_url":"https://github.com/realm/realm-object-store/pull/193.patch","issue_url":"https://api.github.com/repos/realm/realm-object-store/issues/193","number":193,"state":"open","locked":false,"title":"Refactor object store to handle sync functionality","user":{"login":"austinzheng","id":3687054,"avatar_url":"https://avatars.githubusercontent.com/u/3687054?v=3","gravatar_id":"","url":"https://api.github.com/users/austinzheng","html_url":"https://github.com/austinzheng","followers_url":"https://api.github.com/users/austinzheng/followers","following_url":"https://api.github.com/users/austinzheng/following{/other_user}","gists_url":"https://api.github.com/users/austinzheng/gists{/gist_id}","starred_url":"https://api.github.com/users/austinzheng/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/austinzheng/subscriptions","organizations_url":"https://api.github.com/users/austinzheng/orgs","repos_url":"https://api.github.com/users/austinzheng/repos","events_url":"https://api.github.com/users/austinzheng/events{/privacy}","received_events_url":"https://api.github.com/users/austinzheng/received_events","type":"User","site_admin":false},"body":"EDIT: now an actual review.\r\n\r\nI went ahead and tried this refactoring in order to simplify the Cocoa binding. It follows the latest version of the API described in #185 pretty closely, but with changes and additions that became necessary during implementation.\r\n\r\nIn terms of validation: both Mark's (very small) object store level sync test suite, as well as the Cocoa test suite for the accompanying bindings change, pass. \r\n\r\nChanges:\r\n- Added `SyncUser` as an object-store level type representing a user\r\n- Changed `SyncConfig` to take a pointer to a `SyncUser` rather than a tag string\r\n- Added APIs to `SyncManager` to get, create, manage, and store users\r\n- `SyncSession` is now a class rather than a struct, for consistency\r\n- `SyncSession` now starts in the `Inactive` state, and waits for its associated user to ask it to begin the binding process\r\n- Added some code to `SyncSession` and its states to support directly binding the session with an 'admin token'\r\n- Renamed `SyncLogInHandler` to `SyncBindSessionHandler` and added a pointer to `SyncSession` as an argument, allowing bindings to not need to store add'l state\r\n- `SyncManager` now has getters for some of its configuration properties\r\n- The object store now transparently manages persistence metadata\r\n- The object store now manages file-related operations (`sync_file.cpp`)\r\n- `SyncManager` can now be partially reset, only for testing purposes\r\n- Modified cmake files to link with yaml-cpp","created_at":"2016-10-12T00:35:53Z","updated_at":"2016-10-14T08:00:44Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b2122ecf32fdf78260dd353fbd59b56912cff773","assignee":{"login":"austinzheng","id":3687054,"avatar_url":"https://avatars.githubusercontent.com/u/3687054?v=3","gravatar_id":"","url":"https://api.github.com/users/austinzheng","html_url":"https://github.com/austinzheng","followers_url":"https://api.github.com/users/austinzheng/followers","following_url":"https://api.github.com/users/austinzheng/following{/other_user}","gists_url":"https://api.github.com/users/austinzheng/gists{/gist_id}","starred_url":"https://api.github.com/users/austinzheng/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/austinzheng/subscriptions","organizations_url":"https://api.github.com/users/austinzheng/orgs","repos_url":"https://api.github.com/users/austinzheng/repos","events_url":"https://api.github.com/users/austinzheng/events{/privacy}","received_events_url":"https://api.github.com/users/austinzheng/received_events","type":"User","site_admin":false},"assignees":[{"login":"austinzheng","id":3687054,"avatar_url":"https://avatars.githubusercontent.com/u/3687054?v=3","gravatar_id":"","url":"https://api.github.com/users/austinzheng","html_url":"https://github.com/austinzheng","followers_url":"https://api.github.com/users/austinzheng/followers","following_url":"https://api.github.com/users/austinzheng/following{/other_user}","gists_url":"https://api.github.com/users/austinzheng/gists{/gist_id}","starred_url":"https://api.github.com/users/austinzheng/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/austinzheng/subscriptions","organizations_url":"https://api.github.com/users/austinzheng/orgs","repos_url":"https://api.github.com/users/austinzheng/repos","events_url":"https://api.github.com/users/austinzheng/events{/privacy}","received_events_url":"https://api.github.com/users/austinzheng/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/realm/realm-object-store/pulls/193/commits","review_comments_url":"https://api.github.com/repos/realm/realm-object-store/pulls/193/comments","review_comment_url":"https://api.github.com/repos/realm/realm-object-store/pulls/comments{/number}","comments_url":"https://api.github.com/repos/realm/realm-object-store/issues/193/comments","statuses_url":"https://api.github.com/repos/realm/realm-object-store/statuses/0ec034f5471ec06dce3ac07bfab0fccb30f4082e","head":{"label":"realm:az/refactor-sync","ref":"az/refactor-sync","sha":"0ec034f5471ec06dce3ac07bfab0fccb30f4082e","user":{"login":"realm","id":7575099,"avatar_url":"https://avatars.githubusercontent.com/u/7575099?v=3","gravatar_id":"","url":"https://api.github.com/users/realm","html_url":"https://github.com/realm","followers_url":"https://api.github.com/users/realm/followers","following_url":"https://api.github.com/users/realm/following{/other_user}","gists_url":"https://api.github.com/users/realm/gists{/gist_id}","starred_url":"https://api.github.com/users/realm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/realm/subscriptions","organizations_url":"https://api.github.com/users/realm/orgs","repos_url":"https://api.github.com/users/realm/repos","events_url":"https://api.github.com/users/realm/events{/privacy}","received_events_url":"https://api.github.com/users/realm/received_events","type":"Organization","site_admin":false},"repo":{"id":36953657,"name":"realm-object-store","full_name":"realm/realm-object-store","owner":{"login":"realm","id":7575099,"avatar_url":"https://avatars.githubusercontent.com/u/7575099?v=3","gravatar_id":"","url":"https://api.github.com/users/realm","html_url":"https://github.com/realm","followers_url":"https://api.github.com/users/realm/followers","following_url":"https://api.github.com/users/realm/following{/other_user}","gists_url":"https://api.github.com/users/realm/gists{/gist_id}","starred_url":"https://api.github.com/users/realm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/realm/subscriptions","organizations_url":"https://api.github.com/users/realm/orgs","repos_url":"https://api.github.com/users/realm/repos","events_url":"https://api.github.com/users/realm/events{/privacy}","received_events_url":"https://api.github.com/users/realm/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/realm/realm-object-store","description":"Cross-platform abstractions used within Realm products","fork":false,"url":"https://api.github.com/repos/realm/realm-object-store","forks_url":"https://api.github.com/repos/realm/realm-object-store/forks","keys_url":"https://api.github.com/repos/realm/realm-object-store/keys{/key_id}","collaborators_url":"https://api.github.com/repos/realm/realm-object-store/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/realm/realm-object-store/teams","hooks_url":"https://api.github.com/repos/realm/realm-object-store/hooks","issue_events_url":"https://api.github.com/repos/realm/realm-object-store/issues/events{/number}","events_url":"https://api.github.com/repos/realm/realm-object-store/events","assignees_url":"https://api.github.com/repos/realm/realm-object-store/assignees{/user}","branches_url":"https://api.github.com/repos/realm/realm-object-store/branches{/branch}","tags_url":"https://api.github.com/repos/realm/realm-object-store/tags","blobs_url":"https://api.github.com/repos/realm/realm-object-store/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/realm/realm-object-store/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/realm/realm-object-store/git/refs{/sha}","trees_url":"https://api.github.com/repos/realm/realm-object-store/git/trees{/sha}","statuses_url":"https://api.github.com/repos/realm/realm-object-store/statuses/{sha}","languages_url":"https://api.github.com/repos/realm/realm-object-store/languages","stargazers_url":"https://api.github.com/repos/realm/realm-object-store/stargazers","contributors_url":"https://api.github.com/repos/realm/realm-object-store/contributors","subscribers_url":"https://api.github.com/repos/realm/realm-object-store/subscribers","subscription_url":"https://api.github.com/repos/realm/realm-object-store/subscription","commits_url":"https://api.github.com/repos/realm/realm-object-store/commits{/sha}","git_commits_url":"https://api.github.com/repos/realm/realm-object-store/git/commits{/sha}","comments_url":"https://api.github.com/repos/realm/realm-object-store/comments{/number}","issue_comment_url":"https://api.github.com/repos/realm/realm-object-store/issues/comments{/number}","contents_url":"https://api.github.com/repos/realm/realm-object-store/contents/{+path}","compare_url":"https://api.github.com/repos/realm/realm-object-store/compare/{base}...{head}","merges_url":"https://api.github.com/repos/realm/realm-object-store/merges","archive_url":"https://api.github.com/repos/realm/realm-object-store/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/realm/realm-object-store/downloads","issues_url":"https://api.github.com/repos/realm/realm-object-store/issues{/number}","pulls_url":"https://api.github.com/repos/realm/realm-object-store/pulls{/number}","milestones_url":"https://api.github.com/repos/realm/realm-object-store/milestones{/number}","notifications_url":"https://api.github.com/repos/realm/realm-object-store/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/realm/realm-object-store/labels{/name}","releases_url":"https://api.github.com/repos/realm/realm-object-store/releases{/id}","deployments_url":"https://api.github.com/repos/realm/realm-object-store/deployments","created_at":"2015-06-05T20:21:52Z","updated_at":"2016-10-06T16:49:41Z","pushed_at":"2016-10-14T00:20:45Z","git_url":"git://github.com/realm/realm-object-store.git","ssh_url":"git@github.com:realm/realm-object-store.git","clone_url":"https://github.com/realm/realm-object-store.git","svn_url":"https://github.com/realm/realm-object-store","homepage":"https://realm.io","size":1299,"stargazers_count":40,"watchers_count":40,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":5,"mirror_url":null,"open_issues_count":18,"forks":5,"open_issues":18,"watchers":40,"default_branch":"master"}},"base":{"label":"realm:cocoa","ref":"cocoa","sha":"33f2554c47b76291e601226768bf81dd602a26fb","user":{"login":"realm","id":7575099,"avatar_url":"https://avatars.githubusercontent.com/u/7575099?v=3","gravatar_id":"","url":"https://api.github.com/users/realm","html_url":"https://github.com/realm","followers_url":"https://api.github.com/users/realm/followers","following_url":"https://api.github.com/users/realm/following{/other_user}","gists_url":"https://api.github.com/users/realm/gists{/gist_id}","starred_url":"https://api.github.com/users/realm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/realm/subscriptions","organizations_url":"https://api.github.com/users/realm/orgs","repos_url":"https://api.github.com/users/realm/repos","events_url":"https://api.github.com/users/realm/events{/privacy}","received_events_url":"https://api.github.com/users/realm/received_events","type":"Organization","site_admin":false},"repo":{"id":36953657,"name":"realm-object-store","full_name":"realm/realm-object-store","owner":{"login":"realm","id":7575099,"avatar_url":"https://avatars.githubusercontent.com/u/7575099?v=3","gravatar_id":"","url":"https://api.github.com/users/realm","html_url":"https://github.com/realm","followers_url":"https://api.github.com/users/realm/followers","following_url":"https://api.github.com/users/realm/following{/other_user}","gists_url":"https://api.github.com/users/realm/gists{/gist_id}","starred_url":"https://api.github.com/users/realm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/realm/subscriptions","organizations_url":"https://api.github.com/users/realm/orgs","repos_url":"https://api.github.com/users/realm/repos","events_url":"https://api.github.com/users/realm/events{/privacy}","received_events_url":"https://api.github.com/users/realm/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/realm/realm-object-store","description":"Cross-platform abstractions used within Realm products","fork":false,"url":"https://api.github.com/repos/realm/realm-object-store","forks_url":"https://api.github.com/repos/realm/realm-object-store/forks","keys_url":"https://api.github.com/repos/realm/realm-object-store/keys{/key_id}","collaborators_url":"https://api.github.com/repos/realm/realm-object-store/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/realm/realm-object-store/teams","hooks_url":"https://api.github.com/repos/realm/realm-object-store/hooks","issue_events_url":"https://api.github.com/repos/realm/realm-object-store/issues/events{/number}","events_url":"https://api.github.com/repos/realm/realm-object-store/events","assignees_url":"https://api.github.com/repos/realm/realm-object-store/assignees{/user}","branches_url":"https://api.github.com/repos/realm/realm-object-store/branches{/branch}","tags_url":"https://api.github.com/repos/realm/realm-object-store/tags","blobs_url":"https://api.github.com/repos/realm/realm-object-store/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/realm/realm-object-store/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/realm/realm-object-store/git/refs{/sha}","trees_url":"https://api.github.com/repos/realm/realm-object-store/git/trees{/sha}","statuses_url":"https://api.github.com/repos/realm/realm-object-store/statuses/{sha}","languages_url":"https://api.github.com/repos/realm/realm-object-store/languages","stargazers_url":"https://api.github.com/repos/realm/realm-object-store/stargazers","contributors_url":"https://api.github.com/repos/realm/realm-object-store/contributors","subscribers_url":"https://api.github.com/repos/realm/realm-object-store/subscribers","subscription_url":"https://api.github.com/repos/realm/realm-object-store/subscription","commits_url":"https://api.github.com/repos/realm/realm-object-store/commits{/sha}","git_commits_url":"https://api.github.com/repos/realm/realm-object-store/git/commits{/sha}","comments_url":"https://api.github.com/repos/realm/realm-object-store/comments{/number}","issue_comment_url":"https://api.github.com/repos/realm/realm-object-store/issues/comments{/number}","contents_url":"https://api.github.com/repos/realm/realm-object-store/contents/{+path}","compare_url":"https://api.github.com/repos/realm/realm-object-store/compare/{base}...{head}","merges_url":"https://api.github.com/repos/realm/realm-object-store/merges","archive_url":"https://api.github.com/repos/realm/realm-object-store/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/realm/realm-object-store/downloads","issues_url":"https://api.github.com/repos/realm/realm-object-store/issues{/number}","pulls_url":"https://api.github.com/repos/realm/realm-object-store/pulls{/number}","milestones_url":"https://api.github.com/repos/realm/realm-object-store/milestones{/number}","notifications_url":"https://api.github.com/repos/realm/realm-object-store/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/realm/realm-object-store/labels{/name}","releases_url":"https://api.github.com/repos/realm/realm-object-store/releases{/id}","deployments_url":"https://api.github.com/repos/realm/realm-object-store/deployments","created_at":"2015-06-05T20:21:52Z","updated_at":"2016-10-06T16:49:41Z","pushed_at":"2016-10-14T00:20:45Z","git_url":"git://github.com/realm/realm-object-store.git","ssh_url":"git@github.com:realm/realm-object-store.git","clone_url":"https://github.com/realm/realm-object-store.git","svn_url":"https://github.com/realm/realm-object-store","homepage":"https://realm.io","size":1299,"stargazers_count":40,"watchers_count":40,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":5,"mirror_url":null,"open_issues_count":18,"forks":5,"open_issues":18,"watchers":40,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/realm/realm-object-store/pulls/193"},"html":{"href":"https://github.com/realm/realm-object-store/pull/193"},"issue":{"href":"https://api.github.com/repos/realm/realm-object-store/issues/193"},"comments":{"href":"https://api.github.com/repos/realm/realm-object-store/issues/193/comments"},"review_comments":{"href":"https://api.github.com/repos/realm/realm-object-store/pulls/193/comments"},"review_comment":{"href":"https://api.github.com/repos/realm/realm-object-store/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/realm/realm-object-store/pulls/193/commits"},"statuses":{"href":"https://api.github.com/repos/realm/realm-object-store/statuses/0ec034f5471ec06dce3ac07bfab0fccb30f4082e"}}}}
{"actor":{"display_login":"simonask"}}