security/core#97 Ensure that php scripts where applicable in sql and tools that shoul...
[civicrm-core.git] / tools / bin / scripts / set-version.php
CommitLineData
545fc9df
TO
1#!/usr/bin/env php
2<?php
3
4// Update the data-files within this repo to reflect a new version number.
5// Example usage:
6// git checkout origin/master -b master-4.7.29
7// ./tools/bin/scripts/set-version.php 4.7.29 --commit
8// git commit -m "Update to version 4.7.29"
9// git push origin master
10
11/* *********************************************************************** */
12/* Boot */
a9f3bf65
SL
13if (php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)) {
14 header("HTTP/1.0 404 Not Found");
15 return;
16}
545fc9df
TO
17$civicrm_root = dirname(dirname(dirname(__DIR__)));
18chdir($civicrm_root);
19
20/* *********************************************************************** */
21/* Parse inputs -- $oldVersion, $newVersion, $doCommit */
22
23$oldVersion = (string) simplexml_load_file("xml/version.xml")->version_no;
24if (!isVersionValid($oldVersion)) {
25 fatal("failed to read old version from \"xml/version.xml\"\n");
26}
27
28$newVersion = @$argv[1];
29if (!isVersionValid($newVersion)) {
30 fatal("failed to read new version\n");
31}
32
33switch (@$argv[2]) {
34 case '--commit':
35 $doCommit = 1;
36 break;
37 case '--no-commit':
38 $doCommit = 0;
39 break;
40 default:
41 fatal("Must specify --commit or --no-commit\n");
42}
43
44/* *********************************************************************** */
45/* Main */
46
337dc87a
TO
47echo "Changing version from $oldVersion to $newVersion...\n";
48
49$verName = makeVerName($newVersion);
b7c0a88f 50$phpFile = initFile("CRM/Upgrade/Incremental/php/{$verName}.php", function () use ($verName) {
337dc87a
TO
51 ob_start();
52 global $camelNumber;
53 $camelNumber = $verName;
54 require 'CRM/Upgrade/Incremental/php/Template.php';
55 unset($camelNumber);
56 return ob_get_clean();
57});
58
b7c0a88f 59$sqlFile = initFile("CRM/Upgrade/Incremental/sql/{$newVersion}.mysql.tpl", function () use ($newVersion) {
337dc87a
TO
60 return "{* file to handle db changes in $newVersion during upgrade *}\n";
61});
545fc9df
TO
62
63updateFile("xml/version.xml", function ($content) use ($newVersion, $oldVersion) {
64 return str_replace($oldVersion, $newVersion, $content);
65});
66
653b713e
C
67if (file_exists("civicrm-version.php")) {
68 updateFile("civicrm-version.php", function ($content) use ($newVersion, $oldVersion) {
69 return str_replace($oldVersion, $newVersion, $content);
70 });
71}
4d4f529c 72
545fc9df
TO
73updateFile("sql/civicrm_generated.mysql", function ($content) use ($newVersion, $oldVersion) {
74 return str_replace($oldVersion, $newVersion, $content);
75});
76
d071a643
SL
77updateFile("sql/test_data_second_domain.mysql", function ($content) use ($newVersion, $oldVersion) {
78 return str_replace($oldVersion, $newVersion, $content);
79});
80
545fc9df 81if ($doCommit) {
d071a643 82 $files = "xml/version.xml sql/civicrm_generated.mysql sql/test_data_second_domain.mysql " . escapeshellarg($phpFile) . ' ' . escapeshellarg($sqlFile);
545fc9df
TO
83 passthru("git add $files");
84 passthru("git commit $files -m " . escapeshellarg("Set version to $newVersion"));
85}
86
87/* *********************************************************************** */
88/* Helper functions */
89
337dc87a
TO
90/**
91 * Update the content of a file.
92 *
93 * @param string $file
94 * @param callable $callback
95 * Function(string $originalContent) => string $newContent.
96 */
545fc9df
TO
97function updateFile($file, $callback) {
98 if (!file_exists($file)) {
99 die("File does not exist: $file\n");
100 }
101 echo "Update \"$file\"\n";
102 $content = file_get_contents($file);
103 $content = $callback($content);
104 file_put_contents($file, $content);
105}
106
337dc87a
TO
107/**
108 * Initialize a file (if it doesn't already exist).
109 * @param string $file
110 * @param callable $callback
111 * Function() => string $newContent.
112 */
113function initFile($file, $callback) {
114 if (file_exists($file)) {
115 echo "File \"$file\" already exists.\n";
116 }
117 else {
118 echo "Initialize \"$file\"\n";
119 $content = $callback();
120 file_put_contents($file, $content);
121 }
122 return $file;
123}
124
125/**
126 * Render a pretty string for a major/minor version number.
127 *
128 * @param string $version
129 * Ex: '5.10.alpha1'
130 * @return string
131 * Ex: 'FiveTen'.
132 */
133function makeVerName($version) {
134 list ($a, $b) = explode('.', $version);
135 require_once 'CRM/Utils/EnglishNumber.php';
136 return CRM_Utils_EnglishNumber::toCamelCase($a) . CRM_Utils_EnglishNumber::toCamelCase($b);
137}
138
545fc9df
TO
139function isVersionValid($v) {
140 return $v && preg_match('/^[0-9a-z\.\-]+$/', $v);
141}
142
143/**
144 * @param $error
145 */
146function fatal($error) {
147 echo $error;
148 echo "usage: set-version.php <new-version> [--commit|--no-commit]\n";
149 echo " With --commit, any changes will be committed automatically the current git branch.\n";
150 echo " With --no-commit, any changes will be left uncommitted.\n";
151 exit(1);
152}