MyNixOS website logo
Description

Maintain per-branch checklists in Git.

Manage lists of TODO items for private branches from the command line. No configuration required and fast to learn, with human-editable storage format and comprehensive help information.

Git Checklist

I was juggling lots of private git branches at work and making some use of the branch description file (see git branch --edit-description) to store my notes for each branch. This was good for me because the descriptions aren't committed to the branch so they would never make it upstream (even by accident). However managing the TODOs themselves was pretty unwieldy.

And so was born git-checklist, though in actual fact I've aliased it to git todo. Assuming it's in your path:

$ git config alias.todo=checklist

Otherwise, like this:

$ git config alias.todo=!/path/to/git-checklist

Using It Is Easy

To view your TODOs, just enter the bare command from a git repository:

$ git todo

Well, if you've not got anything to do yet, it won't have anything to show you. Find out where to go next:

$ git todo --help
Usage: git-checklist [COMMAND]
  Per-branch TODO list for Git repositories

Available options:
  -h,--help                Show this help text

Available commands:
  show                     Show current TODOs
  add                      Add a TODO
  done                     Mark a TODO as done.
  undo                     Item needs redone!
  remove                   Remove a TODO (can't be undone)
  stats                    Summary statistics of checklist

It will give you a summary of the commands you can enter at this point. There are no entries yet so all you can do is add them.

$ git todo add Add an informative README file
1: [ ] Add an informative README file

Each entry has a number in the left column and a box. Empty boxes mean the item is still to be done. When you've finished a task, mark it done using the number as a reference:

$ git todo done 1
1: [x] Add an informative README file

You can also "undo" items if you realise that the fix you made wasn't so hot after all, or you didn't understand the issue fully, or whatever other reason.

Finally you can remove items entirely from the list. This is permanent and can't be undone.

Advanced Usage

If you're knee deep in work on one branch and you'd like to change the checklist for another branch, all the commands will recognise the --branch (or -b) option.

$ git todo add --branch newparser Make nicer error messages

If you want to start a description of your note with a hyphen you can separate it from the rest of the command options with a double-hyphen on its own.

$ git todo add -- -b stopped working but --branch still okay

If you want to see all your branches at once use

$ git todo show --all

Obviously you can't supply the --all flag to any of the editing commands --- you can only edit one branch's checklist at a time.

There is one more overview command that will take --branch or --all as an option:

$ git todo stats
2 tasks to do (4 in total)

Work In Progress Commits

I've got an alias called wip which lets me quickly save all my unsaved work in the current branch. You can use this as a basic command:

$ git config alias.wip=commit -a -m"WIP"

But if you use git-checklist the following might be more informative when you are trying to get the measure of your branches:

$ git config alias.wip=!git commit -a -m\""WIP $(git todo stats)"\"

Then you'll get a commit that says something like WIP 2 tasks to do (4 in total which is much nicer. For the cherry on top I also use prepare-commit-msg to pipe the result of git todo show to the commit message. The summary line will contain a summary and the rest of the message will contain the current state of the branch.

Background Details

The checklists are stored in .git/checklist/<branchname>. The serialised form is basically just the checklists without the number prefix. This is similar to the checklist format used by GitHub's extended Markdown, so you can re-use the file contents if desired.

The format is very easy to read and edit manually.

[ <mark> ] <space> <description> <newline>

The <mark> is either "x" for a completed item or a space otherwise. (The parser will accept any non-"x" as pending but will always write a space.) The description must not contain a newline but is otherwise freeform.

The checklist for the working directory is whatever branch name is pointed to by HEAD. I have not tested it with a detached head, though I guess you'd just end up with a SHA as a branch name.

Installing It Is Fairly Easy

Assuming you've got a Haskell installation (if not, [grab the Haskell platform] hp) you can grab the source and build with Cabal.

$ git clone http://github.com/dougalstanton/git-checklist
$ cd git-checklist
$ cabal build
$ cabal install

Shortcomings

The data is stored in a separate directory inside .git which isn't versioned --- this is a local list only. I am open to suggestions to make this versioned though it is not a priority for me. My workflow is based around a single computer.

The read/write step bashes into the awkwardness of lazy IO.

It doesn't cope very well with not being somewhere inside a repository. It shouldn't wreck anything but the error message isn't very refined.

Upgrading

If you were using a pre-1.0 version the file format has changed incompatibly. There is a secret flag to upgrade:

$ git-checklist --upgrade

Alternatively you can do it manually before you upgrade the application like this. The key part is to strip the first four characters from each line, ie the number--colon--space prefix.

for b in .git/checklist/* ; do
    git-checklist show --branch $(basename $b) | cut -c 5- > $b
done
Metadata

Version

1.0.0.0

License

Unknown

Platforms (75)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows