From 1e1e61a3523a728c830801a6ad802d90a3ab4c2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Otto=20Kek=C3=A4l=C3=A4inen?= Date: Wed, 25 Mar 2020 16:08:37 +0200 Subject: [PATCH] Add a CONTRIBUTING.md to make it easier for newcomers --- CONTRIBUTING.md | 121 +++++++++++++++++++++++++++++++ images/gitlab-clone.png | Bin 0 -> 14226 bytes images/gitlab-fork.png | Bin 0 -> 1109 bytes images/gitlab-request-access.png | Bin 0 -> 4183 bytes 4 files changed, 121 insertions(+) create mode 100644 CONTRIBUTING.md create mode 100644 images/gitlab-clone.png create mode 100644 images/gitlab-fork.png create mode 100644 images/gitlab-request-access.png diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..83ea34f --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,121 @@ +# Contributing to Fevermap + +We welcome all sorts of contributions: + +- Testing the development version at https://dev.fevermap.net and submitting bug reports. +- Filing new issues about new ideas, or enriching existing issues with comments, data and insight to get turn ideas into reality. +- Making new translations or updating existing ones. +- Proof-reading, all kind of spell checking and efforts to ensure our texts are crisp and documentation up-to-date. +- Contacting new potential participants and helping them learn about the project and get involved. +- Contacting governments, municipalities and health authorities to get the involved. +- All sorts of community management and facilitating that advances the project. +- Making visual designs and graphic material for coders to consume. +- Making front-end code improvements (HTML/CSS/JS) +- Making back-end code improvements (Python) +- Making infrastructure improvements (shell scripts, Docker, security) + +As you can see, coding is just one of the ways to contribute. If you don't now where to begin, start out with something small and dive deeper later :) + +Most of the collaboration is done over Gitlab, so learning the basics of Gitlab is required. At minimum you must have a Gitlab account to be able to comment the issues. + +> NOTE! Please use the search feature at https://gitlab.com/fevermap/fevermap/-/issues to check if the issue you are about to report is already reported, or discussed in some existing issue. We already have quite many things covered, so check existing issues before jumping to make new ones. Thanks for your diligence! + +## How to make a Merge Request + +The most elementary form of producing tangible things together is via Merge Requests. Our website, our logo and other visual assets, translation, text and the app code itself all reside in the code repository you are now browsing. + +For those who are new to Merge Requests, here is a basic walk-through on how to make one. + +1. Start with getting an [account on Gitlab](https://gitlab.com/users/sign_up) if you don't have one already. +2. On the [Fevermap repository main page](https://gitlab.com/fevermap/fevermap), click "Fork" to make a copy our our repository under your own Gitlab account editing. ![Gitlab Sign up](images/gitlab-fork.png) +3. Go to your own repository page (eg. `gitlab.com//fevermap`), click "Clone" and copy the SSH variant of the address, which you will need to make a local copy. ![Gitlab Sign up](images/gitlab-clone.png) +4. Open a terminal on your own computer and paste the address into the git command (requires you have [git](https://git-scm.com/) installed) so it looks like something similar to this: `git clone git@gitlab.com:/fevermap.git`. This will create a folder called `fevermap` on your own computer. +5. Enter the folder with `cd fevermap` so you can run `git` commands in it. Make a branch with a descriptive title. Example: `git checkout -b typofix/finnish-translation`. Using git branches will make later changes easier down the road. +6. Open any of the files with a plain-text editor. There are many options, one of the most popular ones is [Atom editor](https://atom.io/), but a simple Notepad type of app will also do. Do find the file and make the changes you want in the text editor. For example translation files are in directory [app/src/assets/language/](app/src/assets/language/). Edit the files you want to change. +7. Once done, save changes to version control and commit with `git commit -a`. In the text editor that opens, write a git commit message. An example could be "Fix typo in Finnish translation". Exit the text editor and the commit is made. You can inspect your commit with `git show` and `git log`. Graphical tools like `git citool` makes commit writing much easier, and `gitk --all` makes history browsing much easier, but those tools are not installed in the standard git installation. +8. Push the new branch with a new commit you made to your own Gitlab account so the change is made public. Pushing is don with `git push`. If it is a completely new branch, you need to set the upstream on the first push, e.g. `git push --set-upstream origin typofix/finnish-translation`, but after that it's just `git push` all the time for that branch. +9. Open the [Fevermap Merge Request page](https://gitlab.com/fevermap/fevermap/-/merge_requests) and click "New merge request", update the description if it wasn't automatically correct, and hit "Save" to file the merge request. Then your code is on the way into into Fevermap officially! +10. After filing a Merge Request just wait patiently for review. It can take a couple of hours or days. From the review you will either get come comments or your change will be accepted as-is. +11. Enjoy the results! + +### Rebasing a merge request + +> NOTE!: This is very technical, only for coders. + +Sometimes you might be asked to rebase on the latest upstream master for various reasons. Here are the steps how to do it: + +``` +# Initially you most likely just had your own fork cloned locally +$ git remote -v +origin git@gitlab.com:/fevermap.git (fetch) +origin git@gitlab.com:/fevermap.git (push) + +# Add the upstream master as a new remote called 'upstream' +$ git remote add upstream https://gitlab.com/fevermap/fevermap.git +$ git remote -v +origin git@gitlab.com:/fevermap.git (fetch) +origin git@gitlab.com:/fevermap.git (push) +upstream https://gitlab.com/fevermap/fevermap.git (fetch) +upstream https://gitlab.com/fevermap/fevermap.git (push) + +# Fetch latest master from upstream so your local git is aware of it +$ git fetch upstream master +remote: Enumerating objects: 5, done. +remote: Counting objects: 100% (5/5), done. +remote: Compressing objects: 100% (3/3), done. +remote: Total 3 (delta 2), reused 0 (delta 0), pack-reused 0 +Unpacking objects: 100% (3/3), done. +From https://gitlab.com/fevermap/fevermap + * branch master -> FETCH_HEAD + * [new branch] master -> upstream/master + +# Rebase your local master on the upstream master +# Use interactive mode so you can easily reword, squash, fixup or drop commits +# to make git history clean and the merge request easy to review. +$ git rebase -i upstream/master +Successfully rebased and updated refs/heads/master. + +# Push your new master on Gitlab servers. The merge request you made from your +# own master branch to the upstream master branch will automatically update. +$ git push -f +Counting objects: 6, done. +Delta compression using up to 8 threads. +Compressing objects: 100% (5/5), done. +Writing objects: 100% (6/6), 924 bytes | 462.00 KiB/s, done. +Total 6 (delta 3), reused 0 (delta 0) +To gitlab.com:/fevermap.git + + 3b3c261...c1e18c2 master -> master (forced update) +``` + +If you get this error: +``` +remote: GitLab: You are not allowed to force push code to a protected branch on this project. +To gitlab.com:/fevermap.git + ! [remote rejected] master -> master (pre-receive hook declined) +error: failed to push some refs to 'git@gitlab.com:/fevermap.git' +``` + +Then you can fix it by opening `https://gitlab.com//fevermap/-/settings/repository#js-protected-branches-settings` and click "unprotect", and try again `git push -f`. This is a bit of a hassle, but something that needs to be done if you used the master branch to make your merge request instead of a separate feature/bugfix branch. If you did step 5 in "How to make a merge request" you will not run into this problem. + +See also: https://git-scm.com/book/en/v2/Git-Branching-Rebasing + + +## How to plan and implement something + +If you are doing something small, just plan it, just implement it directly and file a Merge Request to get it reviewed. However, if you plan to do something bigger, if might make sense to file an issue about it, plan ahead what to do in the issue and wait for comments on the idea, and only then start implementing it. + +If you are working on an issue, please assign it to yourself, so people can see in the issue and in the [board](https://gitlab.com/fevermap/fevermap/-/boards) that you are working on it. + +### Joing the project on Gitlab + +To open an issue, to comment on an issue or to make a Merge Request you just need an Gitlab account, you don't need to have any special role in the project you are contributing to. + +However, to be able to assign an issue to yourself, you need to join the project to be in the pool of users that can be assigned. To join the project, go to the [Fevermap repository main page](https://gitlab.com/fevermap/fevermap) and click "Request access." ![Gitlab Sign up](images/gitlab-request-access.png) + +## How to run a local development environment + +If you have front-end skills (HTML/CSS/JS) you can easily contribute to the Fevermap app. If you have Python skills, you can help with the API server. In both cases you will benefit greatly from running the local development environment, based on Docker containers. + +Local development makes things smooth, since every time you make a change and save a code file, the servers will automatically restart and the browser window will automatically reload, so you always see the latest version of your changes. + +To spin up a local development environment, simply run `docer-composer up --build` in the project root. diff --git a/images/gitlab-clone.png b/images/gitlab-clone.png new file mode 100644 index 0000000000000000000000000000000000000000..4ee37f8b1ea79a5de204158b79ce72a2d11e7279 GIT binary patch literal 14226 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 literal 0 HcmV?d00001 diff --git a/images/gitlab-fork.png b/images/gitlab-fork.png new file mode 100644 index 0000000000000000000000000000000000000000..ac74784b0de2efb984f6c8e2028c19c145b7a9ea GIT binary patch literal 1109 zcmeAS@N?(olHy`uVBq!ia0y~yU?^o^U{K>=W?*1AdqCwn0|S#xfKQ049tfD|>1CMc z>6z%6n3#B&n1q^Gdze_)m^k{HxJQ||x0`rmnE3XZge))#ookY~+$3?Wm7boJm5H@u zzIDb1M{5&D#|+1e#g6$K+)dowO%mO6m%BHdb#FiGVQu1J9qnOV>S0~u(R9kA^P;bb zp07!wZ|>R<6UPuM-;jp2A??RQde4T;x*Tef5o+xhW#t}ik`%r8UQ*Ncq*bre9Zk}E zccm{lo?#N2(b<&i>zE(ySi1K|>E8cU?p9S%?p13qR~>j;bL3-PO-;k`&rN>TO{YG# zHaEAmw6wdMwELR0pZ(l<59r_G?vX=&G9Nwdp2npZ!|5X3e^_Yd75czv1KmZCkf)&o|kg@3{T- z|Ls5i?=5xQw|DQ6AODa1zkclK(c{Z=kFRYwe);n8Teprsczd?p{p_z_=gywJ`0@Yc zcK6G@zL$Ufx_0f_tyv+rjxV_N?Ag5y8TanpyZ7V&z5o9oEQosW>(`SF`A`1;fBN+4 zv$cuO4)i{I_UzfOU(cUCd;a|Six)3m@2z?L`t{r6y>D+Fc=ztz`*-g?{`mj-Z2RY1 zYd?Sf{Q1|fZ{NOs|Ni~Q_KY9@|NlDM{_Aq@uUoTzy*=>j?eSlq&;I)L?ANcizkdDt z{rmU-i%tLU&Hevm@&DJS{(s!?|Kq9uA20s@c>VwX>;M11{{R2u|NlS!|NsBN>D?{{ z2F5R*E{-7)hm&vE2s9*KxfU4R-n{m-+Se_C9KSk)uUX3`zFu-Kb;_=Nxtf6qY5z-h zteqz?=HVQteQSjmU)kMo z#iUwMuU*pR#;vz+-pDX6QEo8FyT6Wq!_nl|PVr)ijtkay+oW=RUJ}!>p>)%3;~SGT z&z*ZWS=A609#rBpIE|D=*jCn7^vaET|YxBc7p);K)#WyaH zNqHUf^2bu|M=70NzV9wnl-}>zAnLQeduqCQ-VK}C$7dO0=9H&%wn`oj>xdU!SZBIQ*i$_vTR8ve zrKMME&br*1)fD99kb8H6+RY7S5tV#5t})!^ow;Z&OU~T&iE+`%tGrV<$`?-)_+TQV z%;tAkAliI=p{df8SypRiSe~8Lxn-+JMz-kR*K-71wn^SImED^oJ45Wufi2hAmZf@? j8)Us+vDW!+7=x%p;Kax~;;R@K7#KWV{an^LB{Ts5o5oS? literal 0 HcmV?d00001 diff --git a/images/gitlab-request-access.png b/images/gitlab-request-access.png new file mode 100644 index 0000000000000000000000000000000000000000..bdc6a60e087d59facc579533840b4a14fcfe09ca GIT binary patch literal 4183 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 b^8e%ON24^7zeO=HFfe$!`njxgN@xNA#ZAr8 literal 0 HcmV?d00001 -- GitLab