Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Move some internal tools out of the way, to not scare users.
[simgrid.git] / tools / internal / check_dist_archive
diff --git a/tools/internal/check_dist_archive b/tools/internal/check_dist_archive
new file mode 100755 (executable)
index 0000000..963a4a3
--- /dev/null
@@ -0,0 +1,121 @@
+#!/bin/bash
+
+# Copyright (c) 2013-2014. The SimGrid Team.
+# All rights reserved.
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+
+set -e
+
+if [ "$1" = "-batch" ]; then
+    shift
+    interactive=0
+elif [ -t 1 ]; then
+    interactive=1
+else
+    interactive=0
+fi
+
+if [ $# -lt 1 -o $# -gt 3 ]; then
+    cat >&2 <<EOF
+Usage: $0 [-batch] archive.tar.gz [git_url [git_reference]]
+EOF
+    exit 1
+fi
+
+archive=$1
+if [ ! -r "$archive" ]; then
+    printf 'File not found: %s\n' "$archive" >&2
+    exit 1
+fi
+
+if [ $# -ge 2 ]; then
+    giturl=$2
+    gitref=${3:-master}
+else
+    giturl=$(git rev-parse --show-toplevel)
+    gitref=HEAD
+fi
+
+tmpdir=$(mktemp -d)
+trap "rm -fr \"$tmpdir\"" EXIT
+
+arch_dir="$tmpdir/a"
+git_dir="$tmpdir/b"
+
+myname=$(type -p "$0")
+case "$myname" in
+    /*)
+        exclude="$myname.exclude"
+        ;;
+    *)
+        exclude="$PWD/$myname.exclude"
+        ;;
+esac
+
+if [ ! -r "$exclude" ]; then
+    printf 'File not found: %s\n' "$exclude" >&2
+    exit 1
+fi
+
+echo "Exclude patterns extracted from file: $exclude"
+
+echo "Extracting archive: $archive -> $arch_dir"
+tar --directory "$tmpdir" \
+    --transform 's!^[^/]*!a!' \
+    --extract --gunzip --file "$archive"
+
+echo "Copying git repository: $giturl/$gitref -> $git_dir"
+git archive --format=tar --prefix="b/" --remote="$giturl" "$gitref" \
+    | tar --directory "$tmpdir" --extract --file -
+
+fa=from_tgz
+fb=from_git
+cd "$tmpdir"
+
+sed -n '/^-/{s/^- //;p;}' "$exclude" > ea
+sed -n '/^+/{s/^+ //;p;}' "$exclude" > eb
+
+find a -type f \
+    | sed 's!^a/!!' \
+    | grep -E -v -x -f ea \
+    | sort > "$fa"
+find b -type f \
+    | sed 's!^b/!!' \
+    | grep -E -v -x -f eb \
+    | sort > "$fb"
+
+diffcmd() {
+    if cmp -s "$fa" "$fb"; then
+        status=0
+        echo "The archive looks good."
+    else
+        status=1
+        cat <<EOF
+ERROR: Some files are missing and/or unexpected in the archive.
+* lines beginning with '-' give files that are unexpected in the archive
+* lines beginning with '+' give files that are missing from the archive
+Please fix CMake files (e.g. "buildtools/Cmake/DefinePackages.cmake"),
+and/or "tools/check_dist_archive.exclude".
+EOF
+        diff -u "$fa" "$fb"
+    fi
+}
+
+colordiff=$(type -p colordiff || true) 
+colorless() {
+    if [ -x "$colordiff" ]; then
+        "$colordiff" | less -R -F -X
+    else
+        less -F -X
+    fi
+}
+
+if [ "$interactive" = "1" ]; then
+    diffcmd | colorless
+else
+    diffcmd
+fi || true
+
+exit $status