diff --git a/docs/Makefile b/docs/Makefile index f0d67de..e6a20f3 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -29,6 +29,7 @@ help: @echo "pdf latex and then runs the PDF generation" @echo "all html and pdf" @echo "dist all, and then puts the results in dist/" + @echo "gitwash-update update git workflow from source repo" clean: -rm -rf build/* dist/* $(SRCDIR)/api/generated @@ -93,3 +94,7 @@ linkcheck: @echo @echo "Link check complete; look for any errors in the above output " \ "or in build/linkcheck/output.txt." + +gitwash-update: + python ../tools/gitwash_dumper.py source/development ipython + cd source/development/gitwash && rename 's/.rst/.txt/' *.rst diff --git a/docs/source/development/contributing.txt b/docs/source/development/contributing.txt index ab57554..773b3d3 100644 --- a/docs/source/development/contributing.txt +++ b/docs/source/development/contributing.txt @@ -7,177 +7,20 @@ How to contribute to IPython Overview ======== -IPython development is done using Bazaar [Bazaar]_ and Launchpad [Launchpad]_. +IPython development is done using Git [Git]_ and Github.com [Github.com]_. This makes it easy for people to contribute to the development of IPython. There are several ways in which you can join in. -If you have a small change that you want to contribute, you can edit your -Bazaar checkout of IPython (see below) in-place, and ask Bazaar for the -differences: - -.. code-block:: bash - - $ cd /path/to/your/copy/of/ipython - $ bzr diff > my_fixes.diff - -This produces a patch file with your fixes, which we can apply to the source -tree. This file should then be attached to a ticket in our `bug tracker -`_, indicating what it does. - -This model of creating small, self-contained patches works very well and there -are open source projects that do their entire development this way. However, -in IPython we have found that for tracking larger changes, making use of -Bazaar's full capabilities in conjunction with Launchpad's code hosting -services makes for a much better experience. - -Making your own branch of IPython allows you to refine your changes over time, -track the development of the main team, and propose your own full version of -the code for others to use and review, with a minimum amount of fuss. The next -parts of this document will explain how to do this. - -Install Bazaar and create a Launchpad account ---------------------------------------------- - -First make sure you have installed Bazaar (see their `website -`_). To see that Bazaar is installed and knows about -you, try the following: - -.. code-block:: bash - - $ bzr whoami - Joe Coder - -This should display your name and email. Next, you will want to create an -account on the `Launchpad website `_ and setup your -ssh keys. For more information of setting up your ssh keys, see `this link -`_. - -Get the main IPython branch from Launchpad ------------------------------------------- - -Now, you can get a copy of the main IPython development branch (we call this -the "trunk"): - -.. code-block:: bash - - $ bzr branch lp:ipython - -Create a working branch ------------------------ - -When working on IPython, you won't actually make edits directly to the -:file:`lp:ipython` branch. Instead, you will create a separate branch for your -changes. For now, let's assume you want to do your work in a branch named -"ipython-mybranch". Create this branch by doing: - -.. code-block:: bash - - $ bzr branch ipython ipython-mybranch - -When you actually create a branch, you will want to give it a name that -reflects the nature of the work that you will be doing in it, like -"install-docs-update". - -Make edits in your working branch ---------------------------------- - -Now you are ready to actually make edits in your :file:`ipython-mybranch` -branch. Before doing this, it is helpful to install this branch so you can -test your changes as you work. This is easiest if you have setuptools -installed. Then, just do: - -.. code-block:: bash - - $ cd ipython-mybranch - $ python setupegg.py develop - -Now, make some changes. After a while, you will want to commit your changes. -This let's Bazaar know that you like the changes you have made and gives you -an opportunity to keep a nice record of what you have done. This looks like -this: - -.. code-block:: bash - - $ ...do work in ipython-mybranch... - $ bzr commit -m "the commit message goes here" - -Please note that since we now don't use an old-style linear ChangeLog (that -tends to cause problems with distributed version control systems), you should -ensure that your log messages are reasonably detailed. Use a docstring-like -approach in the commit messages (including the second line being left -*blank*):: - - Single line summary of changes being committed. - - * more details when warranted ... - * including crediting outside contributors if they sent the - code/bug/idea! - -As you work, you will repeat this edit/commit cycle many times. If you work on -your branch for a long time, you will also want to get the latest changes from -the :file:`lp:ipython` branch. This can be done with the following sequence of -commands: - -.. code-block:: bash - - $ ls - ipython - ipython-mybranch - - $ cd ipython - $ bzr pull - $ cd ../ipython-mybranch - $ bzr merge ../ipython - $ bzr commit -m "Merging changes from trunk" - -Post your branch and request a code review ------------------------------------------- - -Once you are done with your edits, you should post your branch on Launchpad so -that other IPython developers can review the changes and help you merge your -changes into the main development branch. To post your branch on Launchpad, -do: - -.. code-block:: bash - - $ cd ipython-mybranch - $ bzr push lp:~yourusername/ipython/ipython-mybranch - -Then, go to the `IPython Launchpad site `_, -and you should see your branch under the "Code" tab. If you click on your -branch, you can provide a short description of the branch as well as mark its -status. Most importantly, you should click the link that reads "Propose for -merging into another branch". What does this do? - -This let's the other IPython developers know that your branch is ready to be -reviewed and merged into the main development branch. During this review -process, other developers will give you feedback and help you get your code -ready to be merged. What types of things will we be looking for: - -* All code is documented. How to document your code is described in - :ref:`this section `. -* All code has tests. How to write and run tests is described in - :ref:`this section `. -* The entire IPython test suite passes. - -You should also provide us with a list of changes that your branch contains. -See the :ref:`What's new ` section of our documentation -(:file:`docs/source/whatsnew`) for details on the format and content of this. - -Once your changes have been reviewed and approved, someone will merge them -into the main development branch. - Merging a branch into trunk =========================== Core developers, who ultimately merge any approved branch (from themselves, another developer, or any third-party contribution) will typically use -:command:`bzr merge` to merge the branch into the trunk and push it to the -main Launchpad site. There are a number of things to keep in mind when doing -this, so that the project history is easy to understand in the long -run, and that generating release notes is as painless and accurate as -possible. +:command:`git merge` to merge the branch into the trunk and push it to the main +Git repository. There are a number of things to keep in mind when doing this, +so that the project history is easy to understand in the long run, and that +generating release notes is as painless and accurate as possible. * When you merge any non-trivial functionality (from one small bug fix to a big feature branch), please remember to always edit the appropriate file in @@ -197,13 +40,13 @@ possible. committing something that is completely (or almost so) a third-party contribution, do the commit as:: - $ bzr commit --author="Someone Else" + $ git commit --author="Someone Else" This way it will show that name separately in the log, which makes it even easier to spot. Obviously we often rework third party contributions - extensively, but this is still good to keep in mind for cases when we don't + extensively ,but this is still good to keep in mind for cases when we don't touch the code too much. -.. [Bazaar] Bazaar. http://bazaar-vcs.org/ -.. [Launchpad] Launchpad. http://www.launchpad.net/ipython +.. [Git] The Git version control system. +.. [Github.com] Github.com. http://github.com diff --git a/docs/source/development/gitwash/branch_list.png b/docs/source/development/gitwash/branch_list.png new file mode 100644 index 0000000000000000000000000000000000000000..1196eb754d361dbb2e53a25745f913c2f0cdb83e GIT binary patch literal 13361 zc$__ZV{|6l^L1?7wrx&q+fF7nC&m-ob~3STYhv5B{oZ@$_kVk>?mlOoI<>3Lr|!M0 z!WHEu;9+oJfPjGDr6fg_fq;NL{~4=6LHzTq#7P?b=LPK`spSj=1dICb4Gff#g#`pe z1SBOYtm*-LsRya6IW0q z(Ju%OS2Bt0$`fC(yoeAFUqPoW@K-KskXaq}wYa+K4al@z{ZK0OJC|3n)ba&Md9h=v2W2jscSJCnX~4P3FS{`)_=MM%tVFp)#qv#s1&? zpOsYL|63udYqoD|Ya9LZCseu^WV@jWgFh#iv=?~?iccR*bSbNPY;@FLxjZ;12vn3L z{^r|b?6Au5Ur68>e|9KMn=w|{9BK~<35n{BD&e%_!~f!01o#h0=d@X-flq_D&#RJ- zc+CG7S1$}0-Ij-$fCs^U4uB-`%!v)_5-gT@?+5Px#r$_OJ0x)ACVQpKQmYjk4m=Ah ztCFIkp;}u8sGgMcDww6cJ)(w&#>(1SitK^=UndzzwbElc(xfUkV`F1C4-cY3LO?~z z<;7ywHUdk>Nl9qCmed+|>?zS%4l%tdVM57Np5}e5;087NU8M-McRYh=yyrDP@_|%d zLPA0g%?@w>bGuVVY?z$TvYAN)h} zQyC#z;LH-d(x*kLizJ}iAMaQk>dv(Zp=>0Hmz@IVc2)a@!#;ZL=_s1U@pBSh@*{&Z z&ot1pWW={hwln5jE5>qt1Jf8*M?1$_CSXW%;!A@_aKZTYN_xw4U44n+oih|zME_!D2=PS#oxm}gH<A384;p*&@74$K6;^j50qAMES<}I82f7>FSiPQZ z_-hnu_VW_ux2C z@i%VLZD}nX9YIh@jKBTkw2&$P0jblyxoBNjGvf)9g_F*STv+biwULDf*TSW>(NnFs zqO}~f*?zi@7j5(4%We}hzM^q874N%2j2ur3I@k8?&`p~?cOuKtXql@=RZhNd)s zB?Oj(qq%$P$|wfl$R16Eo;p^h&T>$gXmn~5l3IsL;*q8}wTZHDEtz zrj3;r7+iS@sKxZ*waZ}5EPjjtObR(M4Zl*BOfO~9D&@Q6)$l-_^$0Yd(HBIfHt$~> zu`7T!>lk6e9*A#P+~8MITy^tA_U3BH<7Oxr{iPl5&d)c+g+dLeQ>%ndM?-wywO`0R z;%@yN{J-+bHBnWOA)ZcN-_RZ&tl%Jd@$VYbCFOfyy*asUoKGdKnr78D^t?G3(#0d! z1A-jsZ#!!S^T5U;l4pZ9o?K|g`~G13ES9=NPi60!Gu;w<({o>NY7XO}B#g~LnUv9X zr;nehq<0M^rM8I%mln9+yXLA&Fu4O5N{Y74RLnWj9&s>;Bj0FlaZYNmHrzD!CAvZ{0DpxnbkrlaFT_@d@GHkS8$H=h8 zzcoX1;N%~Hip9WmqwCLVvqrLrIu-Cm5b*N$SEO*8M)B#o2g!iB=RO8Pr`e2%U7&pfdm8Ge;D=SpzEl>oH%$bayU*>BEghea1pwpPtF`0Ex}DC4}J+#dj4Cd^>JfQqUP> znN{@W=PW)bZ~NZh)3zh23UIj&(r_mS%Hx=*91niX&AL-C$N0$Cc0pcJ8*$OKA=oa3 z+a+%}oN=!G`!1G5nsolqojsR;EiaD;osm*|3~R@8On@qR5rH z!#w|RS$#zOceq~Xs?K;x^^dhgm~qtb>7FUESPIV!f%h??=7QTFHcy} zz*Vc3%!r6c-Jd8I+6qF}5*elqFmVzU<*quGMA)GFklrpLCk8)3lF*nRzPEl*d79oi z>oIxB!U*ViqSTF%uvMCb#W1?{%|03dmKr5gGWmc>RrJ(er&@^%>Q2t6DLJK@9h9dY zc+k7V!|7a!8?{<$y{)$L3sC;)v^z>Wr@KpG}0IK5d3I0sXf@nJI|>kO_-kur(azC91-94Xn) zd{p9cVulyiGXrRL;Iw=~8oHF#C9iHp^Y9`F8#)R zdt{#(Go`+0Ml6X!V2=XTw$0gU#JPn4xvT>C5jF?)W-JiHwdO0(j9C`9(s% z7mMGU&N>noCm|y@|4WqX=ucYYjmJ*&4_LDYuLpupfhVyM=o*93$*97^D@v@JYXc=9 za*oa|#9Suu>7R=hBmzGv&7-gb`0E-yZ@5H!5#%`iWu6JjB*xh|*YkG3QAYPpKacQy z-j)2gq(r%Ttbm&n1KqD@2n!{iLb*<1I6i8TIFs4*of6{X;{6lf5lIJl!Ll>jhz`er zD>acr&pEnJ*2<|DuxB-!zSxA6^T*pG4{(uJnvYR%9!~-xIIy`I?lCL3JW=j?8KCS= z!h_2$xnw;64?IQs;X}!)^my5p{^RfhI0}r6t!;-!=drks#G{0IkQ6rfutSq6 z32My=tY?<-0WBpD6y#3$=g-?A^z%N&a4fEKQa()&8p<~Z-B>(8a+lY{#_!5DU0I;v zdi1UFYEbcL0*`0C>w3XaN%xXt&PDADtzK7nEUZ^MG_OgQ0769L0tbb71#W`VeNf86%t+5&6p|&wp`82ChqG{Ee%yg@b-W|tY_uTWg^DLV zko;w|JpZJ&U%fy+JkPjvA2u+$0MmOSwGs$(;21&L9Zz10IgBaio)s5iwwLrDfF zu$5Vf7miDb<7phP2w)g-tYM5Q(Swc`TIq4-8WS82d0bd@OgE*5v-wzT@ZdgX%u11a zP~)Wb=kyZ-ZfY>0ZNXje{kt!99Y`Ziblq`y3RJRj!lF7n9bDX~a3CwYGr37dFN-~r z@U$a6o3!p?s={`f@(wjIxdVJ;=62K`DAgEX$BeCp`50ltoJD3dtr1mzN` zh9}+=d9gXM_$~TBaIy6LY_7-?)3+5*_q+u^ysvmqR^|}B1#@W@Xi2`mQ=-2^?XD?3 z4jVpuSH%FGd3_(OQEk32ru*7(Rtd52^AaXsb+VHN&y;V|XT(Xr79@(b?l_FO60j4h zQu7q`gfJ}XX0X?mh2zuZ#Rsf{w-pP0bFDnw4S`^+iWmCVfe9HmLO_p|nHIMdtFN5D z``<+}=9~l|p0^AD?>Sw}-bY9abJn|w0{EGPXhL-EM3EzTW)NMxn7_^vV>w4L2P(g=92bkYF@aJYuKgUxcZN_9ZBYVs)4^=o?zc zKEX?f=#WxPT5I#>2A+GGLYCQfxJL97BTLcMNS??{$%okDYQYOnPwYTR^4eITC=P#{40&B70d2#DI%mOTDqJNclIqVI$99O((%&>fjwtv5buNNKABkucZhDhaC zliieaef28Z-Iaceitq*+os_O@9*JD(mnW_ z$>UB~(Q;C1F}9JhvD8m?*Q=uj$K7?6=ckrpPt}zO zca!zDjViAd0!LezO%N&H;Fu_Iw3Gd8xETpCw|+mKgMii=B&!g^z?Mhu8@cXT$(ANDsO{J;=4K69&Ow-da6Y{#Ni@zK)5MF#?*vDHt(|19N-hRCI6R2!cMzwCbV5$2 zrcVhtrB-)8&0EGGx*b+?@($jG(5dEW8EX8N6~eE>;66YJ(1(Mj&JMI@R_t2vXW=6t zw=ZZ|K3SfTWnf`wluQ}QDce8u50=gFf54wzic}}&PG^%k-M!GyjMx<7aBa*@asY}MjrPb@6D9QUTJbd2GbgkBQo$4pwdS|Q&>#!r z@RUx3oD&sq+g7K3C4tS~IHOaLjHcj}(Z#?U`|V+|bng)sab!WhGdfMUn>eLGyylMg ztWQGN!JM}4O>(42HalHtW`lrPlF>j=xNMKH z7)>o-R*rH4#8UJs;b~Mvn4WQkMIY_Hm8#}dtk}p5Efmrn)e^K)zAl-9tz@A5&|pW% z327^BM;0)uxE{iBCK=xFln%oF;u1+cf6}N}(P+AwfI@NKtSA>KPYXs&Sk53Eq$HPD z@9-3W3-1MgnU(Q2FmAn|x+RIJ@<~@Ese0OA#rPM82#_p-qwTN_=J0h(HLEnX6BMlF}2~qz|x`|5@)7GiWq&BAvdxea` z2gfZ%I0shhr*F^+Ny`E)DpRX7&>-6?ZM{?QCqV{#1T8UWkT2zeaj~-Q%o{C#BCqnC zu&qw7LMpAzT4tzr087}0Hd{V7FG>au+RQLop|XNYCJ3uSun<=n44e~#tis!xrJ_Oz z?{loleYql>P5+V%c~EpD?gkYNN9YpF=0;@g+@XaKv1^d^ldUe1dyGVbxr5RfnAu~y>;@-3O}!9;o>t}$ zSaiRn8srHoYm_*agvyxl&RVS8NlG($^|uyYUvWf(JCnAz0wvUvm6{*d>aYw=*3ge< zV&SdQ-F+OkdRFe|a52N!8P=G(gc%bTM6^i1-e{aCA^MoP6Fx3NALepN64{N9V|R#< zW8y1LR{CUKEEK6=>_YP=P8iDpgcx+#RA}hC;66=Hux$Aq!Ge}e@o53tu0gw&3GH+6 zX`322>dlWc)dUVqZjcCrO+O@BjE{a_i|uK$oED{A?oh^3(y6s3r$q}94hStDZ;#L` z%OWT{LI>35lM@$ClaYli5C-V0fIS9{RRAurIqS0r? zHHF8yE7$R3k160r4(x)A7^gQ*FSyR?uCuL;zOG=3BiBDcJs^p=#>%zE?nEOqsJq6KPz)8Px(@k$v7&G;`-L8s zx*Hx(0m0c=8Vqu#z*v&@%qxrOS%++DVA1LSQWGbSOnpTfwpUz97(uo{N$qI6roN1Nxz)@3K@-03_M!ABV}`x zc))T!migE4{^sdE^Fx&a)At1Uim1TJ2yW2{Q*F)6LARK5?frt;V7!?-YebAo70;lJ z{aT$p^t%`RtUp!E$E$_t=EM(Qd61{-P4Q}iJa>TVSY#S{hP9ZY zh)=sCH-cklkpriCv~>>0xd4^*c-RyQKKNHAOTqnzsrRC0EB_?~BnJz0@a8fJZ{k0e z8@(}`36MqfuK@Nq4@mwD&L3BEgpXlpi>-%B-+A|36>E9|MXELO?bj&k>E;(v>QMjx+1=m3+l zx|I01X1f8;FMRjS2#c2ZL&9(hjMrsptTenY&JxY>>U^TFARcMJaVLpJ(!6&vg|>FV zA4uL|594?-(DRGZ2#)TZ5T6Io6~>GCykB9@v45AWdN+`$+)`Kkfcx_JOxxIp7jzlv z4sDWNK&?p>rVe*Jw`oeBgu7y6Hs;rco<`XkY%I5;;n6oulys|680mAjY48qnzGb|& z2~FAqJ7CSfLK0E=2w?3W28>>c(QSNEr74OnY~9{$CI$bT*!U-LTzIWa7c;Wg1u?+dj1 z^$Sz9cod1}3Do5-51!_3qQOumLTwss>!8D|n-bL^-Cf&!w3O0J*+uS@1L8C&sGRS9 zb*_ly0=@RG(&^2-?@tG_&*|G;_aax;G8n1IM}GSUF9!V!1T2RAV2G>*j?JcI5`7}2 zj3W&v;p1Y=W1`l%x$T+5%bxK9><cy&Tut&3JU>q zcY}Q)^vlkLz{Q3)7BZ#$4%nxJcuw!8uFmdYIL~4Aj@{4AxybR_WMbNHtS_nGE2rel zZJ-lBr~lMY4)?6!f!9gg%zxP5><^15u7Mk#J?zHK2Wt|MUU8?7a|(YO2Xov%Je<4ft}mW-#2AF71rg2 z?BqW^UqYKch2kM~yniph?|L;TqvjI{mg~{md+?wupdc=*;tgz-)~L?44M`&ymq*D5 z&mnUkNnrBM@V;k{#Y*EgaIcP9Kps;AicCLeOQN)C0~$&(PqYv$of_h@Yl_*pH>iKe z;g)k>;qEim|k|&Ho{_9W+O>*VI$y znaIi!8Ic_`pmugCAoQa=mzK)Z{S9((gc^HFOvw3G1q@klt{NdbFu)ykLxafS;N)C5 z<;{*iGC^&W4)ZHzHBa#ba-a{QnL~SRrbK{iCX@nHNkeGl_2dyKiKYO0CWqq`&(xTT zb?#)8#MY*xbzrtR?us>-G^#m<;QquNR{>f`9V|6P1|LE&-D~RfF@ft+LlrpxGF~t<-&Bqm8lePgF_$orYUh0AZ2B zJS&0Ia@tzLOiloe0XY0vVhbj2%SDn_ii7si?i~bo3pw{R(m|GPTD6@+o=G*$TBlm= zttt)RG%NsNK;)bf8{lOz=fu(>xVMLuU(bXh9 zCPUzxFPe^Cn$X`QK9;H_1s`K7o%87-xd?_lXqvoI+eD|OsqGZa$0sxYBNuEc6f6!p zd(5&1$BRITc2=@<0&F69mI_5CnA8NKy-7^wTw+17N-9dfxoCO5JGdDQK!TIk7)@=H zpeY#!s$zV-OGtlWwGkH5@5Iu;xPMRRUa*dPf1`}b%rfT`JT`R)L!cm! zoUIv;6eP-qz=pGCTJ>Nq*I5t|Qa5axLIH)TA*sqe%AEZtziLnP{kLQJv{zw4KUprIJU= zOuDx97eDXneeJAj)-H61@k7dU23lXpZR$xC$<_>YiEv?u;n=O^ip!a-xx;NZs`Xf> z`zu~n2ExEh34-bA94pq6`c2y1Iqa%b&2O7ZI{n%5ZkwZHX4uAz5@IdiJQq37Kv9*% zr}z*nU(aB?lx<5#n3jXcy0XTK-%SU!(X#rpDggiJY}O6SLxVMPGh2;fCwHzyZxa5* zm;`N|v}3;lq}uU>mYHAQqOP^=fL%>B%)4o~j`k0mqI!$jFLTAiBIug=m(0bRJp~{T zv+GVi;9y6T{|U)E*QAQ%DSW&Y73vkaW80o)U+m^X&N5%uu#`0cq`k;5?@+4YKT~b_}qn6F*7|n{^nLgtVoVq;}?ylAMrmU8eHJ&16o`qeZqhBd}NP6q@Ak_N&t2i z+JCyf;wqG8@j-5g3QICPQ%&rDn^Y-5FnaQ$@DUIG59ucc2!_rbG&Jd}!@tA2GBDEO=&!KyaPAz=6auP5=f z99UyGb2t617x>2^y(a_H|J4d8HsRKs`PAkDsUDPDW6&rtHMMv0os1VNKsHIM+WmYa zF9YWuRX$K7gkGGjXF&8kWR-b2Y&;{1Yi585q|}W)Ce(3#N@4-u#j6X$f{9??j1!n}k~@0tw3d!+7&aL3!Z4uM z$#jw~*ELmZ;}k%M<&c608Pr6qGw1VmfEjxue1EWQpFTaK=U4-u>!=oze3I z{l>|LD`)Oi(DqAbd}Y3?QEwR8|#PXSXUm`Bv+9NMmHe_`pLVO9qTeFT+d=k@rziCa1GA|Be5m zIP|+xbfeV`xWlglDi{KHEuLc-FjJ-3y^mwwgQn>#7E4bKj*EF6pmKfd@!lphs!F}m zVhqedF94wUt^)GzLen$Igz`Y0e{iq$oxq8LeFK@Am$nC| z{aU&jg6dg=QYm>3N)(4I59{1;@TPi4?5XhLQ;RX4CwT|uV`-Y$0g9S%9 zPxhjL`_XZjv*7r{r5xMOwLO84WggWmmKpz#?MC2-l-#W}H|qCxNM%VVh|5SF2&68e0if^+l(|U(lq^RxY*FKEXWRZE!1)h5-Rmvg zo5FdFpx-xYbfSXcIX1*T4c^HO^V@=&@$@)47eNi$*_D7f${Xjb2+erklh`&1KXo)j zt>Cb1rhm#+(W6{`oTw0^NcI{-94u-(tTy}YaQ-KbWqHZV{y7qcT>5@>!Pg+-EcZK< zx_u-Xoj|z+Z6}Kr7>ISbqt6tKE)w?-Z2Tabc({DhQe%g89<~6z;c;?YpdAb4o zu&I5%D`YG9f(W(>hTm^$AaK?x7Xy`6{KyUN=o|!`hKsH1Se2-O%bcvw_liJNY(3qy%ndxiC_X+A6@TG!P6|-$=<|2`uq1 z!gYTU4M$tXoMguyp}T}bt$SilcQGr)eJ44293mk_5Y4s#0Dj1y73&#({lnqCR8M^; z1w4Wv0Q~f zWxv|@3)8RjW4-Z~uDjF{#FYb;<3W0=^#ht{myBN%USF<+P(VUmg0pxEm5PX>(R_Mu z!ae@H6ZozWgzr!j8gF%`du;8Ja1geWPTF!mqr_wF1C*})f~EL39ez$Ao05Q^cW?Vo zaxj`4Z6Goi$-{9}eu!A+j>Whiho`-Mi7vF^2K-vC&(qKy4jfwF<$sWy%zhVWUn3al zKctMqbcf3%Wo5b=@JxH(nvfLe#E`JUU>f1!d?cWz@N1nH?c3|>i0Kcz?h4mmfG#pwz;85mZJ`unYy@~O7MsC*nFQ+z z5Zql>lRS0*AnDVw3zZS;mFRF4w$Y%0>`ac#eT#lCt&pe_F^c_VI@G{1eu%y?TbGT> zpbMZy{T>;wptQMwZO^%Tr>Q$I(m_lV_+~`0-yDoi%WU=Jz>Ak~?=PIMNZVo!hPdz@ zEM^~wCd1}4rP*lB2Gi}93(6-f@*=M)vyxor>f21OW^*Od7}{O1<>!&R3R-&_tcx+Z zZFa{w2x(J1J;Y*W!jebBzw@EJFhG^LN+;rCuC6!Cg2DlB79r)0d(;Qgm{rPx{)P`H zM$KO=BZkfK@9P8p@$^g)J3QsBwBpSGzPu+E_l8A-QZ5EXzzPMgI~Kd}=s6l=BmN=h zz7fbu@n|cTLNjCa0eK@s0bU>=g(^Y`2lHgM1^i%X7Dm6E7)RM90;7fSp0&>9mY~ZZ z`;bsWq=q5O3jt%J)sB*{w`RPt{vDuzudHL9A~P3#9@m5g4%xs3Xf(8c#Z(Qa&Vc|| z@i^6L94q%*(ORt)1}!Qo5~^5)`D|)w3Cpdq4{r_*mVT|3XbEqaVY$Vq-i{KUjAm`r z<_?^?(qlI9vIsV$G~QDt>Pbi7uIe@}xF*r^hQIlV=%>Taz&gcH!k*uOI~IcH3Y92h z#2n|E5yjDz?$=B!;8Ov-@Q33i=+?qT@P%7Bm-jKy=9`1;@U(A5jR(s&E~nNaZIwer zi!ZhZ3%vEY&wpvFvEXj_CO=vjmP`_#pXNYK{|tZ67S%&W3wL;FVh^2Ms>pQ5ly+k9 zyYB7`8ix|fiP~JtGlg#m*6W8o=&~0{5y7T^a>O4fI{{$Ux5bbJVR#Fi>jWNx{-3{F z`z@}2OVho!7Sh(a*yDBLwg^r84lo}Ed8P@}W6zP)5QpjF;AhP{S~6<&`!X61?xeK3 z{qu{dpIoRSb4}7UJREvzAuYQf?5VTTloOh*DeF!b7?@HijKP?K&0(Hq(Hj@reHthS zHnr9wteDARxmki5s(>x>rwB`Qn^V)J5+TJvh9TZQ)qXJjUAmRcD!RGoSqmY>JTHXX z<77+R28pS?#7c-r1V9O1k%|>wz*Zuz)j1ij+6CCNk~VuKM+wgZ=;1s|)CgqnXm`*H zq5l*b~oP=u4I&hAN$QUg#TJ!}|I8sW7ws zT!13M&1AVxQQOLB?R+VGc?t_+Q{oUG$@ye@dPKZ=^$VSab3vARt+t#U!!Lclrkv

gG#3m(X$q5%z|9kO*Ov5G>d1PPoLO@lBP;ic>taKUc*Ns1V>GXlH+vg577!r(BYf<5kToF>%IeJ4Y6|Dzu!To@fb06vOU+DTq^sty+B#|GIEPhx4{v!xpL(w1}L?2mpF8AWM&cZ>;Cg&Wfx@O!(l*IuT6qn5|TCqbK; zQ`ED}I~ZN-_Z2+3x1g^fX&3PQ2Ta)Ie}xCDgl@x^3K2mwDHM~cl_t`!qf zbaTT8BysYmmLwPWp6;&Z5vyw0k!;gd0~k=FOW0`aX-Stdu4H~KSLk3)2D&>sGJhb+ zmOtE$YvI~6x(j>VA=^X%&|e^`BGd&P;a~t`DEIcu5Wion69# zBR1eEl!6+z-^*|Ag@8Xri`wfaFH&h|pocN=?Loqvj}A24>#8%Y(^bSj`o&h#(0b=_ zMYxdhWF@~RjU#ve+auVvO;U#!r6_k@lep$WuS@c%Aik2WP;Uv}S$n06o?c6O5Ixmf zw-bfP^T)6hG#!8mTW)W4Y^;ApPD(~x+6f0HLNg~kx}j$fob5+XD&@{5GB8r{vCza# zQJy*WMBkHEIA!MOouPl#-Uq`$p)a)&c5~GW1Y|`0yU}3du`n%_2LuEtq3t>j6+@D;>tZf0%QCfox)CtRxUTCkQM4vh_`6He#Q!2tSd!HN^5 zRW0d|oR;h(lk;{s#&idUUyvS!_QMty+p7T-(f$R(P&%DRM?3wl1a8-Nrf2&2grZB+kzna-K zFMsIj<1zd$_L!|O^;GeFnxcF5_Xm*7oBAow|se5U|$3_#U>lv7tL4 zJ6HnK^JS>Ng8}1=sF*hp(W+7xksTjpQe9A_I^EiWHa8i;NuV2@AlMiSQoW*S%paQ$ zgV*XB5^0K}Imu@X(T0TVKaPKm62oSILC@xKay4!rMvJ_7psN=$b$FzzAYe!E<%fLE z@y0~`F*-+2Nk;I75Q);hdk@VPFF-AvYQI8CbV$QEYe5TD1kceF1JSwQ&*WTcIrtQp z7=QCTFu=D=W9)EI55@1*0+hIM-s2nUiWM*&%3jE;2i^&S0zj0Z*$HB}MKY(C?|W!7 z8RaXp+BKS_@y^l=0x$?hxh&ILsNTT5J>eb=&!s~G36?vw%J0VV(w>Y z=+w$0(su>=@?YF%uk1e{%jIT^} zc_jF?+G8kEq|}4UAQPIh<=6jO?NMD8nc|;xZnk#X9reoMa)t@88*7!$yb0R6;cV7G zuJQNk8p)fbghfu@g1}#mFAEFALDq?xJI#LH5w}X7j}5~q?+1i2n?&>16RO9cS_4|@ z+{yJ!sFY-bu$tMDBCo5;Z%@aplgY0SEEQK26rQd16_QR*YaNU4H_cAr&6#OW6eYDJ zq<`vbRAd`>@xZp&50Pg3oOcV;@9e8$oE#>WtCWaPbF|P+-JivYO(t}7Xg9vGGLF@7 zgDesCCU>%1-gf@wTtbNzi?1?pLcu9h|2BoV{>vHzwFrd5FLNANkWy z+dvl<@P0r)67fGqNdW{zz0G=V?nF$N&*5*!iBPm~?_OB`PuW$wEBl(;Qs^u C_-JPU literal 0 Hc$@in~jpXmL2WySux)6nFQ79^By+cXx;4?hcpt{r>;1t21k6 zGCNsGR+4A0=Sg8L0!3{f>s zbolWDYw%0_C&c?dcWy^X!Uuw2C!y{L0fB`1&jSgOo{9GX!Z}IGh{7$yz`|lNWkal^ zLO^_hko@^W*=_lB&D{&r`R(CyflV@j&DsNkKbIa$!>lae%O<455E*<#>zCYSDS*5d zF1D(?-KB=YBf@&FvWgmps6RHA=A&W^Q2x^=I+zF|`bp@6I1ZUd!K=pCOH=pm@!W^-N}xdJP%H~dTZxt71Jn-gM}xhX9JC&G@X0a& zo=re1_?~2>aAn7+9NvDY_IF(+yq^HMO^GMojTGWe^!4{PVw z{QXzyR&sDgx1#VKaCJF;m}Mbeu(bz21)NR(4Er&YxPnusJT-7F8%FU@IhE~9-HV&H zk7>u$O1a|0KcQ5{zw*1HEX}VwF+p8S@i6fiSUaK=16X}KwIQ9Xu@P1!$#^;YVI4)^- z{^FKZJ*_`_kul==(kzZh4&7;N

UNgpM}lH-E^?^HdokGszXhsicM*lxgEWe98^ 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 literal 0 Hc$@..." to update what will be committed) + # (use "git checkout -- ..." to discard changes in working directory) + # + # modified: README + # + # Untracked files: + # (use "git add ..." to include in what will be committed) + # + # INSTALL + no changes added to commit (use "git add" and/or "git commit -a") + +#. Check what the actual changes are with ``git diff`` (`git diff`_). +#. Add any new files to version control ``git add new_file_name`` (see + `git add`_). +#. To commit all modified files into the local copy of your repo,, do + ``git commit -am 'A commit message'``. Note the ``-am`` options to + ``commit``. The ``m`` flag just signals that you're going to type a + message on the command line. The ``a`` flag - you can just take on + faith - or see `why the -a flag?`_. See also the `git commit`_ manual + page. +#. To push the changes up to your forked repo on github_, do a ``git + push`` (see `git push`). + +Asking for code review +====================== + +#. Go to your repo URL - e.g. ``http://github.com/your-user-name/ipython``. +#. Click on the *Branch list* button: + + .. image:: branch_list.png + +#. Click on the *Compare* button for your feature branch - here ``my-new-feature``: + + .. image:: branch_list_compare.png + +#. If asked, select the *base* and *comparison* branch names you want to + compare. Usually these will be ``master`` and ``my-new-feature`` + (where that is your feature branch name). +#. At this point you should get a nice summary of the changes. Copy the + URL for this, and post it to the `ipython mailing list`_, asking for + review. The URL will look something like: + ``http://github.com/your-user-name/ipython/compare/master...my-new-feature``. + There's an example at + http://github.com/matthew-brett/nipy/compare/master...find-install-data + See: http://github.com/blog/612-introducing-github-compare-view for + more detail. + +The generated comparison, is between your feature branch +``my-new-feature``, and the place in ``master`` from which you branched +``my-new-feature``. In other words, you can keep updating ``master`` +without interfering with the output from the comparison. More detail? +Note the three dots in the URL above (``master...my-new-feature``) and +see :ref:`dot2-dot3`. + +Asking for your changes to be merged with the main repo +======================================================= + +When you are ready to ask for the merge of your code: + +#. Go to the URL of your forked repo, say + ``http://github.com/your-user-name/ipython.git``. +#. Click on the 'Pull request' button: + + .. image:: pull_button.png + + Enter a message; we suggest you select only ``ipython`` as the + recipient. The message will go to the `ipython mailing list`_. Please + feel free to add others from the list as you like. + +Merging from trunk +================== + +This updates your code from the upstream `ipython github`_ repo. + +Overview +-------- + +:: + + # go to your master branch + git checkout master + # pull changes from github + git fetch upstream + # merge from upstream + git merge upstream master + +In detail +--------- + +We suggest that you do this only for your ``master`` branch, and leave +your 'feature' branches unmerged, to keep their history as clean as +possible. This makes code review easier:: + + git checkout master + +Make sure you have done :ref:`linking-to-upstream`. + +Merge the upstream code into your current development by first pulling +the upstream repo to a copy on your local machine:: + + git fetch upstream + +then merging into your current branch:: + + git merge upstream/master + +Deleting a branch on github_ +============================ + +:: + + git checkout master + # delete branch locally + git branch -D my-unwanted-branch + # delete branch on github + git push origin :my-unwanted-branch + +(Note the colon ``:`` before ``test-branch``. See also: +http://github.com/guides/remove-a-remote-branch + +Several people sharing a single repository +========================================== + +If you want to work on some stuff with other people, where you are all +committing into the same repository, or even the same branch, then just +share it via github_. + +First fork ipython into your account, as from :ref:`forking`. + +Then, go to your forked repository github page, say +``http://github.com/your-user-name/ipython`` + +Click on the 'Admin' button, and add anyone else to the repo as a +collaborator: + + .. image:: pull_button.png + +Now all those people can do:: + + git clone git@githhub.com:your-user-name/ipython.git + +Remember that links starting with ``git@`` use the ssh protocol and are +read-write; links starting with ``git://`` are read-only. + +Your collaborators can then commit directly into that repo with the +usual:: + + git commit -am 'ENH - much better code' + git push origin master # pushes directly into your repo + +Exploring your repository +========================= + +To see a graphical representation of the repository branches and +commits:: + + gitk --all + +To see a linear list of commits for this branch:: + + git log + +You can also look at the `network graph visualizer`_ for your github_ +repo. + +.. include:: git_links.txt diff --git a/docs/source/development/gitwash/dot2_dot3.txt b/docs/source/development/gitwash/dot2_dot3.txt new file mode 100644 index 0000000..7759e2e --- /dev/null +++ b/docs/source/development/gitwash/dot2_dot3.txt @@ -0,0 +1,28 @@ +.. _dot2-dot3: + +======================================== + Two and three dots in difference specs +======================================== + +Thanks to Yarik Halchenko for this explanation. + +Imagine a series of commits A, B, C, D... Imagine that there are two +branches, *topic* and *master*. You branched *topic* off *master* when +*master* was at commit 'E'. The graph of the commits looks like this:: + + + A---B---C topic + / + D---E---F---G master + +Then:: + + git diff master..topic + +will output the difference from G to C (i.e. with effects of F and G), +while:: + + git diff master...topic + +would output just differences in the topic branch (i.e. only A, B, and +C). diff --git a/docs/source/development/gitwash/following_latest.txt b/docs/source/development/gitwash/following_latest.txt new file mode 100644 index 0000000..475e092 --- /dev/null +++ b/docs/source/development/gitwash/following_latest.txt @@ -0,0 +1,36 @@ +.. _following-latest: + +============================= + Following the latest source +============================= + +These are the instructions if you just want to follow the latest +*ipython* source, but you don't need to do any development for now. + +The steps are: + +* :ref:`install-git` +* get local copy of the git repository from github_ +* update local copy from time to time + +Get the local copy of the code +============================== + +From the command line:: + + git clone git://github.com/ipython/ipython.git + +You now have a copy of the code tree in the new ``ipython`` directory. + +Updating the code +================= + +From time to time you may want to pull down the latest code. Do this with:: + + cd ipython + git pull + +The tree in ``ipython`` will now have the latest changes from the initial +repository. + +.. include:: git_links.txt diff --git a/docs/source/development/gitwash/forking_button.png b/docs/source/development/gitwash/forking_button.png new file mode 100644 index 0000000000000000000000000000000000000000..d0e04134d4d086d0c78c45188848c4a0b71b157d GIT binary patch literal 13092 zc%0q4Q*b8E6E+&#w%*vbjg4(Jtv zkc=!G5D*d&8F3LcchF0HXfL(Fr!QBo%*_V*PzabH1sMG}N*FARAZSHUVz{yu6!-wG z?*JI;w<2n?01R(GBVi9{(m7J$GJob;EyNnmuQa|Fqygc zKjTArX-`P zkd-y@#SiP_vXo3TgOVb zozy}V`ZRr_W^d1^r>FOYo81}eK@%?xv4P`*8T^iG8Y3n#*Zn+4N5^($&>~k?uSIVp zYE(gttS;uaJ9JY)y>X4>Oh7y5=gHK`%DSI&)k(#*1&9HW+7XoWOT6-?*Ar}*Lme3( z@2~jV6>&J83f~?-=e*fni_K&J@xGt$in4PR+#bZ|Ob1-<%MR4Vy|}_Km28{f=(U#` zF=I`eJo41gSd8vZXS1xank5rqPNY(lYJS;BB&7 z58-h>g7Li&U}LNA%Q^j9Dc0@t$?T(^zvyKCNKR`12x%95cugOOs~L0A69aIho<7g8 zyk6ftAI^Tv*^JU^vQ1awW@m5EljE}AqykGp*e~!^$5$m<>Rc!OG&F>+I+%LX(=SFt zM~5GpI@7B&gJor99UBz3()ESRePD_a={DZ4y)tup)o0TiXjilUkS)m#>OcRSb@=#$ z#(iKs-%fEx*%8|H#WA(Pnri49U8JF~T``Agf2sjl_2-}}sJLR*s>Zk7T+HIGfbcs_ZA zj%D|O%ehAM4h`zj0Wq`oA>6qBS$_9W{*zgwlQ@~juM%QNLaJ!~^yad8d+%(q0*B24 z;qBp6)#xzAA{z(sRn#%JNq=_Bu;VS&jg8pgU% zLF^MSBTzBB)Eae|`j#Vgh!Eg2Ht_Z+TLuGd1B%3H^~*#o-#b?r&~}rEN$9W2(tfkG z@U-&1FDzXZ6SL4)pYUc-X^A-!m1xh>@bhXsnNAZTmn;)OL_{Qw!v<@mQg%i(Y56P`|!t@cxq(PqkqU^4m>eNV%$a;qhTmCkdB4!p;nf%M!0?;%RB zx*HfMA9n2ii~*w~&wFD}E3}em>&Q++?*R3)skHk;YO_oIkk$JBIPpcUGj^1HsxGko zt8}eu3%jbGcX%D6CHzg4?(Dls)cZycGlZ=SW~_xGlqRNJ|C>Nh$JGkbp&wb{j-LUS zG#u~LvMo#ntoxf?Gzx=N(5QIo~eoT1ox!J)Q#9?>NtQ^9_z z{kL9K;?V1@?7#;LafRV8@yK+c9)0RkKQxOAU4C?%>CK)%(-Kp?YrlfYjYT(CYv0}g zNT8DwnjY;%QZ^)~Yl#1-+Sl2I>?(y_=ze#7Zs3B+;41~wZt|frcdAj4?uO`(&7VCD z4no54=0s1QZmgUuA*NgH5<^s+nrArKu*9%!yYsJx1;vY^+*G^s(7C+^cAUZxb}e

24g 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 literal 0 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 literal 0 Hc$@ + +If not set with options, the repository name is the same as the + +If not set with options, the main github user is the same as the +repository name.''' + + +GITWASH_CENTRAL = 'git://github.com/matthew-brett/gitwash.git' +GITWASH_BRANCH = 'master' + + +if __name__ == '__main__': + from optparse import OptionParser + parser = OptionParser() + parser.set_usage(parser.get_usage().strip() + USAGE) + parser.add_option("--repo-name", dest="repo_name", + help="repository name - e.g. nitime", + metavar="REPO_NAME") + parser.add_option("--github-user", dest="main_gh_user", + help="github username for main repo - e.g fperez", + metavar="MAIN_GH_USER") + parser.add_option("--gitwash-url", dest="gitwash_url", + help="URL to gitwash repository - default %s" + % GITWASH_CENTRAL, + default=GITWASH_CENTRAL, + metavar="GITWASH_URL") + parser.add_option("--gitwash-branch", dest="gitwash_branch", + help="branch in gitwash repository - default %s" + % GITWASH_BRANCH, + default=GITWASH_BRANCH, + metavar="GITWASH_BRANCH") + parser.add_option("--source-suffix", dest="source_suffix", + help="suffix of ReST source files - default '.rst'", + default='.rst', + metavar="SOURCE_SUFFIX") + (options, args) = parser.parse_args() + if len(args) < 2: + parser.print_help() + sys.exit() + out_path, project_name = args + if options.repo_name is None: + options.repo_name = project_name + if options.main_gh_user is None: + options.main_gh_user = options.repo_name + copy_replace((('PROJECTNAME', project_name), + ('REPONAME', options.repo_name), + ('MAIN_GH_USER', options.main_gh_user)), + out_path, + options.gitwash_url, + options.gitwash_branch, + cp_globs=(pjoin('gitwash', '*'),), + rep_globs=('*.rst',), + renames=(('\.rst$', options.source_suffix),))