# Hypha developer tips

## Git configuration and commands

To avoid spurious merge commits use a rebase workflow when appropriate.

Set this to always use rebase when pulling in updates in a branch.

```shell
git config --global branch.autosetuprebase always
```

When updating a feature branch with new commits from the main branch use `rebase` and not `merge`

```shell
git switch feature-branch-name
git fetch origin
git rebase origin/main
```

To update the feature branch on GitHub you then need to do a forced push. Instead of `--force` use `--force-with-lease`. If someone have made changes to the branch that you do not have locally you get a warning. It is a good habit to always use `--force-with-lease`. One day it will save you from a bad mistake.

```shell
git push --force-with-lease
```

## Postgres snapshots/restore

Hypha dev requirements contain the [dslr](https://github.com/mixxorz/DSLR) tool. Use this for fast snapshots and restores of the postgres database.

Perfekt when testing migrations and other times when you need to reset the database or switch between databases.

Take a snapshot, you can have as many as you like.

```shell
dslr snapshot name-of-the-snapshot
```

Restore the snapshot.

```shell
dslr restore name-of-the-snapshot
```

Delete a snapshot you no longer need.

```shell
dslr delete name-of-the-snapshot
```

List all your snapshots:

```shell
dslr list
```

## Commands in Makefile

This is the one stop place to find commands for runiing test, build resources and docs, linting and code style checks/fixes.

## Coding style and linting in pre-commit hook

Hypha's coding style is enforced by ruff and prettier and comes pre-configured with prettier.

Install pre-commit to auto-format the code before each commit:

```shell
pre-commit install
```

## Editor extensions

If you editor does not a Language Server Protocol (LSP) preinstalled make sure to add the plugin for it. Then add "LSP-ruff" for a fast Python linter and code transformation tool.

Your editor most likely have plugins for the other languages Hypha uses as well, css/scss, yaml and html. We recoment to install them as well.

## Shell configuration

In the shell you can press the up arrow to see earlier (history) commands. It is possible to bind this to history search.

You can then e.g. write `git` and then press the upp arrow and see the commands from your history that start with `git`. So useful and intuitive that it should be the default.

For zsh:

```shell
# Settings for history function
HISTFILE=$ZDOTDIR/.zsh_history
HISTSIZE=75000
SAVEHIST=70000
setopt append_history
setopt extended_history
setopt hist_expire_dups_first
setopt hist_ignore_dups
setopt hist_ignore_space
setopt hist_reduce_blanks
setopt hist_verify
setopt inc_append_history
setopt share_history
autoload -Uz up-line-or-beginning-search
autoload -Uz down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search

# Bind up/down arrows to history search.
if [[ $OSTYPE == darwin* ]]; then
  bindkey '\e[A' up-line-or-beginning-search
  bindkey '\e[B' down-line-or-beginning-search
else
  bindkey "${terminfo[kcuu1]}" up-line-or-beginning-search
  bindkey "${terminfo[kcud1]}" down-line-or-beginning-search
fi
```

For bash:

```shell
# Settings for history function
export HISTFILESIZE=50000
export HISTSIZE=50000
export HISTCONTROL=ignoreboth:erasedups
export HISTIGNORE='\&:e:c:l:ca:cd:cd -'

# Make history work well with multiple shells
# append to the history file, don't overwrite it
shopt -s histappend

# Bind up/down arrow to history search
bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
```