scripts/mk-release.sh
author "Benoît Thébaudeau" <benoit.thebaudeau@advansee.com>
Mon Apr 16 15:25:36 2012 +0200 (2012-04-16)
changeset 2941 13e40098fffc
parent 2858 696243162237
child 2978 a6d19e44d08a
permissions -rwxr-xr-x
cc/gcc: update Linaro GCC revisions to 2012.04

Update Linaro GCC with the latest available revisions.

The 4.7 revision is also released, but the infrastructure is not yet ready for
it in CT-NG.

Signed-off-by: "Benoît Thébaudeau" <benoit.thebaudeau@advansee.com>
yann@1822
     1
#!/bin/bash
yann@1822
     2
#set -x
yann@1822
     3
yann@1837
     4
export LC_ALL=C
yann@1837
     5
yann@1822
     6
my_name="$( basename "${0}" )"
yann@1822
     7
yann@1822
     8
usage() {
yann@1822
     9
    cat <<-_EOF_
yann@1822
    10
		Usage:
yann@1822
    11
		    ${my_name} <repos_dir> <M.m.p>
yann@1822
    12
	_EOF_
yann@1822
    13
}
yann@1822
    14
yann@1822
    15
repos="${1}"
yann@1822
    16
version="${2}"
yann@1822
    17
yann@1822
    18
[ -n "${repos}"   ] || { usage; exit 1; }
yann@1822
    19
[ -d "${repos}"   ] || { printf "${my_name}: ${repos}: no such file or directory\n"; exit 1; }
yann@1822
    20
[ -n "${version}" ] || { usage; exit 1; }
yann@1822
    21
yann@2857
    22
_hg() {
yann@2857
    23
    HGPLAIN=1 hg --config progress.disabled=true "$@"
yann@2857
    24
}
yann@2857
    25
yann@1822
    26
gen_bound_revs() {
yann@2857
    27
    r1=$( _hg log   \
yann@1822
    28
          |awk 'BEGIN {
yann@1822
    29
                  found=0;
yann@1822
    30
                }
yann@1822
    31
                $1=="'"${label}"':" {
yann@1822
    32
                  split($2,a,":"); rev=a[1];
yann@1822
    33
                }
yann@1822
    34
                $0~/^summary:[[:space:]]*[[:digit:]]+\.[[:digit:]]+: '"${msg}"'/ \
yann@1822
    35
                && found==0 {
yann@1822
    36
                  printf( "%d\n", rev ); found=1;
yann@1822
    37
                }'
yann@1822
    38
        )
yann@1822
    39
yann@2857
    40
    r2=$( _hg log -b "${branch}" \
yann@1822
    41
          |awk '$1=="changeset:" {
yann@1822
    42
                  split($2,a,":");
yann@1822
    43
                  printf( "%d\n", a[1] );
yann@1822
    44
                  nextfile;
yann@1822
    45
                }'
yann@1822
    46
        )
yann@1822
    47
yann@1822
    48
    r1_log=$((r1+log_offset))
yann@1822
    49
    if [ ${#r1_log} -gt ${#r2} ]; then
yann@1822
    50
        rev_w=${#r1_log}
yann@1822
    51
    else
yann@1822
    52
        rev_w=${#r2}
yann@1822
    53
    fi
yann@1822
    54
}
yann@1822
    55
yann@1822
    56
print_intro_mail() {
yann@1822
    57
    cat <<-_EOF_
yann@1822
    58
		Hello all!
yann@1822
    59
		
yann@1822
    60
		I'm pleased to announce the release of crosstool-NG ${version}!
yann@1822
    61
		
yann@1822
    62
		As usual, there has been quite a number of improvements, new features,
yann@1822
    63
		and bug fixes all around. The most notable changes are listed below:
yann@1822
    64
		
yann@1822
    65
		YEM:
yann@1822
    66
		YEM: PUT YOUR MESSAGE HERE
yann@1822
    67
		YEM:
yann@1822
    68
		
yann@1822
    69
		This marks the beginning of the ${ver_M}.${ver_m} maintenance branch, and the end of
yann@1822
    70
		the previous maintenance branch. As always, comments and suggestions
yann@1822
    71
		are most welcome!
yann@1822
    72
		
yann@1822
    73
		The release can be found at the following URLs:
yann@2725
    74
		Changelog: http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-${version}.changelog
yann@2725
    75
		Tarball:   http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-${version}.tar.bz2
yann@2725
    76
		Patches:   http://crosstool-ng.org/download/crosstool-ng/01-fixes/${version}/
yann@1822
    77
		
yann@1822
    78
		As a reminder, the home for crosstool-NG is:
yann@2725
    79
		http://crosstool-ng.org/
yann@1822
    80
		
yann@1822
    81
		Crosstool-NG also has a Freshmeat page:
yann@1833
    82
		http://freshmeat.net/projects/crosstool-ng
yann@1822
    83
	_EOF_
yann@1822
    84
}
yann@1822
    85
yann@1822
    86
print_intro_changelog_full_release() {
yann@1822
    87
    cat <<-_EOF_
yann@1822
    88
		crosstool-NG ${version} -- ${date}
yann@1822
    89
		
yann@1822
    90
		This is a feature-release. Significant changes are:
yann@1822
    91
		
yann@1822
    92
		YEM:
yann@1822
    93
		YEM: PUT YOUR MESSAGE HERE
yann@1822
    94
		YEM:
yann@1822
    95
	_EOF_
yann@1822
    96
}
yann@1822
    97
yann@1822
    98
print_intro_changelog_bug_fix() {
yann@1822
    99
    cat <<-_EOF_
yann@1822
   100
		crosstool-NG ${version} -- ${date}
yann@1822
   101
		
yann@1822
   102
		This is a bug-fix-only release.
yann@1822
   103
	_EOF_
yann@1822
   104
}
yann@1822
   105
yann@1822
   106
print_author_stats() {
yann@1822
   107
    printf "\nMany thanks to the people who contributed to this release:\n\n"
yann@1822
   108
    prev_author=""
yann@1822
   109
    template='{author|person}\n'
yann@2857
   110
    _hg log -b "${branch}" -r "${r1_log}:${r2}"                 \
yann@1822
   111
           --template "${template}"                             \
yann@1822
   112
    |sed -r -e 's/"//g;'                                        \
yann@1822
   113
    |awk -F '' '{
yann@1822
   114
                  nb[$0]++;
yann@1822
   115
                }
yann@1822
   116
                END {
yann@1822
   117
                  for( author in nb ) {
yann@1822
   118
                    printf( "   %4d  %s\n", nb[author], author );
yann@1822
   119
                  }
yann@1822
   120
                }'                                              \
yann@1943
   121
    |sort -s -k1nr -k2
yann@1822
   122
}
yann@1822
   123
yann@1822
   124
print_author_shortlog() {
yann@1822
   125
    printf "\nHere is the per-author shortlog:\n"
yann@1822
   126
    prev_author=""
yann@1822
   127
    template='{author|person}|{rev}|{branches}|{desc|firstline}\n'
yann@2857
   128
    _hg log -b "${branch}" -r "${r1_log}:${r2}"             \
yann@1822
   129
           --template "${template}"                         \
yann@1822
   130
    |awk -F '' '{
yann@1822
   131
                  n=split( $0,a,"|" );
yann@1822
   132
                  printf( "%s", gensub("\"","","g",a[1]) );
yann@1822
   133
                  printf( "|%0*d", '${rev_w}', a[2] );
yann@1822
   134
                  for(i=3;i<=n;i++) {
yann@1822
   135
                    printf( "|%s", a[i] );
yann@1822
   136
                  }
yann@1822
   137
                  printf( "\n" );
yann@1822
   138
                }'                                          \
yann@1822
   139
    |sort                                                   \
yann@1822
   140
    |while read line; do
yann@1822
   141
        author="$( echo "${line}" |cut -d \| -f 1 )"
yann@1822
   142
        rev="$( echo "${line}" |cut -d \| -f 2 )"
yann@1822
   143
        br="$( echo "${line}" |cut -d \| -f 3 )"
yann@1822
   144
        desc="$( echo "${line}" |cut -d \| -f 4- )"
yann@1822
   145
yann@1822
   146
        case "${br}" in
yann@1822
   147
            ${branch})  ;;
yann@1822
   148
            [0-9]*.*)    continue;;
yann@1822
   149
            *) ;;
yann@1822
   150
        esac
yann@1822
   151
yann@1822
   152
        case "${desc}" in
yann@1822
   153
            Merge.)                 continue;;
yann@1822
   154
            *": close "*" branch"*) continue;;
yann@1822
   155
#           *\(merged\))            continue;;
yann@1822
   156
        esac
yann@1822
   157
yann@1822
   158
        author="$( echo "${author}" |sed -r -e 's/"//g;' )"
yann@1822
   159
yann@1822
   160
        if [ ! "${prev_author}" = "${author}" ]; then
yann@1822
   161
            printf "\n"
yann@1822
   162
            printf "    ${author}:\n"
yann@1822
   163
            prev_author="${author}"
yann@1822
   164
        fi
yann@1822
   165
        rev="$( echo "${rev}" |sed -r -e 's/^0*//;' )"
yann@1822
   166
yann@1822
   167
        printf "%s\n" "${desc}"     \
yann@1822
   168
        |fmt -w 65                  \
yann@1822
   169
        |(first=1; while read l; do
yann@1822
   170
            if [ -n "${first}" ]; then
yann@1822
   171
                printf "        [%*d] %s\n" ${rev_w} ${rev} "${l}"
yann@1822
   172
                first=
yann@1822
   173
            else
yann@1822
   174
                printf "         %*.*s  %s\n" ${rev_w} ${rev_w} '' "${l}"
yann@1822
   175
            fi
yann@1822
   176
        done)
yann@1822
   177
    done
yann@1822
   178
}
yann@1822
   179
yann@1822
   180
print_diffstat() {
yann@1822
   181
    printf "\nThe diffstat follows:\n\n"
yann@2857
   182
    _hg diff -r "${r1}:${r2}" --color=never \
yann@1822
   183
    |diffstat -r 2 -p 1 -w 10               \
yann@1822
   184
    |tail -n 1                              \
yann@1822
   185
    |sed -r -e 's/^ */    /;'
yann@1822
   186
yann@2857
   187
    _hg diff -r "${r1}:${r2}" --color=never \
yann@1822
   188
    |diffstat -f 1 -r 2 -p 1 -w 10          \
yann@1822
   189
    |head -n -1                             \
yann@1822
   190
    |while read file line; do
yann@1822
   191
        if [ ${#file} -gt 57 ]; then
yann@1833
   192
            file="$( echo "${file}" |sed -r -e 's/^(.{,24}).*(.{28})$/\1.....\2/;' )"
yann@1822
   193
        fi
yann@1822
   194
        printf "    %-57s %s\n" "${file}" "${line}"
yann@1822
   195
    done
yann@1822
   196
}
yann@1822
   197
yann@1833
   198
print_short_diffstat() {
yann@1833
   199
    printf "\nThe short diffstat follows:\n\n"
yann@1833
   200
yann@1833
   201
    eval total=$(( $(
yann@2857
   202
        _hg diff -r "${r1}:${r2}" --color=never "${i}"                              \
yann@1833
   203
        |diffstat -r 2 -p 1 -w 10                                                   \
yann@1833
   204
        |tail -n 1                                                                  \
yann@1833
   205
        |sed -r -e 's/^[[:space:]]*[[:digit:]]+ files? changed(,[[:space:]]+|$)//;' \
yann@1833
   206
                -e 's/([[:digit:]]+)[^-\+]+\((-|\+)\)/\1/g;'                        \
yann@1833
   207
                -e 's/,//g; s/ /+/; s/^$/0/;'
yann@1833
   208
    ) ))
yann@1833
   209
    printf "    %-24.24s %5d(+/-)\n" "Total" ${total}
yann@1833
   210
    others=${total}
yann@1833
   211
yann@1833
   212
    { for i in              \
yann@1833
   213
        kconfig/            \
yann@1833
   214
        patches/            \
yann@1833
   215
        config/*/           \
yann@1833
   216
        scripts/build/*/    \
yann@1833
   217
        samples/            \
yann@1833
   218
        ; do
yann@1833
   219
        eval val=$(( $(
yann@2857
   220
            _hg diff -r "${r1}:${r2}" --color=never "${i}"                              \
yann@1833
   221
            |diffstat -r 2 -p 1 -w 10                                                   \
yann@1833
   222
            |tail -n 1                                                                  \
yann@1833
   223
            |sed -r -e 's/^[[:space:]]*[[:digit:]]+ files? changed(,[[:space:]]+|$)//;' \
yann@1833
   224
                    -e 's/([[:digit:]]+)[^-\+]+\((-|\+)\)/\1/g;'                        \
yann@1833
   225
                    -e 's/,//g; s/ /+/; s/^$/0/;'
yann@1833
   226
        ) ))
yann@1833
   227
        if [ ${val} -gt $((total/100)) ]; then
yann@1833
   228
            printf "%d %s\n" $(((1000*val)/total)) "${i}"
yann@1833
   229
            others=$((others-val))
yann@1833
   230
        fi
yann@1833
   231
    done; printf "%d Others\n" $(((1000*others)/total)); }  \
yann@1833
   232
    |sort -nr                                               \
yann@1833
   233
    |{ while read v i; do
yann@1833
   234
        if [ "${i}" = "Others" ]; then
yann@1833
   235
            others=${v}
yann@1833
   236
        else
yann@1833
   237
            printf "    %-24.24s %3d.%d%%\n" "${i}" $((v/10)) $((v%10))
yann@1833
   238
        fi
yann@1833
   239
       done; printf "    %-24.24s %3d.%d%%\n" "Others" $((others/10)) $((others%10)); }
yann@1833
   240
}
yann@1833
   241
yann@1822
   242
ver_M="$( printf "${version}" |cut -d . -f 1 )"
yann@1822
   243
ver_m="$( printf "${version}" |cut -d . -f 2 )"
yann@1822
   244
ver_p="$( printf "${version}" |cut -d . -f 3 )"
yann@1822
   245
yann@1822
   246
prefix="$(pwd)/crosstool-ng-${version}"
yann@1822
   247
pushd "${repos}" >/dev/null 2>&1
yann@1822
   248
yann@1822
   249
printf "Checking for existing tag: "
yann@2857
   250
if _hg tags |grep -E '^'"crosstool-ng-${version}"'\>' >/dev/null; then
yann@1822
   251
    printf "already tagged\n"
yann@1822
   252
    exit 1
yann@1822
   253
fi
yann@1822
   254
printf "no\n"
yann@1822
   255
yann@1822
   256
if [ ${ver_p} -eq 0 ]; then
yann@1822
   257
    print_mail="yes"
yann@1822
   258
    print_intro_changelog="print_intro_changelog_full_release"
yann@1822
   259
    label="parent"
yann@1822
   260
    msg="create maintenance branch, (update|bump) version to [[:digit:]]+"'\'".[[:digit:]]+"'\'".0"'$'
yann@1822
   261
    branch="default"
yann@1822
   262
    log_offset=0
yann@1822
   263
else
yann@1822
   264
    print_mail="no"
yann@1822
   265
    print_intro_changelog="print_intro_changelog_bug_fix"
yann@1822
   266
    label="changeset"
yann@1822
   267
    msg="(update|bump) version to ${ver_M}"'\'".${ver_m}"'\'".$((ver_p-1))"'\+hg$'
yann@1822
   268
    branch="${ver_M}.${ver_m}"
yann@1822
   269
    log_offset=1
yann@1822
   270
fi
yann@1822
   271
yann@1822
   272
printf "Computing boundary revisions:"
yann@1822
   273
gen_bound_revs
yann@1822
   274
printf " %d:%d\n" ${r1} ${r2}
yann@1822
   275
yann@1822
   276
printf "Tagging release:"
yann@2857
   277
_hg up "${branch}" >/dev/null
yann@1822
   278
if [ ${ver_p} -eq 0 ]; then
yann@1822
   279
    printf " update version"
yann@2857
   280
    _hg branch "${ver_M}.${ver_m}" >/dev/null
yann@1822
   281
    echo "${version}" >".version"
yann@2857
   282
    _hg ci -m "${ver_M}.${ver_m}: create maintenance branch, update version to ${version}"
yann@1822
   283
else
yann@1822
   284
    printf " update version"
yann@1822
   285
    echo "${version}" >".version"
yann@2857
   286
    _hg ci -m "${ver_M}.${ver_m}: update version to ${version}"
yann@1822
   287
fi
yann@1822
   288
yann@1822
   289
printf ", tag"
yann@2857
   290
_hg tag -m "Tagging release ${version}" crosstool-ng-${version}
yann@1822
   291
yann@1822
   292
printf ", update version"
yann@1822
   293
echo "${version}+hg" >".version"
yann@2857
   294
_hg ci -m "${ver_M}.${ver_m}: update version to ${version}+hg"
yann@1822
   295
yann@1822
   296
printf ", date"
yann@2857
   297
date="$( _hg log -r crosstool-ng-${version} --template '{date|isodate}\n'    \
yann@1822
   298
         |sed -r -e 's/-|://g; s/ /./; s/ //;'                              \
yann@1822
   299
       )"
yann@1822
   300
printf ", done.\n"
yann@1822
   301
yann@1822
   302
if [ ${ver_p} -eq 0 ]; then
yann@1822
   303
    printf "Generating release mail:"
yann@1822
   304
    printf " intro"
yann@1822
   305
    print_intro_mail        > "${prefix}.mail"
yann@1822
   306
    printf ", stats"
yann@1822
   307
    print_author_stats      >>"${prefix}.mail"
yann@1822
   308
    printf ", shortlog"
yann@1822
   309
    print_author_shortlog   >>"${prefix}.mail"
yann@1833
   310
    printf ", diffstat"
yann@1833
   311
    print_short_diffstat    >>"${prefix}.mail"
yann@1822
   312
    printf ", done.\n"
yann@1822
   313
fi
yann@1822
   314
yann@1822
   315
printf "Generating release changelog:"
yann@1822
   316
printf " intro"
yann@1822
   317
${print_intro_changelog}    > "${prefix}.changelog"
yann@1822
   318
printf ", stats"
yann@1822
   319
print_author_stats          >>"${prefix}.changelog"
yann@1822
   320
printf ", shortlog"
yann@1822
   321
print_author_shortlog       >>"${prefix}.changelog"
yann@1822
   322
printf ", diffstat"
yann@1822
   323
print_diffstat              >>"${prefix}.changelog"
yann@1822
   324
printf ", done.\n"
yann@1822
   325
yann@1822
   326
popd >/dev/null 2>&1
yann@1822
   327
yann@1822
   328
printf "Creating tarball:"
yann@1822
   329
prefix="crosstool-ng-${version}"
yann@2858
   330
printf " extract"
yann@2857
   331
date="$( _hg log -R "${repos}" -r "${prefix}" --template '{date|rfc822date}\n' )"
yann@2858
   332
tmpdir="$( mktemp -d --tmpdir XXXXXX )"
yann@2858
   333
_hg archive --cwd "${repos}" -r "${prefix}" -X '.hg*' --type files "${tmpdir}/${prefix}"
yann@2858
   334
printf ", bootstrap"
yann@2858
   335
pushd "${tmpdir}/${prefix}" >/dev/null 2>&1
yann@2858
   336
./bootstrap >/dev/null
yann@2859
   337
rm -rf autom4te.cache
yann@2858
   338
popd >/dev/null 2>&1
yann@2858
   339
printf ", tarball"
yann@2859
   340
tar cjf "$(pwd)/${prefix}.tar.bz2" -C "${tmpdir}" "${prefix}"
yann@2858
   341
rm -rf "${tmpdir}"
yann@1822
   342
printf ", sum"
yann@1822
   343
for s in md5 sha1 sha512; do
yann@1822
   344
    ${s}sum "${prefix}.tar.bz2" >"${prefix}.tar.bz2.${s}"
yann@1822
   345
done
yann@1822
   346
printf ", touch"
yann@1822
   347
touch -d "${date}" "${prefix}"*
yann@1822
   348
printf ", done.\n"
yann@1822
   349
yann@1822
   350
if [ ${ver_p} -eq 0 ]; then
yann@1822
   351
    printf "\nAn editor will be launched for you to edit the mail.\n"
yann@1822
   352
    read -p "Press enter when ready..." foo
yann@1833
   353
    cp "${prefix}.mail"{,.orig}
yann@1822
   354
    vi "${prefix}.mail"
yann@1833
   355
    diff -du -U 1 "${prefix}.mail"{.orig,} |patch -p0 "${prefix}.changelog" >/dev/null
yann@1833
   356
    rm -f "${prefix}".{mail,changelog}.orig
yann@1822
   357
fi
yann@1822
   358
yann@1822
   359
printf "\nAn editor will be launched for you to review the changelog.\n"
yann@1822
   360
read -p "Press enter when ready..." foo
yann@1822
   361
vi "${prefix}.changelog"
yann@1822
   362
yann@1822
   363
printf "\nNow, you can push the changes with:   hg push -R '${repos}'\n"