From e1cb9f53f0cd62e6df1681624edb3b5f46bad60c Mon Sep 17 00:00:00 2001
From: Diego Pasqualin <dpasqualin@c3sl.ufpr.br>
Date: Mon, 11 Nov 2013 14:40:34 -0200
Subject: [PATCH] Copy update_mirror.sh from LE5 repository

this version of the script fix many issues and allow to see the diff between
two packages before updating them.

Signed-off-by: Diego Pasqualin <dpasqualin@c3sl.ufpr.br>
---
 bin/update_mirror.sh | 110 ++++++++++++++++++++++++++++++++++---------
 1 file changed, 89 insertions(+), 21 deletions(-)

diff --git a/bin/update_mirror.sh b/bin/update_mirror.sh
index 544d1432c..c254bb10c 100755
--- a/bin/update_mirror.sh
+++ b/bin/update_mirror.sh
@@ -26,8 +26,9 @@
 # it.
 
 TMPDIR=$(mktemp -d --tmpdir=/tmp)
-PUBLISHSCRIPT="$(dirname $0)/le-publish.sh"
-HOST="http://windu.c3sl.ufpr.br/le"
+PUBLISHSCRIPT="$(dirname $0)/le_publish.sh"
+PROJECT="le"
+HOST="http://windu.c3sl.ufpr.br/$PROJECT"
 
 function clean() {
     rm -rf $TMPDIR
@@ -39,20 +40,25 @@ trap "clean" SIGINT SIGTERM
 # Build the URL for the Packages file
 function buildURL() {
     local status="$1"
-    echo "http://windu.c3sl.ufpr.br/le/dists/le-$status/main/binary-i386/Packages"
+    echo "$HOST/dists/$PROJECT-$status/main/binary-i386/Packages"
 }
 
 # Return a string containing the tuple package:version with all packages
 # from $repoFile
 function getPackagesAndVersions() {
-    local repoFile=$1
+    local repoFile="$1"
+    local pkgsToCopy="$2"
     local pkgAndVersion=""
     local version=""
 
     for pkg in $(grep '^Package:' $repoFile | awk '{print $2}'); do
-        version=$(awk "/^Package: ${pkg}$/,/^$/" $repoFile |
-                  grep "^Version:" | awk '{print $2}')
-        pkgAndVersion="$pkgAndVersion $pkg:$version"
+        #FIXME: For some reason, grep -w doesn't work
+        if test -z "$pkgsToCopy" || sed 's/ /\n/g' <<< $pkgsToCopy |
+                                    grep -xq "$pkg"; then
+            version=$(awk "/^Package: ${pkg}$/,/^$/" $repoFile |
+                      grep "^Version:" | awk '{print $2}')
+            pkgAndVersion="$pkgAndVersion $pkg:$version"
+        fi
     done
     echo "$pkgAndVersion"
 }
@@ -64,7 +70,7 @@ function askUpdate() {
     local pkg=$2
     local vFrom=$3
     local vTo=$4
-    read -p "Update mirror le-$repo, $pkg ($vTo -> $vFrom) (y/N)? " yn
+    read -p "Update mirror $PROJECT-$repo, $pkg ($vTo -> $vFrom) (y/N)? " yn
     test "$yn" = "y" || test "$yn" = "s"
 }
 
@@ -74,16 +80,17 @@ function askInclude() {
     local repo=$1
     local pkg=$2
     local version=$3
-    read -p "$pkg:$version doesn't exist on le-$repo, include it (y/N)? " yn
+    read -p "$pkg:$version doesn't exist on $PROJECT-$repo, include it (y/N)? " yn
     test "$yn" = "y" || test "$yn" = "s"
 }
 
 # Return the link to download the package $pkg
 function getDownloadLink() {
     local pkg=$1
+    local repo=$2
     local link=""
 
-    link=$(grep -m1 "Filename:.*${pkg}/${pkg}_" $FROMREPOFILE | awk '{print $2}')
+    link=$(grep -m1 "Filename:.*/${pkg}_.*.deb" $repo | awk '{print $2}')
 
     echo "$HOST/$link"
 }
@@ -93,12 +100,12 @@ function doUpdate() {
     local pkg="$1"
     local pkgFile="$TMPDIR/$pkg.deb"
 
-    wget -q $(getDownloadLink $pkg) -O "$pkgFile"
+    wget -q $(getDownloadLink $pkg $FROMREPOFILE) -O "$pkgFile"
 
     echo "---------------------------------------------"
     echo "Updating $pkg..."
 
-    $PUBLISHSCRIPT le-$TOREPO "$pkgFile"
+    $PUBLISHSCRIPT $PROJECT-$TOREPO "$pkgFile"
 
     if test $? -ne 0; then
         echo "ERROR updating $pkg."
@@ -114,9 +121,13 @@ function doUpdate() {
     rm -f "$pkgFile"
 }
 
+################################################################################
+# Parser arguments
+################################################################################
+
 # Sanity check
-if test $# -ne 2; then
-    echo "$0 <from> <to>"
+if test $# -lt 2; then
+    echo "$0 <from> <to> [--diff] [package...]"
     exit 1
 elif ! test -f "$PUBLISHSCRIPT"; then
     echo "Error finding $PUBLISHSCRIPT"
@@ -126,16 +137,47 @@ fi
 FROMREPO=$1
 TOREPO=$2
 
+DIFF=false
+if test "$3" = "--diff"; then
+    DIFF=true
+    shift 3
+else
+    shift 2
+fi
+
+PKGSTOCOPY=""
+if test $# -gt 0; then
+    PKGSTOCOPY="$@"
+fi
+
+################################################################################
+# End of Parser arguments
+################################################################################
+
+
 FROMREPOFILE="$TMPDIR/$FROMREPO"
 TOREPOFILE="$TMPDIR/$TOREPO"
 
 # Download the Packages file, which contains information about all the
 # packages that are part of the repository
-wget -q $(buildURL $FROMREPO) -O $FROMREPOFILE || exit 1
-wget -q $(buildURL $TOREPO) -O $TOREPOFILE || exit 1
+if ! wget -q $(buildURL $FROMREPO) -O $FROMREPOFILE; then
+    echo "Error downloading Packages file $FROMREPO"
+    exit 1
+fi
+if ! wget -q $(buildURL $TOREPO) -O $TOREPOFILE; then
+    echo "Error downloading Packages file $TOREPO"
+    exit 1
+fi
 
-fromPkgAndVersion="$(getPackagesAndVersions $FROMREPOFILE)"
-toPkgAndVersion="$(getPackagesAndVersions $TOREPOFILE)"
+# Sanity check for packages to copy
+for pkg in $PKGSTOCOPY; do
+    if ! grep -q "^Package: ${pkg}$" $FROMREPOFILE; then
+        echo "WARNING: $pkg not found on repository $FROMREPO"
+    fi
+done
+
+fromPkgAndVersion="$(getPackagesAndVersions $FROMREPOFILE "$PKGSTOCOPY")"
+toPkgAndVersion="$(getPackagesAndVersions $TOREPOFILE "$PKGSTOCOPY")"
 
 # Iterate over all packages from the base repository $FROMREPO and check
 # whether the destination repository has a different version of it, or if
@@ -150,23 +192,49 @@ for pkgVersionFrom in $fromPkgAndVersion; do
             versionTo=$(echo $pkgVersionTo | cut -d: -f2)
             found=true
             if dpkg --compare-versions $versionFrom gt $versionTo; then
+
+                # Show package diff
+                if $DIFF; then
+                    linkFrom="$(getDownloadLink $pkgFrom $FROMREPOFILE)"
+                    linkTo="$(getDownloadLink $pkgTo $TOREPOFILE)"
+                    pkgFromDeb="$TMPDIR/${pkgFrom}_${versionFrom}.deb"
+                    pkgToDeb="$TMPDIR/${pkgTo}_${versionTo}.deb"
+
+                    echo "Downloading $linkFrom to $pkgFromDeb"
+
+                    wget -q "$linkFrom" -O "$pkgFromDeb"
+                    wget -q "$linkTo" -O "$pkgToDeb"
+
+                    dpkg -x "$pkgFromDeb" "${pkgFromDeb}_diff"
+                    dpkg -e "$pkgFromDeb" "${pkgFromDeb}_diff/DEBIAN"
+
+                    dpkg -x "$pkgToDeb" "${pkgToDeb}_diff"
+                    dpkg -e "$pkgToDeb" "${pkgToDeb}_diff/DEBIAN"
+
+                    diff -urN "${pkgToDeb}_diff" "${pkgFromDeb}_diff" | less
+                fi
+
                 if askUpdate $TOREPO $pkgTo $versionFrom $versionTo; then
                     doUpdate $pkgTo
                 fi
-            elif dpkg --compare-versions $versionFrom gt $versionTo; then
+            elif dpkg --compare-versions $versionFrom lt $versionTo; then
                 # It's very weird to have a newer version of the package on
                 # the destination repository, let's have the user to know about
                 # it
                 echo -n "WARNING: $pkgFrom($versionFrom) in $FROMREPO is"
-                echo    " greater than $pkgTo($versionTo) in $TOREPO."
+                echo    " older than $pkgTo($versionTo) in $TOREPO."
+            elif test -n "$PKGSTOCOPY"; then
+                echo -n "INFO: Package $pkgFrom: same version ($versionFrom)"
+                echo " on $FROMREPO and $TOREPO."
             fi
             break
         fi
     done
+
     # We didn't find this package on the destionation repository, maybe the
     # user wants to add it. Let's ask him
     if ! $found && askInclude $TOREPO $pkgFrom $versionFrom; then
-        doUpdate $pkgTo
+        doUpdate $pkgFrom
     fi
 done
 
-- 
GitLab