gfwlist/sendGFWList.sh

114 lines
3.2 KiB
Bash
Raw Normal View History

2009-03-11 08:36:57 +00:00
#!/bin/bash
#
# A simple script help to maintain AutoProxy gfwList easily.
#
# Function:
# Update local svn repository;
# Commit decoded changes(by others in your team) to local git repository
# with decoded message and authors name;
# Update "Last Modified" time;
# Update "Checksum";
# Commit your changes to local git repository;
2009-03-15 01:00:35 +00:00
# Commit your encoded changes to remote svn server with encoded log.
2009-03-11 08:36:57 +00:00
# Usage:
# Initialize:
# $svn checkout https://autoproxy-gfwlist.googlecode.com/svn/trunk/ gfwList --username your-google-user-name
# $cd gfwList
# $git init
2009-03-11 10:16:28 +00:00
# $base64 -d gfwlist.txt > list.txt
2009-03-11 08:36:57 +00:00
# $git add list.txt
# $git commit -a -m "init"
# Normal Usage:
# edit list.txt as usual;
2009-03-11 08:49:49 +00:00
# $./sendGFWList.sh "say something about this edit"
2009-03-11 08:36:57 +00:00
# Note:
# 1: You can use "git" to show, diff, log...what's you want;
2009-08-11 08:32:46 +00:00
# 2: Do NOT commit "list.txt" to svn server (it won't by default);
# 3: Do NOT use any unicode character in the list, there is a known bug;
# 4: Do NOT "svn update", run this script to update / commit at any time.
2009-08-11 08:42:19 +00:00
################################################################################
2009-03-11 08:36:57 +00:00
# dependence
2009-08-11 08:42:19 +00:00
for cmd in sed date base64 gawk svn git perl
2009-03-11 08:36:57 +00:00
do
2009-03-11 09:10:07 +00:00
which $cmd &> /dev/null;
if [ $? -ne 0 ]; then
echo "Depends on $cmd, please install it first.";
exit 1;
fi
2009-03-11 08:36:57 +00:00
done
# get formated author and log information
2009-03-15 01:00:35 +00:00
log=$(svn log -r BASE:HEAD) &&
2009-03-11 08:36:57 +00:00
log=$(echo $log | gawk -v RS='------------------------------------------------------------------------'\
'NR > 2 { if (NF > 10) printf "%s:%s;", $3, $NF; }' ) &&
2009-03-11 08:36:57 +00:00
# convert from base64
i=0 &&
convertedLog="" &&
while [ "$log" != "" ]
do
if (( $i%2 == 0 )); then # author
temp=${log%%:*};
2009-03-11 16:13:48 +00:00
convertedLog+=${temp%@*}; # don't include "@gmail.com"
2009-03-11 08:36:57 +00:00
convertedLog+=":\"";
2009-03-11 08:45:34 +00:00
# discard used string
2009-03-11 08:36:57 +00:00
log=${log#*:};
else # log, decode it
temp=$( echo ${log%%;*} | base64 -d);
convertedLog+=$temp;
convertedLog+="\"; ";
log=${log#*;};
fi
((i++));
done
# replace last ";" symbol to "."
convertedLog=$( echo $convertedLog | sed 's/;$/\./' ) &&
2009-03-15 01:00:35 +00:00
# modified by others, commit to local git repository.
2009-03-11 08:36:57 +00:00
if [ "$convertedLog" != "" ]; then
2009-03-15 01:00:35 +00:00
svn update &&
# save local modification
git diff > temp.patch &&
2009-03-11 08:36:57 +00:00
# log format: author1:"message1"; author2:"message2"...
base64 -d gfwlist.txt > list.txt &&
git commit -a -m "$convertedLog" &&
# apply local modification
2009-03-15 01:00:35 +00:00
if [ -s temp.patch ]; then git apply temp.patch; fi &&
rm temp.patch;
fi
if [ "$(git diff)" == "" ]; then
echo "list.txt not modified.";
exit 0;
fi
if [ "$*" == "" ]; then
echo "Empty log, please say something about this modification.";
exit 1;
2009-03-11 08:36:57 +00:00
fi
# update date and checksum
sed -i s/"Last Modified:.*$"/"Last Modified: $(date -R -r list.txt)"/ list.txt &&
./addChecksum.pl list.txt &&
2009-03-15 01:00:35 +00:00
# save self change to git. exit directly if conflicting.
2009-03-11 08:36:57 +00:00
git commit -a -m "$*" &&
# commit to remote svn server
base64 list.txt > gfwlist.txt &&
2009-03-15 01:00:35 +00:00
(
# "svn ci" and "git commit" are atomic operations
svn ci gfwlist.txt -m $( echo "$*" | base64 -w 0) ||
# "svn ci" may be failed because of connection problems.
2009-03-15 03:00:18 +00:00
git reset HEAD^ 1> /dev/null;
) &&
# BASE++, HEAD++, if committed.
svn update 1> /dev/null;