Incorporate some git information into NetHack
Incorporate some git information into NetHack so that it
is potentially visible to a player. That's useful when
collecting details about the version that they are
running and, if the gitinfo is present, it can tie the
code to a specific git commit in the repository.
This modifies 'makedefs -v' to check for the presence of a data file
called dat/gitinfo.txt and if it is there, parse out its
contents, then write additional lines to include/date.h beyond
what 'makedefs -v' was previously putting in there, similar to
this sample:
#define NETHACK_GIT_SHA "0c84e564c78e2024e562d39539376ce2e21eec8e"
#define NETHACK_GIT_BRANCH "NetHack-3.6.0"
The contents of an appropriate dat/gitinfo.txt are as follows,
and trailing/leading whitespace is not significant:
githash = 0c84e564c78e2024e562d39539376ce2e21eec8e
gitbranch = NetHack-3.6.0
It also adjusts the contents of the 'v' version information to
include the additional git info when available.
Also adds some hooks DEVEL/hooksdir and a perl file to DEVEL
for simplifying and automating the deposit of dat/gitinfo.txt
so that it generally reflects the most current git commit.
DEVEL/gitinfo.pl can be used to build dat/gitinfo.txt at any
time without doing a commit, merge, or checkout.
perl DEVEL/gitinfo.pl
command line --version and -version support
To complement the extra information being provided in the
version by the 'v' command, this also adds support for the
following new command line arguments:
--version
-version Output the NetHack version string then exit.
--version:paste Output the NetHack version string and also copy it to
-version:paste the platform's paste buffer for insertion somewhere,
then exit.
If the paste variation of -version is requested on a platform that
hasn't incorporated any support for the capability, it will deliver
the version info then an error message, prior to exiting.
To support the extended -version:paste variation, a port needs to:
- provide a port-specific routine to perform
the paste buffer copy in a port code file.
- #define RUNTIME_PASTEBUF_SUPPORT in the include/portconf.h header file.
--skeleton--
void port_insert_pastebuf(buf)
char *buf;
{
/* insert code to copy the version info from buf into
platform's paste buffer in a supported way */
}
macosx and Windows have both added support for RUNTIME_PASTEBUF_SUPPORT
This commit is contained in:
@@ -35,6 +35,9 @@
|
||||
/* globals required within here */
|
||||
HANDLE ffhandle = (HANDLE) 0;
|
||||
WIN32_FIND_DATA ffd;
|
||||
typedef HWND(WINAPI *GETCONSOLEWINDOW)();
|
||||
static HWND GetConsoleHandle(void);
|
||||
static HWND GetConsoleHwnd(void);
|
||||
|
||||
/* The function pointer nt_kbhit contains a kbhit() equivalent
|
||||
* which varies depending on which window port is active.
|
||||
@@ -316,6 +319,119 @@ int interjection_type;
|
||||
msmsg(interjection_buf[interjection_type]);
|
||||
}
|
||||
|
||||
#ifdef RUNTIME_PASTEBUF_SUPPORT
|
||||
|
||||
void port_insert_pastebuf(buf)
|
||||
char *buf;
|
||||
{
|
||||
/* This implementation will utilize the windows clipboard
|
||||
* to accomplish this.
|
||||
*/
|
||||
|
||||
char *tmp = buf;
|
||||
HWND hwndConsole = GetConsoleHandle();
|
||||
HGLOBAL hglbCopy;
|
||||
WCHAR *w, w2[2];
|
||||
int cc, rc, abytes;
|
||||
LPWSTR lpwstrCopy;
|
||||
HANDLE hresult;
|
||||
|
||||
if (!buf || (hwndConsole == NULL))
|
||||
return;
|
||||
|
||||
cc = strlen(buf);
|
||||
/* last arg=0 means "tell me the size of the buffer that I need" */
|
||||
rc = MultiByteToWideChar(GetConsoleOutputCP(), 0, buf, -1, w2, 0);
|
||||
if (!rc) return;
|
||||
|
||||
abytes = rc * sizeof(WCHAR);
|
||||
w = (WCHAR *)alloc(abytes);
|
||||
/* Housekeeping need: +free(w) */
|
||||
|
||||
rc = MultiByteToWideChar(GetConsoleOutputCP(), 0, buf, -1, w, rc);
|
||||
if (!rc) {
|
||||
free(w);
|
||||
return;
|
||||
}
|
||||
if (!OpenClipboard(hwndConsole)) {
|
||||
free(w);
|
||||
return;
|
||||
}
|
||||
/* Housekeeping need: +CloseClipboard(), free(w) */
|
||||
|
||||
EmptyClipboard();
|
||||
|
||||
/* allocate global mem obj to hold the text */
|
||||
|
||||
hglbCopy = GlobalAlloc(GMEM_MOVEABLE, abytes);
|
||||
if (hglbCopy == NULL) {
|
||||
CloseClipboard();
|
||||
free(w);
|
||||
return;
|
||||
}
|
||||
/* Housekeeping need: +GlobalFree(hglbCopy), CloseClipboard(), free(w) */
|
||||
|
||||
lpwstrCopy = (LPWSTR)GlobalLock(hglbCopy);
|
||||
/* Housekeeping need: +GlobalUnlock(hglbCopy), GlobalFree(hglbCopy),
|
||||
CloseClipboard(), free(w) */
|
||||
|
||||
memcpy(lpwstrCopy, w, abytes);
|
||||
GlobalUnlock(hglbCopy);
|
||||
/* Housekeeping need: GlobalFree(hglbCopy), CloseClipboard(), free(w) */
|
||||
|
||||
/* put it on the clipboard */
|
||||
hresult = SetClipboardData(CF_UNICODETEXT, hglbCopy);
|
||||
if (!hresult) {
|
||||
raw_printf("Error copying to clipboard.\n");
|
||||
GlobalFree(hglbCopy); /* only needed if clipboard didn't accept data */
|
||||
}
|
||||
/* Housekeeping need: CloseClipboard(), free(w) */
|
||||
|
||||
CloseClipboard();
|
||||
free(w);
|
||||
return;
|
||||
}
|
||||
|
||||
static HWND
|
||||
GetConsoleHandle(void)
|
||||
{
|
||||
HMODULE hMod = GetModuleHandle("kernel32.dll");
|
||||
GETCONSOLEWINDOW pfnGetConsoleWindow =
|
||||
(GETCONSOLEWINDOW) GetProcAddress(hMod, "GetConsoleWindow");
|
||||
if (pfnGetConsoleWindow)
|
||||
return pfnGetConsoleWindow();
|
||||
else
|
||||
return GetConsoleHwnd();
|
||||
}
|
||||
|
||||
static HWND
|
||||
GetConsoleHwnd(void)
|
||||
{
|
||||
int iterations = 0;
|
||||
HWND hwndFound = 0;
|
||||
char OldTitle[1024], NewTitle[1024], TestTitle[1024];
|
||||
|
||||
/* Get current window title */
|
||||
GetConsoleTitle(OldTitle, sizeof OldTitle);
|
||||
|
||||
(void) sprintf(NewTitle, "NETHACK%d/%d", GetTickCount(),
|
||||
GetCurrentProcessId());
|
||||
SetConsoleTitle(NewTitle);
|
||||
|
||||
GetConsoleTitle(TestTitle, sizeof TestTitle);
|
||||
while (strcmp(TestTitle, NewTitle) != 0) {
|
||||
iterations++;
|
||||
/* sleep(0); */
|
||||
GetConsoleTitle(TestTitle, sizeof TestTitle);
|
||||
}
|
||||
hwndFound = FindWindow(NULL, NewTitle);
|
||||
SetConsoleTitle(OldTitle);
|
||||
/* printf("%d iterations\n", iterations); */
|
||||
return hwndFound;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef RUNTIME_PORT_ID
|
||||
/*
|
||||
* _M_IX86 is Defined for x86 processors. This is not defined for x64
|
||||
|
||||
Reference in New Issue
Block a user