aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--.gitattributes3
-rw-r--r--LICENSE.txt21
-rw-r--r--README.md13
-rw-r--r--fix_nt_symbol_path.sh204
4 files changed, 241 insertions, 0 deletions
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..d76765e
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,3 @@
+* text=auto
+
+*.sh text eol=lf
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..80c5e0a
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2016 Egor Tensin <Egor.Tensin@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..1c8609f
--- /dev/null
+++ b/README.md
@@ -0,0 +1,13 @@
+Windows `tmp` directory
+=======================
+
+This is my directory for temporary Windows (mostly C++) project files (symbol
+files, project databases, etc.).
+
+License
+-------
+
+Distributed under the MIT License.
+See [LICENSE.txt] for details.
+
+[LICENSE.txt]: LICENSE.txt
diff --git a/fix_nt_symbol_path.sh b/fix_nt_symbol_path.sh
new file mode 100644
index 0000000..3767cd5
--- /dev/null
+++ b/fix_nt_symbol_path.sh
@@ -0,0 +1,204 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2016 Egor Tensin <Egor.Tensin@gmail.com>
+# This file is part of the "Windows tmp directory" project.
+# For details, see https://github.com/egor-tensin/windows-tmp.
+# Distributed under the MIT License.
+
+# "Fixes" the value of _NT_SYMBOL_PATH environment variable by
+#
+# * including the path to the "pdbs" directory in this repository,
+# * adding the "symbols" directory as a local "symbol store", mirroring
+# Microsoft's http://msdl.microsoft.com/download/symbols.
+
+# usage: ./fix_nt_symbol_path.sh [-h|--help] [-y|--yes] [-d|--dir TMP_DIR]
+
+dump() {
+ local prefix="${FUNCNAME[0]}"
+ if [ "${#FUNCNAME[@]}" -gt 1 ]; then
+ prefix="${FUNCNAME[1]}"
+ fi
+ while [ "$#" -ne 0 ]; do
+ echo "$prefix: $1"
+ shift
+ done
+}
+
+str_tolower() {
+ while [ "$#" -ne 0 ]; do
+ echo "$1" | tr '[:upper:]' '[:lower:]'
+ shift
+ done
+}
+
+str_contains() {
+ if [ "$#" -ne 2 ]; then
+ echo "usage: ${FUNCNAME[0]} STR SUB"
+ return 1
+ fi
+ local str="$1"
+ local sub="$( printf '%q' "$2" )"
+ test "$str" != "${str#*$sub}"
+}
+
+path_separator=';'
+
+path_contains() {
+ if [ "$#" -ne 2 ]; then
+ echo "usage: ${FUNCNAME[0]} ENV_VALUE DIR_PATH"
+ return 1
+ fi
+ local env_value="$( str_tolower "$1" )"
+ local path_to_add="$( str_tolower "$2" )"
+ local -a env_paths=()
+ IFS="$path_separator" read -ra env_paths <<< "$env_value"
+ local env_path
+ for env_path in "${env_paths[@]+"${env_paths[@]}"}"; do
+ if [ "$env_path" == "$path_to_add" ]; then
+ return 0
+ fi
+ done
+ return 1
+}
+
+path_append() {
+ if [ "$#" -ne 2 ]; then
+ echo "usage: ${FUNCNAME[0]} ENV_VALUE DIR_PATH"
+ return 1
+ fi
+ local env_value="$1"
+ local path_to_add="$2"
+ if ! path_contains "$env_value" "$path_to_add"; then
+ if [ -z "$env_value" ]; then
+ echo "$path_to_add"
+ else
+ echo "$path_separator$path_to_add"
+ fi
+ fi
+}
+
+prompt_to_continue() {
+ local prefix="${FUNCNAME[0]}"
+ if [ "${#FUNCNAME[@]}" -gt 1 ]; then
+ prefix="${FUNCNAME[1]}"
+ fi
+
+ local prompt_reply
+ while true; do
+ echo -n "$prefix: continue? (y/n) "
+ read -r prompt_reply
+ prompt_reply="$( str_tolower "$prompt_reply" )"
+ case "$prompt_reply" in
+ y|yes) return 0 ;;
+ n|no) return 1 ;;
+ *) continue ;;
+ esac
+ done
+}
+
+ensure_reg_available() {
+ if command -v reg.exe > /dev/null; then
+ return 0
+ else
+ dump "reg.exe could not be found" >&2
+ return 1
+ fi
+}
+
+registry_set_string() (
+ if [ "$#" -ne 3 ]; then
+ echo "usage: ${FUNCNAME[0]} KEY_PATH VALUE_NAME VALUE_DATA"
+ return 1
+ fi
+
+ set -o errexit
+
+ ensure_reg_available
+
+ local key_path="$1"
+ local value_name="$2"
+ local value_data="$3"
+
+ reg.exe add "$key_path" /v "$value_name" /t REG_SZ /d "$value_data" /f > /dev/null
+)
+
+fix_nt_symbol_path() (
+ set -o errexit
+
+ local tmp_dir="$( cygpath -aw "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" )"
+
+ while [ "$#" -ne 0 ]; do
+ local option="$1"
+ shift
+
+ case "$option" in
+ -y|--yes)
+ local skip_prompt=
+ continue
+ ;;
+
+ -h|--help)
+ local exit_with_usage=0
+ break
+ ;;
+ esac
+
+ if [ "$#" -eq 0 ]; then
+ dump "usage error: missing argument for parameter: $option" >&2
+ local exit_with_usage=1
+ break
+ fi
+
+ case "$option" in
+ -d|--dir)
+ tmp_dir="$( cygpath -aw "$1" )"
+ shift
+ ;;
+
+ *)
+ dump "usage error: unknown parameter: $option" >&2
+ local exit_with_usage=1
+ break
+ ;;
+ esac
+ done
+
+ if [ -n "${exit_with_usage+x}" ]; then
+ echo "usage: ${FUNCNAME[0]} [-h|--help] [-y|--yes] [-d|--dir TMP_DIR]"
+ return "${exit_with_usage:-0}"
+ fi
+
+ dump "temporary directory path: $tmp_dir"
+
+ if [ -z "${skip_prompt+x}" ]; then
+ prompt_to_continue || return 0
+ fi
+
+ local pdbs_dir="$tmp_dir\\pdbs"
+ local symbols_dir="$tmp_dir\\symbols"
+ local srv_str="SRV*$symbols_dir*http://msdl.microsoft.com/download/symbols"
+ local vscache_dir="$tmp_dir\\vscache"
+
+ dump "directories:"
+ dump " custom PDB files: $pdbs_dir"
+ dump " symbol store: $symbols_dir"
+ dump " Visual Studio project cache files: $vscache_dir"
+
+ local old_value="${_NT_SYMBOL_PATH-}"
+ dump "old _NT_SYMBOL_PATH value: $old_value"
+ local new_value="$old_value"
+
+ new_value+="$( path_append "$new_value" "$pdbs_dir" )"
+ new_value+="$( path_append "$new_value" "$srv_str" )"
+
+ [ "$new_value" == "$old_value" ] && return 0
+ dump "new _NT_SYMBOL_PATH value: $new_value"
+
+ if [ -z "${skip_prompt+x}" ]; then
+ prompt_to_continue || return 0
+ fi
+
+ registry_set_string 'HKCU\Environment' '_NT_SYMBOL_PATH' "$new_value"
+)
+
+fix_nt_symbol_path "$@"