다짜고짜 pully의 코드부터 써 본다.

#!/bin/sh
# Written by Don Kim (dgkimdev@gmail.com)
#
# It reads "/path/to/repo:branchname" and updates it (via `git up`).
#
# If you don't have `git up`, check this and consider it;
# https://stackoverflow.com/questions/918886
while IFS=':' read -ra PAIR; do
	echo "${PAIR}"
	cd ${PAIR[0]} && git checkout ${PAIR[1]} && git up ${PAIR[1]}
done


그리고 이 스크립트에게 던져 줄 먹이를 준비한다.

# file path: ~/.gitrepos
/home/don/builds/dwm:master
/home/don/builds/st:master
/home/don/builds/slock:master
/home/don/builds/surf:surf-webkit2
/home/don/builds/tabbed:master
/home/don/.vim/pack/don/start/ale:master
/home/don/.vim/pack/don/start/goyo.vim:master
/home/don/.vim/pack/don/start/gruvbox:master
/home/don/.vim/pack/don/start/nerdtree:master
/home/don/.vim/pack/don/start/vim-commentary:master
/home/don/.vim/pack/don/start/vim-picker:master
/home/don/.vim/pack/don/start/vim-surround:master
/home/don/.vim/pack/don/start/vimtex:master


이제 아래 명령어를 통해 pully가 Git repository 리스트를 받아서 동봉된 branch를 업데이트한다.

$ ~/.local/bin/pully < ~/.gitrepos


저걸 일일이 다 타이핑할 필요는 없으므로 .bashrcalias로 추가하면 끝.

# file path: ~/.bashrc
alias pully='~/.local/bin/pully < .gitrepos


나의 Github repo에서 원본을 확인할 수 있다.


pully가 필요했던 이유

결국 pully가 하는 일은, Git repo 리스트를 받아서 묻지도 따지지도 않고 fast-forward pull을 받는 것이다. Package 업그레이드와 같은 일을 하는 것이다. Remote에서 무언가 업데이트된 내용이 있으면 받아오는 것이다.

소스 코드를 직접 compile해야 하는 Suckless 환경을 받아들이면서, 기존 Linux distro가 제공하는 package manager (apt, yum, pacman 등등)와 독립적으로 package로서의 Git repo가 하나 둘 늘어나기 시작했다. 만약 업데이트가 된 suckless software가 있는 지 확인해보려면, 나는 일일이 repo에 찾아가서 git up (또는 git pull --ff-only)를 해야 하는 것이다. 게다가 Vim plugin도 Git repository를 clone해서 적용하기 때문에, 노가다 목록이 더욱 늘어난다. 그래서 pully가 나왔다.


처음에는 libgit2를 이용해 C로 짜 볼까 시도했었다. 하지만 Git 자체에 대한 이해가 부족했고, libgit2와 Git의 간극이 꽤나 존재했어서 지금 내 능력에서 벗어나는 일이었다 (흑). 그래서 shell script로 돌려서 생각했고 금방 pully가 나왔다.


Git에 대해 조금 더 알게 된 시간이었다.



참고 자료

Shell script에서 string 구분자로 쪼개기
stackoverflow.com/questions/918886/how-do-i-split-a-string-on-a-delimiter-in-bash

libgit2 공식 페이지
libgit2.github.io

libgit2와 git의 간극의 예: libgit2을 통해 git checkout을 하려면
ben.straub.cc/2013/04/02/libgit2-checkout/

git pull 하지 마세요, git up 하세요
stackoverflow.com/questions/15316601/in-what-cases-could-git-pull-be-harmful

나의 환경 설정 (shameless plug)
github.com/dgkim5360/desktop-configurations