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:
@@ -329,6 +329,9 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/
|
||||
Strcpy(hackdir, HACKDIR);
|
||||
#endif
|
||||
if (argc > 1) {
|
||||
if (argcheck(argc, argv, ARG_VERSION))
|
||||
nethack_exit(EXIT_SUCCESS);
|
||||
|
||||
if (!strncmp(argv[1], "-d", 2) && argv[1][2] != 'e') {
|
||||
/* avoid matching "-dec" for DECgraphics; since the man page
|
||||
* says -d directory, hope nobody's using -desomething_else
|
||||
|
||||
@@ -110,6 +110,9 @@ char *argv[];
|
||||
dir = nh_getenv("HACKDIR");
|
||||
|
||||
if (argc > 1) {
|
||||
if (argcheck(argc, argv, ARG_VERSION))
|
||||
exit(EXIT_SUCCESS);
|
||||
|
||||
if (!strncmp(argv[1], "-d", 2) && argv[1][2] != 'e') {
|
||||
/* avoid matching "-dec" for DECgraphics; since the man page
|
||||
* says -d directory, hope nobody's using -desomething_else
|
||||
@@ -720,4 +723,40 @@ get_login_name()
|
||||
return buf;
|
||||
}
|
||||
|
||||
#ifdef __APPLE__
|
||||
extern int errno;
|
||||
|
||||
void
|
||||
port_insert_pastebuf(buf)
|
||||
char *buf;
|
||||
{
|
||||
/* This should be replaced when there is a Cocoa port. */
|
||||
const char *errfmt;
|
||||
size_t len;
|
||||
FILE *PB = popen("/usr/bin/pbcopy","w");
|
||||
if(!PB){
|
||||
errfmt = "Unable to start pbcopy (%d)\n";
|
||||
goto error;
|
||||
}
|
||||
|
||||
len = strlen(buf);
|
||||
/* Remove the trailing \n, carefully. */
|
||||
if(buf[len-1] == '\n') len--;
|
||||
|
||||
/* XXX Sorry, I'm too lazy to write a loop for output this short. */
|
||||
if(len!=fwrite(buf,1,len,PB)){
|
||||
errfmt = "Error sending data to pbcopy (%d)\n";
|
||||
goto error;
|
||||
}
|
||||
|
||||
if(pclose(PB)!=-1){
|
||||
return;
|
||||
}
|
||||
errfmt = "Error finishing pbcopy (%d)\n";
|
||||
|
||||
error:
|
||||
raw_printf(errfmt,strerror(errno));
|
||||
}
|
||||
#endif
|
||||
|
||||
/*unixmain.c*/
|
||||
|
||||
@@ -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