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}}
-
+ {{#commit}}
+
+
+
+ Commit by
+
+
+ {{author.login}}
+
+ in
+ {{title}}
+
+ {{/commit}}
+
+ {{#comment}}
+
+ {{/comment}}
+
+ {{#discussion}}
+
+ {{/discussion}}
+
+ {{#pr}}
+
+ {{/pr}}
{{base.label}}
← {{head.label}}
-
-
- opened {{created_at}}
-
+ {{#pr}}
+
+
+ opened {{created_at}}
+
-
+
-
-
+ {{/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