1e2026d8628c3dd636789bc1c67ed14904be8daf
[alioth/musescore.git] / debian / repack
1 #!/bin/bash
2 # debian/repack - Produce DFSG compliant orig.tar.xz from upstream tarball.
3 #  1) Unpack upstream tarball.
4 #  2) Check for DSFG compliance (no PDFs, SF3s or precompiled binaries).
5 #  3) Set revision number in mscore/revision.h to match Git commit number.
6 #  4) Pack into orig.tar.xz
7
8 set -e # exit on error
9
10 watchfile=$(dirname "$0")/watch
11 if [[ ! -e $watchfile ]]; then
12   printf >&2 '%s: Error! File %s not found.\n' "$0" "$watchfile"
13   exit 1
14 fi
15 apipath=$(grep -o '\<https://github\.com/[!-~]*/tags\>' "$watchfile" | \
16     sed 's!github\.com!api.github.com/repos!')
17 if [[ -z $apipath ]]; then
18   printf >&2 '%s: Error! github.com repository not found in %s!\n' "$0" "$watchfile"
19   exit 1
20 fi
21
22 function usage() {
23 cat >&2 <<EOF
24 debian/repack - set MuseScore revision number and check for DFSG compliance.
25
26 Usage:    debian/repack  --upstream-version  VERSION  [UPSTREAM-TARBALL]
27 Example:  debian/repack  --upstream-version  "2.0.1+dfsg1"
28 EOF
29 }
30
31 if [[ $1 = --usage || $1 = --help || $1 = -[h?] ]]; then
32   usage
33   exit 0
34 fi
35
36 if [[ $1 != --upstream-version || -z $2 ]]; then
37   printf >&2 '%s: Error! Upstream version was not specified.\n\n' "$0"
38   usage
39   exit 1
40 fi
41
42 baseversion=$2
43 debversion=${baseversion//'%'/'~'}
44 if [[ $baseversion = *'+dfsg'* ]]; then
45   baseversion=${baseversion%+dfsg*}
46 fi
47 gitversion=v${baseversion//'~'/'%'}
48 baseversion=${baseversion//'%'/'~'}
49
50 printf >&2 'D: baseversion<%s> debversion<%s> gitversion<%s>\n' \
51   "$baseversion" "$debversion" "$gitversion"
52
53 tarpath=${3:-../musescore2_$2.orig.tar.gz}
54 printf >&2 '%s\n' "$0: Repacking upstream tarball '$tarpath'."
55
56 if [[ ! -f $tarpath ]]; then
57   printf >&2 '%s: Error! Upstream tarball not found.\n\n' "$0"
58   usage
59   exit 1
60 fi
61
62 tarball="$(basename "$tarpath")"
63 outdir="$(dirname "$tarpath")" # send output files to input directory
64
65 if [[ -n $(which realpath) ]]; then
66   outdir="$(realpath --relative-to="$PWD" "$outdir")"
67 fi
68
69 cd "$outdir"
70
71 symlink=""
72 if [[ -L $tarball ]]; then
73   # If $tarball was actually a symlink then resolve it
74   symlink="$tarball"
75   tarball="$(readlink "$symlink")"
76 fi
77
78 tempdir="tmp-musescore-$debversion"
79
80 # 1) Unpack upstream tarball
81 printf >&2 '%s\n' "Unpacking upstream tarball into '$tempdir'."
82 rm -rf "$tempdir"
83 mkdir "$tempdir"
84 tar -xaf "$tarball" -C "$tempdir"
85 cd "$tempdir"
86 mv MuseScore-* "musescore2-$debversion.orig"
87 cd "musescore2-$debversion.orig"
88
89 # 2) Check for DSFG compliance (no precompiled binaries or PDFs, etc).
90 cat >&2 <<EOF
91 Checking for DFSG compliance. If any non compliant files are discovered then
92 they will be printed on the Terminal and then this script will exit. The non-
93 compliant files must be added to the Files-Excluded list within debian/copyright
94 and then you will need to run 'uscan' again. See uscan(1).
95 EOF
96
97 dfsg_compliant="TRUE"
98
99 echo >&2 "Searching for PDF, SF3 and object files..."
100 pdfs=$(find . -iname \*.pdf -o -iname \*.sf3 -o -iname \*.dll -o \
101     -iname \*.o -o -iname \*.a -o -iname \*.so -o -iname \*.so.\*)
102 if [[ -n $pdfs ]]; then
103   printf >&2 '%s\n' \
104    "$pdfs" \
105    "PDF, SF3 or other object files, which are not DFSG-free, were discovered." \
106    "Please add them to Files-Excluded in debian/copyright."
107   dfsg_compliant="FALSE"
108 fi
109
110 echo >&2 "Searching for precompiled binaries..."
111 binaries="$(find . -type f -executable -exec sh -c "file -i '{}' | grep -q 'x-executable; charset=binary'" \; -print)"
112 if [[ -n $binaries ]]; then
113   printf >&2 '%s\n' \
114    "$binaries" \
115    "Binary files were discovered. Binaries are non DFSG-free." \
116    "Please add them to Files-Excluded in debian/copyright."
117   dfsg_compliant="FALSE"
118 fi
119
120 if [[ $dfsg_compliant != TRUE ]]; then
121   echo >&2 "You will need to run 'uscan' again afterwards."
122   exit 1
123 fi
124
125 # 3) Set revision number in mscore/revision.h to match upstream Git commit
126 # Note: upstream has a Makefile target "make revision" to set the revision, but
127 # it only works inside a Git repo so we have to get the revision another way.
128 echo >&2 "Determining upstream revision (first 7 characters of Git commit SHA)."
129
130 if ! apires=$(wget -S --content-on-error -O - "$apipath"); then
131   printf >&2 '%s: Error! Could not read from GitHub API:\n%s\n' "$0" "$apires"
132   exit 1
133 fi
134
135 commit="$( \
136   printf '%s\n' "$apires" \
137    | tr -d '[:space:]' | sed -r 's/("name":)/\n\1/g' \
138    | grep -F "\"name\":\"$gitversion\"" \
139    | sed -nr 's/.*"sha":"([[:alnum:]]{7})[[:alnum:]]{33}".*/\1\n/p' \
140 )"
141
142 if [[ -z $commit ]]; then
143   printf >&2 '%s: Error! Could not get upstream commit. Data:\n%s\n' "$0" "$apires"
144   exit 1
145 fi
146
147 printf >&2 '%s\n' "Upstream revision is '$commit'."
148
149 printf >&2 '%s\n' "Setting revision number in 'mscore/revision.h' to '$commit'."
150 mtime="$(stat -c %y "mscore/revision.h")" # preserve modification time
151 printf '%s\n' "$commit" >"mscore/revision.h"
152 touch -d "$mtime" "mscore/revision.h"
153
154 # 4) Pack into orig.tar.xz
155 cd .. # now inside $tempdir
156 printf >&2 '%s\n' "Creating musescore2_$debversion.orig.tar; this may take a while"
157 tar -cf "../musescore2_$debversion.orig.tar" \
158     -Hustar -b1 \
159     --numeric-owner --owner=0 --group=0 \
160     --mode='u=rwX,go=rX' \
161     "musescore2-$debversion.orig"
162 cd .. # now back to output directory (outside $tempdir)
163
164 # Tidy up (must do this before compressing tar incase tarball has same name)
165 echo >&2 "Removing temporary files."
166 rm -rf "$tempdir" "$tarball" "$symlink"
167
168 # Compress new orig.tar
169 printf >&2 '%s\n' "Compressing musescore2_$debversion.orig.tar; this will take long"
170 xz -7e "musescore2_$debversion.orig.tar"
171
172 cat >&2 <<EOF
173 Finished!
174 The upstream code is in "$outdir/musescore2_$debversion.orig.tar.xz".
175 Check this in with pristine-tar after committing it to the upstream-rochade branch:
176  \$ pristine-tar commit '$outdir/musescore2_$debversion.orig.tar.xz' upstream-rochade
177 Then tag the upstream branch and merge it into rochade.
178 EOF