## Cheat sheet for working on your own project based on MnMS repository
This guide is relevant for MnMS users and developers if:
* one plans to develop her own scenario using the original features of MnMS while saving her code in a github private repository and beneficiting from the last updates made on the original repository
* one plans to develop custom/unofficial features for MnMS while saving her code in a github private repository and beneficiting from the last updates made on the original repository
Official developpers of MnMS working on approved features can directly work on a branch of the original MnMS repository. However, some sections of this guide can help the onboarding of new developpers.
### Create a private fork of the original MnMS repository
First step to have your code safely hosted on github is to create your fork of MnMS. As classic forks of public repositories are public, you can follow these steps to create a private fork and keep you code secret for the Internet. Note that if you want to make your science open, you can change the visibility of a private repository to public at any time.
1. Create a bare clone of the MnMS original repository
````bash
git clone --bare https://github.com/licit-lab/MnMS.git
````
2. Create a new private repository on Github (check this [guide](https://docs.github.com/fr/repositories/creating-and-managing-repositories/creating-a-new-repository) if required) and name it according to your needs, with a different name than MnMS to not mix up. We choose **MyMnM** for this guide.
3. Open a terminal, go to the location of your bare clone and mirror-push your it to your new MyMnMS repository.
````bash
cd MnMS.git
git push --mirror git@github.com:<your_username>/MyMnMS.git
````
4. Remove the temporary local repository you created in step 1
````bash
cd ..
rm -rf MnMS.git
````
5. Clone you MyMnMS repository on your machine in the location of your choice (here we choose `~/Documents/Github_Project/`)
````bash
cd ~/Documents/Github_Project/
git clone git@github.com:<your_username>/MyMnMS.git
````
6. Add the original repository as remote to fetch (potential) future changes. Disable push on the remote.
````bash
cd MyMnMS
git remote add upstream https://github.com/licit-lab/MnMS.git
git remote set-url --push upstream DISABLE
````
With `git remote -v` command in the terminal, you should see all your remotes: `origin` should designates your private fork and `upstream` should designates the original MnMS repo (check that push is well DISABLE for upstream!)
(Written from this [post](https://gist.github.com/0xjac/85097472043b697ab57ba1b1c7530274))
N.B.1: If new commits have been pushed on `develop` branch of the original MnMS repository, you can get them into you private fork with the following commands:
````bash
git checkout develop
git pull upstream develop
git push origin develop
git checkout feature/nameOfFeature
git rebase develop
git push origin feature/nameOfFeature --force-with-lease
````
During the rebase, you may have to solve the conflicts with your own code. Follow git instructions if this happens.
N.B.2: To commit and push your local modifs on your branch of you repo, you can follow these commands if you're working with someone else:
````bash
git stash
git pull origin feature/nameOfFeature --rebase
git stash pop
````
Resolve the eventual conflicts. For each of the files you want to commit and push:
````bash
git add pathToFile
````
Commit and push:
````bash
git commit -m'Commit message describing your work.'
git push origin feature/nameOfFeature
````
If you're working alone on the repo, the pull command is not necessarily relevant.
### Install a new env for running code of your private fork
Working within environment is a good practice, and having a dedicated environment for you own code is preferable as you may need additional modules compared to the origin MnMS code.
1. As `develop` branch is the most updated one, checkout this branch and create+checkout your own working branch from it. If you plan to work on a new feature, you can name your branch `feature/nameOfFeature`. If you want to work on a new scenario/example, you can name your branch `scenario/nameOfScenario`. You'd better choose a meaningful name.
````bash
git checkout develop
git checkout -b feature/nameOfFeature
````
2. As we want to work within a dedicated conda env, change the name of the dev environment. Open the file `conda/dev.yaml` and change the line `name: mnms` to `name: MyMnMS`. Save the file.
4. Create and install the dev environment.
````bash
conda env create -f conda/dev.yaml
conda activate MyMnMS
python -m pip install -e .
````
You can install additional module whenever you want in this environment with conda or pip after having activated the environment. For e.g., to install the modules to be able to work in a jupyter notebook, do:
````bash
conda activate MyMnMS
conda install -c anaconda ipykernel notebook
````
5. MnMS requires HiPOP, which is the module for high performance shortest paths computation. Go back to `~/Documents/Github_Project/` and clone HiPOP repository. Similarly to MnMS repo, the most updated branch of HiPOP is `develop`so you can checkout it.
````bash
cd ..
git clone https://github.com/licit-lab/HiPOP.git
cd HiPOP
git checkout develop
````
6. Install the necessary modules to compile C++ code and wrap it to python. Then, install HiPOP.
````bash
conda install -c anaconda cmake
conda install pybind11 -c conda-forge
cd python
python install_cpp.py
python -m pip install .
````
7. Now, you should be able to launch simulations. You can test your installation by launching one of the examples provided in MnMS. For e.g.:
````bash
cd ../MyMnMS
python examples/manhattan_full_simulation/run.py
````
Alternatively, you can launch the tests with:
````bash
cd ../MyMnMS
pytest .
````