summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHugues Hiegel <hugues@hiegel.fr>2009-02-06 11:36:11 +0100
committerHugues Hiegel <hugues@hiegel.fr>2009-02-06 11:36:11 +0100
commit582dfd16fbf04ecb487914fddef5e8ccdf4be26c (patch)
treed32056b6236d633dd50b682ed366e2bcb93c7205
[STLinux] import patches from stlinux kernel SRPMS updates
-rwxr-xr-xSTLinux/stlinux_import_patches.sh126
1 files changed, 126 insertions, 0 deletions
diff --git a/STLinux/stlinux_import_patches.sh b/STLinux/stlinux_import_patches.sh
new file mode 100755
index 0000000..1f12198
--- /dev/null
+++ b/STLinux/stlinux_import_patches.sh
@@ -0,0 +1,126 @@
+#!/bin/zsh
+
+usage()
+{
+ cat << EOF
+usage: $0:t <STLINUX_PATCHES FOLDER> <TAG PREFIX> [Patch # start] [Patch # end]
+EOF
+}
+
+if [ -d .git ]
+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
+
+grep -if =(grep "^%patch" $STLINUX_FOLDER/*.spec | sed 's/%\(patch.*\) .*/^\1:/') $STLINUX_FOLDER/*.spec | awk '{ print $2 }' > $PATCHES_LIST
+
+#cat $PATCHES_LIST
+
+export RELEASE=""
+for file in $(cat $PATCHES_LIST )
+do
+
+ i=$(grep "^Patch.*:[[:blank:]]\+$file$" $STLINUX_FOLDER/*.spec | sed 's/^Patch\(.*\): .*$/\1/')
+
+ if [ $i -ge $START_FROM -a \( -z "$END_TO" -o $i -le "$END_TO" \) ]
+ then
+
+ if [ ! -e $STLINUX_FOLDER/$file -a -e $STLINUX_FOLDER/$file:r ]
+ then
+ file=$file:r
+ fi
+
+ ext=$file:e
+
+ #( preprint $file $color[white] ; echo ; ) >&2
+
+ (
+ #
+ # 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
+ echo "[Patch #$i] ${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
+ #
+ case $ext in
+ "patch")
+ awk '{ RS="--- "; } { if ( NR <= 2 ) { print $0 } }' < $STLINUX_FOLDER/$file | \
+ grep -v -e "^diff \-" -e "^Index: " -e "^=*$" -e "^Signed-off-by: " -e "^index ";
+ ;;
+ "bz2")
+ bunzip2 -c $STLINUX_FOLDER/$file | awk '{ RS="--- "; } { if ( NR <= 2 ) { print $0 } }' | \
+ grep -v -e "^diff \-" -e "^Index: " -e "^=*$" -e "^Signed-off-by: " -e "^index ";
+ ;;
+ esac
+
+ ) | 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
+ case $ext in
+ "bz2")
+ bunzip2 $STLINUX_FOLDER/$file | patch -Np1 >> .git/message
+ ;;
+ "patch")
+ patch -Np1 < $STLINUX_FOLDER/$file >> .git/message
+ ;;
+ *)
+ echo "$ext NOT SUPPORTED !!"
+ exit
+ ;;
+ esac
+ # 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 #$i : $file"
+
+ fi
+done
+git-tag "$TAG_PREFIX$((RELEASE + 1))"