76 | {`You are about to slice ${
77 | slices.length
78 | } updates from ${source}`}
79 |
80 |
81 |
82 |
122 |
123 |
124 |
125 |
126 |
133 |
141 |
142 | >
143 | );
144 | }}
145 |
146 |
147 | );
148 | };
149 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | > New blog post! read about Cherry Pie on Medium: [Crafting the perfect Pull Request](https://medium.com/p/crafting-the-perfect-pull-request-699ab321727f?source=email-5fe064c14ada--writer.postDistributed&sk=69de54d5f585a889d96a8b0a886969a2) by Shlomo Kraus
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | CHERRY PIE
11 |
12 |
13 |
14 |
15 |
A CHROME EXTENSION FOR CRAFTING THE PERFECT PULL REQUEST
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
TL;DR
27 |
28 | This extension adds a button to Github's Pull Request page that extracts files from one branch and stage them into a new one.
29 | That way you can submit PRs with minimum relevant changes, even if you didn't plan ahead.
30 |
31 | ### But why?
32 |
33 | Honestly, you’ve worked hard on that feature, but when you opened the pull request you can clearly see it would've made more sense to split it into multiple smaller updates, each with its own PR.
34 |
35 | Since your commit history is unreadable, you can't use `git cherry-pick` and wish you could go back in time and turn it into something that plays nicely in `git log`.
36 |
37 | Now you can.
38 |
39 |
40 |
INSTALL & USAGE
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 | 1. Install the extension from [Chrome store](https://chrome.google.com/webstore/detail/cherry-pie/fiaignmlhapejpdfbephokpkjnmnaapo).
50 | 2. You will see a `Slice` button appears in every pull request files tab.
51 | 3. After selecting files you will notice a purple button appears at the toolbar, clicking it will open Cherry Pie interface as a modal.
52 | 4. You will need to add your credentials, either password or token.
53 | 5. Review changes, enter pull request title and click Slice!
54 |
55 |
BACKGROUND
56 |
57 | _Cherry picking_ is a perfect git command which, in a perfect world, allows a perfect programmer to carefully pick her commits and stage them into a new branch, where they can be pulled into master in perfectly organized pieces.
58 |
59 | _But we are not perfect, we are developers_
60 |
61 | Though our code is clean, our feature branch’s commits are “WIP” or “fix” or “here’s another try” and essentially - just a whole big mess waiting to be _squashed_.
62 |
63 | ### If you can't pick, then slice!
64 |
65 | _Cherry Pie_ let’s you work your way backwards: Pick any number of _files_ from a branch (instead of _commits_) and move them into a whole new branch.
66 |
67 | That way you can split a long pull request into numerous atomic and clean ones, with descriptive titles. Bugs will be easier to spot, reverts become a breeze and the guy over there doing your CR would be so thankful he’ll bake you a pie. A real one for sure.
68 |
69 | ### Is this needed?
70 |
71 | Pull requests should be small, surgical, keeping only the minimum required updates. But it is easier said than done. [In our team](https://iqoqo.co) we constantly trying to keep PRs small but it can't be done without over-complicating the workflow.
72 |
73 | Since cherry-pick is not always possible (as explained before), you need to manually go, create a branch, checkout the requested files and...just skip the whole process goes who got time.
74 |
75 | This extension rose from endless hours of reviewing pull requests where the thought "I wish could just click and split this PR" constantly troubled my restful mind.
76 |
77 | ### What's with the name?
78 |
79 | You use `cherry-pick` for commits, but when commit history is squashed, it turns into a cherry pie. So - if you `pick` a cherry, you need to `slice` a cherry pie.
80 |
81 |
DEVELOPMENT & CONTRIBUTION
82 |
83 | Feel free to request and add features through pull requests. If you got this far you know the rules.
84 |
85 | ### Running locally
86 | #### Build
87 |
88 | ```
89 | yarn run build
90 | ```
91 | Will compile and build a local version inside `dist` folder. Install the extension by going to chrome extension page and clicking `Load Unpacked` then directing to this folder.
92 |
93 | ```
94 | yarn run watch
95 | ```
96 | Will build the package and also reload it whenever you make a change.
97 | #### Develop
98 | ```
99 | yarn run storybook
100 | ```
101 | Storybook is setup for easier development of the views.
102 |
103 | ### Testing
104 |
105 | This extension uses integration and e2e tests.
106 |
107 | ##### E2E
108 |
109 | Tests are ran using puppeteer. They load the extension in chroium, checks that it is loaded and injected correctly and tests some basic UX paths. The tests are located in `test/puppeteer`.
110 |
111 | ##### Integration
112 |
113 | Those tests run against the repo `cherrypie-test`. Configuration is managed with `node-config` and files located in the `config` directory. You should learn how `node-config` works, but essentialy, we have default config which should be override. The file `default.json` contains the non sensitive data needed for tests.
114 |
115 | The sensitive data which is `github.username` and `github.password` must never be commited to the repo. You can either set them using environment variables when running the tests (that's how it is done on circleci), or you can add a `config/local-test.json` file which is merged to default.json when running the tests. This file is ignored by git and used only for local development.
116 |
117 |
271 | );
272 | };
273 | const RenderStatus = ({ status, error }) => {
274 | switch (status) {
275 | case ProcessStatus.Working:
276 | return ;
277 | case ProcessStatus.Done:
278 | return ;
279 | case ProcessStatus.Failed:
280 | return ;
281 | default:
282 | return ;
283 | }
284 | };
285 |
--------------------------------------------------------------------------------
/privacy.txt:
--------------------------------------------------------------------------------
1 | Privacy policy
2 |
3 | This privacy policy ("Policy") describes how Website Operator ("Website Operator", "we", "us" or "our") collects, protects and uses the personally identifiable information ("Personal Information") you ("User", "you" or "your") may provide on the shlomokraus.github.io website and any of its products or services (collectively, "Website" or "Services"). It also describes the choices available to you regarding our use of your Personal Information and how you can access and update this information. This Policy does not apply to the practices of companies that we do not own or control, or to individuals that we do not employ or manage.
4 |
5 | Collection of personal information
6 |
7 | We receive and store any information you knowingly provide to us when you fill any online forms on the Website. You can choose not to provide us with certain information, but then you may not be able to take advantage of some of the Website's features. Users who are uncertain about what information is mandatory are welcome to contact us.
8 |
9 | Collection of non-personal information
10 |
11 | When you visit the Website our servers automatically record information that your browser sends. This data may include information such as your device's IP address, browser type and version, operating system type and version, language preferences or the webpage you were visiting before you came to our Website, pages of our Website that you visit, the time spent on those pages, information you search for on our Website, access times and dates, and other statistics.
12 |
13 | Use and processing of collected information
14 |
15 | Any of the information we collect from you may be used to improve our Website; run and operate our Website and Services. Non-Personal Information collected is used only to identify potential cases of abuse and establish statistical information regarding Website usage. This statistical information is not otherwise aggregated in such a way that would identify any particular user of the system.
16 |
17 | We may process Personal Information related to you if one of the following applies: (i) You have given their consent for one or more specific purposes. Note that under some legislations we may be allowed to process information until you object to such processing (by opting out), without having to rely on consent or any other of the following legal bases below. This, however, does not apply, whenever the processing of Personal Information is subject to European data protection law; (ii) Provision of information is necessary for the performance of an agreement with you and/or for any pre-contractual obligations thereof; (ii) Processing is necessary for compliance with a legal obligation to which you are subject; (iv) Processing is related to a task that is carried out in the public interest or in the exercise of official authority vested in us; (v) Processing is necessary for the purposes of the legitimate interests pursued by us or by a third party. In any case, we will be happy to clarify the specific legal basis that applies to the processing, and in particular whether the provision of Personal Data is a statutory or contractual requirement, or a requirement necessary to enter into a contract.
18 |
19 | Information transfer and storage
20 |
21 | Depending on your location, data transfers may involve transferring and storing your information in a country other than your own. You are entitled to learn about the legal basis of information transfers to a country outside the European Union or to any international organization governed by public international law or set up by two or more countries, such as the UN, and about the security measures taken by us to safeguard your information. If any such transfer takes place, you can find out more by checking the relevant sections of this document or inquire with us using the information provided in the contact section.
22 |
23 | The rights of users
24 |
25 | You may exercise certain rights regarding your information processed by us. In particular, you have the right to do the following: (i) you have the right to withdraw consent where you have previously given your consent to the processing of your information; (ii) you have the right to object to the processing of your information if the processing is carried out on a legal basis other than consent; (iii) you have the right to learn if information is being processed by us, obtain disclosure regarding certain aspects of the processing and obtain a copy of the information undergoing processing; (iv) you have the right to verify the accuracy of your information and ask for it to be updated or corrected; (v) you have the right, under certain circumstances, to restrict the processing of your information, in which case, we will not process your information for any purpose other than storing it; (vi) you have the right, under certain circumstances, to obtain the erasure of your Personal Information from us; (vii) you have the right to receive your information in a structured, commonly used and machine readable format and, if technically feasible, to have it transmitted to another controller without any hindrance. This provision is applicable provided that your information is processed by automated means and that the processing is based on your consent, on a contract which you are part of or on pre-contractual obligations thereof.
26 |
27 | The right to object to processing
28 |
29 | Where Personal Information is processed for a public interest, in the exercise of an official authority vested in us or for the purposes of the legitimate interests pursued by us, you may object to such processing by providing a ground related to your particular situation to justify the objection. You must know that, however, should your Personal Information be processed for direct marketing purposes, you can object to that processing at any time without providing any justification. To learn, whether we are processing Personal Information for direct marketing purposes, you may refer to the relevant sections of this document.
30 |
31 | How to exercise these rights
32 |
33 | Any requests to exercise User rights can be directed to the Owner through the contact details provided in this document. These requests can be exercised free of charge and will be addressed by the Owner as early as possible and always within one month.
34 |
35 | Privacy of children
36 |
37 | We do not knowingly collect any Personal Information from children under the age of 13. If you are under the age of 13, please do not submit any Personal Information through our Website or Service. We encourage parents and legal guardians to monitor their children's Internet usage and to help enforce this Policy by instructing their children never to provide Personal Information through our Website or Service without their permission. If you have reason to believe that a child under the age of 13 has provided Personal Information to us through our Website or Service, please contact us.
38 |
39 | Do Not Track signals
40 |
41 | Some browsers incorporate a Do Not Track feature that signals to websites you visit that you do not want to have your online activity tracked. Tracking is not the same as using or collecting information in connection with a website. For these purposes, tracking refers to collecting personally identifiable information from consumers who use or visit a website or online service as they move across different websites over time. Our Website does not track its visitors over time and across third party websites. However, some third party sites may keep track of your browsing activities when they serve you content, which enables them to tailor what they present to you.
42 |
43 | Information security
44 |
45 | We secure information you provide on computer servers in a controlled, secure environment, protected from unauthorized access, use, or disclosure. We maintain reasonable administrative, technical, and physical safeguards in an effort to protect against unauthorized access, use, modification, and disclosure of Personal Information in its control and custody. However, no data transmission over the Internet or wireless network can be guaranteed. Therefore, while we strive to protect your Personal Information, you acknowledge that (i) there are security and privacy limitations of the Internet which are beyond our control; (ii) the security, integrity, and privacy of any and all information and data exchanged between you and our Website cannot be guaranteed; and (iii) any such information and data may be viewed or tampered with in transit by a third-party, despite best efforts.
46 |
47 | Legal disclosure
48 |
49 | We will disclose any information we collect, use or receive if required or permitted by law, such as to comply with a subpoena, or similar legal process, and when we believe in good faith that disclosure is necessary to protect our rights, protect your safety or the safety of others, investigate fraud, or respond to a government request. In the event we go through a business transition, such as a merger or acquisition by another company, or sale of all or a portion of its assets, your user account and personal data will likely be among the assets transferred.
50 |
51 | Changes and amendments
52 |
53 | We reserve the right to modify this Policy relating to the Website or Services at any time, effective upon posting of an updated version of this Policy on the Website. When we do we will revise the updated date at the bottom of this page. Continued use of the Website after any such changes shall constitute your consent to such changes. Policy was created with https://www.WebsitePolicies.com
54 |
55 | Acceptance of this policy
56 |
57 | You acknowledge that you have read this Policy and agree to all its terms and conditions. By using the Website or its Services you agree to be bound by this Policy. If you do not agree to abide by the terms of this Policy, you are not authorized to use or access the Website and its Services.
58 |
59 | Contacting us
60 |
61 | If you have any questions about this Policy, please contact us.
62 |
63 | This document was last updated on January 3, 2019
64 |
--------------------------------------------------------------------------------
/test/mocks/pr.ts:
--------------------------------------------------------------------------------
1 | export const GetPullsResponseMock = {
2 | "url": "https://api.github.com/repos/shlomokraus/cherrypie/pulls/5",
3 | "id": 242121488,
4 | "node_id": "MDExOlB1bGxSZXF1ZXN0MjQyMTIxNDg4",
5 | "html_url": "https://github.com/shlomokraus/cherrypie/pull/5",
6 | "diff_url": "https://github.com/shlomokraus/cherrypie/pull/5.diff",
7 | "patch_url": "https://github.com/shlomokraus/cherrypie/pull/5.patch",
8 | "issue_url": "https://api.github.com/repos/shlomokraus/cherrypie/issues/5",
9 | "number": 5,
10 | "state": "closed",
11 | "locked": false,
12 | "title": "feat: automatic login if credentials were saved",
13 | "user": {
14 | "login": "shlomokraus",
15 | "id": 4599271,
16 | "node_id": "MDQ6VXNlcjQ1OTkyNzE=",
17 | "avatar_url": "https://avatars0.githubusercontent.com/u/4599271?v=4",
18 | "gravatar_id": "",
19 | "url": "https://api.github.com/users/shlomokraus",
20 | "html_url": "https://github.com/shlomokraus",
21 | "followers_url": "https://api.github.com/users/shlomokraus/followers",
22 | "following_url": "https://api.github.com/users/shlomokraus/following{/other_user}",
23 | "gists_url": "https://api.github.com/users/shlomokraus/gists{/gist_id}",
24 | "starred_url": "https://api.github.com/users/shlomokraus/starred{/owner}{/repo}",
25 | "subscriptions_url": "https://api.github.com/users/shlomokraus/subscriptions",
26 | "organizations_url": "https://api.github.com/users/shlomokraus/orgs",
27 | "repos_url": "https://api.github.com/users/shlomokraus/repos",
28 | "events_url": "https://api.github.com/users/shlomokraus/events{/privacy}",
29 | "received_events_url": "https://api.github.com/users/shlomokraus/received_events",
30 | "type": "User",
31 | "site_admin": false
32 | },
33 | "body": "",
34 | "created_at": "2019-01-03T21:54:39Z",
35 | "updated_at": "2019-01-04T11:05:15Z",
36 | "closed_at": "2019-01-03T21:55:08Z",
37 | "merged_at": "2019-01-03T21:55:08Z",
38 | "merge_commit_sha": "bfef364e2dbb6b0859d0c0dbfeabfee41545ac22",
39 | "assignee": null,
40 | "assignees": [
41 |
42 | ],
43 | "requested_reviewers": [
44 |
45 | ],
46 | "requested_teams": [
47 |
48 | ],
49 | "labels": [
50 | {
51 | "id": 1179558164,
52 | "node_id": "MDU6TGFiZWwxMTc5NTU4MTY0",
53 | "url": "https://api.github.com/repos/shlomokraus/cherrypie/labels/released",
54 | "name": "released",
55 | "color": "ededed",
56 | "default": false
57 | }
58 | ],
59 | "milestone": null,
60 | "commits_url": "https://api.github.com/repos/shlomokraus/cherrypie/pulls/5/commits",
61 | "review_comments_url": "https://api.github.com/repos/shlomokraus/cherrypie/pulls/5/comments",
62 | "review_comment_url": "https://api.github.com/repos/shlomokraus/cherrypie/pulls/comments{/number}",
63 | "comments_url": "https://api.github.com/repos/shlomokraus/cherrypie/issues/5/comments",
64 | "statuses_url": "https://api.github.com/repos/shlomokraus/cherrypie/statuses/1a87d8a46a6d1a106331fe1d33a6d59a90f6a5b4",
65 | "head": {
66 | "label": "shlomokraus:auto-auth",
67 | "ref": "auto-auth",
68 | "sha": "1a87d8a46a6d1a106331fe1d33a6d59a90f6a5b4",
69 | "user": {
70 | "login": "shlomokraus",
71 | "id": 4599271,
72 | "node_id": "MDQ6VXNlcjQ1OTkyNzE=",
73 | "avatar_url": "https://avatars0.githubusercontent.com/u/4599271?v=4",
74 | "gravatar_id": "",
75 | "url": "https://api.github.com/users/shlomokraus",
76 | "html_url": "https://github.com/shlomokraus",
77 | "followers_url": "https://api.github.com/users/shlomokraus/followers",
78 | "following_url": "https://api.github.com/users/shlomokraus/following{/other_user}",
79 | "gists_url": "https://api.github.com/users/shlomokraus/gists{/gist_id}",
80 | "starred_url": "https://api.github.com/users/shlomokraus/starred{/owner}{/repo}",
81 | "subscriptions_url": "https://api.github.com/users/shlomokraus/subscriptions",
82 | "organizations_url": "https://api.github.com/users/shlomokraus/orgs",
83 | "repos_url": "https://api.github.com/users/shlomokraus/repos",
84 | "events_url": "https://api.github.com/users/shlomokraus/events{/privacy}",
85 | "received_events_url": "https://api.github.com/users/shlomokraus/received_events",
86 | "type": "User",
87 | "site_admin": false
88 | },
89 | "repo": {
90 | "id": 163957091,
91 | "node_id": "MDEwOlJlcG9zaXRvcnkxNjM5NTcwOTE=",
92 | "name": "cherrypie",
93 | "full_name": "shlomokraus/cherrypie",
94 | "private": false,
95 | "owner": {
96 | "login": "shlomokraus",
97 | "id": 4599271,
98 | "node_id": "MDQ6VXNlcjQ1OTkyNzE=",
99 | "avatar_url": "https://avatars0.githubusercontent.com/u/4599271?v=4",
100 | "gravatar_id": "",
101 | "url": "https://api.github.com/users/shlomokraus",
102 | "html_url": "https://github.com/shlomokraus",
103 | "followers_url": "https://api.github.com/users/shlomokraus/followers",
104 | "following_url": "https://api.github.com/users/shlomokraus/following{/other_user}",
105 | "gists_url": "https://api.github.com/users/shlomokraus/gists{/gist_id}",
106 | "starred_url": "https://api.github.com/users/shlomokraus/starred{/owner}{/repo}",
107 | "subscriptions_url": "https://api.github.com/users/shlomokraus/subscriptions",
108 | "organizations_url": "https://api.github.com/users/shlomokraus/orgs",
109 | "repos_url": "https://api.github.com/users/shlomokraus/repos",
110 | "events_url": "https://api.github.com/users/shlomokraus/events{/privacy}",
111 | "received_events_url": "https://api.github.com/users/shlomokraus/received_events",
112 | "type": "User",
113 | "site_admin": false
114 | },
115 | "html_url": "https://github.com/shlomokraus/cherrypie",
116 | "description": "Chrome extension for crafting the perfect pull request",
117 | "fork": false,
118 | "url": "https://api.github.com/repos/shlomokraus/cherrypie",
119 | "forks_url": "https://api.github.com/repos/shlomokraus/cherrypie/forks",
120 | "keys_url": "https://api.github.com/repos/shlomokraus/cherrypie/keys{/key_id}",
121 | "collaborators_url": "https://api.github.com/repos/shlomokraus/cherrypie/collaborators{/collaborator}",
122 | "teams_url": "https://api.github.com/repos/shlomokraus/cherrypie/teams",
123 | "hooks_url": "https://api.github.com/repos/shlomokraus/cherrypie/hooks",
124 | "issue_events_url": "https://api.github.com/repos/shlomokraus/cherrypie/issues/events{/number}",
125 | "events_url": "https://api.github.com/repos/shlomokraus/cherrypie/events",
126 | "assignees_url": "https://api.github.com/repos/shlomokraus/cherrypie/assignees{/user}",
127 | "branches_url": "https://api.github.com/repos/shlomokraus/cherrypie/branches{/branch}",
128 | "tags_url": "https://api.github.com/repos/shlomokraus/cherrypie/tags",
129 | "blobs_url": "https://api.github.com/repos/shlomokraus/cherrypie/git/blobs{/sha}",
130 | "git_tags_url": "https://api.github.com/repos/shlomokraus/cherrypie/git/tags{/sha}",
131 | "git_refs_url": "https://api.github.com/repos/shlomokraus/cherrypie/git/refs{/sha}",
132 | "trees_url": "https://api.github.com/repos/shlomokraus/cherrypie/git/trees{/sha}",
133 | "statuses_url": "https://api.github.com/repos/shlomokraus/cherrypie/statuses/{sha}",
134 | "languages_url": "https://api.github.com/repos/shlomokraus/cherrypie/languages",
135 | "stargazers_url": "https://api.github.com/repos/shlomokraus/cherrypie/stargazers",
136 | "contributors_url": "https://api.github.com/repos/shlomokraus/cherrypie/contributors",
137 | "subscribers_url": "https://api.github.com/repos/shlomokraus/cherrypie/subscribers",
138 | "subscription_url": "https://api.github.com/repos/shlomokraus/cherrypie/subscription",
139 | "commits_url": "https://api.github.com/repos/shlomokraus/cherrypie/commits{/sha}",
140 | "git_commits_url": "https://api.github.com/repos/shlomokraus/cherrypie/git/commits{/sha}",
141 | "comments_url": "https://api.github.com/repos/shlomokraus/cherrypie/comments{/number}",
142 | "issue_comment_url": "https://api.github.com/repos/shlomokraus/cherrypie/issues/comments{/number}",
143 | "contents_url": "https://api.github.com/repos/shlomokraus/cherrypie/contents/{+path}",
144 | "compare_url": "https://api.github.com/repos/shlomokraus/cherrypie/compare/{base}...{head}",
145 | "merges_url": "https://api.github.com/repos/shlomokraus/cherrypie/merges",
146 | "archive_url": "https://api.github.com/repos/shlomokraus/cherrypie/{archive_format}{/ref}",
147 | "downloads_url": "https://api.github.com/repos/shlomokraus/cherrypie/downloads",
148 | "issues_url": "https://api.github.com/repos/shlomokraus/cherrypie/issues{/number}",
149 | "pulls_url": "https://api.github.com/repos/shlomokraus/cherrypie/pulls{/number}",
150 | "milestones_url": "https://api.github.com/repos/shlomokraus/cherrypie/milestones{/number}",
151 | "notifications_url": "https://api.github.com/repos/shlomokraus/cherrypie/notifications{?since,all,participating}",
152 | "labels_url": "https://api.github.com/repos/shlomokraus/cherrypie/labels{/name}",
153 | "releases_url": "https://api.github.com/repos/shlomokraus/cherrypie/releases{/id}",
154 | "deployments_url": "https://api.github.com/repos/shlomokraus/cherrypie/deployments",
155 | "created_at": "2019-01-03T10:16:46Z",
156 | "updated_at": "2019-01-09T06:39:32Z",
157 | "pushed_at": "2019-01-11T03:57:45Z",
158 | "git_url": "git://github.com/shlomokraus/cherrypie.git",
159 | "ssh_url": "git@github.com:shlomokraus/cherrypie.git",
160 | "clone_url": "https://github.com/shlomokraus/cherrypie.git",
161 | "svn_url": "https://github.com/shlomokraus/cherrypie",
162 | "homepage": "",
163 | "size": 2394,
164 | "stargazers_count": 0,
165 | "watchers_count": 0,
166 | "language": "TypeScript",
167 | "has_issues": true,
168 | "has_projects": true,
169 | "has_downloads": true,
170 | "has_wiki": true,
171 | "has_pages": true,
172 | "forks_count": 0,
173 | "mirror_url": null,
174 | "archived": false,
175 | "open_issues_count": 1,
176 | "license": {
177 | "key": "mit",
178 | "name": "MIT License",
179 | "spdx_id": "MIT",
180 | "url": "https://api.github.com/licenses/mit",
181 | "node_id": "MDc6TGljZW5zZTEz"
182 | },
183 | "forks": 0,
184 | "open_issues": 1,
185 | "watchers": 0,
186 | "default_branch": "next"
187 | }
188 | },
189 | "base": {
190 | "label": "shlomokraus:next",
191 | "ref": "next",
192 | "sha": "9b566bdc6eff47be8782a601edbc410be4c2a83d",
193 | "user": {
194 | "login": "shlomokraus",
195 | "id": 4599271,
196 | "node_id": "MDQ6VXNlcjQ1OTkyNzE=",
197 | "avatar_url": "https://avatars0.githubusercontent.com/u/4599271?v=4",
198 | "gravatar_id": "",
199 | "url": "https://api.github.com/users/shlomokraus",
200 | "html_url": "https://github.com/shlomokraus",
201 | "followers_url": "https://api.github.com/users/shlomokraus/followers",
202 | "following_url": "https://api.github.com/users/shlomokraus/following{/other_user}",
203 | "gists_url": "https://api.github.com/users/shlomokraus/gists{/gist_id}",
204 | "starred_url": "https://api.github.com/users/shlomokraus/starred{/owner}{/repo}",
205 | "subscriptions_url": "https://api.github.com/users/shlomokraus/subscriptions",
206 | "organizations_url": "https://api.github.com/users/shlomokraus/orgs",
207 | "repos_url": "https://api.github.com/users/shlomokraus/repos",
208 | "events_url": "https://api.github.com/users/shlomokraus/events{/privacy}",
209 | "received_events_url": "https://api.github.com/users/shlomokraus/received_events",
210 | "type": "User",
211 | "site_admin": false
212 | },
213 | "repo": {
214 | "id": 163957091,
215 | "node_id": "MDEwOlJlcG9zaXRvcnkxNjM5NTcwOTE=",
216 | "name": "cherrypie",
217 | "full_name": "shlomokraus/cherrypie",
218 | "private": false,
219 | "owner": {
220 | "login": "shlomokraus",
221 | "id": 4599271,
222 | "node_id": "MDQ6VXNlcjQ1OTkyNzE=",
223 | "avatar_url": "https://avatars0.githubusercontent.com/u/4599271?v=4",
224 | "gravatar_id": "",
225 | "url": "https://api.github.com/users/shlomokraus",
226 | "html_url": "https://github.com/shlomokraus",
227 | "followers_url": "https://api.github.com/users/shlomokraus/followers",
228 | "following_url": "https://api.github.com/users/shlomokraus/following{/other_user}",
229 | "gists_url": "https://api.github.com/users/shlomokraus/gists{/gist_id}",
230 | "starred_url": "https://api.github.com/users/shlomokraus/starred{/owner}{/repo}",
231 | "subscriptions_url": "https://api.github.com/users/shlomokraus/subscriptions",
232 | "organizations_url": "https://api.github.com/users/shlomokraus/orgs",
233 | "repos_url": "https://api.github.com/users/shlomokraus/repos",
234 | "events_url": "https://api.github.com/users/shlomokraus/events{/privacy}",
235 | "received_events_url": "https://api.github.com/users/shlomokraus/received_events",
236 | "type": "User",
237 | "site_admin": false
238 | },
239 | "html_url": "https://github.com/shlomokraus/cherrypie",
240 | "description": "Chrome extension for crafting the perfect pull request",
241 | "fork": false,
242 | "url": "https://api.github.com/repos/shlomokraus/cherrypie",
243 | "forks_url": "https://api.github.com/repos/shlomokraus/cherrypie/forks",
244 | "keys_url": "https://api.github.com/repos/shlomokraus/cherrypie/keys{/key_id}",
245 | "collaborators_url": "https://api.github.com/repos/shlomokraus/cherrypie/collaborators{/collaborator}",
246 | "teams_url": "https://api.github.com/repos/shlomokraus/cherrypie/teams",
247 | "hooks_url": "https://api.github.com/repos/shlomokraus/cherrypie/hooks",
248 | "issue_events_url": "https://api.github.com/repos/shlomokraus/cherrypie/issues/events{/number}",
249 | "events_url": "https://api.github.com/repos/shlomokraus/cherrypie/events",
250 | "assignees_url": "https://api.github.com/repos/shlomokraus/cherrypie/assignees{/user}",
251 | "branches_url": "https://api.github.com/repos/shlomokraus/cherrypie/branches{/branch}",
252 | "tags_url": "https://api.github.com/repos/shlomokraus/cherrypie/tags",
253 | "blobs_url": "https://api.github.com/repos/shlomokraus/cherrypie/git/blobs{/sha}",
254 | "git_tags_url": "https://api.github.com/repos/shlomokraus/cherrypie/git/tags{/sha}",
255 | "git_refs_url": "https://api.github.com/repos/shlomokraus/cherrypie/git/refs{/sha}",
256 | "trees_url": "https://api.github.com/repos/shlomokraus/cherrypie/git/trees{/sha}",
257 | "statuses_url": "https://api.github.com/repos/shlomokraus/cherrypie/statuses/{sha}",
258 | "languages_url": "https://api.github.com/repos/shlomokraus/cherrypie/languages",
259 | "stargazers_url": "https://api.github.com/repos/shlomokraus/cherrypie/stargazers",
260 | "contributors_url": "https://api.github.com/repos/shlomokraus/cherrypie/contributors",
261 | "subscribers_url": "https://api.github.com/repos/shlomokraus/cherrypie/subscribers",
262 | "subscription_url": "https://api.github.com/repos/shlomokraus/cherrypie/subscription",
263 | "commits_url": "https://api.github.com/repos/shlomokraus/cherrypie/commits{/sha}",
264 | "git_commits_url": "https://api.github.com/repos/shlomokraus/cherrypie/git/commits{/sha}",
265 | "comments_url": "https://api.github.com/repos/shlomokraus/cherrypie/comments{/number}",
266 | "issue_comment_url": "https://api.github.com/repos/shlomokraus/cherrypie/issues/comments{/number}",
267 | "contents_url": "https://api.github.com/repos/shlomokraus/cherrypie/contents/{+path}",
268 | "compare_url": "https://api.github.com/repos/shlomokraus/cherrypie/compare/{base}...{head}",
269 | "merges_url": "https://api.github.com/repos/shlomokraus/cherrypie/merges",
270 | "archive_url": "https://api.github.com/repos/shlomokraus/cherrypie/{archive_format}{/ref}",
271 | "downloads_url": "https://api.github.com/repos/shlomokraus/cherrypie/downloads",
272 | "issues_url": "https://api.github.com/repos/shlomokraus/cherrypie/issues{/number}",
273 | "pulls_url": "https://api.github.com/repos/shlomokraus/cherrypie/pulls{/number}",
274 | "milestones_url": "https://api.github.com/repos/shlomokraus/cherrypie/milestones{/number}",
275 | "notifications_url": "https://api.github.com/repos/shlomokraus/cherrypie/notifications{?since,all,participating}",
276 | "labels_url": "https://api.github.com/repos/shlomokraus/cherrypie/labels{/name}",
277 | "releases_url": "https://api.github.com/repos/shlomokraus/cherrypie/releases{/id}",
278 | "deployments_url": "https://api.github.com/repos/shlomokraus/cherrypie/deployments",
279 | "created_at": "2019-01-03T10:16:46Z",
280 | "updated_at": "2019-01-09T06:39:32Z",
281 | "pushed_at": "2019-01-11T03:57:45Z",
282 | "git_url": "git://github.com/shlomokraus/cherrypie.git",
283 | "ssh_url": "git@github.com:shlomokraus/cherrypie.git",
284 | "clone_url": "https://github.com/shlomokraus/cherrypie.git",
285 | "svn_url": "https://github.com/shlomokraus/cherrypie",
286 | "homepage": "",
287 | "size": 2394,
288 | "stargazers_count": 0,
289 | "watchers_count": 0,
290 | "language": "TypeScript",
291 | "has_issues": true,
292 | "has_projects": true,
293 | "has_downloads": true,
294 | "has_wiki": true,
295 | "has_pages": true,
296 | "forks_count": 0,
297 | "mirror_url": null,
298 | "archived": false,
299 | "open_issues_count": 1,
300 | "license": {
301 | "key": "mit",
302 | "name": "MIT License",
303 | "spdx_id": "MIT",
304 | "url": "https://api.github.com/licenses/mit",
305 | "node_id": "MDc6TGljZW5zZTEz"
306 | },
307 | "forks": 0,
308 | "open_issues": 1,
309 | "watchers": 0,
310 | "default_branch": "next"
311 | }
312 | },
313 | "_links": {
314 | "self": {
315 | "href": "https://api.github.com/repos/shlomokraus/cherrypie/pulls/5"
316 | },
317 | "html": {
318 | "href": "https://github.com/shlomokraus/cherrypie/pull/5"
319 | },
320 | "issue": {
321 | "href": "https://api.github.com/repos/shlomokraus/cherrypie/issues/5"
322 | },
323 | "comments": {
324 | "href": "https://api.github.com/repos/shlomokraus/cherrypie/issues/5/comments"
325 | },
326 | "review_comments": {
327 | "href": "https://api.github.com/repos/shlomokraus/cherrypie/pulls/5/comments"
328 | },
329 | "review_comment": {
330 | "href": "https://api.github.com/repos/shlomokraus/cherrypie/pulls/comments{/number}"
331 | },
332 | "commits": {
333 | "href": "https://api.github.com/repos/shlomokraus/cherrypie/pulls/5/commits"
334 | },
335 | "statuses": {
336 | "href": "https://api.github.com/repos/shlomokraus/cherrypie/statuses/1a87d8a46a6d1a106331fe1d33a6d59a90f6a5b4"
337 | }
338 | },
339 | "author_association": "OWNER",
340 | "merged": true,
341 | "mergeable": null,
342 | "rebaseable": null,
343 | "mergeable_state": "unknown",
344 | "merged_by": {
345 | "login": "shlomokraus",
346 | "id": 4599271,
347 | "node_id": "MDQ6VXNlcjQ1OTkyNzE=",
348 | "avatar_url": "https://avatars0.githubusercontent.com/u/4599271?v=4",
349 | "gravatar_id": "",
350 | "url": "https://api.github.com/users/shlomokraus",
351 | "html_url": "https://github.com/shlomokraus",
352 | "followers_url": "https://api.github.com/users/shlomokraus/followers",
353 | "following_url": "https://api.github.com/users/shlomokraus/following{/other_user}",
354 | "gists_url": "https://api.github.com/users/shlomokraus/gists{/gist_id}",
355 | "starred_url": "https://api.github.com/users/shlomokraus/starred{/owner}{/repo}",
356 | "subscriptions_url": "https://api.github.com/users/shlomokraus/subscriptions",
357 | "organizations_url": "https://api.github.com/users/shlomokraus/orgs",
358 | "repos_url": "https://api.github.com/users/shlomokraus/repos",
359 | "events_url": "https://api.github.com/users/shlomokraus/events{/privacy}",
360 | "received_events_url": "https://api.github.com/users/shlomokraus/received_events",
361 | "type": "User",
362 | "site_admin": false
363 | },
364 | "comments": 1,
365 | "review_comments": 0,
366 | "maintainer_can_modify": false,
367 | "commits": 2,
368 | "additions": 207,
369 | "deletions": 407,
370 | "changed_files": 20
371 | }
372 |
--------------------------------------------------------------------------------