archives2git: let --keep-filter select files to keep in the repository
[archives2git.git] / archives2git
bloba139afe903cad7deed33e73412c1aa8d39ddf3fa
1 #!/bin/sh
2 # archives2git - generate a Git history from a series of release tarballs
3 # Copyright © 2013 Géraud Meyer <graud@gmx.com>
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License version 2 as
7 # published by the Free Software Foundation.
9 # This program is distributed in the hope that it will be useful, but
10 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11 # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 # for more details.
14 # You should have received a copy of the GNU General Public License along
15 # with this program. If not, see <http://www.gnu.org/licenses/>.
17 PROGRAM_NAME="archives2git"
18 PROGRAM_VERSION="0"
19 # Usage:
20 # archives2git [<options>] [--] <archives>
22 # parameters
23 RENAME='echo "$file"'
24 GIT_WORK_TREE=${GIT_WORK_TREE-.}
25 FILTER='false $file'
26 DATE=''
27 TITLE='echo "$arch"'
28 BODY=
29 ARGS=
30 while [ $# -gt 0 ]
32 case $1 in
33 --rename)
34 shift; RENAME=$1 ;;
35 --repo)
36 shift; GIT_WORK_TREE=$1 ;;
37 --keep-filter)
38 shift; FILTER=$1 ;;
39 --date)
40 shift; DATE=$1 ;;
41 --title)
42 shift; TITLE=$1 ;;
43 --body)
44 shift; BODY=$1 ;;
45 --git-arg)
46 shift; ARGS="$ARGS $1" ;;
47 --version)
48 echo "$PROGRAM_NAME version $PROGRAM_VERSION"
49 exit ;;
50 --?*)
51 echo "$0: unknown option $1" >&2
52 exit 255 ;;
53 --)
54 shift; break ;;
56 break ;;
57 esac
58 shift
59 done
60 # setup
61 NL='
63 TMPDIR=$(mktemp -d)
64 WRKDIR=$(pwd)
65 # git repository check
66 cd "$GIT_WORK_TREE" &&
67 { test -d .git || git rev-parse --git-dir >/dev/null; } ||
69 echo "$0: error not in a git repository" >&2
70 exit 255
72 test -z "$(git status --porcelain)" &&
73 git update-index -q --refresh ||
75 echo "$0: unstaged files or dirty index" >&2
76 exit 254
79 # main
80 set -e
81 for arch
83 cd "$WRKDIR"
84 aunpack -X "$TMPDIR" "$arch"
85 cd "$GIT_WORK_TREE"
86 for file in * .*
88 [ -e "$file" ] || continue
89 [ "$file" = "." -o "$file" = ".." -o "$file" = ".git" ] && continue
90 eval "$FILTER" || ( git rm -r "$file" || rm -R "$file" )
91 done
92 for file in "$TMPDIR"/* "$TMPDIR"/.*
94 [ -e "$file" ] || continue
95 file=${file#$TMPDIR/}
96 [ "$file" = "." -o "$file" = ".." ] && continue
97 name=$(eval "$RENAME")
98 if [ -n "$name" ]
99 then
100 [ ! -e ./"$name" ] || rm -R ./"$name"
101 mv "$TMPDIR"/"$file" ./"$name"
102 git add ./"$name"
103 else
104 rm -R "$TMPDIR"/"$file"
106 done
107 git commit -m "$(eval "$TITLE")${BODY:+$NL$BODY}" \
108 ${DATE:+--date "$(eval "$DATE")"} $ARGS
109 done
112 rmdir "$TMPDIR"