From 1ea4364765a6dea4fa7342e8e361918afc6d15db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Verschelde?= Date: Sun, 7 May 2017 22:12:51 +0200 Subject: [PATCH] Add contributing docs on the PR workflow (cherry picked from commit 84538955e04bd0354b1ef869d8edd4d49d0b28e6) --- community/contributing/index.rst | 1 + community/contributing/pr_workflow.rst | 409 ++++++++++++++++++ community/contributing/ways_to_contribute.rst | 8 +- img/github_fork_button.png | Bin 0 -> 5187 bytes img/github_fork_make_pr.png | Bin 0 -> 12478 bytes img/github_fork_url.png | Bin 0 -> 4712 bytes 6 files changed, 414 insertions(+), 4 deletions(-) create mode 100644 community/contributing/pr_workflow.rst create mode 100644 img/github_fork_button.png create mode 100644 img/github_fork_make_pr.png create mode 100644 img/github_fork_url.png diff --git a/community/contributing/index.rst b/community/contributing/index.rst index c00c5728f..1e24a4790 100644 --- a/community/contributing/index.rst +++ b/community/contributing/index.rst @@ -6,6 +6,7 @@ Contributing :name: toc-community-contributing ways_to_contribute + pr_workflow bug_triage_guidelines doc_and_l10n_guidelines updating_the_class_reference diff --git a/community/contributing/pr_workflow.rst b/community/contributing/pr_workflow.rst new file mode 100644 index 000000000..5c15a01e8 --- /dev/null +++ b/community/contributing/pr_workflow.rst @@ -0,0 +1,409 @@ +.. _doc_pr_workflow: + +Pull request workflow +===================== + +.. highlight:: shell + +The so-called "PR workflow" used by Godot is common to many projects using +Git, and should be familiar to veteran free software contributors. The idea +is that only a small number (if any) commit directly to the *master* branch. +Instead, contributors *fork* the project (i.e. create a copy of it, which +they can modify as they wish), and then use the GitHub interface to request +a *pull* from one of their fork's branch to one branch of the original +(often named *upstream*) repository. + +The resulting *pull request* (PR) can then be reviewed by other contributors, +which might approve it, reject it, or most often request that modifications +be done. Once approved, the PR can then be merged by one of the core +developers, and its commit(s) will become part of the target branch (usually +the *master* branch). + +We will go together through an example to show the typical workflow and +associated Git commands. But first, let's have a quick look at the +organisation of Godot's Git repository. + +Git source repository +--------------------- + +The ``repository on GitHub ``_ is a +``Git ``_ code repository together with an embedded +issue tracker and PR system. + +The Git version control system is the tool used to keep track of successive +edits to the source code - to contibute efficiently to Godot, learning the +basics of the Git command line is *highly* recommended. There exist some +graphical interfaces for Git, but they usually encourage users to take bad +habits regarding the Git and PR workflow, and we therefore recommend not to +use them (especially GitHub's online editor). + +.. seealso:: The first sections of Git's "Book" are a good introduction to + the tool's philosophy and the various commands you need to + master in your daily workflow. You can read them online on the + ``Git SCM ``_ website. + +The branches on the Git repository are organized as follows: + +- The *master* branch is where the development of the next major version + (3.0, 3.1, 4.0, etc.) occurs. As a development branch, it can be unstable + and is not meant for use in production. This is where PRs should be done + in priority. +- The stable branches are named after their version, e.g. *2.0* and *2.1*. + They are used to backport bugfixes and enhancements from the *master* + branch to the currently maintained stable release (e.g. 2.0.1 or 2.1.3). + As a rule of thumb, the last stable branch is maintained until the next + major version (e.g. the *2.0* branch was maintained until the release of + Godot 2.1). + If you want to make PRs against a maintained stable branch, you will have + to check if your changes are also relevant for the *master* branch. +- There might be feature branches at time, usually meant to be merged into + the *master* branch at some time. + +Forking and cloning +------------------- + +The first step is to *fork* the ``godotengine/godot ``_ +repository on GitHub. To do so, you will need to have a GitHub account and to +be logged in. In the top right corner of the repository's GitHub page, you +should see the "Fork" button as shown below: + +.. image:: /img/github_fork_button.png + +Click it, and after a while you should be redirected to your own fork of the +Godot repo, with your GitHub username as namespace: + +.. image:: /img/github_fork_url.png + +You can then *clone* your fork, i.e. create a local copy of the online +repository (in Git speak, the *origin remote*): + +:: + + $ git clone https://github.com/USERNAME/godot + +.. note:: In our examples, the "$" character denotes the command line prompt + on typical UNIX shells. It is not part of the command and should + not be typed. + +After a little while, you should have a ``godot`` directory in your current +working directory. Move into it (``cd godot``), and we will set up a useful +reference: + +:: + + $ git remote add upstream https://github.com/godotengine/godot + $ git fetch upstream + +This will create a reference named *upstream* pointing to the original +godotengine/godot repository. This will be useful when you want to pull new +commits from its *master* branch to update your fork. You have another +*remote* reference named *origin*, which points to your fork. + +You only need to do the above steps once, as long as you keep that local +``godot`` folder (which you can move around if you want, the relevant +metadata is hidden in its ``.git`` subfolder). + +.. note:: *Branch it, pull it, code it, stage it, commit, push it, rebase + it... technologic.* + + This bad take on Daft Punk's *Technologic* shows the general + conception Git beginners have of its workflow: lots of strange + commands to learn by copy and paste, hoping they will work as + expected. And that's actually not a bad way to learn, as long as + you're curious and don't hesitate to question your search engine + when lost, so we will give you the basic commands to know when + working in Git. + +In the following, we will assume that you want to implement a feature in +Godot's project manager, which is coded in the ``editor/project_manager.cpp`` +file. + +Branching +--------- + +By default, the ``git clone`` should have put you on the *master* branch of +your fork (*origin*). To start your own feature development, we will create +a feature branch: + +:: + + // Create the branch based on the current branch (master) + $ git branch better-project-manager + // Change the current branch to the new one + $ git checkout better-project-manager + +This command is equivalent: + +:: + + // Change the current branch to a new named one, based on the current branch + $ git checkout -b better-project-manager + +If you want to go back to the *master* branch, you'd use: + +:: + + $ git checkout master + +You can see which branch you are currently on with the ``git branch`` +command: + +:: + + $ git branch + 2.1 + * better-project-manager + master + +Updating your branch +-------------------- + +This would not be needed the first time, just after you forked the upstream +repository. However, the next time you want to work on something, you will +notice that your fork's *master* is several commits behind the upstream +*master* branch: pull requests from other contributors would have been merged +in the meantime. + +To ensure there won't be conflicts between the feature you develop and the +current upstream *master* branch, you will have to update your branch by +*pulling* the upstream branch. + +:: + + $ git pull upstream master + +However, if you had local commits, this method will create a so-called "merge +commit", and you will soon hear from fellow contributors that those are not +wanted in PRs. Then how to update the branch without creating a merge commit? +You will have to use the ``--rebase`` option, so that your local commits are +replayed on top of the updated upstream *master* branch. It will effectively +modify the Git history of your branch, but that is for the greater good. + +Then command that you should (almost) always use is there: + +:: + + $ git pull --rebase upstream master + +Making changes +-------------- + +You would then do your changes to our example's +``editor/project_manager.cpp`` file with your usual development environment +(text editor, IDE, etc.). + +By default, those changes are *unstaged*. The staging area is a layer between +your working directory (where you make your modifications) and the local git +repository (the commits and all the metadata in the ``.git`` folder). To +bring changes from the working directory to the git repository, you need to +*stage* them with the ``git add`` command, and then to commit them with the +``git commit`` command. + +There are various commands you should know to review your current work, +before staging it, while it is staged, and after it has been committed. + +- ``git diff`` will show you the current unstaged changes, i.e. the + differences between your working directory and the staging area. +- ``git checkout -- `` will undo the unstaged changes to the given + files. +- ``git add `` will *stage* the changes on the listed files. +- ``git diff --staged`` will show the current staged changes, i.e. the + differences between the staging area and the last commit. +- ``git reset HEAD `` will *unstage* changes to the listed files. +- ``git status`` will show you what are the currently staged and unstaged + modifications. +- ``git commit`` will commit the staged files. It will open a text editor + (you can define the one you want to use with the ``GIT_EDITOR`` environment + variable or the ``core.editor`` setting in your Git config) to let you + write a commit log. You can use ``git commit -m "Cool commit log"`` to + write the log directly. +- ``git log`` will show you the last commits of your current branch. If you + did local commits, they should be shown at the top. +- ``git show`` will show you the changes of the last commit. You can also + specify a commit hash to see the changes for that commit. + +That's a lot to memorise! Don't worry, just check this cheat sheet when you +need to make changes, and learn by doing. + +Here's how the shell history could look like on our example: + +:: + + // It's nice to know where you're starting from + $ git log + // Do changes to the project manager + $ nano editor/project_manager.cpp + // Find an unrelated bug in Control and fix it + $ nano scene/gui/control.cpp + // Review changes + $ git status + $ git diff + // We'll do two commits for our unrelated changes, + // starting by the Control changes necessary for the PM enhancements + $ git add scene/gui/control.cpp + $ git commit -m "Fix handling of margins in Control" + // Check we did good + $ git log + $ git show + $ git status + // Make our second commit + $ git add editor/project_manager.cpp + $ git commit -m "Add a pretty banner to the project manager" + $ git log + +With this, we should have two new commits in our *better-project-manager* +branch which were not in the *master* branch. They are still only local +though, the remote fork does not know about them, nor does the upstream repo. + +Pushing changes to a remote +--------------------------- + +That's where ``git push`` will come into play. In Git, a commit is always +done in the local repository (unlike Subversion where a commit will modify +the remote repository directly). You need to *push* the new commits to a +remote branch to share them with the world. The syntax for this is: + +:: + + $ git push [:] + +The part about the remote branch can be ommitted if you want it to have the +same name as the local branch, which is our case in this example, so we will +do: + +:: + + $ git push origin better-project-manager + +Git will ask you for your username and password, and the changes will be sent +to your remote. If you check the fork's page on GitHub, you should see a new +branch with your added commits. + +Issuing a pull request +---------------------- + +When you load your fork's branch on GitHub, you should see a line saying +"This branch is 2 commits ahead of godotengine:master." (and potentially some +commits behind, if your *master* branch was out of sync with the upstream +*master* branch. + +.. image:: /img/github_fork_make_pr.png + +On that line, there is a "Pull request" link. Clicking it will open a form +that will let you issue a pull request on the godotengine/godot upstream +repository. It should show you your two commits, and state "Able to merge". +If not (e.g. it has way more commits, or says there are merge conflicts), +don't create the PR, something went wrong. Go to IRC and ask for support :) + +Use an explicit title for the PR and put the necessary details in the comment +area. You can drag and drop screenshots, gifs or zipped projects if relevant, +to showcase what your work implements. Click "Create a pull request", and +tadaa! + +Modifying a pull request +------------------------ + +While it is reviewed by other contributors, you will often need to make +changes to your yet-unmerged PR, either because contributors requested them, +or because you found issues yourself while testing. + +The good news is that you can modify a pull request simply by acting on the +branch you made the pull request from. You can e.g. make a new commit on that +branch, push it to your fork, and the PR will be updated automatically: + +:: + + // Check out your branch again if you had changed in the meantime + $ git checkout better-project-manager + // Fix a mistake + $ nano editor/project_manager.cpp + $ git add editor/project_manager.cpp + $ git commit -m "Fix a typo in the banner's title" + $ git push origin better-project-manager + +That should do the trick, but... + +Mastering the PR workflow: the rebase +------------------------------------- + +On the situation outlined above, your fellow contributors with an OCD +regarding the Git history might ask your to *rebase* your branch to *squash* +or *meld* the last two commits together (i.e. the two related to the project +manager), as the second commit basically fixes an issue in the first one. + +Once the PR is merged, it is not relevant for a changelog reader that the PR +author made mistakes; instead, we want to keep only commits that bring from +one working state to another working state. + +To squash those two commits together, we will have to *rewrite history*. +Right, we have that power. You may read that it's a bad practice, and it's +true when it comes to branches of the upstream repo. But in your fork, you +can do whatever you want, and everything is allowed to get neat PRs :) + +We will use the *interactive rebase* ``git rebase -i`` to do this. This +command takes a commit hash as argument, and will let you modify all commits +between that commit hash and the last one of the branch, the so-called +*HEAD*. In our example, we want to act on the last two commits, so we will +do: + +:: + + // The HEAD~X syntax means X commits before HEAD + $ git rebase -i HEAD~2 + +This will open a text editor with: + +:: + + pick 1b4aad7 Add a pretty banner to the project manager + pick e07077e Fix a typo in the banner's title + +The editor will also show instructions regarding how you can act on those +commits. In particular, it should tell you that "pick" means to use that +commit (do nothing), and that "squash" and "fixup" can be used to *meld* the +commit in its parent commit. The difference between "squash" and "fixup" is +that "fixup" will discard the commit log from the squashed commit. In our +example, we are not interested in keeping the log of the "Fix a typo" commit, +so we use: + +:: + + pick 1b4aad7 Add a pretty banner to the project manager + fixup e07077e Fix a typo in the banner's title + +Upon saving and quitting the editor, the rebase will occur. The second commit +will be melded into the first one, and ``git log`` and ``git show`` should +now confirm that you have only one commit with the changes from both previous +commits. + +.. note:: You could have avoided this rebase by using ``git commit --amend`` + when fixing the typo. This command will write the staged changes + directly into the *last* commit (*HEAD*), instead of creating a new + commit like we did in this example. So it is equivalent to what we + did with a new commit and then a rebase to mark it as "fixup". + +But! You rewrote the history, and now your local and remote branches have +diverged. Indeed, commit 1b4aad7 in the above example will have changed, and +therefore got a new commit hash. If you try to push to your remote branch, it +will raise an error: + +:: + + $ git push origin better-project-manager + To https://github.com/akien-mga/godot + ! [rejected] better-project-manager -> better-project-manager (non-fast-forward) + error: failed to push some refs to 'https://akien-mga@github.com/akien-mga/godot' + hint: Updates were rejected because the tip of your current branch is behind + hint: its remote counterpart. + +This is a sane behaviour, Git will not let you push changes that would +override remote content. But that's actually what we want to do here, so we +will have to *force* it: + +:: + + $ git push --force origin better-project-manager + +And tadaa! Git will happily *replace* your remote branch with what you had +locally (so make sure that's what you wanted, using ``git log``). This will +also update the PR accordingly. diff --git a/community/contributing/ways_to_contribute.rst b/community/contributing/ways_to_contribute.rst index dfc035d0d..0a878c125 100644 --- a/community/contributing/ways_to_contribute.rst +++ b/community/contributing/ways_to_contribute.rst @@ -82,8 +82,8 @@ To ensure a good collaboration and overall quality, the Godot developers enforce some rules for code contribution, for example regarding the style to use in the C++ code (indentation, brackets, etc.) or the git and PR workflow. -.. TODO. Those technical details are outlined in a specific section, - :ref:`doc_code_contribution_guidelines`. +.. seealso:: Technical details about the PR workflow are outlined in a + specific section, :ref:`doc_pr_workflow`. Testing and reporting issues ---------------------------- @@ -171,7 +171,7 @@ There are two separate resources referred to as "documentation" in Godot: :ref:`Godot API `. To contribute to the class reference, you have to edit the `doc/base/classes.xml` in Godot's git repository, and make a pull request. - See :ref:`updating_the_class_reference` for more details. + See :ref:`doc_updating_the_class_reference` for more details. - **The tutorials and engine documentation.** This is the part you are reading now, which is distributed in the HTML, PDF and EPUB formats. Its contents @@ -179,4 +179,4 @@ There are two separate resources referred to as "documentation" in Godot: to which you can contribute via pull requests on the `godot-docs `_ GitHub repository. -.. TODO. See :ref:`documentation_guidelines` for more details. +.. TODO. See :ref:`doc_documentation_guidelines` for more details. diff --git a/img/github_fork_button.png b/img/github_fork_button.png new file mode 100644 index 0000000000000000000000000000000000000000..3b3d9a574025c2cc92bb81cc86d12a17bfba8ebf GIT binary patch literal 5187 zcmb`Lr4>+MD2MKb0aO}+L11Vp0qHJj5FJ1mnxR2rfC1@l zq`O<<8DBhq!SlSh_nx)SUF)p%-TQpcKA%u^RXI{(I${6-NEPJYXaWEp7B`06#mBw- z8{GtPAEJ-)2F?IL*8cCoOXMP>2Y`ns3U8#e-P3n6JoF!qPyKqEaCd@`C|eTWn&vJi z_^H3H?Xv}Zd_2@Q)17h7@CDR8Y5UP~C=7;o@Duf%$EEGZm>M+=wg1>yp>z#*&HYLp z_0Q$(eA<(1H~gu{`zb(f;76Z+F)=JQ<<;J+=5)8Xc!dFLds`48zQ3e;cd0)a;4cXt zxt{=gaF_72r#c)8zJGU9s+I~D%?GXM;(p6!`v007e2UUA)`H!hJ1W_3afQf64l+RA zPaZW>QvFy!SrJ`l62dlK_H4*|V9W zMp`E+S;v~q)O07kMc|8!R`nFZK>WBsiUt^P1Kqz%xM(362Xh1%d^e`|nv*9c4%#3v zUas2no@ex;KF7$CeEap+dW==vBAC;52RPer1P6zWb;iJrMC_L`?!zAYRy;8(zBF?yOT?Wl`PTH z95jbMhv|azQ*(nhUtp$(CcuR6ekmqU;c$9$z~yJbo{zz6MbJg?0Y{}Nre;BUSe%4{SrEc9M&lo;@5U+9}Xj8T(V(>L6nVfwpN zFp@F<>}yI&U41X{<@o0Nwl6^_R<5EYY%kmNA z9!yC)zqnx1cOj-MR^ygMJ8ovCVW0g$)Y2A&G-K)H`Hh3=qUP{Wr?bct4Z<|cZh3f0 z!Nxb}J#)8OSJ&0H1C4xWC?RZk(_9?omlTkGkN48?JaqT3h0 zF_=jUE(mVJT#tRNp%;d)M=-qVgq@cxfWJX||D=k#db@2;9E{T< zzH$GQMOrB;J7pQ=5aaPM@Cs%zmR~ z!Fj8>nH4;r(<^KVD>~E0uAPD+KCKkFko~KP@eec!Z((F(WUpC*JyB6^V}nS1M$f0* zbhqKZL#C3q^>fe{j+JL??t0@RGxd5YnU`j_fAa^TKEds6Y<75l)FC^jdz_<^^KuD% z#X6k~7Q)hmpWzf%PUp+azfao`SCB{3Fw=bdfDKKQGf(}a>-**f8o8H`cN`KnI096y)`uR|A)|84`OYjh=~ZWeoP#>L05HpbI#u{_O5{mX2gz*{esg=KAa zo;sJm=;Y_d`jYV{;tMH_3ZG9cbg+_9;af+CZ@rp%(?vi$Su5u?!?cx zMomUAV_Wm9GnkM=&i#)eArx4}z)YsJ++2BCg;0L;3Vm1;C2F4bj|hecNP2GaV%lC; zdWZ?2R-%KNX8R%P(>5aw7ozPESwe2b1%Lhm5WIzV2?n zp+uvr>_bBZg#}Mig!QmXF}Z;d5X7N(itkQFOSWK<2*a-yC|@rxxJL03EG!|x4qjlE z`-KN6Di+sz{f&r?dqYx{kxYZS$q)7qDHefPjVHi; zPft4vsK%ik$K{^GmauGtuuJz)G~{Y!XeIEwxE;0aa#t)cFg1h^aC4)8{i&{4MTVm2 zW1%WtMJ}xQ+<@6<}S`Hp>g++k35bGgN9!1~;v zQanURSXi%|*Biamyv;Jin3k5NS42{KzV#yrapH&f zcaS9hOXe?jk&*F@rjhg1xrIIX3A(ILS(#rskpSnPeDv2VFn=d%&WAJ=l4pB=E8{J! zswluFrR97&`2rXj8NmmlmO9n0ViFUNw)sg(hi*K*h;nnEgtRLf8Yl=< z@K&O$E_jUg(Yb9-w?BZGl#J`uGzUP^1NtA3kep25hk-e0j+)NPt0l`4HzHH+WL6M!{$4Mpp!%rKQ`J-L?ZP0R7TmY-~qHn;Xn+V_ztfji#&j{H}7v zLzrYY_C`1=W$N^-tk$|;zNhhRq@-$k?~DliL?`ZeND0*RrXDOdzU7IGRPmjMw|eFm zNGSGWpx|lQXeN7ea}t1@8S<1X|-xK_@zHoNwM0~pvqD1QF_P9?jvl<(QfB;nFgjom|6GXiwinatvfa=~|m z7Gfk0(^Td-4FGMWUDksK2`qAN)w9jRaN|XDALM`P=CXAdp-tlJ!9AT{M$;ozn`ZV-$B{0udoTxBbrF zGcIT6BeuyY{*z-3%VVI;hjk2#vcfMTj^UK<2!z;44tJ&=afkn7eqQzMTdv7 zTm&oa;!3f+vZ7S@U3{d4uSomJWc*jKZzV*(ueW!8AL_3DZb8&RldP;cTZSUM`z(dChew zXl*tWTi(q;1_Bvrvc@*5Dff%WXjfELf)$^}mCJB&7?V-lVD3mX{~(Pdoo5z9>`b|k zlb^|e&IC!nwzmr1h()YD#v`jC$eJG;gPWP7zMON7Ej7}EXW@ZPrP!p zU**xmIg`xywtC5W+JwI4uf>;&`WtGqf`THl2Ps_bg$3vyR(p32udZesI9ejNz0SDw zf&x**M79nNxQ-AvhK2}naixB zekX9Y9w$iiO!>2$c~Mq1AFJ^`-(l-iW3ldeQZizOmmjq4wuQD!kT+Ynrv7JbqdGTZSU`>ttB6?t0 zhLX{MBhiyMi`(a@W=0%K1ib5aeyX^RxJ)@7(R1bg&iV2BGP3&Olz?8w5nFYz)Oltk z_h?q&$&=jBpllv}L&G<6viF&7Nr*4a*4nXJ{{=z$-)gzSy&fcN;hMpaFzS}0hdG<) zn)Hm6MGD*o+dWH8q0^?08fGjVmSt!Re8sU=Rdx7VE(?%ds{Xu?H!O@+GgQYo7M0`H zVgOdp2))$YSYH=$Iu1O8juo?J;6G2UwCNc~J|+Du?2%VgF0CvD{Ej08ajUeOI-0TQ zawHItaV)~|Q%1%-PjilwIV>wBUa-~c;! zJb?3PM_ip`^%o{6##6)#_N8O^wwo&BdN((^ITKAwCm#RMyQGMZGc#-YbL0^kiY?gK zFlmMOaAi1+$bu5*dxk9d(3lR&FpPo%cJbRSMG)e(@xlvkK0d!*(}JGtlgyT(gSmBh zYiU==zLhft2u;NGnp1#}4-AKWGO&3xZ9cF(CS?|!V6rL5&;NMSj20;!ko`LLn0(W> zFsOg&;GqYg&XFjvPI6q9SQnS@b)Ye(*VH~d@^Mpcq`Ji?8gAlyuujv8rxXg^f7%Eb zqv#GPZu9PiWAIO25uJp$2;99MXz0$3h3b>N@|6mAHQc{b?j;_TH=aJc3qd*)ws lB*2O5A2lQYKTqBgRH@fq&uzmfaa0gcfU3SJmVWp7e*lr82vh(7 literal 0 HcmV?d00001 diff --git a/img/github_fork_make_pr.png b/img/github_fork_make_pr.png new file mode 100644 index 0000000000000000000000000000000000000000..6c04ca4e2c23ece8b5cbd2c20f53adff954c9010 GIT binary patch literal 12478 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 KugYZJef&T7f~ZCS literal 0 HcmV?d00001 diff --git a/img/github_fork_url.png b/img/github_fork_url.png new file mode 100644 index 0000000000000000000000000000000000000000..154ece52f07c924b1f51eb099f40657398c74c06 GIT binary patch literal 4712 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 literal 0 HcmV?d00001