Fish & Gits

I’ve been using the Fish shell for a while, and it’s really gotten to the point where I miss it when I can’t use it :)

To share with folks, here are some of my Fish configurations and Git configs that make my life as a Blender developer easier.

This post was made possible by the Blender Development Fund.

Fish Config

Update 2024-04-03: I’ve started to track the pull request related functions my projects.blender.org profile space. Go there to get the latest versions.

These I store in ~/.config/fish/conf.d/aliases.fish:

set BLENDER_BUILD_ROOT  /home/sybren/workspace/blender-git

function cdlibs -d "CD to Blender libs directory"
    cd $BLENDER_BUILD_ROOT/lib
end

function cddeps -d "CD to Blender deps directory"
    cd $BLENDER_BUILD_ROOT/build_deps/deps
end

function cdbuild -d "CD to Blender build directory"
    cd $BLENDER_BUILD_ROOT/build_linux
end

function cdsrc -d "CD to Blender source directory"
    cd $BLENDER_BUILD_ROOT/blender
end

function cdtracker -d "CD to Blender bug tracker directory"
    cd $BLENDER_BUILD_ROOT/tracker
end

function bb -d "Build Blender, release mode"
    nice -n 1 ninja -C $BLENDER_BUILD_ROOT/build_linux/ $argv
end

function bbb -d "Build Blender and run with last file"
    bb && blender --open-last $argv
end

function bbd -d "Build Blender, debug mode"
    nice -n 1 ninja -C $BLENDER_BUILD_ROOT/build_debug/ $argv
end

function bbbd -d "Build Blender in Debug mode and run with last file"
    bbd && blenderdebug --open-last $argv
end

function bbt -d "Build Blender, Clang-Tidy mode"
    nice -n 1 ninja -C $BLENDER_BUILD_ROOT/build_tidy/ $argv
end

function bbr -d "Build Blender, release branch"
    nice -n 1 ninja -C $BLENDER_BUILD_ROOT/build_release/ $argv
end

function cdb
    set BLENDVER (blender --version | grep '^Blender' | cut -d' ' -f2 | sed 's/\\([0-9]\\+\\.[0-9]\\+\\).*/\\1/')
    echo "Blender version: $BLENDVER"
    cd ~/.config/blender/$BLENDVER
end

function git_rebase_onto_master
    read -P "Rebase onto master? ENTER for yes, CTRL+C for no."
    git rebase master; and git submodule foreach git pull --rebase origin master
end

function arcpatch -a PATCHNAME -d "Apply a patch from Phabricator"
    if test -z "$PATCHNAME";
        echo "Usage: arcpatch D1234" >&2
        return 47
    end

    set BRANCH arcpatch-$PATCHNAME

    set CURBRANCH (git branch --show-current 2>/dev/null)
    if test "$CURBRANCH" != "master";
        git checkout master
    end

    if git branch | grep -q $BRANCH;
        printf "\033[95mBranch $BRANCH exists, going to refresh it\033[0m\n"
        git branch -D $BRANCH
    else
        printf "\033[96mBranch $BRANCH does not exist\033[0m\n"
    end
    arc patch $PATCHNAME; or begin
        printf "\033[91mPatch $PATCHNAME could not be applied cleanly\033[0m\n"
        return 27
    end

    printf "\033[95mBranch $BRANCH is ready for use\033[0m\n"
    git_rebase_onto_master
end

function arcland -d "Land the current patch, without pushing"
    set CURBRANCH (git branch --show-current 2>/dev/null)
    if ! string match "arcpatch-D*" $CURBRANCH;
        printf "\033[38;5;214mCurrent branch ($CURBRANCH) is not an arcpatch-Dxxxxx branch.\033[0m\\n"
        return 1
    end

    set PATCHNUM (string match -r "D[0-9]+" $CURBRANCH)
    printf "Landing patch \033[95m$PATCHNUM\033[0m\\n\\n"

    arc land --hold ; or return 2
    git checkout master ; or return 3
    git merge --ff-only - ; or return 4
end

function arcprune -d "Delete all arcpatch-Dxxxx branches"
    set BRANCHES (string trim (git branch | grep arcpatch-D))
    if test -z "$BRANCHES";
        echo "No arc branches to prune"
        return 0
    end
    git branch -D $BRANCHES
end

function svnadd -a SUBDIR -d "Add new files and remove deleted files"
  # This is the Fish way of doing `SVN_STATUS=$(<svn status $SUBDIR)`
  begin; set -l IFS; set SVN_STATUS (svn status $SUBDIR); end

  echo "$SVN_STATUS" | grep '^\? ' | sed 's/^.//' | xargs --no-run-if-empty -n 1 svn add
  echo "$SVN_STATUS" | grep '^\! ' | sed 's/^.//' | xargs --no-run-if-empty -n 1 svn rm
end

alias l='ls -F --color=auto'
alias ll='l -lh'
alias df='df -h'
alias du='du -h'
alias grep='grep --color'
alias json_pp="python3 -c 'import json, sys; print(json.dumps(json.load(sys.stdin), sort_keys=True, indent=4))'"
alias trimlong="sed 's/\(.\{120\}\).*/\1…/'"
alias ffprobe-json="ffprobe -v error -hide_banner -print_format json -show_streams -show_format"
alias dot2png="dot -Tpng -O"
alias abccat="abcls -a -m -l -r -t"
alias cdp="cd (pwd -P)"
alias bcode="code ~/workspace/blender-git/blender.code-workspace"

Git Config

My Git configuration (~/.gitconfig) also has some nice aliases & other options:

[color]
    ui = auto
[pull]
    rebase = true
[push]
    default = simple
[alias]
    co = "checkout"
    cp = "cherry-pick"
    ff = "merge --ff-only"
    mt = "mergetool"
    up = "checkout @~1"
    st = "status --ignore-submodules=none"
    car = "commit --amend --reset-author"
    rbi = "rebase -i"
    rbc = "rebase --continue"
    rba = "rebase --abort"
    tpush = "!git push && git push --tags"
    out = "log @{u}.. --pretty=oneline"
    head = "show HEAD"
    unstash = "stash pop"
    authors = "!f() { git log --since 'now - 1 year' \"$@\" | grep ^Author | sed 's/Author: //' | sed 's/<.*>//' | sort -f | uniq -ci | sort -nr | nl -s '' | sort -nr; } ; f"
    glog = "log --all --graph --abbrev-commit --decorate --date=short --format=format:'%C(bold blue)%h%C(reset) %C(green)(%ad)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(dim magenta)%d%C(reset)'"
    onelog = "log --abbrev-commit --decorate --date=short --format=format:'%C(bold blue)%h%C(reset) %C(green)(%ad)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(dim magenta)%d%C(reset)'"
    ver = "log --oneline -n 1 --no-abbrev"
[diff]
    tool = kdiff3
    guitool = kdiff3
[merge]
    tool = kdiff3
    guitool = kdiff3
  	renamelimit = 4096
[core]
    excludesfile = /home/sybren/.configfiles/gitignore_global
[gui]
    gcwarning = false
    encoding = utf-8
[rerere]
  	enabled = true
[gc]
  	rerereUnresolved = 365
  	rerereResolved = 365
dr. Sybren A. Stüvel
dr. Sybren A. Stüvel
Open Source software developer, photographer, drummer, and electronics tinkerer

Related