diff --git a/app/assets/stylesheets/common/base/onebox.scss b/app/assets/stylesheets/common/base/onebox.scss index 2cd9d112fb7..a15badbef9d 100644 --- a/app/assets/stylesheets/common/base/onebox.scss +++ b/app/assets/stylesheets/common/base/onebox.scss @@ -442,8 +442,8 @@ pre.onebox code { .github-icon-container { display: flex; - align-items: flex-start; - margin-right: 5px; + align-items: center; + margin-right: 10px; } .github-icon { @@ -526,8 +526,8 @@ pre.onebox code { .github-icon-container { display: flex; - align-items: flex-start; - margin-right: 5px; + align-items: center; + margin-right: 10px; } .github-icon { diff --git a/lib/onebox/engine/github_pull_request_onebox.rb b/lib/onebox/engine/github_pull_request_onebox.rb index 090fddea66a..403c62f4b2c 100644 --- a/lib/onebox/engine/github_pull_request_onebox.rb +++ b/lib/onebox/engine/github_pull_request_onebox.rb @@ -39,8 +39,40 @@ module Onebox result['body'], result['excerpt'] = compute_body(result['body']) + if result['commit'] = load_commit(link) + result['body'], result['excerpt'] = compute_body(result['commit']['body']) + elsif result['comment'] = load_comment(link) + result['body'], result['excerpt'] = compute_body(result['comment']['body']) + elsif result['discussion'] = load_review(link) + result['body'], result['excerpt'] = compute_body(result['discussion']['body']) + else + result['pr'] = true + end + result end + + def load_commit(link) + if commit_match = link.match(/commits\/(\h+)/) + load_json("https://api.github.com/repos/#{match[:owner]}/#{match[:repository]}/commits/#{commit_match[1]}") + end + end + + def load_comment(link) + if comment_match = link.match(/#issuecomment-(\d+)/) + load_json("https://api.github.com/repos/#{match[:owner]}/#{match[:repository]}/issues/comments/#{comment_match[1]}") + end + end + + def load_review(link) + if review_match = link.match(/#discussion_r(\d+)/) + load_json("https://api.github.com/repos/#{match[:owner]}/#{match[:repository]}/pulls/comments/#{review_match[1]}") + end + end + + def load_json(url) + ::MultiJson.load(URI.parse(url).open(read_timeout: timeout)) + end end end end diff --git a/lib/onebox/sanitize_config.rb b/lib/onebox/sanitize_config.rb index 0dedde853ee..592077a1860 100644 --- a/lib/onebox/sanitize_config.rb +++ b/lib/onebox/sanitize_config.rb @@ -14,7 +14,7 @@ module Onebox 'iframe' => %w[allowfullscreen frameborder height scrolling src width data-original-href data-unsanitized-src], 'source' => %w[src type], 'video' => %w[controls height loop width autoplay muted poster controlslist playsinline], - 'path' => %w[d], + 'path' => %w[d fill-rule], 'svg' => ['aria-hidden', 'width', 'height', 'viewbox'], 'div' => [:data], # any data-* attributes, 'span' => [:data], # any data-* attributes diff --git a/lib/onebox/templates/githubpullrequest.mustache b/lib/onebox/templates/githubpullrequest.mustache index 81eabb41afe..8b0ee6378a7 100644 --- a/lib/onebox/templates/githubpullrequest.mustache +++ b/lib/onebox/templates/githubpullrequest.mustache @@ -1,36 +1,100 @@
-
- -
+ {{#commit}} +
+ +
+ {{/commit}} + + {{#comment}} +
+ +
+ {{/comment}} + + {{#discussion}} +
+ +
+ {{/discussion}} + + {{#pr}} +
+ +
+ {{/pr}}
-

- {{title}} -

+ {{#commit}} +

+ {{commit.message}} +

+ + + Commit by + + {{author.login}} + {{author.login}} + + in + {{title}} + + {{/commit}} + + {{#comment}} +

+ Comment by + + {{user.login}} + {{user.login}} + + to + {{title}} +

+ {{/comment}} + + {{#discussion}} +

+ Review by + + {{user.login}} + {{user.login}} + + in + {{title}} +

+ {{/discussion}} + + {{#pr}} +

+ {{title}} +

+ {{/pr}}
{{base.label}}{{head.label}}
-
-
- opened {{created_at}} -
+ {{#pr}} + + {{/pr}}
diff --git a/spec/fixtures/onebox/githubpullrequest_comment.response b/spec/fixtures/onebox/githubpullrequest_comment.response new file mode 100644 index 00000000000..679be4d7a52 --- /dev/null +++ b/spec/fixtures/onebox/githubpullrequest_comment.response @@ -0,0 +1,44 @@ +{ + "url": "https://api.github.com/repos/discourse/discourse/issues/comments/21597425", + "html_url": "https://github.com/discourse/discourse/pull/1253#issuecomment-21597425", + "issue_url": "https://api.github.com/repos/discourse/discourse/issues/1253", + "id": 21597425, + "node_id": "MDEyOklzc3VlQ29tbWVudDIxNTk3NDI1", + "user": { + "login": "discoursebot", + "id": 3698800, + "node_id": "MDQ6VXNlcjM2OTg4MDA=", + "avatar_url": "https://avatars.githubusercontent.com/u/3698800?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/discoursebot", + "html_url": "https://github.com/discoursebot", + "followers_url": "https://api.github.com/users/discoursebot/followers", + "following_url": "https://api.github.com/users/discoursebot/following{/other_user}", + "gists_url": "https://api.github.com/users/discoursebot/gists{/gist_id}", + "starred_url": "https://api.github.com/users/discoursebot/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/discoursebot/subscriptions", + "organizations_url": "https://api.github.com/users/discoursebot/orgs", + "repos_url": "https://api.github.com/users/discoursebot/repos", + "events_url": "https://api.github.com/users/discoursebot/events{/privacy}", + "received_events_url": "https://api.github.com/users/discoursebot/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2013-07-26T02:05:57Z", + "updated_at": "2013-07-26T02:05:57Z", + "author_association": "NONE", + "body": "You've signed the CLA, jamesaanderson. Thank you! This pull request is ready for review.\n", + "reactions": { + "url": "https://api.github.com/repos/discourse/discourse/issues/comments/21597425/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null +} diff --git a/spec/fixtures/onebox/githubpullrequest_commit.response b/spec/fixtures/onebox/githubpullrequest_commit.response new file mode 100644 index 00000000000..65f302be2a5 --- /dev/null +++ b/spec/fixtures/onebox/githubpullrequest_commit.response @@ -0,0 +1,134 @@ +{ + "sha": "d7d3be1130c665cc7fab9f05dbf32335229137a6", + "node_id": "MDY6Q29tbWl0NzU2OTU3ODpkN2QzYmUxMTMwYzY2NWNjN2ZhYjlmMDVkYmYzMjMzNTIyOTEzN2E2", + "commit": { + "author": { + "name": "James Anderson", + "email": "me@jamesaanderson.com", + "date": "2013-07-26T02:03:23Z" + }, + "committer": { + "name": "James Anderson", + "email": "me@jamesaanderson.com", + "date": "2013-07-26T02:03:23Z" + }, + "message": "Add audio onebox\nhttp://meta.discourse.org/t/audio-html5-tag/8168", + "tree": { + "sha": "20c3841a2f4d2153d880b266cc9307296d8e07c6", + "url": "https://api.github.com/repos/discourse/discourse/git/trees/20c3841a2f4d2153d880b266cc9307296d8e07c6" + }, + "url": "https://api.github.com/repos/discourse/discourse/git/commits/d7d3be1130c665cc7fab9f05dbf32335229137a6", + "comment_count": 0, + "verification": { + "verified": false, + "reason": "unsigned", + "signature": null, + "payload": null + } + }, + "url": "https://api.github.com/repos/discourse/discourse/commits/d7d3be1130c665cc7fab9f05dbf32335229137a6", + "html_url": "https://github.com/discourse/discourse/commit/d7d3be1130c665cc7fab9f05dbf32335229137a6", + "comments_url": "https://api.github.com/repos/discourse/discourse/commits/d7d3be1130c665cc7fab9f05dbf32335229137a6/comments", + "author": { + "login": "jamesaanderson", + "id": 2722987, + "node_id": "MDQ6VXNlcjI3MjI5ODc=", + "avatar_url": "https://avatars.githubusercontent.com/u/2722987?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/jamesaanderson", + "html_url": "https://github.com/jamesaanderson", + "followers_url": "https://api.github.com/users/jamesaanderson/followers", + "following_url": "https://api.github.com/users/jamesaanderson/following{/other_user}", + "gists_url": "https://api.github.com/users/jamesaanderson/gists{/gist_id}", + "starred_url": "https://api.github.com/users/jamesaanderson/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/jamesaanderson/subscriptions", + "organizations_url": "https://api.github.com/users/jamesaanderson/orgs", + "repos_url": "https://api.github.com/users/jamesaanderson/repos", + "events_url": "https://api.github.com/users/jamesaanderson/events{/privacy}", + "received_events_url": "https://api.github.com/users/jamesaanderson/received_events", + "type": "User", + "site_admin": false + }, + "committer": { + "login": "jamesaanderson", + "id": 2722987, + "node_id": "MDQ6VXNlcjI3MjI5ODc=", + "avatar_url": "https://avatars.githubusercontent.com/u/2722987?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/jamesaanderson", + "html_url": "https://github.com/jamesaanderson", + "followers_url": "https://api.github.com/users/jamesaanderson/followers", + "following_url": "https://api.github.com/users/jamesaanderson/following{/other_user}", + "gists_url": "https://api.github.com/users/jamesaanderson/gists{/gist_id}", + "starred_url": "https://api.github.com/users/jamesaanderson/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/jamesaanderson/subscriptions", + "organizations_url": "https://api.github.com/users/jamesaanderson/orgs", + "repos_url": "https://api.github.com/users/jamesaanderson/repos", + "events_url": "https://api.github.com/users/jamesaanderson/events{/privacy}", + "received_events_url": "https://api.github.com/users/jamesaanderson/received_events", + "type": "User", + "site_admin": false + }, + "parents": [ + { + "sha": "9c617d051e08a4a0335d8375e91d87a58c7e720e", + "url": "https://api.github.com/repos/discourse/discourse/commits/9c617d051e08a4a0335d8375e91d87a58c7e720e", + "html_url": "https://github.com/discourse/discourse/commit/9c617d051e08a4a0335d8375e91d87a58c7e720e" + } + ], + "stats": { + "total": 20, + "additions": 19, + "deletions": 1 + }, + "files": [ + { + "sha": "4bf610116998b798fd7255aaf835ce2ffc3d0dc7", + "filename": "app/assets/stylesheets/application/compose.css.scss", + "status": "modified", + "additions": 3, + "deletions": 0, + "changes": 3, + "blob_url": "https://github.com/discourse/discourse/blob/d7d3be1130c665cc7fab9f05dbf32335229137a6/app%2Fassets%2Fstylesheets%2Fapplication%2Fcompose.css.scss", + "raw_url": "https://github.com/discourse/discourse/raw/d7d3be1130c665cc7fab9f05dbf32335229137a6/app%2Fassets%2Fstylesheets%2Fapplication%2Fcompose.css.scss", + "contents_url": "https://api.github.com/repos/discourse/discourse/contents/app%2Fassets%2Fstylesheets%2Fapplication%2Fcompose.css.scss?ref=d7d3be1130c665cc7fab9f05dbf32335229137a6", + "patch": "@@ -299,6 +299,9 @@\n webkit-border-radius: 4px;\n ms-border-radius: 4px;\n }\n+ audio {\n+ max-width: 100%;\n+ }\n }\n #wmd-preview {\n border: 1px dashed $gray;" + }, + { + "sha": "f925244a588046d6caf2bc807c719a59569ad3c2", + "filename": "app/assets/stylesheets/application/topic-post.css.scss", + "status": "modified", + "additions": 3, + "deletions": 0, + "changes": 3, + "blob_url": "https://github.com/discourse/discourse/blob/d7d3be1130c665cc7fab9f05dbf32335229137a6/app%2Fassets%2Fstylesheets%2Fapplication%2Ftopic-post.css.scss", + "raw_url": "https://github.com/discourse/discourse/raw/d7d3be1130c665cc7fab9f05dbf32335229137a6/app%2Fassets%2Fstylesheets%2Fapplication%2Ftopic-post.css.scss", + "contents_url": "https://api.github.com/repos/discourse/discourse/contents/app%2Fassets%2Fstylesheets%2Fapplication%2Ftopic-post.css.scss?ref=d7d3be1130c665cc7fab9f05dbf32335229137a6", + "patch": "@@ -515,6 +515,9 @@\n img {\n max-width: 100%;\n }\n+ audio {\n+ max-width: 100%;\n+ }\n .topic-body {\n position: relative;\n .contents {" + }, + { + "sha": "c2fda69aa041b7075287c5144fd74bd746d27aaf", + "filename": "lib/oneboxer/audio_onebox.rb", + "status": "added", + "additions": 12, + "deletions": 0, + "changes": 12, + "blob_url": "https://github.com/discourse/discourse/blob/d7d3be1130c665cc7fab9f05dbf32335229137a6/lib%2Foneboxer%2Faudio_onebox.rb", + "raw_url": "https://github.com/discourse/discourse/raw/d7d3be1130c665cc7fab9f05dbf32335229137a6/lib%2Foneboxer%2Faudio_onebox.rb", + "contents_url": "https://api.github.com/repos/discourse/discourse/contents/lib%2Foneboxer%2Faudio_onebox.rb?ref=d7d3be1130c665cc7fab9f05dbf32335229137a6", + "patch": "@@ -0,0 +1,12 @@\n+require_dependency 'oneboxer/base_onebox'\n+\n+module Oneboxer\n+ class AudioOnebox < BaseOnebox\n+\n+ matcher /^https?:\\/\\/.*\\.mp3$/\n+\n+ def onebox\n+ \"\"\n+ end\n+ end\n+end" + }, + { + "sha": "e3924069face09f9f716afd09b166af83da496a9", + "filename": "lib/oneboxer/video_onebox.rb", + "status": "modified", + "additions": 1, + "deletions": 1, + "changes": 2, + "blob_url": "https://github.com/discourse/discourse/blob/d7d3be1130c665cc7fab9f05dbf32335229137a6/lib%2Foneboxer%2Fvideo_onebox.rb", + "raw_url": "https://github.com/discourse/discourse/raw/d7d3be1130c665cc7fab9f05dbf32335229137a6/lib%2Foneboxer%2Fvideo_onebox.rb", + "contents_url": "https://api.github.com/repos/discourse/discourse/contents/lib%2Foneboxer%2Fvideo_onebox.rb?ref=d7d3be1130c665cc7fab9f05dbf32335229137a6", + "patch": "@@ -3,7 +3,7 @@\n module Oneboxer\n class VideoOnebox < BaseOnebox\n \n- matcher /^https?:\\/\\/.*\\.(mov|mp4|ogg)$/\n+ matcher /^https?:\\/\\/.*\\.(mov|mp4)$/\n \n def onebox\n \"\"" + } + ] +} diff --git a/spec/lib/onebox/engine/github_pull_request_onebox_spec.rb b/spec/lib/onebox/engine/github_pull_request_onebox_spec.rb index 546ff00438c..c6ab147da4c 100644 --- a/spec/lib/onebox/engine/github_pull_request_onebox_spec.rb +++ b/spec/lib/onebox/engine/github_pull_request_onebox_spec.rb @@ -49,4 +49,30 @@ RSpec.describe Onebox::Engine::GithubPullRequestOnebox do expect(html).not_to include("test comment") end end + + context "with commit links" do + before do + @link = "https://github.com/discourse/discourse/pull/1253/commits/d7d3be1130c665cc7fab9f05dbf32335229137a6" + @uri = "https://api.github.com/repos/discourse/discourse/commits/d7d3be1130c665cc7fab9f05dbf32335229137a6" + + stub_request(:get, @uri).to_return(status: 200, body: onebox_response(described_class.onebox_name + "_commit")) + end + + it "includes commit name" do + expect(html).to include("Add audio onebox") + end + end + + context "with comment links" do + before do + @link = "https://github.com/discourse/discourse/pull/1253/#issuecomment-21597425" + @uri = "https://api.github.com/repos/discourse/discourse/issues/comments/21597425" + + stub_request(:get, @uri).to_return(status: 200, body: onebox_response(described_class.onebox_name + "_comment")) + end + + it "includes comment" do + expect(html).to include("You've signed the CLA") + end + end end