/ release-prep.sh
release-prep.sh
  1  #!/bin/bash
  2  
  3  # This script will do code related release preparation stuff for Bitcoin Core as specified in
  4  # the release-process.md file.
  5  # This should be run from the folder containing the Source tree
  6  # The following actions will be done:
  7  #  1. Set the version numbers as specified in the arguments
  8  #  2. Update src/chainparams.cpp nMinimumChainWork and defaultAssumeValid with information from the getblockchaininfo rpc.
  9  #  3. Update Hard coded seeds
 10  #  4. Set BLOCK_CHAIN_SIZE
 11  #  5. Update translations
 12  #  6. Generate updated manpages
 13  # Note: Step 2 assumes that an up-to-date Bitcoin Core is running and has been built in the
 14  # directory which this script is being run.
 15  
 16  # Variables
 17  VERSION=
 18  BLOCK_CHAIN_SIZE=
 19  DATADIR=""
 20  verBump=true
 21  chainparamsUpdate=true
 22  seedUpdate=true
 23  blockchainsizeBump=true
 24  translationsUpdate=true
 25  genManpages=true
 26  
 27  # Help Message
 28  read -d '' usage <<- EOF
 29  Usage: $scriptName version block_chain_size
 30  
 31  Run this script from the Bitcoin Core Source root directory. This requires a current version of Bitcoin Core
 32  to be running at the time that this script is run.
 33  
 34  Arguments:
 35  version		    Version number to set following the MAJOR.MINOR.REVISION format. Only required if
 36                      a version bump will be done. e.g. 29.0
 37  block_chain_size    The size of the blockchain for the intro display. Should contain a little bit of 
 38                      overhead. Only required if BLOCK_CHAIN_SIZE will be updated. e.g. 120
 39  
 40  Options:
 41  --datadir <path>    The path to the data directory of the running Bitcoin Core node. Note that this is 
 42                      different from Bitcoin Core's -datadir option syntax. There is no equals, simply a space
 43                      followed by the path
 44  
 45  --skip [v|c|s|b|t|m]   Skip the specified steps. v=version bump; c=update nMinimumChainwork and defaultAssumeValid
 46                         s=hard coded seed update; b=blockchain size bump; t=translations update; m=generate manpages.
 47                         The steps will be done in the order listed above.
 48  
 49  EOF
 50  
 51  # Get options and arguments
 52  while :; do
 53      case $1 in
 54          # datadir
 55          --datadir)
 56  	    if [ -n "$2" ]
 57  	    then
 58  		DATADIR="-datadir=$2"
 59  		shift
 60  	    else
 61  		echo 'Error: "--datadir" requires an argument'
 62  		exit 1
 63  	    fi
 64  	    ;;
 65          # skips
 66          --skip)
 67  	    if [ -n "$2" ]
 68  	    then
 69  		if [[ "$2" = *"v"* ]]
 70  		then
 71  		    verBump=false
 72  		fi
 73  		if [[ "$2" = *"c"* ]]
 74  		then
 75  		    chainparamsUpdate=false
 76  		fi
 77          if [[ "$2" = *"s"* ]]
 78  		then
 79              seedUpdate=false
 80  		fi
 81  		if [[ "$2" = *"b"* ]]
 82  		then
 83              blockchainsizeBump=false
 84  		fi
 85  		if [[ "$2" = *"t"* ]]
 86  		then
 87              translationsUpdate=false
 88  		fi
 89  		if [[ "$2" = *"m"* ]]
 90  		then
 91              genManpages=false
 92  		fi
 93  		shift
 94  	    else
 95  		echo 'Error: "--skip" requires an argument'
 96  		exit 1
 97  	    fi
 98  	    ;;
 99  	*)               # Default case: If no more options then break out of the loop.
100          break
101      esac
102      shift
103  done
104  
105  if [[ $verBump = true ]]
106  then
107      # Bump Version numbers
108      # Get version
109      if [[ -n "$1" ]]
110      then
111          VERSION=$1
112          shift
113      fi
114  
115      # Check that a version is specified
116      if [[ $VERSION == "" ]]
117      then
118          echo "$scriptName: Missing version."
119          echo "Try $scriptName --help for more information"
120          exit 1
121      fi
122  
123      echo "Setting Version number"
124      major=$(echo $VERSION | cut -d. -f1)
125      minor=$(echo $VERSION | cut -d. -f2)
126      rev=$(echo $VERSION | cut -d. -f3)
127  
128      # configure.ac
129      sed -i "/define(_CLIENT_VERSION_MAJOR, /c\define(_CLIENT_VERSION_MAJOR, $major)" ./configure.ac
130      sed -i "/define(_CLIENT_VERSION_MINOR, /c\define(_CLIENT_VERSION_MINOR, $minor)" ./configure.ac
131      sed -i "/define(_CLIENT_VERSION_REVISION, /c\define(_CLIENT_VERSION_REVISION, $rev)" ./configure.ac
132      sed -i "/define(_CLIENT_VERSION_IS_RELEASE, /c\define(_CLIENT_VERSION_IS_RELEASE, true)" ./configure.ac
133  
134      # src/clientversion.h
135      sed -i "/#define CLIENT_VERSION_MAJOR /c\#define CLIENT_VERSION_MAJOR $major" ./src/clientversion.h
136      sed -i "/#define CLIENT_VERSION_MINOR /c\#define CLIENT_VERSION_MINOR $minor" ./src/clientversion.h
137      sed -i "/#define CLIENT_VERSION_REVISION /c\#define CLIENT_VERSION_REVISION $rev" ./src/clientversion.h
138      sed -i "/#define CLIENT_VERSION_IS_RELEASE /c\#define CLIENT_VERSION_IS_RELEASE true" ./src/clientversion.h
139  
140      # docs
141      sed -i "/PROJECT_NUMBER         = /c\PROJECT_NUMBER         = $VERSION" ./doc/Doxyfile
142      sed -i "1s/.*/Bitcoin Core $VERSION/" ./doc/README.md
143      sed -i "1s/.*/Bitcoin Core $VERSION/" ./doc/README_windows.txt
144  
145      # gitian descriptors
146      sed -i "2s/.*/name: \"bitcoin-win-$major.$minor\"/" ./contrib/gitian-descriptors/gitian-win.yml
147      sed -i "2s/.*/name: \"bitcoin-linux-$major.$minor\"/" ./contrib/gitian-descriptors/gitian-linux.yml
148      sed -i "2s/.*/name: \"bitcoin-osx-$major.$minor\"/" ./contrib/gitian-descriptors/gitian-osx.yml
149  fi
150  
151  if [[ $chainparamsUpdate = true ]]
152  then
153      # Update nMinimumChainWork and defaultAssumeValid
154      echo "Updating nMinimumChainWork and defaultAssumeValid"
155      blockchaininfo=`src/bitcoin-cli ${DATADIR} getblockchaininfo`
156      chainwork=`echo "$blockchaininfo" | jq -r '.chainwork'`
157      bestblockhash=`echo "$blockchaininfo" | jq -r '.bestblockhash'`
158      sed -i "0,/        consensus.nMinimumChainWork = uint256S(.*/s//        consensus.nMinimumChainWork = uint256S(\"0x$chainwork\");/" ./src/chainparams.cpp
159      sed -i "0,/        consensus.defaultAssumeValid = uint256S(.*/s//        consensus.defaultAssumeValid = uint256S(\"0x$bestblockhash\");/" ./src/chainparams.cpp
160  fi
161  
162  if [[ $seedUpdate = true ]]
163  then
164      # Update Seeds
165      echo "Updating hard coded seeds"
166      pushd ./contrib/seeds
167      curl -s http://bitcoin.sipa.be/seeds.txt > seeds_main.txt
168      python makeseeds.py < seeds_main.txt > nodes_main.txt
169      python generate-seeds.py . > ../../src/chainparamsseeds.h
170  popd
171  fi
172  
173  if [[ $blockchainsizeBump = true ]]
174  then
175      # Set blockchain size
176      # Get block_chain_size
177      if [[ -n "$1" ]]
178      then
179          BLOCK_CHAIN_SIZE=$1
180          shift
181      fi
182  
183      # Check that a block_chain_size is specified
184      if [[ $BLOCK_CHAIN_SIZE == "" ]]
185      then
186          echo "$scriptName: Missing block_chain_size."
187          echo "Try $scriptName --help for more information"
188          exit 1
189      fi
190      echo "Setting BLOCK_CHAIN_SIZE"
191      sed -i "/static const uint64_t BLOCK_CHAIN_SIZE = /c\static const uint64_t BLOCK_CHAIN_SIZE = $BLOCK_CHAIN_SIZE;" ./src/qt/intro.cpp
192  fi
193  
194  if [[ $translationsUpdate = true ]]
195  then
196      # Update translations
197      echo "Updating translations"
198      python contrib/devtools/update-translations.py
199      ls src/qt/locale/*ts|xargs -n1 basename|sed 's/\(bitcoin_\(.*\)\).ts/<file alias="\2">locale\/\1.qm<\/file>/'
200      ls src/qt/locale/*ts|xargs -n1 basename|sed 's/\(bitcoin_\(.*\)\).ts/ qt\/locale\/\1.ts \\/'
201  fi
202  
203  if [[ $genManpages = true ]]
204  then
205      # Generate manpages
206      echo "Generating manpages"
207      bash ./contrib/devtools/gen-manpages.sh
208  fi
209  
210  # Complete
211  echo "Release preparation complete. Please use git to commit these changes"