From 1feedbe34622bd707948a9205c4eb9261ffc3068 Mon Sep 17 00:00:00 2001 From: Tomasz Kolek Date: Tue, 25 Oct 2016 14:50:42 +0200 Subject: [PATCH] Add github webhook integration. --- .../integrations/github_webhook/001.png | Bin 0 -> 23707 bytes .../integrations/github_webhook/002.png | Bin 0 -> 36091 bytes .../integrations/github_webhook/003.png | Bin 0 -> 18313 bytes .../integrations/github_webhook/004.png | Bin 0 -> 52361 bytes templates/zerver/integrations.html | 38 + .../github_webhook_closed_pull_request.json | 412 +++++ .../github_webhook_commit_comment.json | 140 ++ .../github_webhook/github_webhook_create.json | 113 ++ .../github_webhook/github_webhook_delete.json | 111 ++ .../github_webhook_deployment.json | 142 ++ .../github_webhook_deployment_status.json | 172 ++ .../github_webhook/github_webhook_fork.json | 196 +++ .../github_webhook/github_webhook_issue.json | 154 ++ .../github_webhook_issue_comment.json | 182 ++ .../github_webhook/github_webhook_member.json | 128 ++ .../github_webhook_membership.json | 61 + .../github_webhook_merged_pull_request.json | 412 +++++ .../github_webhook_opened_pull_request.json | 412 +++++ .../github_webhook_page_build.json | 139 ++ .../github_webhook/github_webhook_public.json | 108 ++ .../github_webhook_pull_request_review.json | 440 +++++ ...b_webhook_pull_request_review_comment.json | 446 +++++ .../github_webhook_push_1_commit.json | 163 ++ .../github_webhook_push_50_commits.json | 1486 +++++++++++++++++ .../github_webhook_push_event.json | 163 ++ .../github_webhook_push_tag.json | 130 ++ .../github_webhook_release.json | 148 ++ .../github_webhook_repository.json | 119 ++ .../github_webhook/github_webhook_status.json | 206 +++ .../github_webhook_team_add.json | 129 ++ .../github_webhook_watch_repository.json | 109 ++ .../github_webhook_wiki_pages.json | 126 ++ zerver/lib/integrations.py | 15 +- zerver/tests/webhooks/test_github_webhook.py | 152 ++ zerver/views/webhooks/github_webhook.py | 399 +++++ 35 files changed, 7150 insertions(+), 1 deletion(-) create mode 100644 static/images/integrations/github_webhook/001.png create mode 100644 static/images/integrations/github_webhook/002.png create mode 100644 static/images/integrations/github_webhook/003.png create mode 100644 static/images/integrations/github_webhook/004.png create mode 100644 zerver/fixtures/github_webhook/github_webhook_closed_pull_request.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_commit_comment.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_create.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_delete.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_deployment.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_deployment_status.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_fork.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_issue.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_issue_comment.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_member.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_membership.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_merged_pull_request.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_opened_pull_request.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_page_build.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_public.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_pull_request_review.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_pull_request_review_comment.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_push_1_commit.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_push_50_commits.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_push_event.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_push_tag.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_release.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_repository.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_status.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_team_add.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_watch_repository.json create mode 100644 zerver/fixtures/github_webhook/github_webhook_wiki_pages.json create mode 100644 zerver/tests/webhooks/test_github_webhook.py create mode 100644 zerver/views/webhooks/github_webhook.py diff --git a/static/images/integrations/github_webhook/001.png b/static/images/integrations/github_webhook/001.png new file mode 100644 index 0000000000000000000000000000000000000000..186b4dad373d17c5b491004e684d402eafbeae1e GIT binary patch literal 23707 zcmeFYWmwxyw>OFvcZ!ujkm3%--P=O37A@`+C%6TQyIZjWrO+F9hvH6fclSVW&7t@6 zoW0N4@BMsxKki&tlF5H&&6*|io0+vH;i}3CIGC?65fBh?-o2GoM?iSt{9H~#M}7Vj zPaXe`fPhVAEhD4)PDX}W)!D(q+SVKa;ca-b7Mk|Q0g~*`>gX8k_=wE80#aVdDyNZ$3_=cJtK))*u&`iDk{`l3 zp!P_zONP}i`|f7X;4FiHvN#+B!WT{~3jL!2H%tf(!XhfF2ne~z2RIg_Tj6K;-G3py z#Ydp!=-pQ@;pqLPF8a=dh~gNlk`%#=C6fLvnxxclhEBh7sME`CKet+EYp*Q>BK6*M@wiz9L5O~B=qKPOQgY!NSw#33T|^8K|n@$>8S0O zi*F+}jBnoKIaI-}NPQN3Wrb2sEvOmt@kQf!)r}R6gb1w?iKQp1fCsk2Cg!7QukC~f zVh4WLdzn}g^KOQ>o_Us7o@WI3tddLg!x0$Cx8h8Lr_p591YvnSnK(3l84T!QDGNpi zLYQ=4}O@^J+Za zwiE&)T)Iu8b2P@r!)XpGh-_T@!bY(?Iy7okjVs&4vOVt`*O}0f+kWG51)$e`io@bT zEC*Fs<3Ap zpXsQPON5*BNgH={gCLu*2_qI=0Npoek(x?0UN&B5WP=#X&uA27{X3pKR-Ab%rYUaJ z{912ZE%HfVv&>VR$mnmr0D5~o-m_jYV|!fHdoh`D!FmUq+f5&nnblpoN!B!0!G7%@ zG4155PQ}3d8^3yaz+C8)RXBTJj1g(Y>a(aV`AS0l!5j~2r0w=BlCbygVl zY-FJV7N+_RVn&a*p^Z9Kw>^jSY-^*;_+ad|Mo-X-mWwE)p8`wKjl)Lbi(d#QXBK)1 z5YAROmW5ZiUVHO*HavVtT}Aa*B>(giJXwj2Ao%nW;jY<1IB>RNX%@jTFOr?`<$KqS zV>0|Ti4fWcmN)*mTnIn8fS=dU;W91$66lEW)FiJ1(j9wvC2_YzDTdJ$C7GGfY<{Cw zys$-UmSh)1zzt*=!&DADU&Gu(68NpJP5QX@f(!}z8~rQw>!6S^0vuUVZfQ3B&)wu_ zk`M7*uV1~BR*!QDiVcgq?N|Q+_$66KEfO!hrL`sK{Hig?g|0q6v>yTX>Nd!PiC9Cf zR?XCf=OD@}Ki7&)82N+3`8aJ2ihi)Yw9VL~6`j|s)~_p)_hY1cT&P^0Q33nLDQUbr zk#Z&j+OHUXlbD!m(`yFu8L^*=8Ft-ONFC8Bckc@l)d$s*2lcJniUJM8%Dd~=YCY)u zNZLarx+!8c8|QqYx2d><7&UsY}xvKOTR4{6VEIv5%~iU7}b=j~16W z;N#5Qn9vgIldvS?Cr=gsF@ZM$lpL9~**}u}nZ5pVncT@=dhJW-a_J`0PKDj-Jj{wr z8B91ypd{}k0T>K+2jhT!-1dY;ZVLJs!wzp!C#aw3zQ2Zii(T8f7wkfP6@nu zHIlX?r}&e2OmqCe%F+tY3ixslQxmfT6A&ziseu`dDTc{Oy!|rzWh=2I3kkC(3zb^S zUxG!i3(ZQlio4Zyi#`>&=>5{N)=n?8%?JF-%x_Wm%z@Ew@3OomHYElV$Gi_83?nih4x8ABXsK1)Y0_D^iGk+uPoI=QzL9s zc`mw)%5P3-PKjsMU$0Q07)uze3~!Y7(oYS1^O{nHwOW-Pzu)0ps=QLd0Y|e%*S`Aj z>YC5#18C&ew`#t6>+DHDW|8o?9j&*?e0LWS)GAkZM|WKJyvEJi)e6Vv&FA zc)nOs*Vx&_z?4ooNZnF0wd^o=Xi~r2`~5ZE&sUQf=_5EtaKc1$0Cf0Ei`PW%`Tm**0;6>Y#0sG9;O#MgcrT)FZC&i zGw?G^GDtFJ>vrmF7g-h$-QF}KG|Rb-xRoEVA2nVr9yth&QFcLCgk$|>H8l@ho=*x|l zRn%LyOnh$`Tom{6xz4$yv=s$kQ4zLrJQxJ2p-AL06Uw40lts1x%?Xo%my4e^riy-P ze9Vzwl!e5$;mgFP6IXNY=$EJ*9n3X5{dCG}xbo<^**|kVgAzRuvJl=8GBR?!ZAti% z-mUmWnSs8K5&DiQdq={qtLAARcT%x%HPe{KbTmqlm(S7yBFe4kL}D`&|5EzB^k7>O zq~xt8j*TFnV6Cug*zwRxzhB4MM#(O=<8mYMlBM;DHL*2ha(QyL0ME?B;*$k7%*XSy zM>$U*PrYRuBw~0WgYR2boG({sW?}*;v%C|skux$qkd?TYWf`yaZ8jD9t(^w^7N2E~ zPBw@)XynCTr)iTkJj9Q$y|nk#v^8#w-5!qUKuNo&yDr0gIn5>~)p`DThCA!$bLR`Y zha-kO@O32U3lUOUtdFF1oIKi}s*1o)Ya0vnN%T63ew=k2WlVm}Z;Y)K!`%ip68a=w zJbg0!OO=J`SpV5`?wx&v96Wb1n~5{DeAqXW^f~G|%Guy839T>~gkQqp&eKI>;jhu@ znBw|UnzHrs#>N?ton5fAoLbMO>-yoVS>D;yQgE~JOo(FgRq~>MI)4QJl^y2dRLi{M z`L~grdNbQbwe63t6}rVdhvnvK|kCV77F`q?{-T7z8WLp!;!As(8X9mptax^mzq1WM{OOt3Bh`&BIf*G+j@u1M-r zOxtxH>*_ViYY&1J!lxOT85NadvRQ=rmQrTK#?o&cxO<^*`C1+Z!-giY9pKI*0uSVj|aI2M! zobB=BE#x5eCui)__N7*z>V_(uwWD}^mUY#tW&VEV$?o29>NL<@2r9pl>N|F$dOv=< z8LWbllN~+$q;%J^A32|zQl4uFjoyih*{MWf8&E?C#QC6zymo1TVD;|wXzT@ooRrsf z0y=Fg=X?Ac6>TqxM0C-{qe~=edu{~d)2J#Oe!8$<6{Nsc(^iBpmI5ngv`W?0$-Q}< z6xi!sdwUdi2yfXDd;jsKnMsV^nc!n@6=zPA|N1|Sbx%X(f*($Z0cagVQl7LV$R`V=lI+j z0YTJ5__=6j?qW>sVP|U(67~?I{kw(mbNSC>PFm`}o4DAB(Q1ECrIvAUHmBy}c*DU( zD~?G`O)ctdW+ALDEB|lu=U-y9RxU1%!knD$?(Q7!yc`bBmYm!|LPDHeJe)i{?9VOO zL7w(5#vbhUAi95b^8fZDYYsAXwsv%}cCe@Z)333KgR6@eE$tsh|MmLUIL$q*|C^IN z=-*;J3&{DWhLf9vi}SzwekK+D^Hf*^WbQ2EU}tA;?;`%u)Y;tJ9%SXXJIY5&TId^jv^p_ z_Y;dgr%3i2tva&|vl6X*k|G^y@_YKAVQOif0kW>JU+H^4Y3XR?->bXuB`3vyv;UMg z5Eb7Br-JO?&eUHCc|$>?e%IbB@Vm#+=IiF`renB4s-@VWjtvlWyPXOy8Gk2T9f z@|qeEKeF+U&>Q-1 zg8w;|fOI0&c#(5bv#Wm^;=kyghk*URL-=1U{PB?g)x!T3E&O(({hu@OUjUKD8F1bH zbhLx)(Eh#gD8XF-c)zExo1q3`2oR%n9M&kC&^z`Luq|_qO#F7Zv~KL36nV_(J-nT2 z_*8k!Xo~sIU?YR>v*io5UhzKZ%D`*C)|dIZuZ4v6?e}y!cys5jFmqn-@`mCFfL5#|<8=J4>eX0Hd@vg)IhB%r_8hcAmTA?{zXmP&{@V}p^hPsXX>R+xE zI5__Y1gd~y=sEQek5taK?ze$)fs#nxQvOXclnZ?BOJ!nl5W4>pbp27>0)8uG6u)82 z+zuUeTi3tCo+ND8N>Kdy!7*>Draue4X5b$<{Tsf?6eZ`2X(3i0zq;=>WO%e}w(tvM8Unlu;JU z{>}9txJA)FvtbkJ`Ui9WTi&!V|A?h<$&9FfF!H}T45)l&6GLw)_@Ct^B6wb52&@w0 z|FhCkp4n7xVKe@dz5XRHEfR|}Ba$7@KZx;fbM+EFvq{NZ|IhL&$v#_8_WK9<|Ex6a zXEuEayqW)5-f;Ay{|inMu*vYg@4rnWdEO4cZ~t8AILzJm=E3EE2wB15|^YZZ(8y>?m@gF5>%l$4T)+B(npQ@Q7e4S&wLP|l>!2BY5wtuo3m_$Cx=mHbkxaZrO~R_xh{LWm^yug7EkT+TMZ zete{gSHIlPKp5cYsrXr|Y7?WVf{&TNeH##*o2;+u;E!Gx-SJVY%hVoHOI&)o>(=+t+86XL&@6cbDPcl*8}Jck&`R zz5qjy301`(4%?q>x)QcH@A5dmlsQG))L`N#H9-BYn?Hkdsc%n1C6?|aP8v3KUrd&9 zoe90JU`LwDiuKu|J1%#4mAe&P5!8I3QNHk`N_CJzULAA?Y?(C*i2qYN~+*xT3Tc@lpCv@o(4Nkz8YU@Km%3_uel^t((7%Y`=-z zfjk{SzH#0raHh*#4F{sQh5V7gGkH=1eNb+R5e#FjNB*`Cs_e0 zE3C)6dA4o&?NIx}&<+&-1YJC|Ex>=jL@kN-PO!vH?TYYfVYcl`T8HrIYLR=8%v&Ee zWIx|}1OZ`8p;u52;L9nq$25=(8od-b(V+aK34~v$z+H?h100gfm5j0+J2C9mT%qNo z9Zy#sbp(IRv08WO{_LaIzTOf&ixn#>Ql1{Kn4IAIIZwYz;r(1_1Ho+hY`$?TO^_yB zL~N~__0B!>tQ+iR9i;Zh#rEZjrZ<39XU}KfE~ORlzYz304FuX6!0%@3L+}jYmxikq z!di?03D43e^i#nhPXP{o=NTFGt;cpFq2d?0!CznYEIn&)sEzrm-b_E%{xX)+?M`@4%~J~cWu*5ht+OHR@7O@PGuhHlP1!B0s1^_4sL+TG5t>7jaI z-D|daMJ@5Y{!_hY7LQLaxg}fOS}wHVei_;}^7`6!Y3AOuU3`$!`)Sf%xu8EQFf-A7 zA5C-(5l1o3^*&XypV)gGZhCa~Q=s)%slr8i|GpB(c?ab4(gw*0j=f{xBUWAiEvvy< z#E!e)uKR+e=;Os?#-ZM>a4;TxnLohrY1`1gzPxF1`D8}94cu$#BcHL=ymDE#BLF@Z zh<*R01-{gxcrYmnGOcCaz7+7=6!?~?Ec~l+w)MpIQyMp^)yHR1!1c+yv=6T3-pf06 z^{sXpDhEA&jST-bG=3cgLf>SD^dZ_HV2 zWXlSmqNLZ1&ACm_nRlbk@G%5mD1fIj-B&zIX}?F2Dvn4zZA#dSuM>&qHbQ()cv+1d z+TTRbPYS_vh)K72uR7%3vO%Y_1FHtHnff@NHaMw1X`cViBXMuLn$LNhANf_7-IQG3 zc|MHZC5nuhbd<6@^d!3Kjg+L7m}#&w|>fl{7tnExlrV94vo$fBt7#v1^9U)VI|p6SrM{ zZoe#Y^yS2t*v^POa1&zKFua>cz{%4c}SLKpLTg;-jz>>>tso*z#0EGNElO?xb_f*XBLq7{yo-4Vt%P){8H2}_U>v9sEm{YuKlfBFr$lQ&l z``ko@F-l|*San?(1vLYz&`uI_9=3M=;BE2yrMFm*7=EWiDFJ(L9J_n?kxZ8tSD&tS z`0E=-2nHd#dbS_>QHCg1PD2)sYsPUC1vWL{y-*6!r$@_2&gLEe*>G7>f@qM-RbC#EjBE(H;TNQZ`1>GtK10i&=Ep_$d3 zyI(oN<}lXDyd3mY$mYVQKAOwyHrTA+@$7>58(3dAb08Cg+P&bRFYrAaie`XaCWBh& zr&d3xAqWSWh*%B^Ev|nlS)`L}_1xjjX(S^}AT&j+n=?)qagC@v3??<09mA?lc!2j@7uAgYA^xHi8&bKa^lGroPWZWQ(yc+N&qdbiZPtiB)N58V;Bc-< ze%uCMa4bR()glevXT%;M`@x^BTyu(KRhbaQhKZvyV`mejy& zg3-BA?9Rbv38^#nmOioQ}#JqXuJxy4wapnQmMKU~nVK{bGYW^4Y8*To6 ze(VO-lV@}I+3mX~z;%K<47NcojVrt7%;&;CR@zTo%Wdu}c)&hylYoQqZO9)Eecx5y zgSUv1KCIt>l|ECh_W_bYy{f#!285D3e(P9<4RPlKSc{Kb48t*J-OPoV6Q|rtNo`U3 z7(1!%Z_jEuBpiH`?-OGmXlj-raMMq<(%bFMlO0xcOXkQu~PH0a#Iz#Q#k z8g~W=;f$)eRpb!d1K}6Q`xxFP1KRFEK3fVBex=( zhG1`k5K*7D0yu+uL9%UUkP;3gnbQJ&Nk@)Vm7oEI62^*?t@L%-TLmeVyB`!l-3U=R z?E}uC7!UB&Dv#lMtff&nQQ$VV2NbD=xys`gCCwHsys5CvtJnbbkz|POInnG}3T1sL`-5jDUV!=b z3&ocU!V6dcRyyf;MT(B!A&PA z3cEvNH8j{pO@s92e!0}>OU1oyGm;h|UaT?BTZDaDJrxb6r6vrGW~i$m=K zb22f4RlJAac!1pQ5o;sW4o#IxJO`=_GjJxaywr{{K;|}ALV-kv>em3QKd7H=PuS5m z{w-xsLW*#}u*_Y*(SwQ*PG|@Err(0wRC z9A|Nc7dnP_1%^$|M=E|~i?sPPtK8YhY1z;hhGfxN26`H#UJZWlph}a>jV1PHNgih#zkDg%iXhvK-%-aeEWb z4${3BPPy!*QoyEFl;iO98ILshv>cmIkSlRtEwQ)+f4Vlj>v&TVWO!ATnmkaS@|KOS zn--Lu4-!2e=8eVYr^Pm`Y1#kau%PQG&j`52y^F6(88RxJ^e6CBog3fVLCroC!iIlj zs9R5aY1HKO<{d>$U0NG&{p`>Iy)nUo4yv}__YmP;G<&jP zBIthMZ2M9cdl(%M5dUJ%A*W$KvKinh8Lk7GBFNsQx^C#pgG5}h+*_VX-v_bYBWELH zSuVtX+nk^K5;0IqQ|8dBU@Zwup;UaOhQQS@Kyqu_?Ef_n%A;`T`_t<}h)1Tb7YB$f zOa3Ng6MVN;`1k*fgWPpt?5$?;30Jl z6Au)$N|lKhse$I%<-?6G4M)ZWxb}M{92ZU^7_2ttPU#}07a96y$8THFw>#8*-FMu&_ zWb=qJE$Z1OdPFhDRVEqe+T2osk*Di;l$e{0Nvm6=!NQl7E=vmb`w3@zTI8S*IS?-7 z-lSysChH8iscu%QZrOEnB+|Ai;yl(PB+LqX;lAvK4rtD@+NEGcW-IBm`duv(-x<|c zg&N>}6Rs11uA=t|X@hDbP0Wl0S)r$YFvI+;;-!DDKhV&B7R*fvg=?{Z$oFC^wHMw zcj{`j4pMdse?5+~9I&QkvY@wT&&I;z?91gXW_Ie5xYw#yaojJmVbW+mpu4`^U^Vo| z(b84kbzkg>ujnY}&#h7R-D;&xn@(zow_Fj4f<**3%(@Ok!e0P^>qX2?bfSSVlgc7? zan8hTrVFGN6RWV4`kHrL4>oN(HnbG^F@eP5hhQ&K|^y#dUhUd2!$t?e=!iWB4&F6GiKSCgl9u%5=SxBP;y~4^8CmWY;#w)SStn!P+ zDLl|+FObV@&$+uJh2U(xbOPwaMV{)p9_rPC(^#hj)`AzZ%Lk-U%8Nc5@+#07U!q|A zl{r25nm&}=S-H`G|7X6Tr8Puis@pPldN#m{?i&JB)GzGmt zakk4MjpLGAUY2Fan;Y#76IeFo&Z@73nUvtegpgUaPl<3C#n4h!=XOogsE*0-upCg~ zLH~YZe1Dsho`7lNNbP-q!0sv&hAi!0Iba;?s6fyf{8b1Lmb_&Njlpxkaws`6*fg;qA>*ojB zSe-EGd07uYigt~V?Y!iQvDee>ZoRS9N25W%WM91+Dc^?>AnfY-9K`u#rzKf&ko)sU z*WR;g zsH@mJfABpNgHq4hOpFZTWM>hpDtU!2^?zYP%|FBLC_J=kEl=#&`)&~(>2QDnMeR*O zuEX!hC9|xG^TzJ|#rv_LH32lUPdZx)|L7?8)>_tcCoJE#uQnI3hnKf1sW~zeP`qKH z)K?yRc+hOMSZ$J|L0&V`-$%o%uyykGz#vv2N%HLh{{Y z2?aic`1pg98kD}NYsMkp^fc=d8`jAyIE6dIFjPFGMU=ni?6JDHKgWITaJFd080N?I zsX?k`z{?^9c7|OYv54V7`{1e(Szgz>`{%IbXK_8tufl`2{k|niok&^JX=I!0WN5t& zOhZQTvEmAB4wWu{`dW6*UkNsNA%wS#mngWtH`xhGwFy$_{qZ!$L9<(7l3YQvL!!>@QVcjSJ;f^w{PgnhT=z zWUlVrG(f(Gr1Pfya2(}PLpA+0WggRdgWv6hPCnc)(J)pqKF*u=+Hk!hY+!J=;lzmw zMcSxj8x@f?h&>62zVCb+3nvZ9@qXJqV(%gC7WE5cRQbHx{Z)S6kR3O-Z58Tk(|ATk>?KT;)?g z?XQZS*b3kPf*0~=87|`v(;G`zLY7&6l_l*mhv4Xd*&P{#+t&vu5x|9u56$Mjq=Q-q zj1o!COsZ-q<67egh&8Rg?9P&3{?!APZv zItl(AD5iTJp|Lf$L=u~918PD$&V0Ikjvu)?Vt0M^fG6 zp*lR|D(UcG6Y2e;ok)BB{dc#&?Ra3nkwAnO^b95?EgzkwsRFo+pY@0HF>7-BTsf=8}@m0r-sbk*T zrD*7@cTPo1d&@O|NEtmt2jPH7Wdt(TGPQBK@CHTNQ}<`@S}gmgPT|D6&nJbH##XFU zq^i`WO|2D*xXS`71~oFhDn2vau6IZ(w6u3QsfzmF~!+t!BUs9P%I;>c2>8E4R7 z-KQm}jwN CW7pt$Qc}SuhU1)E3Mpy`>NP5R)i{c*$l+*H)ox%{zatvf9*Jy)Bxr zRMyzyL{)IcwLj>hlm^BIty8k+^d1CORtVO<(0~ z&o|w1YzUrJlt9Xd;;DEjHtqHLJNV!=joOGQF>SF=!5ZX(cZ?}kvkjAAi@<;|EINcb z%pa{CNb&DPdYc;b>SvN|=vwu~VYu^J5>bFbOF5^3h^;o<_Mq^ABLJ=r!ZNb;j0^s} zLuNIE)mQ4nj4^Bf9B#t2w05|lg8JrtQa`&U~0ST*YrK3V$XLIDcoRT05n*`lQ8s#W>)w;ei-K?C85Z~?b zpPU;AA5t&5_M6H1m#T|xK|b%{tD0oLA-D}Cll4Vui|Hi$IRSjP*J!>9B}wZ+y7B{B z=+N!Yv+gg2J9|H@_nNNE1~My$f7ykNmJnUTV41qQ28*AOT143Xs?N{saV}~YwKd71 z=UWGJD3lz4ER)WY50U+}V>DTZTsEds$s9w*0GAPhmEEQ()jNCI1V!hecs5VH2A}K2 zEdofliAdC2Y}iuOHtaiJ@WKZDEYNkdpYi}KmdBw#QgeJY1RvUNdN>U{WWokgJR&LR zR6@4Q%?ME!@ewt{zkiS7_ZRjzsnHYq8W**#K9c)@bvUu`*dRY|SSKMKsCE@5xAOg% zJ$O5e5lFYHXDX?*n6#LGs<=%1$dsXmS8dx>wQO!jT8!P>Wb51c9UdR+W7b@YbP2qr zhVj06^2pX$_b42<->m1S-t=O|!Wqz7ZHXH#6J~hY)b9$c(q@f4dq|SNrW_=8amt~) zM4-b&eQb=SU1^!(58W5eDb6I?#v25$2 zhZvNKEcxW@SKC+%LnopQFFx{ZTU|kfwlgZtQe`@ZQqYqulT@dUzlmypG?9B?!pdKb zx$ABnw)^aCHw!wRJxsdgKwBKHA2QT4+|J?WJkSl&aW(VCV`yQzCX2}O_JGfffn>F@ zM{c;wwq?rWcOPt{?3nsIu}aZZZins?(Sg_38);hd+ZW^9#?+y-0t^a`c#GN^-PP2l zZbE5P!nVnZV7;cj$wp;(w;MgvK;_REj6|L&xI^~u0JSX>8b!vq>n%*h1@6UHs{57b zVS*de71$NAd>l{Q0uaS=x)^Q+7KTuK;M^Q9N8iiM!fUMOj`8S`7 zwr;H1s@BG4)m0*wl$^wOlVUZH$jw8yPjwnHAw+DDci9h2z9zn;mxxkTvF2ngY4dWP z35Rr-*6E8$(ltt^M3)2w>_hgQop>BR9WO(jDdg~o6l7AQw|yq4xHpF;05|K}sNHx9 zp95(DSaB_S&8>|aD&6&+pS>y8IT=#=iH4d}Y6E;XhW$de=tIwa9MFUK)U*!JA=&{h zjaDLGu0gFoqNY&`32=?c12S*ojH@)%ZkS_lH;I$1+4wbuU_sK6b*!PQKP5+HaUz1| z7)c9QNIpFj1u_k!E9Lr zN7H1~#}6x@>;~rgc{Sw*@tT(552HGThQpWcN{A9LAc!_W zJYaQ>|7Y>4&WyX<$**!-nV!E|TEspqK|w#FI5UpSkO*YZHbO;?WzsD-ib^eXlAr3f z7c};v_4j1Or)7dO*t%rEie>4>Z)JxqtVm*)lAq?RK@}6F zx51XSsj4fMM-WXi8pAv;3k}j3L7kq#nP8<7-2K=gmj|#=0CIl69Dd(j3=*Wxc3ri5 z0)wM^7^~gshm4d?;`Q7*)u7r2Io(C|OHA|ew2Jt0!HG)O5!DbN>f3Qgxo=M0c!PV) ztOg`&bg@*sQV8@&<}4xy*oxfvAxngGiH#HLVXWyo*5j^bVYiQ|hjh@KQtcZn^2K_y zJ_JgdaNss#@Dooib?C@0I#|VLgXnYQ+ylY82kP$X943h*@j}28{=&~ihL>iXzWa)# zI?_%_68`C{^wti-k8+*aZ0NsR_$9Y>XItgga57zRXmKg)l-Kgj00Qe|C2kml-4K6D zIjw$*MmBre$1vow4w1rfb0@(1j2Mq`r^4%`3L0qA3DA{szIqJ zk*U;FZWs@dxEqfZH~CC)M_9KTUg}k)aS*3BNmX_24Ge}>dE~e6!@78bXh|g+4F`>j znq`(>IvBaH;x#iN=Rbd!tI)G z#@$VIAZqoVNNDo$Si-{Wuh1;$U~GQF57%ltA%p^*-K@sc@=G$py(OpL$0mi!)PKu+ z887>*Qe=I`7TpJ^y-B6?4%!wcsaU7=Il)$AJ1^14(VKP6mN+5cygy2a)xe>`DYf@Q zNek#vud?x9WbBhUkj=UI2}?XghQ!huPaB2ufcG}DG;kqQO+znNe8~u|$F3`W-Mtm{ zxriJ&QmcW99s!5fL;xu_N1@#cjCnX=-o7zR#W#+x?0An!4g2IAhlgw`mrPY5ZQZ_r zVND#8uux8bWiFu{2c}tPr>M$Pu5ITaMlm96X?Hmu)pPuk5rMO$(i5*E=DMS{4O$ES zqHt$6gn}|<*Qm$2fA1+j_`Fn^MQLz!icT2FQNc7Zm2Nl| z?{cFohvC>iZ@4RCY^Cp|DezrWh5JI^rXA_jEig@-d=@WSOlKZ+7C+K#nm}TPY1|b* z=4_TPuU^_*yx{6L=gB6Q!`~*-A=9bbDPm+btrIRm7%!951=u2 zF`9}q^mb_%k>Jf1_0bHa2p5dtQVad)INwP0vrlYioaa1h_t`4#<{#}M1=?xcKyExCJ!RJkj z5MRhRF}I(wPtOk~p1rDFZ9e0!>ol?qZmJ+=d4b)ZcI zWWm1?Xu`er8Y<8<9=-5DAdc!++whiESfSGxC(zUabsa&9tN<0cf2m=+p^1$a|CJT> zR|09X)dCVBKgcuoNQLrL#pL@;s!i3AY73mW!fIJ;%ka=grxMHRa!E*uM9$XP4k#|m zu3GdUiZnJ(PSN4SbrQdP;|fVQjrsL~o_?s)58Bc)6dkZ8EY6m=E!|*CpQF-Nt_?hC zVh9-oL!{0bJs^HtY51>ePg2JKD2o;*i*|;K&_-nWqWHr)p5a#Y5LgfDrQo!>IgWzg zvQ7!b5Bc~UAA4oqY6dw|%}aS{C6Vu=E^vq5i5=0Idjn{?xKMqiM3c#xF(t>b@i?Yc zau^qWV=N|_!2OC#n+*Q`~%b-Pyn;_F+fy$Sb??80+0Z=@?L7gqmic+*K* z_g>bl2zplr)fJBKn+wJ(H4c;3!KJHSvQX!|do^7;xC($yDp%Ap&P;1F=0o=X3N%)o z+!gA)BQLgH;U-e@d2_bW<;5EXOr5?IKRYZ`UYonyUT%x%OqLIep%E#Os;Ds;Qxz_A zDqkW>6`X5#Dk4n1*^j#YY9e?=nmfS;(heEJ4;jKST(Q~1aq#FeIVJVm?C06Dk{yuI z#9U=imKY)~>s8H+|}MQe&R8}EhfN{)yGulLjV_@z_j z>!J(qaXC_UlmysH(`Eej$L?5HIS#EKGWYHf@0D}(+(Mh*G4KV+z^ZpkKM)HijF$sC z-*oO=tKYH1q4`JbUD&ta`RbH2TMI3vvA@EL>Q%`v`*ube-xEM_3$M4TVpNK_l+&s~ZN z>1AGzDBi60(6xBD*BXjCL^BU6zLc)zQSnxdEGJRdK1w#?XzepTwXc1}626aKx-Px5SL~j> zZg|&N=kTq0hw~7yF;9k7Nl2P5Hb`L}11fXkREd&r(A9Htm?v27IM2Rr*@@yEwbDX% z8(<+o69yzT2qx9j9B%O^I@~7}JJO0OxG+Usb~e0TjRf80w)w)-#91fEy|<7T*RyYj zEj9b@l=3p4uj{QJ7tyg2tBu02f<3N+oNq2BRSfkGhD-^5CmNu{9BngQSR* zeZRCzbq44T=ed*P^ctu2V$s!pPnaUudDancb-MA&(~Rh}j2_M9)V=jkzsp*6a$nxAtA88CtO{myapHgA-m=_=+z5MwSS2c** z|H8H0Yq~h*+l3^#wAf#b&vEc9-eYvdY(ZE_LDv^rRJ5hYYpN$0oGJRf!gB1JIl=a& zI#f7Q{#VvMfF-%%Q+xTEe*qfrX-hS%Z`hUDjK|-&wxeqMtq|~!w~&v*4^fyFYn^}d zos7&UUnYcOqt+DUw{2r++-bhlE(VzMqVAs>8L3~*>w(WA4VUV4`caN#C`5l@RVq-< zR!Bk?i{iv*E0bcmw7a%iwg+Th=H9~5!GFT-c38()p3IcK^2~ureqZ3%r8X_0E!asH zR*|&jq7*}6=hVUGK{9%)E!g28(#O0c9G$e?O>oi?XqR+5XOm(3Ic4*FK7@0mlM%x7XdEkA=nhWibRu2-6%5T9?4Wx|Y4Oy~X8+YM>nHQT;@fc}^p&OWrL zK+tL*OY~BE$>46)eMX#3Y7ZFygxgKZqDZJN!ldP54NamUw|%QmXtqHM)Lm;!@5GKh ztNI&eT;u58ytw=qD$SB*$%Q|fD0NF6P`x0hgXY{wKPF!Z)*4%Z>cHvufM+UN5}j`3 z*MVga=TN(=1}E#=!dROyouVlVHTT`O%z&FBjvQD6ys2`$4t^;_ZSH~R!~@+5hG^<5 z7eZErb~8aq0@?9)Z(J7X9nCRT>|a$!XLSe#5~uJfY|~Y%Rf2klY@Tm}Ffyav2r1=& zlH}evenJPl$SDZYUY=0>&h%YM67ee`zX;p9G{%tYRgXyuKWfl$f+#FL*7n4sPoypd zr2W`4n|r2G_%=V4a{Zl168*4?ajTM?`Bkt^t!UAJ@g_j7KetPfw`(vC^;H2SGDC^| z+zc%=tJ^=(j>bjHZw{kacJRd@J?b}Og6^YrmL7ty#JmaEVN4WBjKa!;xZ8B8sdg}i zRhP0ewHJf5itJ2=Ng^d$L$H>Shp1?Z^>{larh4>me{$&GKCi%1aH`WQeppS}yNpc3wgoDZQzlcY=V*T|rbUor62SA99xmzb;grH4 z4GF3C@cPXfdG-DgcMmAf$UKiBC}DwTuEi|#Diros=jY=OJ7Z?PPBPxZ?yfpiuCLt3 z`1dT^$(W~5kp}1?XHdM6CRKV57?zl`WbpF=Mir{Ob~&P$UI(AWP;IxOV^+!BWRe)S zmrpMVUAZrwQryB@kOu(qax*`Ycv2m_zsOxu*s~C_11flIAuq5364`xp(ylP*@d6$0 zZd(XLj^BT!>q}G-Z!C=rQV{nV{Fptl6Mf|`9^pmqO!Rd7_MKZ}Iql;l-e(I{cWb<& z)u45F#rItH+>^;2*t&L!{@gbP*xSeF%ggo&&(T((`m6_o!lW-pT}&dCuN2?Q>&cmPu zb^a0UM|&dY7FjdM-iT~P$(q6tS;p9zWbFHrbwbu5@924t_vzRB z^!xL79KYju{=1Jk?m4gPJn!?m=Dz3tem_ALE))p>2x5oi3?s}eYxnyDD#NZnN?5K| zXD(Hf#oY(Tq*kbX$TO=98@t9G*Ok8d*!~g|#SSn8wmuZj?y2C~k%fhq20D-OQx8vp z4z^9iruQH1g-+aj?0OSE^e|WCZqb&Y%X79$gpEsMptz`p0hq7%lWYibyi@wJSQ4_E z-iS9p4dcQHOrcjv<)r+#ob8a}cm#okMBll>pD%3s7bx3e;m9Hg0vVG?$w+`WLOV6SuPPxatF z=l}=7h`@S&!g;j8Qs|f$QJUIkWEcNoP4Tnr7D!8!-l__Z(Dr zdZ4^-nbAcpp(r;AVc2Q`oeH>_d^w#v)9>^2r&rspsIeZsq7&>}El0e2oRaFSmNSPo zPNT5BpZ!mzuPIqa6?2+Hdq~Mn=lzAY9t5RT5r~;|*s=W;B4Q(wUtG7bk1M`l##VS4 zK*l`!Og~Y=m2Vb<5V8ohr&7lNSuMf$thcI&<*hJ*hhNBA$*9PZUKSDNf(N%(6t*h$ zNfGPkHh5}vy`*5QPF&t7=45VnV1Vjq(1rr5g?}eh9(>Om#7O({`@8zmsw&aB#a5W5 zYtfK+q4@!JZH97#qom+Rh)=(-22z1(D2SpO@zO}T!4kJ8InHD1mA36?#^`x#+;Y#j z0|&$ysrZ%$Ap*$M*co4j-0Y0!B$4R+(pr?e%vc*Ga5-#0*sHU@Fd>RKp=1H{J9&Nj zi9meGgDYPSWj1^a@bJC@wT2_N5+xbNSd=EBRyhGP!l3)FVJ7;`uUIIt_i;g;y9_~ht2OecA z6!=YkCP(6@R>s)>LeRBOsM&F)_2WHCC>dAn!mNS2t%O-LS6G z;@KHl%1w(WC*`rPrv0g?!iP1Bm`d;=HLY3aK87y3Ud-640euhU5o$hE$(#67C6zXv zmyOJNs*I2Q5CuJ(S_lPDWU=5KZNCZ&;v|QrY>#GlK<}>Nv@+vE$9V&LS2F4+ADexviAO7O8!_sQb=;{&|Y9E?+Lsb^ci zH8zN(K;ZRCPN`E0tc=sOvv?3|o30IUSQWI}?NR=R35R{aH%s`LIVa&t>m=u0m?)xz zrW5T06f<9*Ep6K`7>khPnOKWkWe3PBIW4J;G{l|?rr8wN7**YAhbn{JAx z0Rt_A2IX}ic)ku^-w_uo$>8TlnBW(Ls}LLv&YFE^IccBqHK(J%D5T}2PR7^mpo=Cj zh?JU@!&}pm70v^(9b_9dhsCi3Iv&~W9_3Y@Ta4I>3GwaD(ntj~c-RgQbaU&1jo* z3w9abR?F`C*+wOP=@08et%3SV=tRp)AA{`bk?%kkbezU}w!Bx5uV3}NT5)ZAMjkbB zht+kZS=J$}zBMlO!Ki$aTtf3w1&5X zN2{Z?S{S@(bc`oCKY2_;)4nddIz9=>Z_Hv(_&z#kc z`#stMt5>C3&&NKcogIG8^$tP&wS7NJWQ(1DocOzS#86OmBL95Wur0`b_YW?liml4& zr@&2#&4Cc4JHLCNXJjGuT|7$|fZMT|==TZHuA323tukOIDw(5i&&D?e7>q)@!r^@CKB3=})p%5lu2<$oVH@;{YkH>bwT&nN@*xne&BkZW9cUgQaVDk7xT0 z+vKBf%i~p-N#XXanjBHrmXE9PUZtkjWz7%~4nwZs9=cjnxfb@?{S{zZ$(~(-xo0Jq+W|g`?r5mmfV9q}d}|3v zW@cV>4R}0xzMhDt)1=dZ;9u3Dk{ zqm`S9?~xM+C_v#N7~kjAK-QIYQW?cF;(C1r&hAVAxOujtUHiz8-lyfL4%hs;w^ZR9_?k;l@s+q8aZ-d4xCcPde7Kwn0*3%a8 z<%>DkjD{?)H$v7W+Nc5le0-CmR6>QEOclKeeARhE^A&ZJV7tonnUe139Cvf1qtAhBWxFQCm<~ecvqDau>5o45UqBeg5o?kW5n8 z4U*Ui#JduL7DAB~ah*-OzL?L>?UF)Hc}B)<)3r{=RxiaR>!_7LCm2%lXw8u!kz#2T z*>?@S9WfL~;!X|gz59Xm&#O^MkD20EH|*?cQ_81xrr?f6Ztw|$S!qFtvVuu?`z6-V zpzp#yqhlx9%q+cr!b|Y+O-`IBdNX`-a6T&WtPb!9*pQ)dTdX2&)bLYG;-r2|DeWs-gNo7?#Yi+n zI~=}nTKm*dg7B=FrJ5F~^+hHb(Y2s#mwq-xYdfp`jS!1W+`a*q83~=EwWBeBPd7J) zUv45dt?@4O#lZ$M4p1V_CYHq^CAamL_jf`tUF948>$=f~G+1q_sQxdCFZ^-AyfP9R zAC2Pe-D%twSfG|Zlt)=T5zt(+JpUMyQQVFuDf~^Deki;*~toD z6|nQootpy;QrI6h>SBc;2uS5d;wzBs4ZUzDYq1a8lbciEA(KMMxF+7XeHu@v18hIZ z`x#Tv#Q?96G!5Oe=2AYs>eA7Z3l2_ zo^Bd4IpfSfhO6|W=_4;oL683MU-xrSO#K+-E#2cWb%nxiBR3|-6HyuPAC_MLtI}#~ z@^Z;=V=KhJ?R0b|uWhBr-XB1Kh~7sRIM`1IAw^rTg_&>={mDG;t4cAvkGjZQ{}Dcg zp89lDGqMWe&@5m2- zo=S;g5Qk+e&=CH;q5mF*8*mq$3;8{Kp#KD=9REz^7aGO?x2lX+F!_B^#YAaUgaYo|{gQa-vmV}Cytfpe6dm8D(a&;8=>&O^vihM5{TYxH|y#rZ?Z$HM`& zpHuudyyM>)Jr<-4BX>nr`xpGwU&*C}P=1=UBrxHBQ|dpb6|{Ot`LMUY`ulw2DNFte zy&dcSLitFi470k#DD-Qo{*yX_<&g66@ebdAKKZXX;|_6E>Cetx_@7DsbTM^RC|B=% z$~Cp$7tQOC@=+$0^ZR_Y4k;i1G|5kk;-4n@sTe;FgZ|H&WDnF{sK9)MR}FHA2Gmm5 KQ!7+KJp30{3?&-? literal 0 HcmV?d00001 diff --git a/static/images/integrations/github_webhook/002.png b/static/images/integrations/github_webhook/002.png new file mode 100644 index 0000000000000000000000000000000000000000..c4ab20b9ea62c451f9feda33d09d793c3f7b87b3 GIT binary patch literal 36091 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 literal 0 HcmV?d00001 diff --git a/static/images/integrations/github_webhook/004.png b/static/images/integrations/github_webhook/004.png new file mode 100644 index 0000000000000000000000000000000000000000..2cb867063c691e8884e42b260821fab827f299dd GIT binary patch literal 52361 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 C!AT?l literal 0 HcmV?d00001 diff --git a/templates/zerver/integrations.html b/templates/zerver/integrations.html index 658eea6c7c..c3adfe8332 100644 --- a/templates/zerver/integrations.html +++ b/templates/zerver/integrations.html @@ -864,6 +864,10 @@

+

+ This webhook bases on deprecated concept that is + GitHub Services +

First, create the stream you'd like to use for GitHub notifications, and subscribe all interested parties to this stream. The integration will @@ -906,6 +910,40 @@

+
+ +

First, create the stream you'd like to use for GitHub Webhook notifications, + and subscribe all interested parties to this stream. The integration will + use the default stream github if no stream is supplied in + the hook; you still need to create the stream even if you are using this + default.

+ +

Next, go to your repository page and click "Settings":

+

+ +

From there, select "Webhooks":

+

+ +

Click "Add webhook".

+

+ +

Authorize yourself and configure your webhook.

+ +

In the "Payload URL" field, enter a URL constructed like this:

+ +

{{ external_api_uri_subdomain }}/v1/external/webhook_github?api_key=abcdefgh&stream=github

+ +

where api_key is the API key of your Zulip + bot. Select the actions that you want to result in a + Zulip notification and click Add Webhook.

+ +

Congratulations! You're done!
+ Your messages will look like this:

+ +

+ +
+

First, create the stream you'd like to use for GitLab notifications, diff --git a/zerver/fixtures/github_webhook/github_webhook_closed_pull_request.json b/zerver/fixtures/github_webhook/github_webhook_closed_pull_request.json new file mode 100644 index 0000000000..4f6ec5fc82 --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_closed_pull_request.json @@ -0,0 +1,412 @@ +{ + "action": "closed", + "number": 1, + "pull_request": { + "url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1", + "id": 34778301, + "html_url": "https://github.com/baxterthehacker/public-repo/pull/1", + "diff_url": "https://github.com/baxterthehacker/public-repo/pull/1.diff", + "patch_url": "https://github.com/baxterthehacker/public-repo/pull/1.patch", + "issue_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/1", + "number": 1, + "state": "close", + "locked": false, + "title": "Update the README with new information", + "user": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "body": "This is a pretty simple change that we need to pull into master.", + "created_at": "2015-05-05T23:40:27Z", + "updated_at": "2015-05-05T23:40:27Z", + "closed_at": null, + "merged_at": null, + "merge_commit_sha": null, + "assignee": null, + "milestone": null, + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1/commits", + "review_comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1/comments", + "review_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/comments{/number}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/1/comments", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "head": { + "label": "baxterthehacker:changes", + "ref": "changes", + "sha": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "user": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "repo": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2015-05-05T23:40:12Z", + "pushed_at": "2015-05-05T23:40:26Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 1, + "forks": 0, + "open_issues": 1, + "watchers": 0, + "default_branch": "master" + } + }, + "base": { + "label": "baxterthehacker:master", + "ref": "master", + "sha": "9049f1265b7d61be4a8904a9a27120d2064dab3b", + "user": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "repo": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2015-05-05T23:40:12Z", + "pushed_at": "2015-05-05T23:40:26Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 1, + "forks": 0, + "open_issues": 1, + "watchers": 0, + "default_branch": "master" + } + }, + "_links": { + "self": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1" + }, + "html": { + "href": "https://github.com/baxterthehacker/public-repo/pull/1" + }, + "issue": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/issues/1" + }, + "comments": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/issues/1/comments" + }, + "review_comments": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1/comments" + }, + "review_comment": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/comments{/number}" + }, + "commits": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1/commits" + }, + "statuses": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c" + } + }, + "merged": false, + "mergeable": null, + "mergeable_state": "unknown", + "merged_by": null, + "comments": 0, + "review_comments": 0, + "commits": 1, + "additions": 1, + "deletions": 1, + "changed_files": 1 + }, + "repository": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2015-05-05T23:40:12Z", + "pushed_at": "2015-05-05T23:40:26Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 1, + "forks": 0, + "open_issues": 1, + "watchers": 0, + "default_branch": "master" + }, + "sender": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_commit_comment.json b/zerver/fixtures/github_webhook/github_webhook_commit_comment.json new file mode 100644 index 0000000000..353f238344 --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_commit_comment.json @@ -0,0 +1,140 @@ +{ + "action":"created", + "comment":{ + "url":"https://api.github.com/repos/baxterthehacker/public-repo/comments/11056394", + "html_url":"https://github.com/baxterthehacker/public-repo/commit/9049f1265b7d61be4a8904a9a27120d2064dab3b#commitcomment-11056394", + "id":11056394, + "user":{ + "login":"baxterthehacker", + "id":6752317, + "avatar_url":"https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id":"", + "url":"https://api.github.com/users/baxterthehacker", + "html_url":"https://github.com/baxterthehacker", + "followers_url":"https://api.github.com/users/baxterthehacker/followers", + "following_url":"https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url":"https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url":"https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url":"https://api.github.com/users/baxterthehacker/orgs", + "repos_url":"https://api.github.com/users/baxterthehacker/repos", + "events_url":"https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url":"https://api.github.com/users/baxterthehacker/received_events", + "type":"User", + "site_admin":false + }, + "position":null, + "line":null, + "path":null, + "commit_id":"9049f1265b7d61be4a8904a9a27120d2064dab3b", + "created_at":"2015-05-05T23:40:29Z", + "updated_at":"2015-05-05T23:40:29Z", + "body":"This is a really good change! :+1:" + }, + "repository":{ + "id":35129377, + "name":"public-repo", + "full_name":"baxterthehacker/public-repo", + "owner":{ + "login":"baxterthehacker", + "id":6752317, + "avatar_url":"https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id":"", + "url":"https://api.github.com/users/baxterthehacker", + "html_url":"https://github.com/baxterthehacker", + "followers_url":"https://api.github.com/users/baxterthehacker/followers", + "following_url":"https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url":"https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url":"https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url":"https://api.github.com/users/baxterthehacker/orgs", + "repos_url":"https://api.github.com/users/baxterthehacker/repos", + "events_url":"https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url":"https://api.github.com/users/baxterthehacker/received_events", + "type":"User", + "site_admin":false + }, + "private":false, + "html_url":"https://github.com/baxterthehacker/public-repo", + "description":"", + "fork":false, + "url":"https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url":"https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url":"https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url":"https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url":"https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url":"https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url":"https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url":"https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url":"https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url":"https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url":"https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url":"https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url":"https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url":"https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url":"https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url":"https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url":"https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url":"https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url":"https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url":"https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url":"https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url":"https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url":"https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url":"https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url":"https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url":"https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url":"https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url":"https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url":"https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url":"https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url":"https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url":"https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url":"https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url":"https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url":"https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url":"https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at":"2015-05-05T23:40:12Z", + "updated_at":"2015-05-05T23:40:12Z", + "pushed_at":"2015-05-05T23:40:27Z", + "git_url":"git://github.com/baxterthehacker/public-repo.git", + "ssh_url":"git@github.com:baxterthehacker/public-repo.git", + "clone_url":"https://github.com/baxterthehacker/public-repo.git", + "svn_url":"https://github.com/baxterthehacker/public-repo", + "homepage":null, + "size":0, + "stargazers_count":0, + "watchers_count":0, + "language":null, + "has_issues":true, + "has_downloads":true, + "has_wiki":true, + "has_pages":true, + "forks_count":0, + "mirror_url":null, + "open_issues_count":2, + "forks":0, + "open_issues":2, + "watchers":0, + "default_branch":"master" + }, + "sender":{ + "login":"baxterthehacker", + "id":6752317, + "avatar_url":"https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id":"", + "url":"https://api.github.com/users/baxterthehacker", + "html_url":"https://github.com/baxterthehacker", + "followers_url":"https://api.github.com/users/baxterthehacker/followers", + "following_url":"https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url":"https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url":"https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url":"https://api.github.com/users/baxterthehacker/orgs", + "repos_url":"https://api.github.com/users/baxterthehacker/repos", + "events_url":"https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url":"https://api.github.com/users/baxterthehacker/received_events", + "type":"User", + "site_admin":false + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_create.json b/zerver/fixtures/github_webhook/github_webhook_create.json new file mode 100644 index 0000000000..18c3f68972 --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_create.json @@ -0,0 +1,113 @@ +{ + "ref":"0.0.1", + "ref_type":"tag", + "master_branch":"master", + "description":"", + "pusher_type":"user", + "repository":{ + "id":35129377, + "name":"public-repo", + "full_name":"baxterthehacker/public-repo", + "owner":{ + "login":"baxterthehacker", + "id":6752317, + "avatar_url":"https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id":"", + "url":"https://api.github.com/users/baxterthehacker", + "html_url":"https://github.com/baxterthehacker", + "followers_url":"https://api.github.com/users/baxterthehacker/followers", + "following_url":"https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url":"https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url":"https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url":"https://api.github.com/users/baxterthehacker/orgs", + "repos_url":"https://api.github.com/users/baxterthehacker/repos", + "events_url":"https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url":"https://api.github.com/users/baxterthehacker/received_events", + "type":"User", + "site_admin":false + }, + "private":false, + "html_url":"https://github.com/baxterthehacker/public-repo", + "description":"", + "fork":false, + "url":"https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url":"https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url":"https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url":"https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url":"https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url":"https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url":"https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url":"https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url":"https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url":"https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url":"https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url":"https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url":"https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url":"https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url":"https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url":"https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url":"https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url":"https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url":"https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url":"https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url":"https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url":"https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url":"https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url":"https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url":"https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url":"https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url":"https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url":"https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url":"https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url":"https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url":"https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url":"https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url":"https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url":"https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url":"https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url":"https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at":"2015-05-05T23:40:12Z", + "updated_at":"2015-05-05T23:40:30Z", + "pushed_at":"2015-05-05T23:40:38Z", + "git_url":"git://github.com/baxterthehacker/public-repo.git", + "ssh_url":"git@github.com:baxterthehacker/public-repo.git", + "clone_url":"https://github.com/baxterthehacker/public-repo.git", + "svn_url":"https://github.com/baxterthehacker/public-repo", + "homepage":null, + "size":0, + "stargazers_count":0, + "watchers_count":0, + "language":null, + "has_issues":true, + "has_downloads":true, + "has_wiki":true, + "has_pages":true, + "forks_count":0, + "mirror_url":null, + "open_issues_count":2, + "forks":0, + "open_issues":2, + "watchers":0, + "default_branch":"master" + }, + "sender":{ + "login":"baxterthehacker", + "id":6752317, + "avatar_url":"https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id":"", + "url":"https://api.github.com/users/baxterthehacker", + "html_url":"https://github.com/baxterthehacker", + "followers_url":"https://api.github.com/users/baxterthehacker/followers", + "following_url":"https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url":"https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url":"https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url":"https://api.github.com/users/baxterthehacker/orgs", + "repos_url":"https://api.github.com/users/baxterthehacker/repos", + "events_url":"https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url":"https://api.github.com/users/baxterthehacker/received_events", + "type":"User", + "site_admin":false + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_delete.json b/zerver/fixtures/github_webhook/github_webhook_delete.json new file mode 100644 index 0000000000..ab6e25f68c --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_delete.json @@ -0,0 +1,111 @@ +{ + "ref":"simple-tag", + "ref_type":"tag", + "pusher_type":"user", + "repository":{ + "id":35129377, + "name":"public-repo", + "full_name":"baxterthehacker/public-repo", + "owner":{ + "login":"baxterthehacker", + "id":6752317, + "avatar_url":"https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id":"", + "url":"https://api.github.com/users/baxterthehacker", + "html_url":"https://github.com/baxterthehacker", + "followers_url":"https://api.github.com/users/baxterthehacker/followers", + "following_url":"https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url":"https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url":"https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url":"https://api.github.com/users/baxterthehacker/orgs", + "repos_url":"https://api.github.com/users/baxterthehacker/repos", + "events_url":"https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url":"https://api.github.com/users/baxterthehacker/received_events", + "type":"User", + "site_admin":false + }, + "private":false, + "html_url":"https://github.com/baxterthehacker/public-repo", + "description":"", + "fork":false, + "url":"https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url":"https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url":"https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url":"https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url":"https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url":"https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url":"https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url":"https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url":"https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url":"https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url":"https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url":"https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url":"https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url":"https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url":"https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url":"https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url":"https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url":"https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url":"https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url":"https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url":"https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url":"https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url":"https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url":"https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url":"https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url":"https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url":"https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url":"https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url":"https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url":"https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url":"https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url":"https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url":"https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url":"https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url":"https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url":"https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at":"2015-05-05T23:40:12Z", + "updated_at":"2015-05-05T23:40:30Z", + "pushed_at":"2015-05-05T23:40:40Z", + "git_url":"git://github.com/baxterthehacker/public-repo.git", + "ssh_url":"git@github.com:baxterthehacker/public-repo.git", + "clone_url":"https://github.com/baxterthehacker/public-repo.git", + "svn_url":"https://github.com/baxterthehacker/public-repo", + "homepage":null, + "size":0, + "stargazers_count":0, + "watchers_count":0, + "language":null, + "has_issues":true, + "has_downloads":true, + "has_wiki":true, + "has_pages":true, + "forks_count":0, + "mirror_url":null, + "open_issues_count":2, + "forks":0, + "open_issues":2, + "watchers":0, + "default_branch":"master" + }, + "sender":{ + "login":"baxterthehacker", + "id":6752317, + "avatar_url":"https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id":"", + "url":"https://api.github.com/users/baxterthehacker", + "html_url":"https://github.com/baxterthehacker", + "followers_url":"https://api.github.com/users/baxterthehacker/followers", + "following_url":"https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url":"https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url":"https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url":"https://api.github.com/users/baxterthehacker/orgs", + "repos_url":"https://api.github.com/users/baxterthehacker/repos", + "events_url":"https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url":"https://api.github.com/users/baxterthehacker/received_events", + "type":"User", + "site_admin":false + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_deployment.json b/zerver/fixtures/github_webhook/github_webhook_deployment.json new file mode 100644 index 0000000000..9f2ca9668f --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_deployment.json @@ -0,0 +1,142 @@ +{ + "deployment": { + "url": "https://api.github.com/repos/baxterthehacker/public-repo/deployments/710692", + "id": 710692, + "sha": "9049f1265b7d61be4a8904a9a27120d2064dab3b", + "ref": "master", + "task": "deploy", + "payload": { + }, + "environment": "production", + "description": null, + "creator": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2015-05-05T23:40:38Z", + "updated_at": "2015-05-05T23:40:38Z", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/deployments/710692/statuses", + "repository_url": "https://api.github.com/repos/baxterthehacker/public-repo" + }, + "repository": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2015-05-05T23:40:30Z", + "pushed_at": "2015-05-05T23:40:38Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 2, + "forks": 0, + "open_issues": 2, + "watchers": 0, + "default_branch": "master" + }, + "sender": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_deployment_status.json b/zerver/fixtures/github_webhook/github_webhook_deployment_status.json new file mode 100644 index 0000000000..e1dcd0706f --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_deployment_status.json @@ -0,0 +1,172 @@ +{ + "deployment_status": { + "url": "https://api.github.com/repos/baxterthehacker/public-repo/deployments/710692/statuses/1115122", + "id": 1115122, + "state": "success", + "creator": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "description": null, + "target_url": null, + "created_at": "2015-05-05T23:40:39Z", + "updated_at": "2015-05-05T23:40:39Z", + "deployment_url": "https://api.github.com/repos/baxterthehacker/public-repo/deployments/710692", + "repository_url": "https://api.github.com/repos/baxterthehacker/public-repo" + }, + "deployment": { + "url": "https://api.github.com/repos/baxterthehacker/public-repo/deployments/710692", + "id": 710692, + "sha": "9049f1265b7d61be4a8904a9a27120d2064dab3b", + "ref": "master", + "task": "deploy", + "payload": { + }, + "environment": "production", + "description": null, + "creator": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2015-05-05T23:40:38Z", + "updated_at": "2015-05-05T23:40:38Z", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/deployments/710692/statuses", + "repository_url": "https://api.github.com/repos/baxterthehacker/public-repo" + }, + "repository": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2015-05-05T23:40:30Z", + "pushed_at": "2015-05-05T23:40:38Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 2, + "forks": 0, + "open_issues": 2, + "watchers": 0, + "default_branch": "master" + }, + "sender": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_fork.json b/zerver/fixtures/github_webhook/github_webhook_fork.json new file mode 100644 index 0000000000..1ed8bc21ca --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_fork.json @@ -0,0 +1,196 @@ +{ + "forkee": { + "id": 35129393, + "name": "public-repo", + "full_name": "baxterandthehackers/public-repo", + "owner": { + "login": "baxterandthehackers", + "id": 7649605, + "avatar_url": "https://avatars.githubusercontent.com/u/7649605?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterandthehackers", + "html_url": "https://github.com/baxterandthehackers", + "followers_url": "https://api.github.com/users/baxterandthehackers/followers", + "following_url": "https://api.github.com/users/baxterandthehackers/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterandthehackers/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterandthehackers/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterandthehackers/subscriptions", + "organizations_url": "https://api.github.com/users/baxterandthehackers/orgs", + "repos_url": "https://api.github.com/users/baxterandthehackers/repos", + "events_url": "https://api.github.com/users/baxterandthehackers/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterandthehackers/received_events", + "type": "Organization", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterandthehackers/public-repo", + "description": "", + "fork": true, + "url": "https://api.github.com/repos/baxterandthehackers/public-repo", + "forks_url": "https://api.github.com/repos/baxterandthehackers/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterandthehackers/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterandthehackers/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterandthehackers/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterandthehackers/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterandthehackers/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterandthehackers/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterandthehackers/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterandthehackers/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterandthehackers/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterandthehackers/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterandthehackers/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterandthehackers/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterandthehackers/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterandthehackers/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterandthehackers/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterandthehackers/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterandthehackers/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterandthehackers/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterandthehackers/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterandthehackers/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterandthehackers/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterandthehackers/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterandthehackers/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterandthehackers/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterandthehackers/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterandthehackers/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterandthehackers/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterandthehackers/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterandthehackers/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterandthehackers/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterandthehackers/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterandthehackers/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterandthehackers/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterandthehackers/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:30Z", + "updated_at": "2015-05-05T23:40:30Z", + "pushed_at": "2015-05-05T23:40:27Z", + "git_url": "git://github.com/baxterandthehackers/public-repo.git", + "ssh_url": "git@github.com:baxterandthehackers/public-repo.git", + "clone_url": "https://github.com/baxterandthehackers/public-repo.git", + "svn_url": "https://github.com/baxterandthehackers/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": false, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 0, + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "master", + "public": true + }, + "repository": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2015-05-05T23:40:30Z", + "pushed_at": "2015-05-05T23:40:27Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 1, + "mirror_url": null, + "open_issues_count": 2, + "forks": 1, + "open_issues": 2, + "watchers": 0, + "default_branch": "master" + }, + "sender": { + "login": "baxterandthehackers", + "id": 7649605, + "avatar_url": "https://avatars.githubusercontent.com/u/7649605?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterandthehackers", + "html_url": "https://github.com/baxterandthehackers", + "followers_url": "https://api.github.com/users/baxterandthehackers/followers", + "following_url": "https://api.github.com/users/baxterandthehackers/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterandthehackers/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterandthehackers/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterandthehackers/subscriptions", + "organizations_url": "https://api.github.com/users/baxterandthehackers/orgs", + "repos_url": "https://api.github.com/users/baxterandthehackers/repos", + "events_url": "https://api.github.com/users/baxterandthehackers/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterandthehackers/received_events", + "type": "Organization", + "site_admin": false + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_issue.json b/zerver/fixtures/github_webhook/github_webhook_issue.json new file mode 100644 index 0000000000..dbbb045d2f --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_issue.json @@ -0,0 +1,154 @@ +{ + "action": "opened", + "issue": { + "url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/2", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/2/labels{/name}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/2/comments", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/2/events", + "html_url": "https://github.com/baxterthehacker/public-repo/issues/2", + "id": 73464126, + "number": 2, + "title": "Spelling error in the README file", + "user": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "url": "https://api.github.com/repos/baxterthehacker/public-repo/labels/bug", + "name": "bug", + "color": "fc2929" + } + ], + "state": "open", + "locked": false, + "assignee": null, + "milestone": null, + "comments": 0, + "created_at": "2015-05-05T23:40:28Z", + "updated_at": "2015-05-05T23:40:28Z", + "closed_at": null, + "body": "It looks like you accidently spelled 'commit' with two 't's." + }, + "repository": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2015-05-05T23:40:12Z", + "pushed_at": "2015-05-05T23:40:27Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 2, + "forks": 0, + "open_issues": 2, + "watchers": 0, + "default_branch": "master" + }, + "sender": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_issue_comment.json b/zerver/fixtures/github_webhook/github_webhook_issue_comment.json new file mode 100644 index 0000000000..6f6e7d8975 --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_issue_comment.json @@ -0,0 +1,182 @@ +{ + "action": "created", + "issue": { + "url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/2", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/2/labels{/name}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/2/comments", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/2/events", + "html_url": "https://github.com/baxterthehacker/public-repo/issues/2", + "id": 73464126, + "number": 2, + "title": "Spelling error in the README file", + "user": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "url": "https://api.github.com/repos/baxterthehacker/public-repo/labels/bug", + "name": "bug", + "color": "fc2929" + } + ], + "state": "open", + "locked": false, + "assignee": null, + "milestone": null, + "comments": 1, + "created_at": "2015-05-05T23:40:28Z", + "updated_at": "2015-05-05T23:40:28Z", + "closed_at": null, + "body": "It looks like you accidently spelled 'commit' with two 't's." + }, + "comment": { + "url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments/99262140", + "html_url": "https://github.com/baxterthehacker/public-repo/issues/2#issuecomment-99262140", + "issue_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/2", + "id": 99262140, + "user": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2015-05-05T23:40:28Z", + "updated_at": "2015-05-05T23:40:28Z", + "body": "You are totally right! I'll get this fixed right away." + }, + "repository": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2015-05-05T23:40:12Z", + "pushed_at": "2015-05-05T23:40:27Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 2, + "forks": 0, + "open_issues": 2, + "watchers": 0, + "default_branch": "master" + }, + "sender": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_member.json b/zerver/fixtures/github_webhook/github_webhook_member.json new file mode 100644 index 0000000000..20305670e3 --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_member.json @@ -0,0 +1,128 @@ +{ + "action": "added", + "member": { + "login": "octocat", + "id": 583231, + "avatar_url": "https://avatars.githubusercontent.com/u/583231?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/octocat", + "html_url": "https://github.com/octocat", + "followers_url": "https://api.github.com/users/octocat/followers", + "following_url": "https://api.github.com/users/octocat/following{/other_user}", + "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}", + "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/octocat/subscriptions", + "organizations_url": "https://api.github.com/users/octocat/orgs", + "repos_url": "https://api.github.com/users/octocat/repos", + "events_url": "https://api.github.com/users/octocat/events{/privacy}", + "received_events_url": "https://api.github.com/users/octocat/received_events", + "type": "User", + "site_admin": false + }, + "repository": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2015-05-05T23:40:30Z", + "pushed_at": "2015-05-05T23:40:40Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 2, + "forks": 0, + "open_issues": 2, + "watchers": 0, + "default_branch": "master" + }, + "sender": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_membership.json b/zerver/fixtures/github_webhook/github_webhook_membership.json new file mode 100644 index 0000000000..612d967f6d --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_membership.json @@ -0,0 +1,61 @@ +{ + "action": "added", + "scope": "team", + "member": { + "login": "kdaigle", + "id": 2501, + "avatar_url": "https://avatars.githubusercontent.com/u/2501?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/kdaigle", + "html_url": "https://github.com/kdaigle", + "followers_url": "https://api.github.com/users/kdaigle/followers", + "following_url": "https://api.github.com/users/kdaigle/following{/other_user}", + "gists_url": "https://api.github.com/users/kdaigle/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kdaigle/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kdaigle/subscriptions", + "organizations_url": "https://api.github.com/users/kdaigle/orgs", + "repos_url": "https://api.github.com/users/kdaigle/repos", + "events_url": "https://api.github.com/users/kdaigle/events{/privacy}", + "received_events_url": "https://api.github.com/users/kdaigle/received_events", + "type": "User", + "site_admin": true + }, + "sender": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=2", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "team": { + "name": "Contractors", + "id": 123456, + "slug": "contractors", + "permission": "admin", + "url": "https://api.github.com/teams/123456", + "members_url": "https://api.github.com/teams/123456/members{/member}", + "repositories_url": "https://api.github.com/teams/123456/repos" + }, + "organization": { + "login": "baxterandthehackers", + "id": 7649605, + "url": "https://api.github.com/orgs/baxterandthehackers", + "repos_url": "https://api.github.com/orgs/baxterandthehackers/repos", + "events_url": "https://api.github.com/orgs/baxterandthehackers/events", + "members_url": "https://api.github.com/orgs/baxterandthehackers/members{/member}", + "public_members_url": "https://api.github.com/orgs/baxterandthehackers/public_members{/member}", + "avatar_url": "https://avatars.githubusercontent.com/u/7649605?v=2" + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_merged_pull_request.json b/zerver/fixtures/github_webhook/github_webhook_merged_pull_request.json new file mode 100644 index 0000000000..30e6ac1880 --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_merged_pull_request.json @@ -0,0 +1,412 @@ +{ + "action": "closed", + "number": 1, + "pull_request": { + "url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1", + "id": 34778301, + "html_url": "https://github.com/baxterthehacker/public-repo/pull/1", + "diff_url": "https://github.com/baxterthehacker/public-repo/pull/1.diff", + "patch_url": "https://github.com/baxterthehacker/public-repo/pull/1.patch", + "issue_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/1", + "number": 1, + "state": "merged", + "locked": false, + "title": "Update the README with new information", + "user": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "body": "This is a pretty simple change that we need to pull into master.", + "created_at": "2015-05-05T23:40:27Z", + "updated_at": "2015-05-05T23:40:27Z", + "closed_at": null, + "merged_at": null, + "merge_commit_sha": null, + "assignee": null, + "milestone": null, + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1/commits", + "review_comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1/comments", + "review_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/comments{/number}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/1/comments", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "head": { + "label": "baxterthehacker:changes", + "ref": "changes", + "sha": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "user": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "repo": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2015-05-05T23:40:12Z", + "pushed_at": "2015-05-05T23:40:26Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 1, + "forks": 0, + "open_issues": 1, + "watchers": 0, + "default_branch": "master" + } + }, + "base": { + "label": "baxterthehacker:master", + "ref": "master", + "sha": "9049f1265b7d61be4a8904a9a27120d2064dab3b", + "user": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "repo": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2015-05-05T23:40:12Z", + "pushed_at": "2015-05-05T23:40:26Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 1, + "forks": 0, + "open_issues": 1, + "watchers": 0, + "default_branch": "master" + } + }, + "_links": { + "self": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1" + }, + "html": { + "href": "https://github.com/baxterthehacker/public-repo/pull/1" + }, + "issue": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/issues/1" + }, + "comments": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/issues/1/comments" + }, + "review_comments": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1/comments" + }, + "review_comment": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/comments{/number}" + }, + "commits": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1/commits" + }, + "statuses": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c" + } + }, + "merged": true, + "mergeable": null, + "mergeable_state": "unknown", + "merged_by": null, + "comments": 0, + "review_comments": 0, + "commits": 1, + "additions": 1, + "deletions": 1, + "changed_files": 1 + }, + "repository": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2015-05-05T23:40:12Z", + "pushed_at": "2015-05-05T23:40:26Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 1, + "forks": 0, + "open_issues": 1, + "watchers": 0, + "default_branch": "master" + }, + "sender": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_opened_pull_request.json b/zerver/fixtures/github_webhook/github_webhook_opened_pull_request.json new file mode 100644 index 0000000000..316cc4e8f7 --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_opened_pull_request.json @@ -0,0 +1,412 @@ +{ + "action": "opened", + "number": 1, + "pull_request": { + "url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1", + "id": 34778301, + "html_url": "https://github.com/baxterthehacker/public-repo/pull/1", + "diff_url": "https://github.com/baxterthehacker/public-repo/pull/1.diff", + "patch_url": "https://github.com/baxterthehacker/public-repo/pull/1.patch", + "issue_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/1", + "number": 1, + "state": "open", + "locked": false, + "title": "Update the README with new information", + "user": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "body": "This is a pretty simple change that we need to pull into master.", + "created_at": "2015-05-05T23:40:27Z", + "updated_at": "2015-05-05T23:40:27Z", + "closed_at": null, + "merged_at": null, + "merge_commit_sha": null, + "assignee": null, + "milestone": null, + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1/commits", + "review_comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1/comments", + "review_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/comments{/number}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/1/comments", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "head": { + "label": "baxterthehacker:changes", + "ref": "changes", + "sha": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "user": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "repo": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2015-05-05T23:40:12Z", + "pushed_at": "2015-05-05T23:40:26Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 1, + "forks": 0, + "open_issues": 1, + "watchers": 0, + "default_branch": "master" + } + }, + "base": { + "label": "baxterthehacker:master", + "ref": "master", + "sha": "9049f1265b7d61be4a8904a9a27120d2064dab3b", + "user": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "repo": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2015-05-05T23:40:12Z", + "pushed_at": "2015-05-05T23:40:26Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 1, + "forks": 0, + "open_issues": 1, + "watchers": 0, + "default_branch": "master" + } + }, + "_links": { + "self": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1" + }, + "html": { + "href": "https://github.com/baxterthehacker/public-repo/pull/1" + }, + "issue": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/issues/1" + }, + "comments": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/issues/1/comments" + }, + "review_comments": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1/comments" + }, + "review_comment": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/comments{/number}" + }, + "commits": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1/commits" + }, + "statuses": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c" + } + }, + "merged": false, + "mergeable": null, + "mergeable_state": "unknown", + "merged_by": null, + "comments": 0, + "review_comments": 0, + "commits": 1, + "additions": 1, + "deletions": 1, + "changed_files": 1 + }, + "repository": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2015-05-05T23:40:12Z", + "pushed_at": "2015-05-05T23:40:26Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 1, + "forks": 0, + "open_issues": 1, + "watchers": 0, + "default_branch": "master" + }, + "sender": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_page_build.json b/zerver/fixtures/github_webhook/github_webhook_page_build.json new file mode 100644 index 0000000000..80962c016e --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_page_build.json @@ -0,0 +1,139 @@ +{ + "id": 15995382, + "build": { + "url": "https://api.github.com/repos/baxterthehacker/public-repo/pages/builds/15995382", + "status": "built", + "error": { + "message": null + }, + "pusher": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "commit": "053b99542c83021d6b202d1a1f5ecd5ef7084e55", + "duration": 3790, + "created_at": "2015-05-05T23:40:13Z", + "updated_at": "2015-05-05T23:40:17Z" + }, + "repository": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2015-05-05T23:40:12Z", + "pushed_at": "2015-05-05T23:40:17Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 0, + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "master" + }, + "sender": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_public.json b/zerver/fixtures/github_webhook/github_webhook_public.json new file mode 100644 index 0000000000..f596a54282 --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_public.json @@ -0,0 +1,108 @@ +{ + "repository": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2015-05-05T23:40:41Z", + "pushed_at": "2015-05-05T23:40:40Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 2, + "forks": 0, + "open_issues": 2, + "watchers": 0, + "default_branch": "master" + }, + "sender": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_pull_request_review.json b/zerver/fixtures/github_webhook/github_webhook_pull_request_review.json new file mode 100644 index 0000000000..cfcc61a415 --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_pull_request_review.json @@ -0,0 +1,440 @@ +{ + "action": "submitted", + "review": { + "id": 2626884, + "user": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "body": "Looks great!", + "submitted_at": "2016-10-03T23:39:09Z", + "state": "approved", + "html_url": "https://github.com/baxterthehacker/public-repo/pull/1#pullrequestreview-2626884", + "pull_request_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1", + "_links": { + "html": { + "href": "https://github.com/baxterthehacker/public-repo/pull/1#pullrequestreview-2626884" + }, + "pull_request": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1" + } + } + }, + "pull_request": { + "url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1", + "id": 87811438, + "html_url": "https://github.com/baxterthehacker/public-repo/pull/1", + "diff_url": "https://github.com/baxterthehacker/public-repo/pull/1.diff", + "patch_url": "https://github.com/baxterthehacker/public-repo/pull/1.patch", + "issue_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/8", + "number": 1, + "state": "open", + "locked": false, + "title": "Update the README with new information", + "user": { + "login": "skalnik", + "id": 2546, + "avatar_url": "https://avatars.githubusercontent.com/u/2546?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/skalnik", + "html_url": "https://github.com/skalnik", + "followers_url": "https://api.github.com/users/skalnik/followers", + "following_url": "https://api.github.com/users/skalnik/following{/other_user}", + "gists_url": "https://api.github.com/users/skalnik/gists{/gist_id}", + "starred_url": "https://api.github.com/users/skalnik/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/skalnik/subscriptions", + "organizations_url": "https://api.github.com/users/skalnik/orgs", + "repos_url": "https://api.github.com/users/skalnik/repos", + "events_url": "https://api.github.com/users/skalnik/events{/privacy}", + "received_events_url": "https://api.github.com/users/skalnik/received_events", + "type": "User", + "site_admin": true + }, + "body": "Just a few more details", + "created_at": "2016-10-03T23:37:43Z", + "updated_at": "2016-10-03T23:39:09Z", + "closed_at": null, + "merged_at": null, + "merge_commit_sha": "faea154a7decef6819754aab0f8c0e232e6c8b4f", + "assignee": null, + "assignees": [], + "milestone": null, + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1/commits", + "review_comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1/comments", + "review_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/comments{/number}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/8/comments", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/b7a1f9c27caa4e03c14a88feb56e2d4f7500aa63", + "head": { + "label": "skalnik:patch-2", + "ref": "patch-2", + "sha": "b7a1f9c27caa4e03c14a88feb56e2d4f7500aa63", + "user": { + "login": "skalnik", + "id": 2546, + "avatar_url": "https://avatars.githubusercontent.com/u/2546?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/skalnik", + "html_url": "https://github.com/skalnik", + "followers_url": "https://api.github.com/users/skalnik/followers", + "following_url": "https://api.github.com/users/skalnik/following{/other_user}", + "gists_url": "https://api.github.com/users/skalnik/gists{/gist_id}", + "starred_url": "https://api.github.com/users/skalnik/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/skalnik/subscriptions", + "organizations_url": "https://api.github.com/users/skalnik/orgs", + "repos_url": "https://api.github.com/users/skalnik/repos", + "events_url": "https://api.github.com/users/skalnik/events{/privacy}", + "received_events_url": "https://api.github.com/users/skalnik/received_events", + "type": "User", + "site_admin": true + }, + "repo": { + "id": 69919152, + "name": "public-repo", + "full_name": "skalnik/public-repo", + "owner": { + "login": "skalnik", + "id": 2546, + "avatar_url": "https://avatars.githubusercontent.com/u/2546?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/skalnik", + "html_url": "https://github.com/skalnik", + "followers_url": "https://api.github.com/users/skalnik/followers", + "following_url": "https://api.github.com/users/skalnik/following{/other_user}", + "gists_url": "https://api.github.com/users/skalnik/gists{/gist_id}", + "starred_url": "https://api.github.com/users/skalnik/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/skalnik/subscriptions", + "organizations_url": "https://api.github.com/users/skalnik/orgs", + "repos_url": "https://api.github.com/users/skalnik/repos", + "events_url": "https://api.github.com/users/skalnik/events{/privacy}", + "received_events_url": "https://api.github.com/users/skalnik/received_events", + "type": "User", + "site_admin": true + }, + "private": false, + "html_url": "https://github.com/skalnik/public-repo", + "description": null, + "fork": true, + "url": "https://api.github.com/repos/skalnik/public-repo", + "forks_url": "https://api.github.com/repos/skalnik/public-repo/forks", + "keys_url": "https://api.github.com/repos/skalnik/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/skalnik/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/skalnik/public-repo/teams", + "hooks_url": "https://api.github.com/repos/skalnik/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/skalnik/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/skalnik/public-repo/events", + "assignees_url": "https://api.github.com/repos/skalnik/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/skalnik/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/skalnik/public-repo/tags", + "blobs_url": "https://api.github.com/repos/skalnik/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/skalnik/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/skalnik/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/skalnik/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/skalnik/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/skalnik/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/skalnik/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/skalnik/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/skalnik/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/skalnik/public-repo/subscription", + "commits_url": "https://api.github.com/repos/skalnik/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/skalnik/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/skalnik/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/skalnik/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/skalnik/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/skalnik/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/skalnik/public-repo/merges", + "archive_url": "https://api.github.com/repos/skalnik/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/skalnik/public-repo/downloads", + "issues_url": "https://api.github.com/repos/skalnik/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/skalnik/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/skalnik/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/skalnik/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/skalnik/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/skalnik/public-repo/releases{/id}", + "deployments_url": "https://api.github.com/repos/skalnik/public-repo/deployments", + "created_at": "2016-10-03T23:23:31Z", + "updated_at": "2016-08-15T17:19:01Z", + "pushed_at": "2016-10-03T23:36:52Z", + "git_url": "git://github.com/skalnik/public-repo.git", + "ssh_url": "git@github.com:skalnik/public-repo.git", + "clone_url": "https://github.com/skalnik/public-repo.git", + "svn_url": "https://github.com/skalnik/public-repo", + "homepage": null, + "size": 233, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "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": "baxterthehacker:master", + "ref": "master", + "sha": "9049f1265b7d61be4a8904a9a27120d2064dab3b", + "user": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "repo": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "deployments_url": "https://api.github.com/repos/baxterthehacker/public-repo/deployments", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2016-08-15T17:19:01Z", + "pushed_at": "2016-10-03T23:37:43Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 233, + "stargazers_count": 2, + "watchers_count": 2, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 2, + "mirror_url": null, + "open_issues_count": 5, + "forks": 2, + "open_issues": 5, + "watchers": 2, + "default_branch": "master" + } + }, + "_links": { + "self": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1" + }, + "html": { + "href": "https://github.com/baxterthehacker/public-repo/pull/1" + }, + "issue": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/issues/8" + }, + "comments": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/issues/8/comments" + }, + "review_comments": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1/comments" + }, + "review_comment": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/comments{/number}" + }, + "commits": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1/commits" + }, + "statuses": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/b7a1f9c27caa4e03c14a88feb56e2d4f7500aa63" + } + } + }, + "repository": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "deployments_url": "https://api.github.com/repos/baxterthehacker/public-repo/deployments", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2016-08-15T17:19:01Z", + "pushed_at": "2016-10-03T23:37:43Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 233, + "stargazers_count": 2, + "watchers_count": 2, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 2, + "mirror_url": null, + "open_issues_count": 5, + "forks": 2, + "open_issues": 5, + "watchers": 2, + "default_branch": "master" + }, + "sender": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_pull_request_review_comment.json b/zerver/fixtures/github_webhook/github_webhook_pull_request_review_comment.json new file mode 100644 index 0000000000..a89b6b547d --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_pull_request_review_comment.json @@ -0,0 +1,446 @@ +{ + "action": "created", + "comment": { + "url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/comments/29724692", + "id": 29724692, + "diff_hunk": "@@ -1 +1 @@\n-# public-repo", + "path": "README.md", + "position": 1, + "original_position": 1, + "commit_id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "original_commit_id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "user": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "body": "Maybe you should use more emojji on this line.", + "created_at": "2015-05-05T23:40:27Z", + "updated_at": "2015-05-05T23:40:27Z", + "html_url": "https://github.com/baxterthehacker/public-repo/pull/1#discussion_r29724692", + "pull_request_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1", + "_links": { + "self": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/comments/29724692" + }, + "html": { + "href": "https://github.com/baxterthehacker/public-repo/pull/1#discussion_r29724692" + }, + "pull_request": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1" + } + } + }, + "pull_request": { + "url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1", + "id": 34778301, + "html_url": "https://github.com/baxterthehacker/public-repo/pull/1", + "diff_url": "https://github.com/baxterthehacker/public-repo/pull/1.diff", + "patch_url": "https://github.com/baxterthehacker/public-repo/pull/1.patch", + "issue_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/1", + "number": 1, + "state": "open", + "locked": false, + "title": "Update the README with new information", + "user": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "body": "This is a pretty simple change that we need to pull into master.", + "created_at": "2015-05-05T23:40:27Z", + "updated_at": "2015-05-05T23:40:27Z", + "closed_at": null, + "merged_at": null, + "merge_commit_sha": "18721552ba489fb84e12958c1b5694b5475f7991", + "assignee": null, + "milestone": null, + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1/commits", + "review_comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1/comments", + "review_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/comments{/number}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/1/comments", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "head": { + "label": "baxterthehacker:changes", + "ref": "changes", + "sha": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "user": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "repo": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2015-05-05T23:40:12Z", + "pushed_at": "2015-05-05T23:40:27Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 1, + "forks": 0, + "open_issues": 1, + "watchers": 0, + "default_branch": "master" + } + }, + "base": { + "label": "baxterthehacker:master", + "ref": "master", + "sha": "9049f1265b7d61be4a8904a9a27120d2064dab3b", + "user": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "repo": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2015-05-05T23:40:12Z", + "pushed_at": "2015-05-05T23:40:27Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 1, + "forks": 0, + "open_issues": 1, + "watchers": 0, + "default_branch": "master" + } + }, + "_links": { + "self": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1" + }, + "html": { + "href": "https://github.com/baxterthehacker/public-repo/pull/1" + }, + "issue": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/issues/1" + }, + "comments": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/issues/1/comments" + }, + "review_comments": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1/comments" + }, + "review_comment": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/comments{/number}" + }, + "commits": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1/commits" + }, + "statuses": { + "href": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c" + } + } + }, + "repository": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2015-05-05T23:40:12Z", + "pushed_at": "2015-05-05T23:40:27Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 1, + "forks": 0, + "open_issues": 1, + "watchers": 0, + "default_branch": "master" + }, + "sender": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_push_1_commit.json b/zerver/fixtures/github_webhook/github_webhook_push_1_commit.json new file mode 100644 index 0000000000..26fd30b595 --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_push_1_commit.json @@ -0,0 +1,163 @@ +{ + "ref": "refs/heads/changes", + "before": "9049f1265b7d61be4a8904a9a27120d2064dab3b", + "after": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "created": false, + "deleted": false, + "forced": false, + "base_ref": null, + "compare": "https://github.com/baxterthehacker/public-repo/compare/9049f1265b7d...0d1a26e67d8f", + "commits": [ + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + } + ], + "head_commit": { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + "repository": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com" + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://github.com/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": 1430869212, + "updated_at": "2015-05-05T23:40:12Z", + "pushed_at": 1430869217, + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 0, + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "master", + "stargazers": 0, + "master_branch": "master" + }, + "pusher": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com" + }, + "sender": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_push_50_commits.json b/zerver/fixtures/github_webhook/github_webhook_push_50_commits.json new file mode 100644 index 0000000000..a2b95af978 --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_push_50_commits.json @@ -0,0 +1,1486 @@ +{ + "ref": "refs/heads/changes", + "before": "9049f1265b7d61be4a8904a9a27120d2064dab3b", + "after": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "created": false, + "deleted": false, + "forced": false, + "base_ref": null, + "compare": "https://github.com/baxterthehacker/public-repo/compare/9049f1265b7d...0d1a26e67d8f", + "commits": [ + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + } + ], + "head_commit": { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + "repository": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com" + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://github.com/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": 1430869212, + "updated_at": "2015-05-05T23:40:12Z", + "pushed_at": 1430869217, + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 0, + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "master", + "stargazers": 0, + "master_branch": "master" + }, + "pusher": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com" + }, + "sender": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_push_event.json b/zerver/fixtures/github_webhook/github_webhook_push_event.json new file mode 100644 index 0000000000..26fd30b595 --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_push_event.json @@ -0,0 +1,163 @@ +{ + "ref": "refs/heads/changes", + "before": "9049f1265b7d61be4a8904a9a27120d2064dab3b", + "after": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "created": false, + "deleted": false, + "forced": false, + "base_ref": null, + "compare": "https://github.com/baxterthehacker/public-repo/compare/9049f1265b7d...0d1a26e67d8f", + "commits": [ + { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + } + ], + "head_commit": { + "id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "tree_id": "f9d2a07e9488b91af2641b26b9407fe22a451433", + "distinct": true, + "message": "Update README.md", + "timestamp": "2015-05-05T19:40:15-04:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "username": "baxterthehacker" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.md" + ] + }, + "repository": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com" + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://github.com/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": 1430869212, + "updated_at": "2015-05-05T23:40:12Z", + "pushed_at": 1430869217, + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 0, + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "master", + "stargazers": 0, + "master_branch": "master" + }, + "pusher": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com" + }, + "sender": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_push_tag.json b/zerver/fixtures/github_webhook/github_webhook_push_tag.json new file mode 100644 index 0000000000..e6daa10ff4 --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_push_tag.json @@ -0,0 +1,130 @@ +{ + "ref": "refs/tags/abc", + "before": "0000000000000000000000000000000000000000", + "after": "7d0f82929cc157f8ade81a4619c6a835c5b70eff", + "created": true, + "deleted": false, + "forced": false, + "base_ref": "refs/heads/master", + "compare": "https://github.com/baxterthehacker/public-repo/compare/abc", + "commits": [], + "head_commit": { + "id": "7d0f82929cc157f8ade81a4619c6a835c5b70eff", + "tree_id": "a4d86ea3428f79e74a9a8562e0a5ae60adf10abb", + "distinct": true, + "message": "g", + "timestamp": "2016-05-09T19:51:28+02:00", + "url": "https://github.com/baxterthehacker/public-repo/commit/7d0f82929cc157f8ade81a4619c6a835c5b70eff", + "author": { + "name": "Tomasz Kolek", + "email": "tomasz-kolek@o2.pl" + }, + "committer": { + "name": "Tomasz Kolek", + "email": "tomasz-kolek@o2.pl" + }, + "added": [], + "removed": [ + "circlecitest/requirements.txt" + ], + "modified": [] + }, + "repository": { + "id": 56711323, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "name": "baxterthehacker", + "email": "tomasz-kolek@go2.pl" + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "University's project", + "fork": false, + "url": "https://github.com/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "deployments_url": "https://api.github.com/repos/baxterthehacker/public-repo/deployments", + "created_at": 1461177349, + "updated_at": "2016-05-09T15:50:17Z", + "pushed_at": 1479150013, + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 5, + "stargazers_count": 0, + "watchers_count": 0, + "language": "Python", + "has_issues": true, + "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", + "stargazers": 0, + "master_branch": "master" + }, + "pusher": { + "name": "baxterthehacker", + "email": "tomasz-kolek@go2.pl" + }, + "sender": { + "login": "baxterthehacker", + "id": 5993758, + "avatar_url": "https://avatars.githubusercontent.com/u/5993758?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_release.json b/zerver/fixtures/github_webhook/github_webhook_release.json new file mode 100644 index 0000000000..dd8aed8d53 --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_release.json @@ -0,0 +1,148 @@ +{ + "action": "published", + "release": { + "url": "https://api.github.com/repos/baxterthehacker/public-repo/releases/1261438", + "assets_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases/1261438/assets", + "upload_url": "https://uploads.github.com/repos/baxterthehacker/public-repo/releases/1261438/assets{?name}", + "html_url": "https://github.com/baxterthehacker/public-repo/releases/tag/0.0.1", + "id": 1261438, + "tag_name": "0.0.1", + "target_commitish": "master", + "name": null, + "draft": false, + "author": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "prerelease": false, + "created_at": "2015-05-05T23:40:12Z", + "published_at": "2015-05-05T23:40:38Z", + "assets": [ + + ], + "tarball_url": "https://api.github.com/repos/baxterthehacker/public-repo/tarball/0.0.1", + "zipball_url": "https://api.github.com/repos/baxterthehacker/public-repo/zipball/0.0.1", + "body": null + }, + "repository": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2015-05-05T23:40:30Z", + "pushed_at": "2015-05-05T23:40:38Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 2, + "forks": 0, + "open_issues": 2, + "watchers": 0, + "default_branch": "master" + }, + "sender": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_repository.json b/zerver/fixtures/github_webhook/github_webhook_repository.json new file mode 100644 index 0000000000..eed2dbaa4a --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_repository.json @@ -0,0 +1,119 @@ +{ + "action": "created", + "repository": { + "id": 27496774, + "name": "public-repo", + "full_name": "baxterandthehackers/public-repo", + "owner": { + "login": "baxterandthehackers", + "id": 7649605, + "avatar_url": "https://avatars.githubusercontent.com/u/7649605?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterandthehackers", + "html_url": "https://github.com/baxterandthehackers", + "followers_url": "https://api.github.com/users/baxterandthehackers/followers", + "following_url": "https://api.github.com/users/baxterandthehackers/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterandthehackers/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterandthehackers/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterandthehackers/subscriptions", + "organizations_url": "https://api.github.com/users/baxterandthehackers/orgs", + "repos_url": "https://api.github.com/users/baxterandthehackers/repos", + "events_url": "https://api.github.com/users/baxterandthehackers/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterandthehackers/received_events", + "type": "Organization", + "site_admin": false + }, + "private": true, + "html_url": "https://github.com/baxterandthehackers/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterandthehackers/public-repo", + "forks_url": "https://api.github.com/repos/baxterandthehackers/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterandthehackers/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterandthehackers/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterandthehackers/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterandthehackers/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterandthehackers/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterandthehackers/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterandthehackers/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterandthehackers/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterandthehackers/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterandthehackers/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterandthehackers/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterandthehackers/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterandthehackers/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterandthehackers/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterandthehackers/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterandthehackers/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterandthehackers/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterandthehackers/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterandthehackers/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterandthehackers/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterandthehackers/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterandthehackers/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterandthehackers/public-repo/issues/comments/{number}", + "contents_url": "https://api.github.com/repos/baxterandthehackers/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterandthehackers/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterandthehackers/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterandthehackers/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterandthehackers/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterandthehackers/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterandthehackers/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterandthehackers/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterandthehackers/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterandthehackers/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterandthehackers/public-repo/releases{/id}", + "created_at": "2014-12-03T16:39:25Z", + "updated_at": "2014-12-03T16:39:25Z", + "pushed_at": "2014-12-03T16:39:25Z", + "git_url": "git://github.com/baxterandthehackers/public-repo.git", + "ssh_url": "git@github.com:baxterandthehackers/public-repo.git", + "clone_url": "https://github.com/baxterandthehackers/public-repo.git", + "svn_url": "https://github.com/baxterandthehackers/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "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" + }, + "organization": { + "login": "baxterandthehackers", + "id": 7649605, + "url": "https://api.github.com/orgs/baxterandthehackers", + "repos_url": "https://api.github.com/orgs/baxterandthehackers/repos", + "events_url": "https://api.github.com/orgs/baxterandthehackers/events", + "members_url": "https://api.github.com/orgs/baxterandthehackers/members{/member}", + "public_members_url": "https://api.github.com/orgs/baxterandthehackers/public_members{/member}", + "avatar_url": "https://avatars.githubusercontent.com/u/7649605?v=2" + }, + "sender": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=2", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_status.json b/zerver/fixtures/github_webhook/github_webhook_status.json new file mode 100644 index 0000000000..a562561649 --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_status.json @@ -0,0 +1,206 @@ +{ + "id": 214015194, + "sha": "9049f1265b7d61be4a8904a9a27120d2064dab3b", + "name": "baxterthehacker/public-repo", + "target_url": null, + "context": "default", + "description": null, + "state": "success", + "commit": { + "sha": "9049f1265b7d61be4a8904a9a27120d2064dab3b", + "commit": { + "author": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "date": "2015-05-05T23:40:12Z" + }, + "committer": { + "name": "baxterthehacker", + "email": "baxterthehacker@users.noreply.github.com", + "date": "2015-05-05T23:40:12Z" + }, + "message": "Initial commit", + "tree": { + "sha": "02b49ad0ba4f1acd9f06531b21e16a4ac5d341d0", + "url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees/02b49ad0ba4f1acd9f06531b21e16a4ac5d341d0" + }, + "url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits/9049f1265b7d61be4a8904a9a27120d2064dab3b", + "comment_count": 1 + }, + "url": "https://api.github.com/repos/baxterthehacker/public-repo/commits/9049f1265b7d61be4a8904a9a27120d2064dab3b", + "html_url": "https://github.com/baxterthehacker/public-repo/commit/9049f1265b7d61be4a8904a9a27120d2064dab3b", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits/9049f1265b7d61be4a8904a9a27120d2064dab3b/comments", + "author": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "committer": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "parents": [ + + ] + }, + "branches": [ + { + "name": "master", + "commit": { + "sha": "9049f1265b7d61be4a8904a9a27120d2064dab3b", + "url": "https://api.github.com/repos/baxterthehacker/public-repo/commits/9049f1265b7d61be4a8904a9a27120d2064dab3b" + } + }, + { + "name": "changes", + "commit": { + "sha": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "url": "https://api.github.com/repos/baxterthehacker/public-repo/commits/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c" + } + }, + { + "name": "gh-pages", + "commit": { + "sha": "b11bb7545ac14abafc6191a0481b0d961e7793c6", + "url": "https://api.github.com/repos/baxterthehacker/public-repo/commits/b11bb7545ac14abafc6191a0481b0d961e7793c6" + } + } + ], + "created_at": "2015-05-05T23:40:39Z", + "updated_at": "2015-05-05T23:40:39Z", + "repository": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2015-05-05T23:40:30Z", + "pushed_at": "2015-05-05T23:40:39Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 2, + "forks": 0, + "open_issues": 2, + "watchers": 0, + "default_branch": "master" + }, + "sender": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_team_add.json b/zerver/fixtures/github_webhook/github_webhook_team_add.json new file mode 100644 index 0000000000..bd4256bc07 --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_team_add.json @@ -0,0 +1,129 @@ +{ + "team": { + "name": "github", + "id": 836012, + "slug": "github", + "description": "", + "permission": "pull", + "url": "https://api.github.com/teams/836012", + "members_url": "https://api.github.com/teams/836012/members{/member}", + "repositories_url": "https://api.github.com/teams/836012/repos" + }, + "repository": { + "id": 35129393, + "name": "public-repo", + "full_name": "baxterandthehackers/public-repo", + "owner": { + "login": "baxterandthehackers", + "id": 7649605, + "avatar_url": "https://avatars.githubusercontent.com/u/7649605?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterandthehackers", + "html_url": "https://github.com/baxterandthehackers", + "followers_url": "https://api.github.com/users/baxterandthehackers/followers", + "following_url": "https://api.github.com/users/baxterandthehackers/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterandthehackers/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterandthehackers/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterandthehackers/subscriptions", + "organizations_url": "https://api.github.com/users/baxterandthehackers/orgs", + "repos_url": "https://api.github.com/users/baxterandthehackers/repos", + "events_url": "https://api.github.com/users/baxterandthehackers/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterandthehackers/received_events", + "type": "Organization", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterandthehackers/public-repo", + "description": "", + "fork": true, + "url": "https://api.github.com/repos/baxterandthehackers/public-repo", + "forks_url": "https://api.github.com/repos/baxterandthehackers/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterandthehackers/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterandthehackers/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterandthehackers/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterandthehackers/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterandthehackers/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterandthehackers/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterandthehackers/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterandthehackers/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterandthehackers/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterandthehackers/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterandthehackers/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterandthehackers/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterandthehackers/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterandthehackers/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterandthehackers/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterandthehackers/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterandthehackers/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterandthehackers/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterandthehackers/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterandthehackers/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterandthehackers/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterandthehackers/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterandthehackers/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterandthehackers/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterandthehackers/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterandthehackers/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterandthehackers/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterandthehackers/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterandthehackers/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterandthehackers/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterandthehackers/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterandthehackers/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterandthehackers/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterandthehackers/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:30Z", + "updated_at": "2015-05-05T23:40:30Z", + "pushed_at": "2015-05-05T23:40:27Z", + "git_url": "git://github.com/baxterandthehackers/public-repo.git", + "ssh_url": "git@github.com:baxterandthehackers/public-repo.git", + "clone_url": "https://github.com/baxterandthehackers/public-repo.git", + "svn_url": "https://github.com/baxterandthehackers/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": false, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 0, + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "master" + }, + "organization": { + "login": "baxterandthehackers", + "id": 7649605, + "url": "https://api.github.com/orgs/baxterandthehackers", + "repos_url": "https://api.github.com/orgs/baxterandthehackers/repos", + "events_url": "https://api.github.com/orgs/baxterandthehackers/events", + "members_url": "https://api.github.com/orgs/baxterandthehackers/members{/member}", + "public_members_url": "https://api.github.com/orgs/baxterandthehackers/public_members{/member}", + "avatar_url": "https://avatars.githubusercontent.com/u/7649605?v=3", + "description": null + }, + "sender": { + "login": "baxterandthehackers", + "id": 7649605, + "avatar_url": "https://avatars.githubusercontent.com/u/7649605?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterandthehackers", + "html_url": "https://github.com/baxterandthehackers", + "followers_url": "https://api.github.com/users/baxterandthehackers/followers", + "following_url": "https://api.github.com/users/baxterandthehackers/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterandthehackers/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterandthehackers/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterandthehackers/subscriptions", + "organizations_url": "https://api.github.com/users/baxterandthehackers/orgs", + "repos_url": "https://api.github.com/users/baxterandthehackers/repos", + "events_url": "https://api.github.com/users/baxterandthehackers/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterandthehackers/received_events", + "type": "Organization", + "site_admin": false + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_watch_repository.json b/zerver/fixtures/github_webhook/github_webhook_watch_repository.json new file mode 100644 index 0000000000..88bc71d0ab --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_watch_repository.json @@ -0,0 +1,109 @@ +{ + "action": "started", + "repository": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2015-05-05T23:40:30Z", + "pushed_at": "2015-05-05T23:40:27Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 2, + "forks": 0, + "open_issues": 2, + "watchers": 0, + "default_branch": "master" + }, + "sender": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + } +} diff --git a/zerver/fixtures/github_webhook/github_webhook_wiki_pages.json b/zerver/fixtures/github_webhook/github_webhook_wiki_pages.json new file mode 100644 index 0000000000..832d58c83a --- /dev/null +++ b/zerver/fixtures/github_webhook/github_webhook_wiki_pages.json @@ -0,0 +1,126 @@ +{ + "pages": [ + { + "page_name": "Home", + "title": "Home", + "summary": null, + "action": "created", + "sha": "91ea1bd42aa2ba166b86e8aefe049e9837214e67", + "html_url": "https://github.com/baxterthehacker/public-repo/wiki/Home" + }, + { + "page_name": "Home", + "title": "Home", + "summary": null, + "action": "created", + "sha": "91ea1bd42aa2ba166b86e8aefe049e9837214e67", + "html_url": "https://github.com/baxterthehacker/public-repo/wiki/Home" + } + ], + "repository": { + "id": 35129377, + "name": "public-repo", + "full_name": "baxterthehacker/public-repo", + "owner": { + "login": "baxterthehacker", + "id": 6752317, + "avatar_url": "https://avatars.githubusercontent.com/u/6752317?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/baxterthehacker", + "html_url": "https://github.com/baxterthehacker", + "followers_url": "https://api.github.com/users/baxterthehacker/followers", + "following_url": "https://api.github.com/users/baxterthehacker/following{/other_user}", + "gists_url": "https://api.github.com/users/baxterthehacker/gists{/gist_id}", + "starred_url": "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baxterthehacker/subscriptions", + "organizations_url": "https://api.github.com/users/baxterthehacker/orgs", + "repos_url": "https://api.github.com/users/baxterthehacker/repos", + "events_url": "https://api.github.com/users/baxterthehacker/events{/privacy}", + "received_events_url": "https://api.github.com/users/baxterthehacker/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/baxterthehacker/public-repo", + "description": "", + "fork": false, + "url": "https://api.github.com/repos/baxterthehacker/public-repo", + "forks_url": "https://api.github.com/repos/baxterthehacker/public-repo/forks", + "keys_url": "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/baxterthehacker/public-repo/teams", + "hooks_url": "https://api.github.com/repos/baxterthehacker/public-repo/hooks", + "issue_events_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/baxterthehacker/public-repo/events", + "assignees_url": "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/tags", + "blobs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/baxterthehacker/public-repo/languages", + "stargazers_url": "https://api.github.com/repos/baxterthehacker/public-repo/stargazers", + "contributors_url": "https://api.github.com/repos/baxterthehacker/public-repo/contributors", + "subscribers_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscribers", + "subscription_url": "https://api.github.com/repos/baxterthehacker/public-repo/subscription", + "commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/baxterthehacker/public-repo/merges", + "archive_url": "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/baxterthehacker/public-repo/downloads", + "issues_url": "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}", + "created_at": "2015-05-05T23:40:12Z", + "updated_at": "2015-05-05T23:40:12Z", + "pushed_at": "2015-05-05T23:40:17Z", + "git_url": "git://github.com/baxterthehacker/public-repo.git", + "ssh_url": "git@github.com:baxterthehacker/public-repo.git", + "clone_url": "https://github.com/baxterthehacker/public-repo.git", + "svn_url": "https://github.com/baxterthehacker/public-repo", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "open_issues_count": 0, + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "master" + }, + "sender": { + "login": "jasonrudolph", + "id": 2988, + "avatar_url": "https://avatars.githubusercontent.com/u/2988?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/jasonrudolph", + "html_url": "https://github.com/jasonrudolph", + "followers_url": "https://api.github.com/users/jasonrudolph/followers", + "following_url": "https://api.github.com/users/jasonrudolph/following{/other_user}", + "gists_url": "https://api.github.com/users/jasonrudolph/gists{/gist_id}", + "starred_url": "https://api.github.com/users/jasonrudolph/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/jasonrudolph/subscriptions", + "organizations_url": "https://api.github.com/users/jasonrudolph/orgs", + "repos_url": "https://api.github.com/users/jasonrudolph/repos", + "events_url": "https://api.github.com/users/jasonrudolph/events{/privacy}", + "received_events_url": "https://api.github.com/users/jasonrudolph/received_events", + "type": "User", + "site_admin": true + } +} diff --git a/zerver/lib/integrations.py b/zerver/lib/integrations.py index 28a8b253ee..a0f55ae8b2 100644 --- a/zerver/lib/integrations.py +++ b/zerver/lib/integrations.py @@ -87,7 +87,20 @@ WEBHOOK_INTEGRATIONS = [ WebhookIntegration('crashlytics'), WebhookIntegration('deskdotcom', logo='static/images/integrations/logos/deskcom.png', display_name='Desk.com'), WebhookIntegration('freshdesk'), - WebhookIntegration('github', function='zerver.views.webhooks.github.api_github_landing', display_name='GitHub'), + WebhookIntegration( + 'github', + function='zerver.views.webhooks.github.api_github_landing', + display_name='GitHub', + secondary_line_text='(deprecated)' + ), + WebhookIntegration( + 'github_webhook', + display_name='GitHub', + url='api/v1/external/webhook_github', + logo='static/images/integrations/logos/github.png', + secondary_line_text='(webhook)', + function='zerver.views.webhooks.github_webhook.api_github_webhook' + ), WebhookIntegration('gitlab', display_name='GitLab'), WebhookIntegration('helloworld', display_name='Hello World'), WebhookIntegration('ifttt', function='zerver.views.webhooks.ifttt.api_iftt_app_webhook', display_name='IFTTT'), diff --git a/zerver/tests/webhooks/test_github_webhook.py b/zerver/tests/webhooks/test_github_webhook.py new file mode 100644 index 0000000000..cfcc95b2b8 --- /dev/null +++ b/zerver/tests/webhooks/test_github_webhook.py @@ -0,0 +1,152 @@ +import ujson +from six import text_type +from typing import Dict, Optional + +from zerver.models import Message +from zerver.lib.webhooks.git import COMMITS_LIMIT +from zerver.lib.test_classes import WebhookTestCase + +class GithubWebhookTest(WebhookTestCase): + STREAM_NAME = 'github' + URL_TEMPLATE = "/api/v1/external/webhook_github?stream={stream}&api_key={api_key}" + FIXTURE_DIR_NAME = 'github_webhook' + EXPECTED_SUBJECT_REPO_EVENTS = u"public-repo" + EXPECTED_SUBJECT_ISSUE_EVENTS = u"public-repo / Issue #2 Spelling error in the README file" + EXPECTED_SUBJECT_PR_EVENTS = u"public-repo / PR #1 Update the README with new information" + EXPECTED_SUBJECT_DEPLOYMENT_EVENTS = u"public-repo / Deployment on production" + EXPECTED_SUBJECT_ORGANIZATION_EVENTS = u"baxterandthehackers organization" + EXPECTED_SUBJECT_BRANCH_EVENTS = u"public-repo / changes" + EXPECTED_SUBJECT_WIKI_EVENTS = u"public-repo / Wiki Pages" + + def test_push_1_commit(self): + # type: () -> None + expected_message = u"baxterthehacker [pushed](https://github.com/baxterthehacker/public-repo/compare/9049f1265b7d...0d1a26e67d8f) to branch changes\n\n* [0d1a26e](https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c): Update README.md" + self.send_and_test_stream_message('push_1_commit', self.EXPECTED_SUBJECT_BRANCH_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='push') + + def test_push_50_commits(self): + # type: () -> None + commit_info = "* [0d1a26e](https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c): Update README.md\n" + expected_message = u"baxterthehacker [pushed](https://github.com/baxterthehacker/public-repo/compare/9049f1265b7d...0d1a26e67d8f) to branch changes\n\n{}[and 40 more commit(s)]".format( + commit_info * COMMITS_LIMIT + ) + self.send_and_test_stream_message('push_50_commits', self.EXPECTED_SUBJECT_BRANCH_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='push') + + def test_commit_comment_msg(self): + # type: () -> None + expected_message = u"baxterthehacker [commented](https://github.com/baxterthehacker/public-repo/commit/9049f1265b7d61be4a8904a9a27120d2064dab3b#commitcomment-11056394) on [9049f12](https://github.com/baxterthehacker/public-repo/commit/9049f1265b7d61be4a8904a9a27120d2064dab3b)\n~~~ quote\nThis is a really good change! :+1:\n~~~" + self.send_and_test_stream_message('commit_comment', self.EXPECTED_SUBJECT_REPO_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='commit_comment') + + def test_create_msg(self): + # type: () -> None + expected_message = u"baxterthehacker created tag 0.0.1" + self.send_and_test_stream_message('create', self.EXPECTED_SUBJECT_REPO_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='create') + + def test_delete_msg(self): + # type: () -> None + expected_message = u"baxterthehacker deleted tag simple-tag" + self.send_and_test_stream_message('delete', self.EXPECTED_SUBJECT_REPO_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='delete') + + def test_deployment_msg(self): + # type: () -> None + expected_message = u"baxterthehacker created new deployment" + self.send_and_test_stream_message('deployment', self.EXPECTED_SUBJECT_DEPLOYMENT_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='deployment') + + def test_deployment_status_msg(self): + # type: () -> None + expected_message = u"Deployment changed status to success" + self.send_and_test_stream_message('deployment_status', self.EXPECTED_SUBJECT_DEPLOYMENT_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='deployment_status') + + def test_fork_msg(self): + # type: () -> None + expected_message = u"baxterandthehackers forked [public-repo](https://github.com/baxterandthehackers/public-repo)" + self.send_and_test_stream_message('fork', self.EXPECTED_SUBJECT_REPO_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='fork') + + def test_issue_comment_msg(self): + # type: () -> None + expected_message = u"baxterthehacker [commented](https://github.com/baxterthehacker/public-repo/issues/2#issuecomment-99262140) on [Issue #2](https://github.com/baxterthehacker/public-repo/issues/2)\n\n~~~ quote\nYou are totally right! I'll get this fixed right away.\n~~~" + self.send_and_test_stream_message('issue_comment', self.EXPECTED_SUBJECT_ISSUE_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='issue_comment') + + def test_issue_msg(self): + # type: () -> None + expected_message = u"baxterthehacker opened [Issue #2](https://github.com/baxterthehacker/public-repo/issues/2)\n\n~~~ quote\nIt looks like you accidently spelled 'commit' with two 't's.\n~~~" + self.send_and_test_stream_message('issue', self.EXPECTED_SUBJECT_ISSUE_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='issue') + + def test_membership_msg(self): + # type: () -> None + expected_message = u"baxterthehacker added [kdaigle](https://github.com/kdaigle) to Contractors team" + self.send_and_test_stream_message('membership', self.EXPECTED_SUBJECT_ORGANIZATION_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='membership') + + def test_member_msg(self): + # type: () -> None + expected_message = u"baxterthehacker added [octocat](https://github.com/octocat) to [public-repo](https://github.com/baxterthehacker/public-repo)" + self.send_and_test_stream_message('member', self.EXPECTED_SUBJECT_REPO_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='member') + + def test_pull_request_opened_msg(self): + # type: () -> None + expected_message = u"baxterthehacker opened [PR](https://github.com/baxterthehacker/public-repo/pull/1)\nfrom `changes` to `master`\n\n~~~ quote\nThis is a pretty simple change that we need to pull into master.\n~~~" + self.send_and_test_stream_message('opened_pull_request', self.EXPECTED_SUBJECT_PR_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='pull_request') + + def test_pull_request_closed_msg(self): + # type: () -> None + expected_message = u"baxterthehacker closed without merge [PR](https://github.com/baxterthehacker/public-repo/pull/1)" + self.send_and_test_stream_message('closed_pull_request', self.EXPECTED_SUBJECT_PR_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='pull_request') + + def test_pull_request_merged_msg(self): + # type: () -> None + expected_message = u"baxterthehacker merged [PR](https://github.com/baxterthehacker/public-repo/pull/1)" + self.send_and_test_stream_message('merged_pull_request', self.EXPECTED_SUBJECT_PR_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='pull_request') + + def test_public_msg(self): + # type: () -> None + expected_message = u"baxterthehacker made [the repository](https://github.com/baxterthehacker/public-repo) public" + self.send_and_test_stream_message('public', self.EXPECTED_SUBJECT_REPO_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='public') + + def test_wiki_pages_msg(self): + # type: () -> None + expected_message = u"jasonrudolph:\n* created [Home](https://github.com/baxterthehacker/public-repo/wiki/Home)\n* created [Home](https://github.com/baxterthehacker/public-repo/wiki/Home)" + self.send_and_test_stream_message('wiki_pages', self.EXPECTED_SUBJECT_WIKI_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='gollum') + + def test_watch_msg(self): + # type: () -> None + expected_message = u"baxterthehacker starred [the repository](https://github.com/baxterthehacker/public-repo)" + self.send_and_test_stream_message('watch_repository', self.EXPECTED_SUBJECT_REPO_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='watch') + + def test_repository_msg(self): + # type: () -> None + expected_message = u"baxterthehacker created [the repository](https://github.com/baxterandthehackers/public-repo)" + self.send_and_test_stream_message('repository', self.EXPECTED_SUBJECT_REPO_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='repository') + + def test_team_add_msg(self): + # type: () -> None + expected_message = u"[The repository](https://github.com/baxterandthehackers/public-repo) was added to team github" + self.send_and_test_stream_message('team_add', self.EXPECTED_SUBJECT_REPO_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='team_add') + + def test_release_msg(self): + # type: () -> None + expected_message = u"baxterthehacker published [the release](https://github.com/baxterthehacker/public-repo/releases/tag/0.0.1)" + self.send_and_test_stream_message('release', self.EXPECTED_SUBJECT_REPO_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='release') + + def test_page_build_msg(self): + # type: () -> None + expected_message = u"Github Pages build, trigerred by baxterthehacker, is built" + self.send_and_test_stream_message('page_build', self.EXPECTED_SUBJECT_REPO_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='page_build') + + def test_status_msg(self): + # type: () -> None + expected_message = u"[9049f12](https://github.com/baxterthehacker/public-repo/commit/9049f1265b7d61be4a8904a9a27120d2064dab3b) changed it's status to success" + self.send_and_test_stream_message('status', self.EXPECTED_SUBJECT_REPO_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='status') + + def test_pull_request_review_msg(self): + # type: () -> None + expected_message = u"baxterthehacker submitted [PR Review](https://github.com/baxterthehacker/public-repo/pull/1#pullrequestreview-2626884)" + self.send_and_test_stream_message('pull_request_review', self.EXPECTED_SUBJECT_PR_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='pull_request_review') + + def test_pull_request_review_comment_msg(self): + # type: () -> None + expected_message = u"baxterthehacker created [PR Review Comment](https://github.com/baxterthehacker/public-repo/pull/1#discussion_r29724692)\n\n~~~ quote\nMaybe you should use more emojji on this line.\n~~~" + self.send_and_test_stream_message('pull_request_review_comment', self.EXPECTED_SUBJECT_PR_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='pull_request_review_comment') + + def test_push_tag_msg(self): + # type: () -> None + expected_message = u"baxterthehacker pushed abc tag" + self.send_and_test_stream_message('push_tag', self.EXPECTED_SUBJECT_REPO_EVENTS, expected_message, HTTP_X_GITHUB_EVENT='push') diff --git a/zerver/views/webhooks/github_webhook.py b/zerver/views/webhooks/github_webhook.py new file mode 100644 index 0000000000..996fab1f32 --- /dev/null +++ b/zerver/views/webhooks/github_webhook.py @@ -0,0 +1,399 @@ +from __future__ import absolute_import +import re +from functools import partial +from six import text_type +from typing import Any, Callable +from django.http import HttpRequest, HttpResponse +from zerver.lib.actions import check_send_message +from zerver.lib.response import json_success +from zerver.models import Client, UserProfile +from zerver.decorator import api_key_only_webhook_view, REQ, has_request_variables + +from zerver.lib.webhooks.git import get_issue_event_message, SUBJECT_WITH_PR_OR_ISSUE_INFO_TEMPLATE,\ + get_pull_request_event_message, SUBJECT_WITH_BRANCH_TEMPLATE,\ + get_push_commits_event_message, CONTENT_MESSAGE_TEMPLATE,\ + get_commits_comment_action_message, get_push_tag_event_message + +class UnknownEventType(Exception): + pass + +def get_opened_or_update_pull_request_body(payload): + # type: (Dict[str, Any]) -> text_type + pull_request = payload['pull_request'] + action = payload['action'] + if action == 'synchronized': + action = 'updated' + assignee = None + if pull_request.get('assignee'): + assignee = pull_request['assignee']['login'] + + return get_pull_request_event_message( + get_sender_name(payload), + action, + pull_request['html_url'], + target_branch=pull_request['head']['ref'], + base_branch=pull_request['base']['ref'], + message=pull_request['body'], + assignee=assignee + ) + +def get_closed_pull_request_body(payload): + # type: (Dict[str, Any]) -> text_type + pull_request = payload['pull_request'] + action = 'merged' if pull_request['merged'] else 'closed without merge' + return get_pull_request_event_message( + get_sender_name(payload), + action, + pull_request['html_url'], + ) + +def get_membership_body(payload): + # type: (Dict[str, Any]) -> text_type + action = payload['action'] + member = payload['member'] + scope = payload['scope'] + scope_object = payload[scope] + + return u"{} {} [{}]({}) to {} {}".format( + get_sender_name(payload), + action, + member['login'], + member['html_url'], + scope_object['name'], + scope + ) + +def get_member_body(payload): + # type: (Dict[str, Any]) -> text_type + return u"{} {} [{}]({}) to [{}]({})".format( + get_sender_name(payload), + payload['action'], + payload['member']['login'], + payload['member']['html_url'], + get_repository_name(payload), + payload['repository']['html_url'] + ) + +def get_issue_body(payload): + # type: (Dict[str, Any]) -> text_type + action = payload['action'] + issue = payload['issue'] + assignee = issue['assignee'] + return get_issue_event_message( + get_sender_name(payload), + action, + issue['html_url'], + issue['number'], + issue['body'], + assignee=assignee['login'] if assignee else None + ) + +def get_issue_comment_body(payload): + # type: (Dict[str, Any]) -> text_type + action = payload['action'] + comment = payload['comment'] + issue = payload['issue'] + + if action == 'created': + action = '[commented]' + else: + action = '{} a [comment]' + action += '({}) on'.format(comment['html_url']) + + return get_issue_event_message( + get_sender_name(payload), + action, + issue['html_url'], + issue['number'], + comment['body'], + ) + +def get_fork_body(payload): + # type: (Dict[str, Any]) -> text_type + forkee = payload['forkee'] + return u"{} forked [{}]({})".format( + get_sender_name(payload), + forkee['name'], + forkee['html_url'] + ) + +def get_deployment_body(payload): + # type: (Dict[str, Any]) -> text_type + return u'{} created new deployment'.format( + get_sender_name(payload), + ) + +def get_change_deployment_status_body(payload): + # type: (Dict[str, Any]) -> text_type + return u'Deployment changed status to {}'.format( + payload['deployment_status']['state'], + ) + +def get_create_or_delete_body(payload, action): + # type: (Dict[str, Any], text_type) -> text_type + ref_type = payload['ref_type'] + return u'{} {} {} {}'.format( + get_sender_name(payload), + action, + ref_type, + payload['ref'] + ).rstrip() + +def get_commit_comment_body(payload): + # type: (Dict[str, Any]) -> text_type + comment = payload['comment'] + comment_url = comment['html_url'] + commit_url = comment_url.split('#', 1)[0] + action = u'[commented]({})'.format(comment_url) + return get_commits_comment_action_message( + get_sender_name(payload), + action, + commit_url, + comment.get('commit_id'), + comment['body'], + ) + +def get_push_tags_body(payload): + # type: (Dict[str, Any]) -> text_type + return get_push_tag_event_message( + get_sender_name(payload), + get_tag_name_from_ref(payload['ref']), + action='pushed' if payload.get('created') else 'removed' + ) + +def get_push_commits_body(payload): + # type: (Dict[str, Any]) -> text_type + commits_data = [{ + 'sha': commit['id'], + 'url': commit['url'], + 'message': commit['message'] + } for commit in payload['commits']] + return get_push_commits_event_message( + get_sender_name(payload), + payload['compare'], + get_branch_name_from_ref(payload['ref']), + commits_data + ) + +def get_public_body(payload): + # type: (Dict[str, Any]) -> text_type + return u"{} made [the repository]({}) public".format( + get_sender_name(payload), + payload['repository']['html_url'], + ) + +def get_wiki_pages_body(payload): + # type: (Dict[str, Any]) -> text_type + wiki_page_info_template = u"* {action} [{title}]({url})\n" + wiki_info = u'' + for page in payload['pages']: + wiki_info += wiki_page_info_template.format( + action=page['action'], + title=page['title'], + url=page['html_url'], + ) + return u"{}:\n{}".format(get_sender_name(payload), wiki_info.rstrip()) + +def get_watch_body(payload): + # type: (Dict[str, Any]) -> text_type + return u"{} starred [the repository]({})".format( + get_sender_name(payload), + payload['repository']['html_url'] + ) + +def get_repository_body(payload): + # type: (Dict[str, Any]) -> text_type + return u"{} {} [the repository]({})".format( + get_sender_name(payload), + payload.get('action'), + payload['repository']['html_url'] + ) + +def get_add_team_body(payload): + # type: (Dict[str, Any]) -> text_type + return u"[The repository]({}) was added to team {}".format( + payload['repository']['html_url'], + payload['team']['name'] + ) + +def get_release_body(payload): + # type: (Dict[str, Any]) -> text_type + return u"{} published [the release]({})".format( + get_sender_name(payload), + payload['release']['html_url'], + ) + +def get_page_build_body(payload): + # type: (Dict[str, Any]) -> text_type + build = payload['build'] + action = build['status'] + if action == 'null': + action = u'has yet to be built' + elif action == 'building': + action = u'is being building' + elif action == 'errored': + action = u'is errored{}'.format( + CONTENT_MESSAGE_TEMPLATE.format(message=build['error']['message']) + ) + else: + action = u'is {}'.format(action) + return u"Github Pages build, trigerred by {}, {}".format( + payload['build']['pusher']['login'], + action + ) + +def get_status_body(payload): + # type: (Dict[str, Any]) -> text_type + if payload['target_url']: + status = '[{}]({})'.format( + payload['state'], + payload['target_url'] + ) + else: + status = payload['state'] + return u"[{}]({}) changed it's status to {}".format( + payload['sha'][:7], # TODO + payload['commit']['html_url'], + status + ) + +def get_pull_request_review_body(payload): + # type: (Dict[str, Any]) -> text_type + return get_pull_request_event_message( + get_sender_name(payload), + 'submitted', + payload['review']['html_url'], + type='PR Review' + ) + +def get_pull_request_review_comment_body(payload): + # type: (Dict[str, Any]) -> text_type + action = payload['action'] + message = None + if action == 'created': + message = payload['comment']['body'] + + return get_pull_request_event_message( + get_sender_name(payload), + action, + payload['comment']['html_url'], + message=message, + type='PR Review Comment' + ) + +def get_repository_name(payload): + # type: (Dict[str, Any]) -> text_type + return payload['repository']['name'] + +def get_sender_name(payload): + # type: (Dict[str, Any]) -> text_type + return payload['sender']['login'] + +def get_branch_name_from_ref(ref_string): + # type: (text_type) -> text_type + return re.sub(r'^refs/heads/', '', ref_string) + +def get_tag_name_from_ref(ref_string): + # type: (text_type) -> text_type + return re.sub(r'^refs/tags/', '', ref_string) + +def is_commit_push_event(payload): + # type: (Dict[str, Any]) -> bool + return bool(re.match(r'^refs/heads/', payload['ref'])) + +def get_subject_based_on_type(payload, event): + # type: (Dict[str, Any], text_type) -> text_type + if 'pull_request' in event: + return SUBJECT_WITH_PR_OR_ISSUE_INFO_TEMPLATE.format( + repo=get_repository_name(payload), + type='PR', + id=payload['pull_request']['number'], + title=payload['pull_request']['title'] + ) + elif event.startswith('issue'): + return SUBJECT_WITH_PR_OR_ISSUE_INFO_TEMPLATE.format( + repo=get_repository_name(payload), + type='Issue', + id=payload['issue']['number'], + title=payload['issue']['title'] + ) + elif event.startswith('deployment'): + return u"{} / Deployment on {}".format( + get_repository_name(payload), + payload['deployment']['environment'] + ) + elif event == 'membership': + return u"{} organization".format(payload['organization']['login']) + elif event == 'push_commits': + return SUBJECT_WITH_BRANCH_TEMPLATE.format( + repo=get_repository_name(payload), + branch=get_branch_name_from_ref(payload['ref']) + ) + elif event == 'gollum': + return SUBJECT_WITH_BRANCH_TEMPLATE.format( + repo=get_repository_name(payload), + branch='Wiki Pages' + ) + return get_repository_name(payload) + +EVENT_FUNCTION_MAPPER = { + 'team_add': get_add_team_body, + 'commit_comment': get_commit_comment_body, + 'closed_pull_request': get_closed_pull_request_body, + 'create': partial(get_create_or_delete_body, action='created'), + 'delete': partial(get_create_or_delete_body, action='deleted'), + 'deployment': get_deployment_body, + 'deployment_status': get_change_deployment_status_body, + 'fork': get_fork_body, + 'gollum': get_wiki_pages_body, + 'issue_comment': get_issue_comment_body, + 'issue': get_issue_body, + 'member': get_member_body, + 'membership': get_membership_body, + 'opened_or_update_pull_request': get_opened_or_update_pull_request_body, + 'page_build': get_page_build_body, + 'public': get_public_body, + 'pull_request_review': get_pull_request_review_body, + 'pull_request_review_comment': get_pull_request_review_comment_body, + 'push_commits': get_push_commits_body, + 'push_tags': get_push_tags_body, + 'release': get_release_body, + 'repository': get_repository_body, + 'status': get_status_body, + 'watch': get_watch_body, +} + +@api_key_only_webhook_view('Github') +@has_request_variables +def api_github_webhook( + request, user_profile, client, + payload=REQ(argument_type='body'), stream=REQ(default='github')): + # type: (HttpRequest, UserProfile, Client, Dict[str, Any], text_type) -> HttpResponse + event = get_event(request, payload) + subject = get_subject_based_on_type(payload, event) + body = get_body_function_based_on_type(event)(payload) + check_send_message(user_profile, client, 'stream', [stream], subject, body) + return json_success() + +def get_event(request, payload): + # type: (HttpRequest, Dict[str, Any]) -> str + event = request.META['HTTP_X_GITHUB_EVENT'] + if event == 'pull_request': + action = payload['action'] + if action == 'opened' or action == 'synchronized': + return 'opened_or_update_pull_request' + if action == 'closed': + return 'closed_pull_request' + raise UnknownEventType(u'Event pull_request with {} action is unsupported'.format(action)) + if event == 'push': + if is_commit_push_event(payload): + return "push_commits" + else: + return "push_tags" + elif event in list(EVENT_FUNCTION_MAPPER.keys()): + return event + raise UnknownEventType(u'Event {} is unknown and cannot be handled'.format(event)) + +def get_body_function_based_on_type(type): + # type: (str) -> Any + return EVENT_FUNCTION_MAPPER.get(type)