about summary refs log tree commit diff
path: root/third_party/git/compat/win32
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2021-09-21T10·03+0300
committerVincent Ambo <mail@tazj.in>2021-09-21T11·29+0300
commit43b1791ec601732ac31195df96781a848360a9ac (patch)
treedaae8d638343295d2f1f7da955e556ef4c958864 /third_party/git/compat/win32
parent2d8e7dc9d9c38127ec4ebd13aee8e8f586a43318 (diff)
chore(3p/git): Unvendor git and track patches instead r/2903
This was vendored a long time ago under the expectation that keeping
it in sync with cgit would be easier this way, but it has proven not
to be a big issue.

On the other hand, a vendored copy of git is an annoying maintenance
burden. It is much easier to rebase the single (dottime) patch that we
have.

This removes the vendored copy of git and instead passes the git
source code to cgit via `pkgs.srcOnly`, which includes the applied
patch so that cgit can continue rendering dottime.

Change-Id: If31f62dea7ce688fd1b9050204e9378019775f2b
Diffstat (limited to 'third_party/git/compat/win32')
-rw-r--r--third_party/git/compat/win32/alloca.h1
-rw-r--r--third_party/git/compat/win32/dirent.c92
-rw-r--r--third_party/git/compat/win32/dirent.h20
-rw-r--r--third_party/git/compat/win32/git.manifest25
-rw-r--r--third_party/git/compat/win32/lazyload.h57
-rw-r--r--third_party/git/compat/win32/path-utils.c52
-rw-r--r--third_party/git/compat/win32/path-utils.h37
-rw-r--r--third_party/git/compat/win32/pthread.c58
-rw-r--r--third_party/git/compat/win32/pthread.h100
-rw-r--r--third_party/git/compat/win32/syslog.c80
-rw-r--r--third_party/git/compat/win32/syslog.h20
-rw-r--r--third_party/git/compat/win32/trace2_win32_process_info.c191
12 files changed, 0 insertions, 733 deletions
diff --git a/third_party/git/compat/win32/alloca.h b/third_party/git/compat/win32/alloca.h
deleted file mode 100644
index c0d7985b7edd..000000000000
--- a/third_party/git/compat/win32/alloca.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <malloc.h>
diff --git a/third_party/git/compat/win32/dirent.c b/third_party/git/compat/win32/dirent.c
deleted file mode 100644
index 52420ec7d4da..000000000000
--- a/third_party/git/compat/win32/dirent.c
+++ /dev/null
@@ -1,92 +0,0 @@
-#include "../../git-compat-util.h"
-
-struct DIR {
-	struct dirent dd_dir; /* includes d_type */
-	HANDLE dd_handle;     /* FindFirstFile handle */
-	int dd_stat;          /* 0-based index */
-};
-
-static inline void finddata2dirent(struct dirent *ent, WIN32_FIND_DATAW *fdata)
-{
-	/* convert UTF-16 name to UTF-8 */
-	xwcstoutf(ent->d_name, fdata->cFileName, sizeof(ent->d_name));
-
-	/* Set file type, based on WIN32_FIND_DATA */
-	if (fdata->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
-		ent->d_type = DT_DIR;
-	else
-		ent->d_type = DT_REG;
-}
-
-DIR *opendir(const char *name)
-{
-	wchar_t pattern[MAX_PATH + 2]; /* + 2 for '/' '*' */
-	WIN32_FIND_DATAW fdata;
-	HANDLE h;
-	int len;
-	DIR *dir;
-
-	/* convert name to UTF-16 and check length < MAX_PATH */
-	if ((len = xutftowcs_path(pattern, name)) < 0)
-		return NULL;
-
-	/* append optional '/' and wildcard '*' */
-	if (len && !is_dir_sep(pattern[len - 1]))
-		pattern[len++] = '/';
-	pattern[len++] = '*';
-	pattern[len] = 0;
-
-	/* open find handle */
-	h = FindFirstFileW(pattern, &fdata);
-	if (h == INVALID_HANDLE_VALUE) {
-		DWORD err = GetLastError();
-		errno = (err == ERROR_DIRECTORY) ? ENOTDIR : err_win_to_posix(err);
-		return NULL;
-	}
-
-	/* initialize DIR structure and copy first dir entry */
-	dir = xmalloc(sizeof(DIR));
-	dir->dd_handle = h;
-	dir->dd_stat = 0;
-	finddata2dirent(&dir->dd_dir, &fdata);
-	return dir;
-}
-
-struct dirent *readdir(DIR *dir)
-{
-	if (!dir) {
-		errno = EBADF; /* No set_errno for mingw */
-		return NULL;
-	}
-
-	/* if first entry, dirent has already been set up by opendir */
-	if (dir->dd_stat) {
-		/* get next entry and convert from WIN32_FIND_DATA to dirent */
-		WIN32_FIND_DATAW fdata;
-		if (FindNextFileW(dir->dd_handle, &fdata)) {
-			finddata2dirent(&dir->dd_dir, &fdata);
-		} else {
-			DWORD lasterr = GetLastError();
-			/* POSIX says you shouldn't set errno when readdir can't
-			   find any more files; so, if another error we leave it set. */
-			if (lasterr != ERROR_NO_MORE_FILES)
-				errno = err_win_to_posix(lasterr);
-			return NULL;
-		}
-	}
-
-	++dir->dd_stat;
-	return &dir->dd_dir;
-}
-
-int closedir(DIR *dir)
-{
-	if (!dir) {
-		errno = EBADF;
-		return -1;
-	}
-
-	FindClose(dir->dd_handle);
-	free(dir);
-	return 0;
-}
diff --git a/third_party/git/compat/win32/dirent.h b/third_party/git/compat/win32/dirent.h
deleted file mode 100644
index 058207e4bfed..000000000000
--- a/third_party/git/compat/win32/dirent.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef DIRENT_H
-#define DIRENT_H
-
-typedef struct DIR DIR;
-
-#define DT_UNKNOWN 0
-#define DT_DIR     1
-#define DT_REG     2
-#define DT_LNK     3
-
-struct dirent {
-	unsigned char d_type;      /* file type to prevent lstat after readdir */
-	char d_name[MAX_PATH * 3]; /* file name (* 3 for UTF-8 conversion) */
-};
-
-DIR *opendir(const char *dirname);
-struct dirent *readdir(DIR *dir);
-int closedir(DIR *dir);
-
-#endif /* DIRENT_H */
diff --git a/third_party/git/compat/win32/git.manifest b/third_party/git/compat/win32/git.manifest
deleted file mode 100644
index 771e3cce4315..000000000000
--- a/third_party/git/compat/win32/git.manifest
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
-	<assemblyIdentity type="win32" name="Git" version="0.0.0.1" />
-	<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
-		<security>
-			<requestedPrivileges>
-				<requestedExecutionLevel level="asInvoker" uiAccess="false" />
-			</requestedPrivileges>
-		</security>
-	</trustInfo>
-	<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
-		<application>
-			<!-- Windows Vista -->
-			<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
-			<!-- Windows 7 -->
-			<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
-			<!-- Windows 8 -->
-			<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
-			<!-- Windows 8.1 -->
-			<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
-			<!-- Windows 10 -->
-			<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
-		</application>
-	</compatibility>
-</assembly>
diff --git a/third_party/git/compat/win32/lazyload.h b/third_party/git/compat/win32/lazyload.h
deleted file mode 100644
index 9e631c8593ff..000000000000
--- a/third_party/git/compat/win32/lazyload.h
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef LAZYLOAD_H
-#define LAZYLOAD_H
-
-/*
- * A pair of macros to simplify loading of DLL functions. Example:
- *
- *   DECLARE_PROC_ADDR(kernel32.dll, BOOL, CreateHardLinkW,
- *                     LPCWSTR, LPCWSTR, LPSECURITY_ATTRIBUTES);
- *
- *   if (!INIT_PROC_ADDR(CreateHardLinkW))
- *           return error("Could not find CreateHardLinkW() function";
- *
- *   if (!CreateHardLinkW(source, target, NULL))
- *           return error("could not create hardlink from %S to %S",
- *                        source, target);
- */
-
-struct proc_addr {
-	const char *const dll;
-	const char *const function;
-	FARPROC pfunction;
-	unsigned initialized : 1;
-};
-
-/* Declares a function to be loaded dynamically from a DLL. */
-#define DECLARE_PROC_ADDR(dll, rettype, function, ...) \
-	static struct proc_addr proc_addr_##function = \
-	{ #dll, #function, NULL, 0 }; \
-	static rettype (WINAPI *function)(__VA_ARGS__)
-
-/*
- * Loads a function from a DLL (once-only).
- * Returns non-NULL function pointer on success.
- * Returns NULL + errno == ENOSYS on failure.
- * This function is not thread-safe.
- */
-#define INIT_PROC_ADDR(function) \
-	(function = get_proc_addr(&proc_addr_##function))
-
-static inline void *get_proc_addr(struct proc_addr *proc)
-{
-	/* only do this once */
-	if (!proc->initialized) {
-		HANDLE hnd;
-		proc->initialized = 1;
-		hnd = LoadLibraryExA(proc->dll, NULL,
-				     LOAD_LIBRARY_SEARCH_SYSTEM32);
-		if (hnd)
-			proc->pfunction = GetProcAddress(hnd, proc->function);
-	}
-	/* set ENOSYS if DLL or function was not found */
-	if (!proc->pfunction)
-		errno = ENOSYS;
-	return proc->pfunction;
-}
-
-#endif
diff --git a/third_party/git/compat/win32/path-utils.c b/third_party/git/compat/win32/path-utils.c
deleted file mode 100644
index ebf2f12eb666..000000000000
--- a/third_party/git/compat/win32/path-utils.c
+++ /dev/null
@@ -1,52 +0,0 @@
-#include "../../git-compat-util.h"
-
-int win32_has_dos_drive_prefix(const char *path)
-{
-	int i;
-
-	/*
-	 * Does it start with an ASCII letter (i.e. highest bit not set),
-	 * followed by a colon?
-	 */
-	if (!(0x80 & (unsigned char)*path))
-		return *path && path[1] == ':' ? 2 : 0;
-
-	/*
-	 * While drive letters must be letters of the English alphabet, it is
-	 * possible to assign virtually _any_ Unicode character via `subst` as
-	 * a drive letter to "virtual drives". Even `1`, or `ä`. Or fun stuff
-	 * like this:
-	 *
-	 *      subst ֍: %USERPROFILE%\Desktop
-	 */
-	for (i = 1; i < 4 && (0x80 & (unsigned char)path[i]); i++)
-		; /* skip first UTF-8 character */
-	return path[i] == ':' ? i + 1 : 0;
-}
-
-int win32_skip_dos_drive_prefix(char **path)
-{
-	int ret = has_dos_drive_prefix(*path);
-	*path += ret;
-	return ret;
-}
-
-int win32_offset_1st_component(const char *path)
-{
-	char *pos = (char *)path;
-
-	/* unc paths */
-	if (!skip_dos_drive_prefix(&pos) &&
-			is_dir_sep(pos[0]) && is_dir_sep(pos[1])) {
-		/* skip server name */
-		pos = strpbrk(pos + 2, "\\/");
-		if (!pos)
-			return 0; /* Error: malformed unc path */
-
-		do {
-			pos++;
-		} while (*pos && !is_dir_sep(*pos));
-	}
-
-	return pos + is_dir_sep(*pos) - path;
-}
diff --git a/third_party/git/compat/win32/path-utils.h b/third_party/git/compat/win32/path-utils.h
deleted file mode 100644
index bba2b644080f..000000000000
--- a/third_party/git/compat/win32/path-utils.h
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef WIN32_PATH_UTILS_H
-#define WIN32_PATH_UTILS_H
-
-int win32_has_dos_drive_prefix(const char *path);
-#define has_dos_drive_prefix win32_has_dos_drive_prefix
-
-int win32_skip_dos_drive_prefix(char **path);
-#define skip_dos_drive_prefix win32_skip_dos_drive_prefix
-static inline int win32_is_dir_sep(int c)
-{
-	return c == '/' || c == '\\';
-}
-#define is_dir_sep win32_is_dir_sep
-static inline char *win32_find_last_dir_sep(const char *path)
-{
-	char *ret = NULL;
-	for (; *path; ++path)
-		if (is_dir_sep(*path))
-			ret = (char *)path;
-	return ret;
-}
-#define find_last_dir_sep win32_find_last_dir_sep
-static inline int win32_has_dir_sep(const char *path)
-{
-	/*
-	 * See how long the non-separator part of the given path is, and
-	 * if and only if it covers the whole path (i.e. path[len] is NUL),
-	 * there is no separator in the path---otherwise there is a separator.
-	 */
-	size_t len = strcspn(path, "/\\");
-	return !!path[len];
-}
-#define has_dir_sep(path) win32_has_dir_sep(path)
-int win32_offset_1st_component(const char *path);
-#define offset_1st_component win32_offset_1st_component
-
-#endif
diff --git a/third_party/git/compat/win32/pthread.c b/third_party/git/compat/win32/pthread.c
deleted file mode 100644
index 2e7eead42cb0..000000000000
--- a/third_party/git/compat/win32/pthread.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2009 Andrzej K. Haczewski <ahaczewski@gmail.com>
- *
- * DISCLAIMER: The implementation is Git-specific, it is subset of original
- * Pthreads API, without lots of other features that Git doesn't use.
- * Git also makes sure that the passed arguments are valid, so there's
- * no need for double-checking.
- */
-
-#include "../../git-compat-util.h"
-#include "pthread.h"
-
-#include <errno.h>
-#include <limits.h>
-
-static unsigned __stdcall win32_start_routine(void *arg)
-{
-	pthread_t *thread = arg;
-	thread->tid = GetCurrentThreadId();
-	thread->arg = thread->start_routine(thread->arg);
-	return 0;
-}
-
-int pthread_create(pthread_t *thread, const void *unused,
-		   void *(*start_routine)(void*), void *arg)
-{
-	thread->arg = arg;
-	thread->start_routine = start_routine;
-	thread->handle = (HANDLE)
-		_beginthreadex(NULL, 0, win32_start_routine, thread, 0, NULL);
-
-	if (!thread->handle)
-		return errno;
-	else
-		return 0;
-}
-
-int win32_pthread_join(pthread_t *thread, void **value_ptr)
-{
-	DWORD result = WaitForSingleObject(thread->handle, INFINITE);
-	switch (result) {
-		case WAIT_OBJECT_0:
-			if (value_ptr)
-				*value_ptr = thread->arg;
-			return 0;
-		case WAIT_ABANDONED:
-			return EINVAL;
-		default:
-			return err_win_to_posix(GetLastError());
-	}
-}
-
-pthread_t pthread_self(void)
-{
-	pthread_t t = { NULL };
-	t.tid = GetCurrentThreadId();
-	return t;
-}
diff --git a/third_party/git/compat/win32/pthread.h b/third_party/git/compat/win32/pthread.h
deleted file mode 100644
index 737983d00bae..000000000000
--- a/third_party/git/compat/win32/pthread.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Header used to adapt pthread-based POSIX code to Windows API threads.
- *
- * Copyright (C) 2009 Andrzej K. Haczewski <ahaczewski@gmail.com>
- */
-
-#ifndef PTHREAD_H
-#define PTHREAD_H
-
-#ifndef WIN32_LEAN_AND_MEAN
-#define WIN32_LEAN_AND_MEAN
-#endif
-
-#include <windows.h>
-
-/*
- * Defines that adapt Windows API threads to pthreads API
- */
-#define pthread_mutex_t CRITICAL_SECTION
-
-static inline int return_0(int i) {
-	return 0;
-}
-#define pthread_mutex_init(a,b) return_0((InitializeCriticalSection((a)), 0))
-#define pthread_mutex_destroy(a) DeleteCriticalSection((a))
-#define pthread_mutex_lock EnterCriticalSection
-#define pthread_mutex_unlock LeaveCriticalSection
-
-typedef int pthread_mutexattr_t;
-#define pthread_mutexattr_init(a) (*(a) = 0)
-#define pthread_mutexattr_destroy(a) do {} while (0)
-#define pthread_mutexattr_settype(a, t) 0
-#define PTHREAD_MUTEX_RECURSIVE 0
-
-#define pthread_cond_t CONDITION_VARIABLE
-
-#define pthread_cond_init(a,b) InitializeConditionVariable((a))
-#define pthread_cond_destroy(a) do {} while (0)
-#define pthread_cond_wait(a,b) return_0(SleepConditionVariableCS((a), (b), INFINITE))
-#define pthread_cond_signal WakeConditionVariable
-#define pthread_cond_broadcast WakeAllConditionVariable
-
-/*
- * Simple thread creation implementation using pthread API
- */
-typedef struct {
-	HANDLE handle;
-	void *(*start_routine)(void*);
-	void *arg;
-	DWORD tid;
-} pthread_t;
-
-int pthread_create(pthread_t *thread, const void *unused,
-		   void *(*start_routine)(void*), void *arg);
-
-/*
- * To avoid the need of copying a struct, we use small macro wrapper to pass
- * pointer to win32_pthread_join instead.
- */
-#define pthread_join(a, b) win32_pthread_join(&(a), (b))
-
-int win32_pthread_join(pthread_t *thread, void **value_ptr);
-
-#define pthread_equal(t1, t2) ((t1).tid == (t2).tid)
-pthread_t pthread_self(void);
-
-static inline void NORETURN pthread_exit(void *ret)
-{
-	ExitThread((DWORD)(intptr_t)ret);
-}
-
-typedef DWORD pthread_key_t;
-static inline int pthread_key_create(pthread_key_t *keyp, void (*destructor)(void *value))
-{
-	return (*keyp = TlsAlloc()) == TLS_OUT_OF_INDEXES ? EAGAIN : 0;
-}
-
-static inline int pthread_key_delete(pthread_key_t key)
-{
-	return TlsFree(key) ? 0 : EINVAL;
-}
-
-static inline int pthread_setspecific(pthread_key_t key, const void *value)
-{
-	return TlsSetValue(key, (void *)value) ? 0 : EINVAL;
-}
-
-static inline void *pthread_getspecific(pthread_key_t key)
-{
-	return TlsGetValue(key);
-}
-
-#ifndef __MINGW64_VERSION_MAJOR
-static inline int pthread_sigmask(int how, const sigset_t *set, sigset_t *oset)
-{
-	return 0;
-}
-#endif
-
-#endif /* PTHREAD_H */
diff --git a/third_party/git/compat/win32/syslog.c b/third_party/git/compat/win32/syslog.c
deleted file mode 100644
index 161978d720ae..000000000000
--- a/third_party/git/compat/win32/syslog.c
+++ /dev/null
@@ -1,80 +0,0 @@
-#include "../../git-compat-util.h"
-
-static HANDLE ms_eventlog;
-
-void openlog(const char *ident, int logopt, int facility)
-{
-	if (ms_eventlog)
-		return;
-
-	ms_eventlog = RegisterEventSourceA(NULL, ident);
-
-	if (!ms_eventlog)
-		warning("RegisterEventSource() failed: %lu", GetLastError());
-}
-
-void syslog(int priority, const char *fmt, ...)
-{
-	WORD logtype;
-	char *str, *pos;
-	int str_len;
-	va_list ap;
-
-	if (!ms_eventlog)
-		return;
-
-	va_start(ap, fmt);
-	str_len = vsnprintf(NULL, 0, fmt, ap);
-	va_end(ap);
-
-	if (str_len < 0) {
-		warning_errno("vsnprintf failed");
-		return;
-	}
-
-	str = malloc(st_add(str_len, 1));
-	if (!str) {
-		warning_errno("malloc failed");
-		return;
-	}
-
-	va_start(ap, fmt);
-	vsnprintf(str, str_len + 1, fmt, ap);
-	va_end(ap);
-
-	while ((pos = strstr(str, "%1")) != NULL) {
-		char *oldstr = str;
-		str = realloc(str, st_add(++str_len, 1));
-		if (!str) {
-			free(oldstr);
-			warning_errno("realloc failed");
-			return;
-		}
-		memmove(pos + 2, pos + 1, strlen(pos));
-		pos[1] = ' ';
-	}
-
-	switch (priority) {
-	case LOG_EMERG:
-	case LOG_ALERT:
-	case LOG_CRIT:
-	case LOG_ERR:
-		logtype = EVENTLOG_ERROR_TYPE;
-		break;
-
-	case LOG_WARNING:
-		logtype = EVENTLOG_WARNING_TYPE;
-		break;
-
-	case LOG_NOTICE:
-	case LOG_INFO:
-	case LOG_DEBUG:
-	default:
-		logtype = EVENTLOG_INFORMATION_TYPE;
-		break;
-	}
-
-	ReportEventA(ms_eventlog, logtype, 0, 0, NULL, 1, 0,
-	    (const char **)&str, NULL);
-	free(str);
-}
diff --git a/third_party/git/compat/win32/syslog.h b/third_party/git/compat/win32/syslog.h
deleted file mode 100644
index 70daa7c08b8d..000000000000
--- a/third_party/git/compat/win32/syslog.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef SYSLOG_H
-#define SYSLOG_H
-
-#define LOG_PID     0x01
-
-#define LOG_EMERG   0
-#define LOG_ALERT   1
-#define LOG_CRIT    2
-#define LOG_ERR     3
-#define LOG_WARNING 4
-#define LOG_NOTICE  5
-#define LOG_INFO    6
-#define LOG_DEBUG   7
-
-#define LOG_DAEMON  (3<<3)
-
-void openlog(const char *ident, int logopt, int facility);
-void syslog(int priority, const char *fmt, ...);
-
-#endif /* SYSLOG_H */
diff --git a/third_party/git/compat/win32/trace2_win32_process_info.c b/third_party/git/compat/win32/trace2_win32_process_info.c
deleted file mode 100644
index 8ccbd1c2c6f8..000000000000
--- a/third_party/git/compat/win32/trace2_win32_process_info.c
+++ /dev/null
@@ -1,191 +0,0 @@
-#include "../../cache.h"
-#include "../../json-writer.h"
-#include "lazyload.h"
-#include <Psapi.h>
-#include <tlHelp32.h>
-
-/*
- * An arbitrarily chosen value to limit the size of the ancestor
- * array built in git_processes().
- */
-#define NR_PIDS_LIMIT 10
-
-/*
- * Find the process data for the given PID in the given snapshot
- * and update the PROCESSENTRY32 data.
- */
-static int find_pid(DWORD pid, HANDLE hSnapshot, PROCESSENTRY32 *pe32)
-{
-	pe32->dwSize = sizeof(PROCESSENTRY32);
-
-	if (Process32First(hSnapshot, pe32)) {
-		do {
-			if (pe32->th32ProcessID == pid)
-				return 1;
-		} while (Process32Next(hSnapshot, pe32));
-	}
-	return 0;
-}
-
-/*
- * Accumulate JSON array of our parent processes:
- *     [
- *         exe-name-parent,
- *         exe-name-grand-parent,
- *         ...
- *     ]
- *
- * Note: we only report the filename of the process executable; the
- *       only way to get its full pathname is to use OpenProcess()
- *       and GetModuleFileNameEx() or QueryfullProcessImageName()
- *       and that seems rather expensive (on top of the cost of
- *       getting the snapshot).
- *
- * Note: we compute the set of parent processes by walking the PPID
- *       link in each visited PROCESSENTRY32 record.  This search
- *       stops when an ancestor process is not found in the snapshot
- *       (because it exited before the current or intermediate parent
- *       process exited).
- *
- *       This search may compute an incorrect result if the PPID link
- *       refers to the PID of an exited parent and that PID has been
- *       recycled and given to a new unrelated process.
- *
- *       Worse, it is possible for a child or descendant of the
- *       current process to be given the recycled PID and cause a
- *       PPID-cycle.  This would cause an infinite loop building our
- *       parent process array.
- *
- * Note: for completeness, the "System Idle" process has PID=0 and
- *       PPID=0 and could cause another PPID-cycle.  We don't expect
- *       Git to be a descendant of the idle process, but because of
- *       PID recycling, it might be possible to get a PPID link value
- *       of 0.  This too would cause an infinite loop.
- *
- * Therefore, we keep an array of the visited PPIDs to guard against
- * cycles.
- *
- * We use a fixed-size array rather than ALLOC_GROW to keep things
- * simple and avoid the alloc/realloc overhead.  It is OK if we
- * truncate the search and return a partial answer.
- */
-static void get_processes(struct json_writer *jw, HANDLE hSnapshot)
-{
-	PROCESSENTRY32 pe32;
-	DWORD pid;
-	DWORD pid_list[NR_PIDS_LIMIT];
-	int k, nr_pids = 0;
-
-	pid = GetCurrentProcessId();
-	while (find_pid(pid, hSnapshot, &pe32)) {
-		/* Only report parents. Omit self from the JSON output. */
-		if (nr_pids)
-			jw_array_string(jw, pe32.szExeFile);
-
-		/* Check for cycle in snapshot. (Yes, it happened.) */
-		for (k = 0; k < nr_pids; k++)
-			if (pid == pid_list[k]) {
-				jw_array_string(jw, "(cycle)");
-				return;
-			}
-
-		if (nr_pids == NR_PIDS_LIMIT) {
-			jw_array_string(jw, "(truncated)");
-			return;
-		}
-
-		pid_list[nr_pids++] = pid;
-
-		pid = pe32.th32ParentProcessID;
-	}
-}
-
-/*
- * Emit JSON data for the current and parent processes.  Individual
- * trace2 targets can decide how to actually print it.
- */
-static void get_ancestry(void)
-{
-	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
-
-	if (hSnapshot != INVALID_HANDLE_VALUE) {
-		struct json_writer jw = JSON_WRITER_INIT;
-
-		jw_array_begin(&jw, 0);
-		get_processes(&jw, hSnapshot);
-		jw_end(&jw);
-
-		trace2_data_json("process", the_repository, "windows/ancestry",
-				 &jw);
-
-		jw_release(&jw);
-		CloseHandle(hSnapshot);
-	}
-}
-
-/*
- * Is a debugger attached to the current process?
- *
- * This will catch debug runs (where the debugger started the process).
- * This is the normal case.  Since this code is called during our startup,
- * it will not report instances where a debugger is attached dynamically
- * to a running git process, but that is relatively rare.
- */
-static void get_is_being_debugged(void)
-{
-	if (IsDebuggerPresent())
-		trace2_data_intmax("process", the_repository,
-				   "windows/debugger_present", 1);
-}
-
-/*
- * Emit JSON data with the peak memory usage of the current process.
- */
-static void get_peak_memory_info(void)
-{
-	DECLARE_PROC_ADDR(psapi.dll, BOOL, GetProcessMemoryInfo, HANDLE,
-			  PPROCESS_MEMORY_COUNTERS, DWORD);
-
-	if (INIT_PROC_ADDR(GetProcessMemoryInfo)) {
-		PROCESS_MEMORY_COUNTERS pmc;
-
-		if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc,
-					 sizeof(pmc))) {
-			struct json_writer jw = JSON_WRITER_INIT;
-
-			jw_object_begin(&jw, 0);
-
-#define KV(kv) #kv, (intmax_t)pmc.kv
-
-			jw_object_intmax(&jw, KV(PageFaultCount));
-			jw_object_intmax(&jw, KV(PeakWorkingSetSize));
-			jw_object_intmax(&jw, KV(PeakPagefileUsage));
-
-			jw_end(&jw);
-
-			trace2_data_json("process", the_repository,
-					 "windows/memory", &jw);
-			jw_release(&jw);
-		}
-	}
-}
-
-void trace2_collect_process_info(enum trace2_process_info_reason reason)
-{
-	if (!trace2_is_enabled())
-		return;
-
-	switch (reason) {
-	case TRACE2_PROCESS_INFO_STARTUP:
-		get_is_being_debugged();
-		get_ancestry();
-		return;
-
-	case TRACE2_PROCESS_INFO_EXIT:
-		get_peak_memory_info();
-		return;
-
-	default:
-		BUG("trace2_collect_process_info: unknown reason '%d'", reason);
-	}
-}