scripts/mk-release.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Tue Aug 23 21:11:26 2011 +0200 (2011-08-23)
changeset 2891 f176fee535a0
parent 2858 696243162237
child 2978 a6d19e44d08a
permissions -rwxr-xr-x
cc/gcc: add 'cflags' paramater to the core backend

As the core backend is used to generate the bare-metal compiler,
we need to pass it the host CFLAGS.

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
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"