summaryrefslogtreecommitdiffstats
path: root/contrib/jemalloc/FREEBSD-upgrade
blob: 6ee6cc91e42e23a69ce8d966c60a7025e4ef72f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/bin/sh
# $FreeBSD$
#
# Usage: cd /usr/src/contrib/jemalloc
#        ./FREEBSD-upgrade <command> [args]
#
# At least the following ports are required when importing jemalloc:
# - devel/autoconf
# - devel/git
# - devel/gmake
# - textproc/docbook-xsl
# - textproc/libxslt
#
# The normal workflow for importing a new release is:
#
#   cd /usr/src/contrib/jemalloc
#
# Merge local changes that were made since the previous import:
#
#   ./FREEBSD-upgrade merge-changes
#   ./FREEBSD-upgrade rediff
#
# Extract latest jemalloc release.
#
#   ./FREEBSD-upgrade extract
#
# Fix patch conflicts as necessary, then regenerate diffs to update line
# offsets:
#
#   ./FREEBSD-upgrade rediff
#   ./FREEBSD-upgrade extract
#
# Do multiple buildworld/installworld rounds.  If problems arise and patches
# are needed, edit the code in ${work} as necessary, then:
#
#   ./FREEBSD-upgrade rediff
#   ./FREEBSD-upgrade extract
#
# The rediff/extract order is important because rediff saves the local
# changes, then extract blows away the work tree and re-creates it with the
# diffs applied.
#
# Finally, to clean up:
#
#  ./FREEBSD-upgrade clean

set -e

if [ ! -x "FREEBSD-upgrade" ] ; then
  echo "Run from within src/contrib/jemalloc/" >&2
  exit 1
fi

src=`pwd`
workname="jemalloc.git"
work="${src}/../${workname}" # merge-changes expects ${workname} in "..".
changes="${src}/FREEBSD-changes"

do_extract() {
  local rev=$1
  # Clone.
  rm -rf ${work}
  git clone https://github.com/jemalloc/jemalloc.git ${work}
  (
    cd ${work}
    if [ "x${rev}" != "x" ] ; then
      # Use optional rev argument to check out a revision other than HEAD on
      # master.
      git checkout ${rev}
    fi
    # Apply diffs before generating files.
    patch -p1 < "${src}/FREEBSD-diffs"
    find . -name '*.orig' -delete
    # Generate various files.
    ./autogen.sh --enable-cc-silence --enable-xmalloc --enable-utrace \
      --with-xslroot=/usr/local/share/xsl/docbook --with-private-namespace=__ \
      --with-lg-page-sizes=12,13,14,16
    gmake dist
  )
}

do_diff() {
  (
    cd ${work}
    find . -name '*.orig' -delete
    find . -name '*.rej' -delete
    git add -A
    git diff --cached
  ) > FREEBSD-diffs
}

command=$1
shift
case "${command}" in
  merge-changes) # Merge local changes that were made since the previous import.
    rev=`cat VERSION |tr 'g' ' ' |awk '{print $2}'`
    # Extract code corresponding to most recent import.
    do_extract ${rev}
    # Compute local differences to the upstream+patches and apply them.
    (
      cd ..
      diff -ru -X ${src}/FREEBSD-Xlist ${workname} jemalloc > ${changes} || true
    )
    (
      cd ${work}
      patch -p1 < ${changes}
      find . -name '*.orig' -delete
    )
    # Update diff.
    do_diff
    ;;
  extract) # Extract upstream sources, apply patches, copy to contrib/jemalloc.
    rev=$1
    do_extract ${rev}
    # Delete existing files so that cruft doesn't silently remain.
    rm -rf ChangeLog COPYING VERSION doc include src
    # Copy files over.
    tar cf - -C ${work} -X FREEBSD-Xlist . |tar xvf -
    ;;
  rediff) # Regenerate diffs based on working tree.
    do_diff
    ;;
  clean) # Remove working tree and temporary files.
    rm -rf ${work} ${changes}
    ;;
  *)
    echo "Unsupported command: \"${command}\"" >&2
    exit 1
    ;;
esac
OpenPOWER on IntegriCloud