- pull-repo-script = path: repo:
- pkgs.writeShellScript "pull-repo" ''
- set -eo pipefail
-
- echo Pulling in ${escapeShellArg path} >&2
-
- if [[ ! -e ${escapeShellArg path} ]];then
- d=$(mktemp -d)
- ${pkgs.git}/bin/git init "$d"
- ${pkgs.git}/bin/git -C "$d" checkout -b \
- ${escapeShellArg repo.localBranch}
- ${pkgs.git}/bin/git -C "$d" remote add \
- ${escapeShellArg repo.remoteName} \
- ${escapeShellArg repo.url}
- ${pkgs.git}/bin/git -C "$d" branch -u \
- ${escapeShellArg repo.remoteBranch}
- mkdir -p "$(dirname ${escapeShellArg path})"
- mv "$d" ${escapeShellArg path}
- fi
-
- cd ${escapeShellArg path}
-
- if [[ "$(${pkgs.git}/bin/git remote get-url \
- ${escapeShellArg repo.remoteName})" != \
- ${escapeShellArg repo.url} ]]
- then
- echo Expected git remote ${escapeShellArg repo.remoteName} \
- to point at ${escapeShellArg repo.url} \
- but it points at "$(${pkgs.git}/bin/git remote get-url \
- ${escapeShellArg repo.remoteName})" >&2
- ${
- {
- abort = "exit 1";
- update = ''
- echo Updating it >&2
- ${pkgs.git}/bin/git -C "$d" remote set-url \
- ${escapeShellArg repo.remoteName} \
- ${escapeShellArg repo.url}
- '';
- }."${repo.onRemoteURLMismatch}"
- }
- fi
-
- ${pkgs.git}/bin/git fetch \
- ${escapeShellArg repo.remoteName} \
- ${escapeShellArg repo.remoteBranch}
-
- if [[ "$(${pkgs.git}/bin/git rev-parse --abbrev-ref HEAD)" != \
- ${escapeShellArg repo.localBranch} ]]
- then
- echo Could not merge because currently-checked-out \
- \""$(${pkgs.git}/bin/git rev-parse --abbrev-ref HEAD)"\" is not \
- \"${escapeShellArg repo.localBranch}\"
- ${
- {
- abort = "exit 1";
- continue = "exit 0";
- }."${repo.onBranchMismatch}"
- }
- fi