Git Cola Development
This garden file sets up a development garden with the latest version of Git, Git Cola, qtpy and vx.
Run the following commands to see this in action.
# Create a directory we'll clone and build a few repositories.
mkdir -p cola && cd cola
# Download and audit the garden file we're going to run.
wget https://gitlab.com/garden-rs/garden/-/raw/main/doc/src/examples/git-cola/garden.yaml
cat garden.yaml
# One-time setup: Clone all of the repos in the "cola" garden and use a custom
# "garden grow" is a garden built-in command that clones.
garden grow cola
# "garden setup" command defined in "garden.yaml" to initializes the environment.
garden setup cola
# All set! Now we can run Git Cola from the development environment.
garden run
# Daily development workflow: run tests in each repository in-place.
garden test cola
# Commands can be passed to the underlying "run" command to run Git Cola
# against any Git repository.
garden run -- --repo path/to/any/git/tree
# These projects don't need to be "built", so this is technically a no-op.
# A Rust or C++ Rust project could use something like this to run "make"
# in each repository.
garden build cola
The development repositories are now in your current directory and a
development virtualenv is present in the ./dist
directory.
garden.yaml
The following is the contents of the garden.yaml
file used in this example.
# Create environments for developing Git Cola against development versions of Git.
#
# The following gardens are defined: "cola", "cola/main" and "cola/next".
#
# The "cola" garden runs git-cola using the "git" command from your $PATH.
# The "cola/main" garden runs git-cola using git.git's "main" branch.
# The "cola/next" garden runs git-cola using git.git's "next" branch.
#
# One-time Setup:
#
# * Clone repositories and create worktrees:
#
# garden grow cola/main cola/next
#
# * Initialize git-cola's Python virtualenv environment.
#
# garden setup cola
#
# Development workflows:
#
# * Build the "cola/main" garden using git.git's "main" branch:
# garden build cola/main
#
# * Build the "cola/next" garden using git.git's "next" branch:
# garden build cola/next
#
# * Run Git Cola
# garden run
#
# * Run Git Cola on the git/next and git-cola trees using the cola/next garden environment:
# garden run --trees git/next cola/next
# garden run -t git-cola cola/next
#
# * Open a shell for running Git Cola in different enviornments
# garden shell cola/main
# garden shell cola/next
#
# * Run just Git Cola's tests in each environment.
# garden test/cola cola
# garden test/cola cola/main
# garden test/cola cola/next
#
# * Run tests for all projects in each environment. Also runs Git's testsuite.
# garden test cola
# garden test cola/main
# garden test cola/next
# The following variables are used in the custom commands below.
variables:
# A virtualenv is created in the ./dist/git-cola/env3 directory.
prefix: ${GARDEN_ROOT}/git-cola/env3
jobs: $ nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 8
commands:
add-all: git add --update
diff: GIT_PAGER= git diff --patience --color-words "$@"
lol: git log --decorate --graph --oneline "$@" && echo
run: vx ${prefix} git cola "$@"
status:
- git status --short
- git branch
templates:
bin:
environment:
PATH: ${TREE_PATH}/bin
python:
environment:
PYTHONPATH: ${TREE_PATH}
makefile:
commands:
build: make -j ${jobs} prefix="${prefix}" all "$@"
install: make -j ${jobs} prefix="${prefix}" install "$@"
test: make -j ${jobs} prefix="${prefix}" test "$@"
doc: make -j ${jobs} prefix="${prefix}" doc "$@"
trees:
# git/main is the parent worktree that shares its .git storage with the child
# git/next worktrees using "git worktree" -- https://git-scm.com/docs/git-worktree
git/main:
url: https://github.com/git/git.git
templates: makefile
environment:
PATH: ${TREE_PATH}/bin-wrappers
# git/next is a "git worktree" for git.git's "next" branch.
git/next:
worktree: git/main
branch: next
# git-cola's worktree can be reused alongside any of the git/* trees defined above.
git-cola:
url: https://gitlab.com/git-cola/git-cola.git
templates: [bin, python]
commands:
setup: garden dev
test/cola: garden test "$@"
install: garden -D prefix="${prefix}" install "$@"
test: garden test "$@"
doc: garden doc "$@"
qtpy:
description: Qt abstraction library used by git-cola
url: https://github.com/spyder-ide/qtpy.git
templates: python
setup: vx ${prefix} pip install pytest-qt
vx:
description: Utility for activating Python virtualenvs
url: https://gitlab.com/davvid/vx.git
depth: 1 # Create a shallow clone using "git clone --depth=1"
environment:
PATH: ${TREE_PATH}
commands:
test: make test
# This tree allows the "run" command to be run from any directory.
cwd:
path: ${PWD}
groups:
cola-repos-grp:
- git-cola
- qtpy
- vx
gardens:
cola:
groups: cola-repos-grp
environment:
PATH: ${prefix}/bin
cola/main:
groups: cola-repos-grp
trees: git/main
environment:
PATH: ${prefix}/bin
cola/next:
groups: cola-repos-grp
trees: git/next
environment:
PATH: ${prefix}/bin
Pre-defined Custom Commands and Ad-Hoc Commands
Included in garden.yaml
are a few few helpful commands that give us a quick
view of what's going on in each tree:
garden diff cola
garden status cola
garden lol cola
If we want to perform git stuff (like fetch the latest changes), we can
always use garden exec
to run arbitrary commands:
garden exec cola git fetch --verbose
# When needed, we can hop into a shell with all of the environment variables set
garden shell cola
Self-contained installation demo
The garden run
example runs git
and git cola
in-place in their
respective trees. The git-cola
project is not installed into the ./dist
directory.
It contains just the virtualenv created needed to run it.
In order to create a self-contained installation to run the tools
independently of their source repositories we have to install them into the
./dist
directory.
The following example installs Git and Git Cola into the ./dist
directory
by running the "make install" targets in each repo:
garden install cola
Now we can test the installed tools directly by adding ./dist/bin
to our
$PATH
, or just invoke the script directly:
./dist/bin/git-cola
Voila, we now have a fully functional development environment with PyQt5, qtpy and Git Cola ready to go for development.