{"action":"created","comment":{"url":"https://api.github.com/repos/Unvanquished/Unvanquished/pulls/comments/30670021","id":30670021,"diff_hunk":"@@ -55,27 +67,226 @@ GLShader_motionblur                      *gl_motionblurShader = nullptr;\n GLShader_fxaa                            *gl_fxaaShader = nullptr;\n GLShaderManager                           gl_shaderManager;\n \n-GLShaderManager::~GLShaderManager( )\n+namespace // Implementation details\n {\n-\tfor ( std::size_t i = 0; i < _shaders.size(); i++ )\n+\tinline void ThrowShaderError(Str::StringRef msg)\n \t{\n-\t\tdelete _shaders[ i ];\n+\t\tthrow ShaderException(msg.c_str());\n \t}\n-}\n \n-void GLShaderManager::freeAll()\n-{\n-\tfor ( std::size_t i = 0; i < _shaders.size(); i++ )\n+\tconst char* GetInternalShader(Str::StringRef filename)\n+\t{\n+\t\tauto it = shadermap.find(filename);\n+\t\tif (it != shadermap.end())\n+\t\t\treturn it->second;\n+\t\treturn nullptr;\n+\t}\n+\n+\tenum class CommentType\n+\t{\n+\t\tNone,\n+\t\tBlock,\n+\t\tLine\n+\t};\n+\n+\tbool FindCommentStart(const std::string& source, size_t start, size_t& commentStartPos, CommentType& commentType)\n+\t{\n+\t\tfor (size_t pos = start; pos < source.length(); ++pos)\n+\t\t{\n+\t\t\tif (source[pos] == '/' && pos + 1 < source.length())\n+\t\t\t{\n+\t\t\t\tif (source[pos + 1] == '/')\n+\t\t\t\t{\n+\t\t\t\t\tcommentType = CommentType::Line;\n+\t\t\t\t\tcommentStartPos = pos;\n+\t\t\t\t\treturn true;\n+\t\t\t\t}\n+\t\t\t\tif (source[pos + 1] == '*')\n+\t\t\t\t{\n+\t\t\t\t\tcommentType = CommentType::Block;\n+\t\t\t\t\tcommentStartPos = pos;\n+\t\t\t\t\treturn true;\n+\t\t\t\t}\n+\t\t\t}\n+\t\t}\n+\t\tcommentStartPos = std::string::npos;\n+\t\tcommentType = CommentType::None;\n+\t\treturn false;\n+\t}\n+\n+\tbool FindCommentEnd(const std::string& source, size_t start, CommentType commentType, size_t& commentEndPos)\n+\t{\n+\t\tassert(commentType != CommentType::None);\n+\t\tif (commentType == CommentType::Block)\n+\t\t{\n+\t\t\tcommentEndPos = source.find(\"*/\", start);\n+\t\t\tif (commentEndPos != std::string::npos)\n+\t\t\t\tcommentEndPos += 2;\n+\t\t}\n+\t\telse\n+\t\t\tcommentEndPos = source.find_first_of(\"\\r\\n\", start);\n+\t\treturn (commentEndPos != std::string::npos);\n+\t}\n+\n+\t// Remove C++ comments from a file.\n+\t// This logic must effictively match what buildshaders.sh does.\n+\t// If it doesn't the app will issue warnings but not from this routine.\n+\t// We remove slash star xxxx star slash and\n+\t// slash slash xxxx to \\r or \\n combinations. We leave the\n+\t// new line character inplace to avoid splicing together lines\n+\t// and creating new tokens by accident.\n+\t// We don't use regex as we don't need it. Nor do we want\n+\t// to force a dependency on it either for such simple needs.\n+\t// We do not remove #if 0 type comments as buildshader does not do\n+\t// that. It would be also more complex. Complexity comes from\n+\t// things like #if X #elif 0 #else X #endif patterns.\n+\t// The shaders actually do/did that btw.\n+\t// But we don't need to handle #directives right now nor do we.\n+\tvoid StripComments(std::string& source)\n+\t{\n+\t\tsize_t sourcePos = 0;\n+\t\tsize_t keepPos = 0;\n+\t\tsize_t commentStartPos;\n+\t\tsize_t commentEndPos;\n+\t\tCommentType commentType;\n+\n+\t\tauto keep = [&](size_t keepLength)\n+\t\t{\n+\t\t\tif (keepPos != sourcePos)\n+\t\t\t\tstd::copy(source.begin() + sourcePos, source.begin() + sourcePos + keepLength,\n+\t\t\t\t\tsource.begin() + keepPos);\n+\t\t\tkeepPos += keepLength;\n+\t\t};\n+\n+\t\tfor (;; )\n+\t\t{\n+\t\t\tbool foundCommentStart = FindCommentStart(source, sourcePos, commentStartPos, commentType);\n+\t\t\tif (!foundCommentStart)\n+\t\t\t{\n+\t\t\t\t// If we don't find a comment, the rest of program is code.\n+\t\t\t\tsize_t remainingLength = source.length() - sourcePos;\n+\t\t\t\tkeep(remainingLength);\n+\t\t\t\tbreak;\n+\t\t\t}\n+\n+\t\t\tbool foundCommentEnd = FindCommentEnd(source, commentStartPos, commentType, commentEndPos);\n+\t\t\tif (!foundCommentEnd)\n+\t\t\t{\n+\t\t\t\t// If we don't find the end of a comment:\n+\t\t\t\t// If it' a block comment we failed to close then keep everything\n+\t\t\t\t// before it and after. Before it is code and keeping what's\n+\t\t\t\t// after makes it easier to diagnose what's wrong.\n+\t\t\t\t// If we can't close a line comment (i.e. no new line), keep everything\n+\t\t\t\t// before it as that's code, but forget the line comment and what follows.\n+\t\t\t\t// Either way we are done.\n+\t\t\t\tif (commentType == CommentType::Block)\n+\t\t\t\t{\n+\t\t\t\t\tsize_t remainingLength = source.length() - sourcePos;\n+\t\t\t\t\tkeep(remainingLength);\n+\t\t\t\t}\n+\t\t\t\telse\n+\t\t\t\t{\n+\t\t\t\t\tsize_t codeLength = commentStartPos - sourcePos;\n+\t\t\t\t\tkeep(codeLength);\n+\t\t\t\t}\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t\t// We found a start and end comment. keep the what's before the comment.\n+\t\t\t// as that's code. Then continue after the comment.\n+\t\t\t// Note that the new line that exists after comments is kept to avoid\n+\t\t\t// splicing any lines together without gaps that would create new unexpected tokens.\n+\t\t\tsize_t codeLength = commentStartPos - sourcePos;\n+\t\t\tkeep(codeLength);\n+\t\t\tsourcePos = commentEndPos;\n+\t\t}\n+\t\tsource.resize(keepPos);\n+\t}\n+\n+\t// Somewhat emulate what buildshader.sh does or doesn't do.\n+\t// Not wildly efficient but doesn't have to be as it's currently\n+\t// only used as part of a debugging only feature on small shader files.\n+\tvoid NormalizeShaderText( std::string& text )\n \t{\n-\t\tdelete _shaders[ i ];\n+\t\tsize_t pos = 0;\n+\t\twhile ((pos = text.find(\"\\r\\n\", pos)) != std::string::npos)","path":"src/engine/renderer/gl_shader.cpp","position":170,"original_position":174,"commit_id":"5c7cfad036684dfbf882e4913a5e7e5d9ebfe0b4","original_commit_id":"2c52ac586df5f3ac32e1fd3ea2bb7404144da5e8","user":{"login":"gmcode","id":10876766,"avatar_url":"https://avatars.githubusercontent.com/u/10876766?v=3","gravatar_id":"","url":"https://api.github.com/users/gmcode","html_url":"https://github.com/gmcode","followers_url":"https://api.github.com/users/gmcode/followers","following_url":"https://api.github.com/users/gmcode/following{/other_user}","gists_url":"https://api.github.com/users/gmcode/gists{/gist_id}","starred_url":"https://api.github.com/users/gmcode/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gmcode/subscriptions","organizations_url":"https://api.github.com/users/gmcode/orgs","repos_url":"https://api.github.com/users/gmcode/repos","events_url":"https://api.github.com/users/gmcode/events{/privacy}","received_events_url":"https://api.github.com/users/gmcode/received_events","type":"User","site_admin":false},"body":"I think you are suggesting using remove_if, but the predicate needs to identify a sequence not a single character and it's only passed a single character. What exact code are you suggesting if it's only a few lines like this implies?","created_at":"2015-05-20T04:03:10Z","updated_at":"2015-05-20T04:03:10Z","html_url":"https://github.com/Unvanquished/Unvanquished/pull/723#discussion_r30670021","pull_request_url":"https://api.github.com/repos/Unvanquished/Unvanquished/pulls/723","_links":{"self":{"href":"https://api.github.com/repos/Unvanquished/Unvanquished/pulls/comments/30670021"},"html":{"href":"https://github.com/Unvanquished/Unvanquished/pull/723#discussion_r30670021"},"pull_request":{"href":"https://api.github.com/repos/Unvanquished/Unvanquished/pulls/723"}}},"pull_request":{"url":"https://api.github.com/repos/Unvanquished/Unvanquished/pulls/723","id":35444148,"html_url":"https://github.com/Unvanquished/Unvanquished/pull/723","diff_url":"https://github.com/Unvanquished/Unvanquished/pull/723.diff","patch_url":"https://github.com/Unvanquished/Unvanquished/pull/723.patch","issue_url":"https://api.github.com/repos/Unvanquished/Unvanquished/issues/723","number":723,"state":"open","locked":false,"title":"Changes to make shader debugging easier. Support a -set shaderpath \"c…","user":{"login":"gmcode","id":10876766,"avatar_url":"https://avatars.githubusercontent.com/u/10876766?v=3","gravatar_id":"","url":"https://api.github.com/users/gmcode","html_url":"https://github.com/gmcode","followers_url":"https://api.github.com/users/gmcode/followers","following_url":"https://api.github.com/users/gmcode/following{/other_user}","gists_url":"https://api.github.com/users/gmcode/gists{/gist_id}","starred_url":"https://api.github.com/users/gmcode/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gmcode/subscriptions","organizations_url":"https://api.github.com/users/gmcode/orgs","repos_url":"https://api.github.com/users/gmcode/repos","events_url":"https://api.github.com/users/gmcode/events{/privacy}","received_events_url":"https://api.github.com/users/gmcode/received_events","type":"User","site_admin":false},"body":"…:/unvanquished/main\" option. See app and git comments.\r\n\r\nOn Windows use forward slashes instead of backslashes in the option as shown in the above example as the unv app console eats backslashes.\r\nBasically use this command on the command line like so -set shaderpath \"c:/unvanquished/main\".\r\nIn unv app console use the option like so: set shaderpath \"c:/unvanquished/main\".\r\n\r\nSo the idea is:\r\n* Issue set shaderpath \"c:/unvanquished/main\" to tell Unvanquished what folder the glsl folder is in.\r\n* Then make whatever changes you want to make the .glsl files in the glsl folder.\r\n* Then type glsl_restart at the Unvanquished console and unv will load the files directly from disk and compare them to the versions already compiled into Unvanquished and let you know what it thinks has changed.\r\n* The command can be on the console or command line. If on the command line Unv will start by loading the disk versions first.\r\n* If done from the console the built in versions will be used first.\r\n* If Unvanquished can't load the new versions from disk due to syntax errors or whatever, it will try to recover and use the built in version again.\r\n* If that happens, just make whatever changes you need to correct the problems with the disk versions and run glsl_restart again.\r\n* When you're done, look at the console log for a reminder of what changes Unv thinks you've made and commit those to git.\r\n* Then run shaderbuild.sh and commit shaders.cpp to git too.","created_at":"2015-05-14T17:48:11Z","updated_at":"2015-05-20T04:03:10Z","closed_at":null,"merged_at":null,"merge_commit_sha":"235c2d6c45e6e256e81aa8388b42e5291cc0cdd9","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/Unvanquished/Unvanquished/pulls/723/commits","review_comments_url":"https://api.github.com/repos/Unvanquished/Unvanquished/pulls/723/comments","review_comment_url":"https://api.github.com/repos/Unvanquished/Unvanquished/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Unvanquished/Unvanquished/issues/723/comments","statuses_url":"https://api.github.com/repos/Unvanquished/Unvanquished/statuses/5c7cfad036684dfbf882e4913a5e7e5d9ebfe0b4","head":{"label":"gmcode:gmshader","ref":"gmshader","sha":"5c7cfad036684dfbf882e4913a5e7e5d9ebfe0b4","user":{"login":"gmcode","id":10876766,"avatar_url":"https://avatars.githubusercontent.com/u/10876766?v=3","gravatar_id":"","url":"https://api.github.com/users/gmcode","html_url":"https://github.com/gmcode","followers_url":"https://api.github.com/users/gmcode/followers","following_url":"https://api.github.com/users/gmcode/following{/other_user}","gists_url":"https://api.github.com/users/gmcode/gists{/gist_id}","starred_url":"https://api.github.com/users/gmcode/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gmcode/subscriptions","organizations_url":"https://api.github.com/users/gmcode/orgs","repos_url":"https://api.github.com/users/gmcode/repos","events_url":"https://api.github.com/users/gmcode/events{/privacy}","received_events_url":"https://api.github.com/users/gmcode/received_events","type":"User","site_admin":false},"repo":{"id":35622976,"name":"Unvanquished","full_name":"gmcode/Unvanquished","owner":{"login":"gmcode","id":10876766,"avatar_url":"https://avatars.githubusercontent.com/u/10876766?v=3","gravatar_id":"","url":"https://api.github.com/users/gmcode","html_url":"https://github.com/gmcode","followers_url":"https://api.github.com/users/gmcode/followers","following_url":"https://api.github.com/users/gmcode/following{/other_user}","gists_url":"https://api.github.com/users/gmcode/gists{/gist_id}","starred_url":"https://api.github.com/users/gmcode/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gmcode/subscriptions","organizations_url":"https://api.github.com/users/gmcode/orgs","repos_url":"https://api.github.com/users/gmcode/repos","events_url":"https://api.github.com/users/gmcode/events{/privacy}","received_events_url":"https://api.github.com/users/gmcode/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/gmcode/Unvanquished","description":"An FPS/RTS hybrid game powered by the Daemon engine (a combination of ioq3 and XreaL)","fork":true,"url":"https://api.github.com/repos/gmcode/Unvanquished","forks_url":"https://api.github.com/repos/gmcode/Unvanquished/forks","keys_url":"https://api.github.com/repos/gmcode/Unvanquished/keys{/key_id}","collaborators_url":"https://api.github.com/repos/gmcode/Unvanquished/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/gmcode/Unvanquished/teams","hooks_url":"https://api.github.com/repos/gmcode/Unvanquished/hooks","issue_events_url":"https://api.github.com/repos/gmcode/Unvanquished/issues/events{/number}","events_url":"https://api.github.com/repos/gmcode/Unvanquished/events","assignees_url":"https://api.github.com/repos/gmcode/Unvanquished/assignees{/user}","branches_url":"https://api.github.com/repos/gmcode/Unvanquished/branches{/branch}","tags_url":"https://api.github.com/repos/gmcode/Unvanquished/tags","blobs_url":"https://api.github.com/repos/gmcode/Unvanquished/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/gmcode/Unvanquished/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/gmcode/Unvanquished/git/refs{/sha}","trees_url":"https://api.github.com/repos/gmcode/Unvanquished/git/trees{/sha}","statuses_url":"https://api.github.com/repos/gmcode/Unvanquished/statuses/{sha}","languages_url":"https://api.github.com/repos/gmcode/Unvanquished/languages","stargazers_url":"https://api.github.com/repos/gmcode/Unvanquished/stargazers","contributors_url":"https://api.github.com/repos/gmcode/Unvanquished/contributors","subscribers_url":"https://api.github.com/repos/gmcode/Unvanquished/subscribers","subscription_url":"https://api.github.com/repos/gmcode/Unvanquished/subscription","commits_url":"https://api.github.com/repos/gmcode/Unvanquished/commits{/sha}","git_commits_url":"https://api.github.com/repos/gmcode/Unvanquished/git/commits{/sha}","comments_url":"https://api.github.com/repos/gmcode/Unvanquished/comments{/number}","issue_comment_url":"https://api.github.com/repos/gmcode/Unvanquished/issues/comments{/number}","contents_url":"https://api.github.com/repos/gmcode/Unvanquished/contents/{+path}","compare_url":"https://api.github.com/repos/gmcode/Unvanquished/compare/{base}...{head}","merges_url":"https://api.github.com/repos/gmcode/Unvanquished/merges","archive_url":"https://api.github.com/repos/gmcode/Unvanquished/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/gmcode/Unvanquished/downloads","issues_url":"https://api.github.com/repos/gmcode/Unvanquished/issues{/number}","pulls_url":"https://api.github.com/repos/gmcode/Unvanquished/pulls{/number}","milestones_url":"https://api.github.com/repos/gmcode/Unvanquished/milestones{/number}","notifications_url":"https://api.github.com/repos/gmcode/Unvanquished/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/gmcode/Unvanquished/labels{/name}","releases_url":"https://api.github.com/repos/gmcode/Unvanquished/releases{/id}","created_at":"2015-05-14T16:38:00Z","updated_at":"2015-05-14T16:38:06Z","pushed_at":"2015-05-20T03:49:10Z","git_url":"git://github.com/gmcode/Unvanquished.git","ssh_url":"git@github.com:gmcode/Unvanquished.git","clone_url":"https://github.com/gmcode/Unvanquished.git","svn_url":"https://github.com/gmcode/Unvanquished","homepage":"http://unvanquished.net","size":139900,"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":"Unvanquished:master","ref":"master","sha":"3e3bc195ea52f451e5b5bb1155fb2981f3d1a4f5","user":{"login":"Unvanquished","id":1360713,"avatar_url":"https://avatars.githubusercontent.com/u/1360713?v=3","gravatar_id":"","url":"https://api.github.com/users/Unvanquished","html_url":"https://github.com/Unvanquished","followers_url":"https://api.github.com/users/Unvanquished/followers","following_url":"https://api.github.com/users/Unvanquished/following{/other_user}","gists_url":"https://api.github.com/users/Unvanquished/gists{/gist_id}","starred_url":"https://api.github.com/users/Unvanquished/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Unvanquished/subscriptions","organizations_url":"https://api.github.com/users/Unvanquished/orgs","repos_url":"https://api.github.com/users/Unvanquished/repos","events_url":"https://api.github.com/users/Unvanquished/events{/privacy}","received_events_url":"https://api.github.com/users/Unvanquished/received_events","type":"Organization","site_admin":false},"repo":{"id":2490468,"name":"Unvanquished","full_name":"Unvanquished/Unvanquished","owner":{"login":"Unvanquished","id":1360713,"avatar_url":"https://avatars.githubusercontent.com/u/1360713?v=3","gravatar_id":"","url":"https://api.github.com/users/Unvanquished","html_url":"https://github.com/Unvanquished","followers_url":"https://api.github.com/users/Unvanquished/followers","following_url":"https://api.github.com/users/Unvanquished/following{/other_user}","gists_url":"https://api.github.com/users/Unvanquished/gists{/gist_id}","starred_url":"https://api.github.com/users/Unvanquished/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Unvanquished/subscriptions","organizations_url":"https://api.github.com/users/Unvanquished/orgs","repos_url":"https://api.github.com/users/Unvanquished/repos","events_url":"https://api.github.com/users/Unvanquished/events{/privacy}","received_events_url":"https://api.github.com/users/Unvanquished/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Unvanquished/Unvanquished","description":"An FPS/RTS hybrid game powered by the Daemon engine (a combination of ioq3 and XreaL)","fork":false,"url":"https://api.github.com/repos/Unvanquished/Unvanquished","forks_url":"https://api.github.com/repos/Unvanquished/Unvanquished/forks","keys_url":"https://api.github.com/repos/Unvanquished/Unvanquished/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Unvanquished/Unvanquished/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Unvanquished/Unvanquished/teams","hooks_url":"https://api.github.com/repos/Unvanquished/Unvanquished/hooks","issue_events_url":"https://api.github.com/repos/Unvanquished/Unvanquished/issues/events{/number}","events_url":"https://api.github.com/repos/Unvanquished/Unvanquished/events","assignees_url":"https://api.github.com/repos/Unvanquished/Unvanquished/assignees{/user}","branches_url":"https://api.github.com/repos/Unvanquished/Unvanquished/branches{/branch}","tags_url":"https://api.github.com/repos/Unvanquished/Unvanquished/tags","blobs_url":"https://api.github.com/repos/Unvanquished/Unvanquished/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Unvanquished/Unvanquished/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Unvanquished/Unvanquished/git/refs{/sha}","trees_url":"https://api.github.com/repos/Unvanquished/Unvanquished/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Unvanquished/Unvanquished/statuses/{sha}","languages_url":"https://api.github.com/repos/Unvanquished/Unvanquished/languages","stargazers_url":"https://api.github.com/repos/Unvanquished/Unvanquished/stargazers","contributors_url":"https://api.github.com/repos/Unvanquished/Unvanquished/contributors","subscribers_url":"https://api.github.com/repos/Unvanquished/Unvanquished/subscribers","subscription_url":"https://api.github.com/repos/Unvanquished/Unvanquished/subscription","commits_url":"https://api.github.com/repos/Unvanquished/Unvanquished/commits{/sha}","git_commits_url":"https://api.github.com/repos/Unvanquished/Unvanquished/git/commits{/sha}","comments_url":"https://api.github.com/repos/Unvanquished/Unvanquished/comments{/number}","issue_comment_url":"https://api.github.com/repos/Unvanquished/Unvanquished/issues/comments{/number}","contents_url":"https://api.github.com/repos/Unvanquished/Unvanquished/contents/{+path}","compare_url":"https://api.github.com/repos/Unvanquished/Unvanquished/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Unvanquished/Unvanquished/merges","archive_url":"https://api.github.com/repos/Unvanquished/Unvanquished/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Unvanquished/Unvanquished/downloads","issues_url":"https://api.github.com/repos/Unvanquished/Unvanquished/issues{/number}","pulls_url":"https://api.github.com/repos/Unvanquished/Unvanquished/pulls{/number}","milestones_url":"https://api.github.com/repos/Unvanquished/Unvanquished/milestones{/number}","notifications_url":"https://api.github.com/repos/Unvanquished/Unvanquished/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Unvanquished/Unvanquished/labels{/name}","releases_url":"https://api.github.com/repos/Unvanquished/Unvanquished/releases{/id}","created_at":"2011-09-30T16:44:44Z","updated_at":"2015-05-19T18:40:56Z","pushed_at":"2015-05-20T03:49:12Z","git_url":"git://github.com/Unvanquished/Unvanquished.git","ssh_url":"git@github.com:Unvanquished/Unvanquished.git","clone_url":"https://github.com/Unvanquished/Unvanquished.git","svn_url":"https://github.com/Unvanquished/Unvanquished","homepage":"http://unvanquished.net","size":217657,"stargazers_count":185,"watchers_count":185,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":65,"mirror_url":null,"open_issues_count":165,"forks":65,"open_issues":165,"watchers":185,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Unvanquished/Unvanquished/pulls/723"},"html":{"href":"https://github.com/Unvanquished/Unvanquished/pull/723"},"issue":{"href":"https://api.github.com/repos/Unvanquished/Unvanquished/issues/723"},"comments":{"href":"https://api.github.com/repos/Unvanquished/Unvanquished/issues/723/comments"},"review_comments":{"href":"https://api.github.com/repos/Unvanquished/Unvanquished/pulls/723/comments"},"review_comment":{"href":"https://api.github.com/repos/Unvanquished/Unvanquished/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Unvanquished/Unvanquished/pulls/723/commits"},"statuses":{"href":"https://api.github.com/repos/Unvanquished/Unvanquished/statuses/5c7cfad036684dfbf882e4913a5e7e5d9ebfe0b4"}}}}