blob: a1b1e9ee87732aa08ace3dcfad914ce27155065c (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
{-
- Copyright 2015 Egor Tensin <Egor.Tensin@gmail.com>
- This file is licensed under the terms of the MIT License.
- See LICENSE.txt for details.
-}
module Main (main) where
import Control.Monad (when)
import Data.List (union)
import Data.Maybe (fromMaybe)
import System.Directory (createDirectoryIfMissing, getCurrentDirectory)
import System.FilePath (combine)
import Options.Applicative
import qualified Windows.Environment as Env
import Prompt
import PromptMessage
data Options = Options
{ optYes :: Bool
, optGlobal :: Bool
} deriving (Eq, Show)
optionParser :: Parser Options
optionParser = Options
<$> optYesDesc
<*> optGlobalDesc
where
optYesDesc = switch $
long "yes" <> short 'y' <>
help "Skip confirmation prompt"
optGlobalDesc = switch $
long "global" <> short 'g' <>
help "Set up for all users"
data Dirs = Dirs
{ pdbsDir :: String
, symbolsDir :: String
} deriving (Eq, Show)
dirPaths :: Dirs -> [String]
dirPaths dirs = [ pdbsDir dirs
, symbolsDir dirs
]
createDirs :: Dirs -> IO ()
createDirs = mapM_ (createDirectoryIfMissing True) . dirPaths
toRemoteDirs :: Dirs -> Dirs
toRemoteDirs localDirs = localDirs
{ symbolsDir = remoteSymbolsDir $ symbolsDir localDirs
}
where
remoteSymbolsDir localDir = "SRV*" ++ localDir ++ "*" ++ remoteSymbolsUrl
remoteSymbolsUrl = "http://msdl.microsoft.com/download/symbols"
getLocalDirs :: IO Dirs
getLocalDirs = do
cwd <- getCurrentDirectory
return Dirs
{ pdbsDir = combine cwd "pdbs"
, symbolsDir = combine cwd "symbols"
}
fixNtSymbolPath :: Options -> IO ()
fixNtSymbolPath options = do
oldValue <- Env.query profile varName
let oldPaths = Env.pathSplit $ fromMaybe "" oldValue
localDirs <- getLocalDirs
let remoteDirs = toRemoteDirs localDirs
let newPaths = union oldPaths $ dirPaths remoteDirs
when (length oldPaths /= length newPaths) $ do
let newValue = Env.pathJoin newPaths
let promptAnd = if skipPrompt
then withoutPrompt
else withPrompt $ engraveMessage profile varName oldValue newValue
let engrave = Env.engrave profile varName newValue
agreed <- promptAnd engrave
when agreed $
createDirs localDirs
where
varName = "_NT_SYMBOL_PATH"
forAllUsers = optGlobal options
profile
| forAllUsers = Env.AllUsers
| otherwise = Env.CurrentUser
skipPrompt = optYes options
main :: IO ()
main = execParser parser >>= fixNtSymbolPath
where
parser = info (helper <*> optionParser) $
fullDesc <> progDesc "Set up your _NT_SYMBOL_PATH"
|