blob: 9f9afddf1bc0fb240d373ec5eb4292c28e37de27 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
#!/bin/zsh
usage()
{
cat << EOF
usage: $0:t <STLINUX_PATCHES FOLDER> <TAG PREFIX> [Patch # start] [Patch # end]
EOF
}
if ! git-rev-parse --git-dir >/dev/null
then
echo "This is not a GIT repository !"
usage
exit 27 # I like 27.
fi
if [ $# -lt 2 ]
then
usage
exit 42 # 42 ? Because !
fi
STLINUX_FOLDER=$1
TAG_PREFIX=$2
START_FROM=${3:-0}
END_TO=${4:-}
PATCHES_LIST=$STLINUX_FOLDER/.patches
:>$PATCHES_LIST
for patch in $(grep "^%patch" $STLINUX_FOLDER/*.spec | sed 's/%\(patch[0-9]\+\).*/\1/')
do
echo $patch | sed 's/patch\([0-9]\+\)/\1/' | awk '{ printf $1" " }' >> $PATCHES_LIST
grep -i "^%$patch" $STLINUX_FOLDER/*.spec | awk '{ printf $2" " }' >> $PATCHES_LIST
grep -i "^$patch:" $STLINUX_FOLDER/*.spec | awk '{ print $2 }' >> $PATCHES_LIST
done
#cat $PATCHES_LIST
function read_patch_file()
{
case $1:e in
"patch")
< $1
;;
"bz2")
bunzip2 -c $1
;;
"*")
echo >&2 "Error ! $1:e is not a recognized patch extension !"
exit;
;;
esac
}
export RELEASE=""
for patch in $(awk < $PATCHES_LIST '{print $1}' )
do
file=$(grep "^$patch " $PATCHES_LIST | awk '{print $3}')
strip=$(grep "^$patch " $PATCHES_LIST | awk '{print $2}')
if [ $patch -ge $START_FROM -a \( -z "$END_TO" -o $patch -le "$END_TO" \) ]
then
if [ ! -e $STLINUX_FOLDER/$file -a -e $STLINUX_FOLDER/$file:r ]
then
file=$file:r
fi
(
#
# On extrait le numéro de release ST dans le nom du fichier .patch
#
_RELEASE="$(echo $file | sed 's/linux-.*[-_]stm\(.\)\(.\)[-_]\([0-9]*\)[_-\.].*/\3/')"
# Ça a marché ? Alors on vérifie qu'on n'est pas passé à la release suivante...
if [ "$_RELEASE" != "$file" ]
then
# On épure le numéro de révision
_RELEASE=$(( $_RELEASE ))
if [ "$(( $_RELEASE ))" -gt "$(( $RELEASE ))" ]
then
# Ha ! On est passé à une release "supérieure", alors on pose le tag
git-tag "$TAG_PREFIX${_RELEASE}"
# Et on stocke le résultat pour le récupérer dans le bloc parent
echo $_RELEASE > .git/release
fi
# On crée le tag pour le message de commit
RELEASE="[$_RELEASE] "
else
RELEASE=""
fi
# Voici la première ligne du message de commit. C'est la plus jolie.
echo "[Patch #$patch] ${RELEASE}Applied $file"
#
# On récupère le commentaire dans le patch en guise de message de commit
# avec gestion des .patch ou des .patch.bz2
#
read_patch_file $STLINUX_FOLDER/$file | awk '{ RS="--- "; } { if ( NR <= 2 ) { print $0 } }' | \
grep -v -e "^diff \-" -e "^Index: " -e "^=*$" -e "^Signed-off-by: " -e "^index ";
) | sed 's/
//' > .git/message ;
# On récupère la release trouvée dans le bloc précédent
RELEASE=$([ -s .git/release ] && ( cat .git/release ; rm -f .git/release) )
#
# On affiche le résultat de l'application du patch dans le message de commit
#
echo "---" >> .git/message
read_patch_file $STLINUX_FOLDER/$file | patch -N $strip >> .git/message
# Suppression des fichiers supprimés par le patch
git-rm $(git-ls-files --deleted) 2>/dev/null
# Ajout de tout le reste :-)
git-add .
# Et on committe !!
git-commit -F .git/message
else
echo >&2 "Skipping patch #$patch : $file"
fi
done
git-tag "$TAG_PREFIX$((RELEASE + 1))"
|