diff options
-rw-r--r-- | Makefile | 5 | ||||
-rwxr-xr-x | bin/gitthing | 70 |
2 files changed, 74 insertions, 1 deletions
@@ -49,6 +49,9 @@ dat/content-file/%: content-file = $(foreach u,$(filter-out %/,$(index)),dat/content-file/$(call url2murl,$(u))) download: $(content-file) -.PHONY: all fix download +git: download + gitthing dat/git < dat/index.txt + +.PHONY: all fix download git .DELETE_ON_ERROR: .SECONDARY: diff --git a/bin/gitthing b/bin/gitthing new file mode 100755 index 0000000..a54c017 --- /dev/null +++ b/bin/gitthing @@ -0,0 +1,70 @@ +#!/usr/bin/env bash + +empty() { + [[ $(stat -c %s "$1") -eq 0 ]] +} + +url2murl() { + local x + x=$1 + x=${x//'^'/'^5E'} + x=${x//':'/'^3A'} + x=${x//'%'/'^25'} + printf '%s' "$x" +} + +murl2url() { + local x + x=$1 + x=${x//'^25'/'%'} + x=${x//'^3A'/':'} + x=${x//'^5E'/'^'} + printf '%s' "$x" +} + +main() { + set -euE -o pipefail + top=$PWD + + mkdir -p "$1" + cd "$1" + git init + echo 'ref: refs/heads/PROGRAMS/CVTUTF' > .git/HEAD + git commit --allow-empty -m 'initial commit' + + while read -r time url; do + suffix="${url##*/Public/}" + dirpart="${suffix%/*}" + filepart="${suffix##*/}" + + branch=$dirpart + + git checkout PROGRAMS/CVTUTF + git checkout -b "$branch" || true + git checkout "$branch" + + waurl="http://web.archive.org/web/$time/$url" + if [[ -n "$filepart" ]]; then + file="$top/dat/content-file/$(url2murl "${waurl#http://}")" + cp "$file" . + else + dir="$top/dat/content-dir/$(url2murl "${waurl#http://}")" + comm -23 \ + <(git ls-files) \ + <(< "$dir/metadata.txt" awk '{print $1}') \ + | xargs -r0 rm -f -- + if ! empty "$dir/readme.txt"; then + cp "$dir/readme.txt" . + fi + cp "$dir/metadata.txt" .metadata.txt + fi + + if [[ -n "$(git status -s .)" ]]; then + gitdate="$(sed -r 's/(....)(..)(..)(..)(..)(..)/\1-\2-\3T\4:\5:\6/' <<<"$time")" + git add . + GIT_AUTHOR_DATE=$gitdate GIT_AUTHOR_DATE=$gitdate git commit -m "$time $url" + fi + done +} + +main "$@" |