Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eb17220dd5 |
@@ -66,6 +66,24 @@ means the tree had uncommitted changes to tracked files when it was built —
|
|||||||
useful when a test machine reports something a clean build cannot reproduce.
|
useful when a test machine reports something a clean build cannot reproduce.
|
||||||
Only the `4.12` product line is set by hand, at the top of the script.
|
Only the `4.12` product line is set by hand, at the top of the script.
|
||||||
|
|
||||||
|
**Test builds expire.** `$expireDays` at the top of the same script is the
|
||||||
|
shelf life in days (currently **14**, counted from the day it was *built*,
|
||||||
|
not the day the code was written — rebuilding an old commit gives a usable
|
||||||
|
binary rather than one born stale). An expired build says so in a dialog,
|
||||||
|
names its version and expiry date, points at the releases page, and exits
|
||||||
|
without running. It stops a tester spending an afternoon on something that
|
||||||
|
was fixed a week ago.
|
||||||
|
|
||||||
|
> ⚠️ **Set `$expireDays = 0` for a real release.** A shipped build that
|
||||||
|
> expires is a catastrophe, and that one line is what decides it.
|
||||||
|
|
||||||
|
`RP412NOEXPIRY=1` waives the check when an old build has to be run on
|
||||||
|
purpose, and says so in the log so a waived build is never mistaken for a
|
||||||
|
current one. It is deliberately **not** listed in `environ.ini` — a bypass
|
||||||
|
every tester can see is a bypass every tester will use. Negative
|
||||||
|
`$expireDays` backdates the expiry, which is how the refusal gets tested
|
||||||
|
without touching the machine's clock.
|
||||||
|
|
||||||
The header is deliberately not committed: the commit that recorded a
|
The header is deliberately not committed: the commit that recorded a
|
||||||
hardcoded number would itself change the count, so the file would be stale
|
hardcoded number would itself change the count, so the file would be stale
|
||||||
the moment it landed. It is rewritten only when the stamp actually changes,
|
the moment it landed. It is rewritten only when the stamp actually changes,
|
||||||
|
|||||||
@@ -42,6 +42,7 @@
|
|||||||
#include <strsafe.h>
|
#include <strsafe.h>
|
||||||
#include <direct.h>
|
#include <direct.h>
|
||||||
#include <shellapi.h>
|
#include <shellapi.h>
|
||||||
|
#include <time.h> // the test-build expiry check
|
||||||
|
|
||||||
#define SPOOL_SIZE 0x600000
|
#define SPOOL_SIZE 0x600000
|
||||||
|
|
||||||
@@ -182,6 +183,98 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
|
|||||||
//
|
//
|
||||||
RPL4Environ_Load();
|
RPL4Environ_Load();
|
||||||
|
|
||||||
|
//
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
// Test builds have a shelf life.
|
||||||
|
//
|
||||||
|
// A tester still racing a fortnight-old binary reports things that were
|
||||||
|
// fixed a week ago, and the afternoon spent chasing them is gone. So the
|
||||||
|
// build says plainly that it is out of date and stops, rather than
|
||||||
|
// running on and being quietly wrong about what it is.
|
||||||
|
//
|
||||||
|
// This is a nudge, not a lock: the date comes from the machine's own
|
||||||
|
// clock, so anyone determined can wind it back, and RP412NOEXPIRY=1 is
|
||||||
|
// there for us when an old build has to be run on purpose. It is
|
||||||
|
// deliberately not listed in environ.ini - a bypass every tester can see
|
||||||
|
// is a bypass every tester will use, and then the build never goes stale
|
||||||
|
// for the one person it was meant to stop.
|
||||||
|
//
|
||||||
|
// $expireDays in stamp-version.ps1 is what sets this, and 0 turns it off
|
||||||
|
// for a real release.
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
#if RP412_EXPIRES
|
||||||
|
{
|
||||||
|
const char *no_expiry = getenv("RP412NOEXPIRY");
|
||||||
|
Logical overridden = (no_expiry != NULL && atoi(no_expiry) != 0);
|
||||||
|
|
||||||
|
__time64_t raw_now = _time64(NULL);
|
||||||
|
struct tm today;
|
||||||
|
if (!overridden && _localtime64_s(&today, &raw_now) == 0)
|
||||||
|
{
|
||||||
|
int now_stamp =
|
||||||
|
(today.tm_year + 1900) * 10000 + (today.tm_mon + 1) * 100 + today.tm_mday;
|
||||||
|
int expiry_stamp =
|
||||||
|
RP412_EXPIRY_YEAR * 10000 + RP412_EXPIRY_MONTH * 100 + RP412_EXPIRY_DAY;
|
||||||
|
|
||||||
|
if (now_stamp > expiry_stamp)
|
||||||
|
{
|
||||||
|
DEBUG_STREAM << "Build expired on " << RP412_EXPIRY_TEXT
|
||||||
|
<< " - refusing to run\n" << std::flush;
|
||||||
|
|
||||||
|
char notice[512];
|
||||||
|
sprintf(notice,
|
||||||
|
"This Red Planet test build has expired.\n\n"
|
||||||
|
" Build %s\n"
|
||||||
|
" Expired %s\n\n"
|
||||||
|
"Test builds are good for a fortnight so that nobody spends an "
|
||||||
|
"afternoon chasing something that was fixed a week ago.\n\n"
|
||||||
|
"Grab the current one:\n"
|
||||||
|
"https://gitea.mysticmachines.com/VWE/RP412/releases",
|
||||||
|
RP412_VERSION_LONG, RP412_EXPIRY_TEXT);
|
||||||
|
MessageBoxA(NULL, notice, "Red Planet - test build expired",
|
||||||
|
MB_OK | MB_ICONWARNING | MB_SETFOREGROUND);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// The last few days get a line in the log, so somebody reading a
|
||||||
|
// report can see the build was nearly out rather than wondering.
|
||||||
|
//
|
||||||
|
struct tm expiry_day;
|
||||||
|
memset(&expiry_day, 0, sizeof(expiry_day));
|
||||||
|
expiry_day.tm_year = RP412_EXPIRY_YEAR - 1900;
|
||||||
|
expiry_day.tm_mon = RP412_EXPIRY_MONTH - 1;
|
||||||
|
expiry_day.tm_mday = RP412_EXPIRY_DAY;
|
||||||
|
//
|
||||||
|
// The END of the expiry day, because that is the rule the check
|
||||||
|
// above enforces - the build is good for all of that date and
|
||||||
|
// refuses the morning after. Anchoring at midday instead would
|
||||||
|
// report one day fewer than the build actually has left.
|
||||||
|
//
|
||||||
|
expiry_day.tm_hour = 23;
|
||||||
|
expiry_day.tm_min = 59;
|
||||||
|
expiry_day.tm_sec = 59;
|
||||||
|
expiry_day.tm_isdst = -1;
|
||||||
|
__time64_t expiry_time = _mktime64(&expiry_day);
|
||||||
|
if (expiry_time != (__time64_t) -1)
|
||||||
|
{
|
||||||
|
int days_left = (int)((expiry_time - raw_now) / (24 * 60 * 60));
|
||||||
|
if (days_left <= 3)
|
||||||
|
{
|
||||||
|
DEBUG_STREAM << "Build expires " << RP412_EXPIRY_TEXT << " ("
|
||||||
|
<< days_left << " day(s) left)\n" << std::flush;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (overridden)
|
||||||
|
{
|
||||||
|
DEBUG_STREAM << "Build expiry (" << RP412_EXPIRY_TEXT
|
||||||
|
<< ") waived by RP412NOEXPIRY\n" << std::flush;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
DEBUG_STREAM << "L4CONTROLS=" << getenv("L4CONTROLS") << std::endl << std::flush;
|
DEBUG_STREAM << "L4CONTROLS=" << getenv("L4CONTROLS") << std::endl << std::flush;
|
||||||
|
|
||||||
#ifdef RP412_STEAM
|
#ifdef RP412_STEAM
|
||||||
|
|||||||
@@ -282,6 +282,16 @@ through several updates stops being offered new options - rpl4.log names
|
|||||||
any it has not heard of, and deleting the file brings back the fully
|
any it has not heard of, and deleting the file brings back the fully
|
||||||
documented current one.
|
documented current one.
|
||||||
|
|
||||||
|
THIS IS A TEST BUILD AND IT GOES STALE. Two weeks after it was built it
|
||||||
|
will tell you so and refuse to start, rather than let you spend an
|
||||||
|
afternoon on something that was fixed the week before. When that happens,
|
||||||
|
grab the current build:
|
||||||
|
|
||||||
|
https://gitea.mysticmachines.com/VWE/RP412/releases
|
||||||
|
|
||||||
|
Unzip it over this folder - your environ.ini, bindings.txt, pilot.cfg and
|
||||||
|
mfd_layout.cfg all survive.
|
||||||
|
|
||||||
Known prototype notes: pods race untextured (the player1-8 skins come
|
Known prototype notes: pods race untextured (the player1-8 skins come
|
||||||
from the presets system, not shipped data), and text drawn on the plasma
|
from the presets system, not shipped data), and text drawn on the plasma
|
||||||
glass may appear rotated.
|
glass may appear rotated.
|
||||||
|
|||||||
+47
-2
@@ -18,6 +18,15 @@ $ErrorActionPreference = 'Stop'
|
|||||||
# number after it looks after itself.
|
# number after it looks after itself.
|
||||||
$line = '4.12'
|
$line = '4.12'
|
||||||
|
|
||||||
|
# How many days a build stays good for. Test builds go stale so nobody is
|
||||||
|
# still racing a fortnight-old binary and reporting things that were fixed
|
||||||
|
# a week ago - the expired build says so and stops, rather than quietly
|
||||||
|
# wasting everyone's afternoon.
|
||||||
|
#
|
||||||
|
# SET THIS TO 0 FOR A REAL RELEASE. A shipped build that expires is a
|
||||||
|
# catastrophe, and this is the one line that decides it.
|
||||||
|
$expireDays = 14
|
||||||
|
|
||||||
$root = Split-Path -Parent $MyInvocation.MyCommand.Path
|
$root = Split-Path -Parent $MyInvocation.MyCommand.Path
|
||||||
$header = Join-Path $root 'RP_L4\rpl4build.h'
|
$header = Join-Path $root 'RP_L4\rpl4build.h'
|
||||||
|
|
||||||
@@ -62,6 +71,32 @@ if ($count -eq 0) {
|
|||||||
$long = "$version ($commit$(if ($dirty) { '+' } else { '' }))"
|
$long = "$version ($commit$(if ($dirty) { '+' } else { '' }))"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Expiry, from the day it was BUILT rather than the day the code was
|
||||||
|
# written: rebuilding an old commit to chase something should give a
|
||||||
|
# usable binary, not one that was born stale.
|
||||||
|
#
|
||||||
|
# The date is what makes this header change from one day to the next, so
|
||||||
|
# the first build of each day recompiles RPL4.CPP and the rest of that
|
||||||
|
# day's builds do not. One file, a couple of seconds.
|
||||||
|
#
|
||||||
|
# Only 0 means "never". A NEGATIVE count backdates the expiry, which is how
|
||||||
|
# the refusal gets tested without touching the machine's clock.
|
||||||
|
if ($expireDays -ne 0) {
|
||||||
|
$expiry = (Get-Date).Date.AddDays($expireDays)
|
||||||
|
$expires = 1
|
||||||
|
$expiryY = $expiry.Year
|
||||||
|
$expiryM = $expiry.Month
|
||||||
|
$expiryD = $expiry.Day
|
||||||
|
$expiryTxt = $expiry.ToString('d MMMM yyyy', [Globalization.CultureInfo]::InvariantCulture)
|
||||||
|
} else {
|
||||||
|
$expires = 0
|
||||||
|
$expiryY = 0
|
||||||
|
$expiryM = 0
|
||||||
|
$expiryD = 0
|
||||||
|
$expiryTxt = 'never'
|
||||||
|
}
|
||||||
|
|
||||||
$content = @"
|
$content = @"
|
||||||
//===========================================================================//
|
//===========================================================================//
|
||||||
// File: rpl4build.h GENERATED - do not edit, do not commit //
|
// File: rpl4build.h GENERATED - do not edit, do not commit //
|
||||||
@@ -70,6 +105,9 @@ $content = @"
|
|||||||
// is the repository's commit count and the hash beside it names the exact //
|
// is the repository's commit count and the hash beside it names the exact //
|
||||||
// commit, so a running build always says where it came from. A trailing '+' //
|
// commit, so a running build always says where it came from. A trailing '+' //
|
||||||
// means the tree had uncommitted changes to tracked files when it was built. //
|
// means the tree had uncommitted changes to tracked files when it was built. //
|
||||||
|
// //
|
||||||
|
// EXPIRES is the test-build shelf life - see \$expireDays in the script. A //
|
||||||
|
// release must be built with it at 0. //
|
||||||
//===========================================================================//
|
//===========================================================================//
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
@@ -79,6 +117,12 @@ $content = @"
|
|||||||
#define RP412_BUILD_DIRTY $dirty
|
#define RP412_BUILD_DIRTY $dirty
|
||||||
#define RP412_VERSION "$version"
|
#define RP412_VERSION "$version"
|
||||||
#define RP412_VERSION_LONG "$long"
|
#define RP412_VERSION_LONG "$long"
|
||||||
|
|
||||||
|
#define RP412_EXPIRES $expires
|
||||||
|
#define RP412_EXPIRY_YEAR $expiryY
|
||||||
|
#define RP412_EXPIRY_MONTH $expiryM
|
||||||
|
#define RP412_EXPIRY_DAY $expiryD
|
||||||
|
#define RP412_EXPIRY_TEXT "$expiryTxt"
|
||||||
"@
|
"@
|
||||||
|
|
||||||
#
|
#
|
||||||
@@ -87,11 +131,12 @@ $content = @"
|
|||||||
# recompile each time.
|
# recompile each time.
|
||||||
#
|
#
|
||||||
$existing = if (Test-Path $header) { [IO.File]::ReadAllText($header) } else { '' }
|
$existing = if (Test-Path $header) { [IO.File]::ReadAllText($header) } else { '' }
|
||||||
|
$note = if ($expires) { "expires $expiryTxt" } else { "no expiry" }
|
||||||
if ($existing -ne $content) {
|
if ($existing -ne $content) {
|
||||||
[IO.File]::WriteAllText($header, $content, (New-Object System.Text.ASCIIEncoding))
|
[IO.File]::WriteAllText($header, $content, (New-Object System.Text.ASCIIEncoding))
|
||||||
Write-Host "stamp-version: $long"
|
Write-Host "stamp-version: $long, $note"
|
||||||
} else {
|
} else {
|
||||||
Write-Host "stamp-version: $long (unchanged)"
|
Write-Host "stamp-version: $long, $note (unchanged)"
|
||||||
}
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|||||||
Reference in New Issue
Block a user