scripts/mk-release.sh
author "Yann E. MORIN" <yann.morin.1998@free.fr>
Sun May 11 23:43:52 2014 +0200 (2014-05-11)
changeset 3320 78af1c99bc6d
parent 2859 0afb64320510
permissions -rwxr-xr-x
scripts/functions: add target_endian_le and target_endian_be

We currently define target_endian_el and target_endian_eb to be the
tuple extension depending on endianness, defined to be respectively
'el' or 'eb' according to the endianness.

Some architecture do not use 'el' or 'eb', but use 'le' or 'be'.

Provide that as well, as two new variables: target_endian_le and
target_endian_be.

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Cc: Cody P Schafer <dev@codyps.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@2978
   246
sob_line="$( printf "Signed-off-by: "; _hg debugconfig ui.username )"
yann@1822
   247
prefix="$(pwd)/crosstool-ng-${version}"
yann@1822
   248
pushd "${repos}" >/dev/null 2>&1
yann@1822
   249
yann@1822
   250
printf "Checking for existing tag: "
yann@2857
   251
if _hg tags |grep -E '^'"crosstool-ng-${version}"'\>' >/dev/null; then
yann@1822
   252
    printf "already tagged\n"
yann@1822
   253
    exit 1
yann@1822
   254
fi
yann@1822
   255
printf "no\n"
yann@1822
   256
yann@1822
   257
if [ ${ver_p} -eq 0 ]; then
yann@1822
   258
    print_mail="yes"
yann@1822
   259
    print_intro_changelog="print_intro_changelog_full_release"
yann@1822
   260
    label="parent"
yann@1822
   261
    msg="create maintenance branch, (update|bump) version to [[:digit:]]+"'\'".[[:digit:]]+"'\'".0"'$'
yann@1822
   262
    branch="default"
yann@1822
   263
    log_offset=0
yann@1822
   264
else
yann@1822
   265
    print_mail="no"
yann@1822
   266
    print_intro_changelog="print_intro_changelog_bug_fix"
yann@1822
   267
    label="changeset"
yann@1822
   268
    msg="(update|bump) version to ${ver_M}"'\'".${ver_m}"'\'".$((ver_p-1))"'\+hg$'
yann@1822
   269
    branch="${ver_M}.${ver_m}"
yann@1822
   270
    log_offset=1
yann@1822
   271
fi
yann@1822
   272
yann@1822
   273
printf "Computing boundary revisions:"
yann@1822
   274
gen_bound_revs
yann@1822
   275
printf " %d:%d\n" ${r1} ${r2}
yann@1822
   276
yann@1822
   277
printf "Tagging release:"
yann@2857
   278
_hg up "${branch}" >/dev/null
yann@1822
   279
if [ ${ver_p} -eq 0 ]; then
yann@1822
   280
    printf " update version"
yann@2857
   281
    _hg branch "${ver_M}.${ver_m}" >/dev/null
yann@1822
   282
    echo "${version}" >".version"
yann@2978
   283
    _msg="$( printf "%s.%s: create maintenance branch, update version to %s\n\n%s" \
yann@2978
   284
                    "${ver_M}" "${ver_m}" "${version}" "${sob_line}"
yann@2978
   285
           )"
yann@2978
   286
    _hg ci -m "${_msg}"
yann@1822
   287
else
yann@1822
   288
    printf " update version"
yann@1822
   289
    echo "${version}" >".version"
yann@2978
   290
    _msg="$( printf "%s.%s: update version to %s\n\n%s" \
yann@2978
   291
                    "${ver_M}" "${ver_m}" "${version}" "${sob_line}"
yann@2978
   292
           )"
yann@2978
   293
    _hg ci -m "${_msg}"
yann@1822
   294
fi
yann@1822
   295
yann@1822
   296
printf ", tag"
yann@2978
   297
_msg="$( printf "Tagging release %s\n\n%s" "${version}" "${sob_line}" )"
yann@2978
   298
_hg tag -m "${_msg}" crosstool-ng-${version}
yann@1822
   299
yann@1822
   300
printf ", update version"
yann@1822
   301
echo "${version}+hg" >".version"
yann@2978
   302
_msg="$( printf "%s.%s: update version to %s+hg\n\n%s" \
yann@2978
   303
                "${ver_M}" "${ver_m}" "${version}" "${sob_line}"
yann@2978
   304
       )"
yann@2978
   305
_hg ci -m "${_msg}"
yann@1822
   306
yann@1822
   307
printf ", date"
yann@2857
   308
date="$( _hg log -r crosstool-ng-${version} --template '{date|isodate}\n'    \
yann@1822
   309
         |sed -r -e 's/-|://g; s/ /./; s/ //;'                              \
yann@1822
   310
       )"
yann@1822
   311
printf ", done.\n"
yann@1822
   312
yann@1822
   313
if [ ${ver_p} -eq 0 ]; then
yann@1822
   314
    printf "Generating release mail:"
yann@1822
   315
    printf " intro"
yann@1822
   316
    print_intro_mail        > "${prefix}.mail"
yann@1822
   317
    printf ", stats"
yann@1822
   318
    print_author_stats      >>"${prefix}.mail"
yann@1822
   319
    printf ", shortlog"
yann@1822
   320
    print_author_shortlog   >>"${prefix}.mail"
yann@1833
   321
    printf ", diffstat"
yann@1833
   322
    print_short_diffstat    >>"${prefix}.mail"
yann@1822
   323
    printf ", done.\n"
yann@1822
   324
fi
yann@1822
   325
yann@1822
   326
printf "Generating release changelog:"
yann@1822
   327
printf " intro"
yann@1822
   328
${print_intro_changelog}    > "${prefix}.changelog"
yann@1822
   329
printf ", stats"
yann@1822
   330
print_author_stats          >>"${prefix}.changelog"
yann@1822
   331
printf ", shortlog"
yann@1822
   332
print_author_shortlog       >>"${prefix}.changelog"
yann@1822
   333
printf ", diffstat"
yann@1822
   334
print_diffstat              >>"${prefix}.changelog"
yann@1822
   335
printf ", done.\n"
yann@1822
   336
yann@1822
   337
popd >/dev/null 2>&1
yann@1822
   338
yann@1822
   339
printf "Creating tarball:"
yann@1822
   340
prefix="crosstool-ng-${version}"
yann@2858
   341
printf " extract"
yann@2857
   342
date="$( _hg log -R "${repos}" -r "${prefix}" --template '{date|rfc822date}\n' )"
yann@2858
   343
tmpdir="$( mktemp -d --tmpdir XXXXXX )"
yann@2858
   344
_hg archive --cwd "${repos}" -r "${prefix}" -X '.hg*' --type files "${tmpdir}/${prefix}"
yann@2858
   345
printf ", bootstrap"
yann@2858
   346
pushd "${tmpdir}/${prefix}" >/dev/null 2>&1
yann@2858
   347
./bootstrap >/dev/null
yann@2859
   348
rm -rf autom4te.cache
yann@2858
   349
popd >/dev/null 2>&1
yann@2858
   350
printf ", tarball"
yann@2859
   351
tar cjf "$(pwd)/${prefix}.tar.bz2" -C "${tmpdir}" "${prefix}"
yann@2858
   352
rm -rf "${tmpdir}"
yann@1822
   353
printf ", sum"
yann@1822
   354
for s in md5 sha1 sha512; do
yann@1822
   355
    ${s}sum "${prefix}.tar.bz2" >"${prefix}.tar.bz2.${s}"
yann@1822
   356
done
yann@1822
   357
printf ", touch"
yann@1822
   358
touch -d "${date}" "${prefix}"*
yann@1822
   359
printf ", done.\n"
yann@1822
   360
yann@1822
   361
if [ ${ver_p} -eq 0 ]; then
yann@1822
   362
    printf "\nAn editor will be launched for you to edit the mail.\n"
yann@1822
   363
    read -p "Press enter when ready..." foo
yann@1833
   364
    cp "${prefix}.mail"{,.orig}
yann@1822
   365
    vi "${prefix}.mail"
yann@1833
   366
    diff -du -U 1 "${prefix}.mail"{.orig,} |patch -p0 "${prefix}.changelog" >/dev/null
yann@1833
   367
    rm -f "${prefix}".{mail,changelog}.orig
yann@1822
   368
fi
yann@1822
   369
yann@1822
   370
printf "\nAn editor will be launched for you to review the changelog.\n"
yann@1822
   371
read -p "Press enter when ready..." foo
yann@1822
   372
vi "${prefix}.changelog"
yann@1822
   373
yann@1822
   374
printf "\nNow, you can push the changes with:   hg push -R '${repos}'\n"