summaryrefslogtreecommitdiff
path: root/xmake/scripts/xrepo-hook.psm1
blob: 3782b123ab967f8075e182b3625812297ef60286 (plain)
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128

## ENVIRONMENT MANAGEMENT ######################################################

<#
    .SYNOPSIS
        Enter a xrepo environment based on your current project.

    .EXAMPLE
        Enter-XrepoEnvironment
#>
function Enter-XrepoEnvironment {
    [CmdletBinding()]
    param(
        [string]$bnd
    );

    begin {
        $script:xrepoOldEnvs = (Get-ChildItem -Path Env:);

        if (-not $bnd) {
            & $Env:XMAKE_PROGRAM_FILE lua private.xrepo.action.env.info config;
            if (-not $?) {
                Exit 1;
            }

            $xmakeColorTermBackup, $Env:XMAKE_COLORTERM = $Env:XMAKE_COLORTERM, "nocolor";
            $xrepoPrompt = (& $Env:XMAKE_PROGRAM_FILE lua --quiet private.xrepo.action.env.info prompt | Out-String);
            $Env:XMAKE_COLORTERM = $xmakeColorTermBackup;
            if (-not $xrepoPrompt.StartsWith("[")) {
                Write-Host "error: xmake.lua not found!";
                Exit 1;
            }

            $activateCommand = (& $Env:XMAKE_PROGRAM_FILE lua --quiet private.xrepo.action.env.info script.powershell | Out-String);
        } else {
            Push-Location $Env:XMAKE_ROOTDIR;
            & $Env:XMAKE_PROGRAM_FILE lua private.xrepo.action.env.info config $bnd;
            if (-not $?) {
                Pop-Location;
                Exit 1;
            }

            $xmakeColorTermBackup, $Env:XMAKE_COLORTERM = $Env:XMAKE_COLORTERM, "nocolor";
            $xrepoPrompt = (& $Env:XMAKE_PROGRAM_FILE lua --quiet private.xrepo.action.env.info prompt $bnd | Out-String);
            $Env:XMAKE_COLORTERM = $xmakeColorTermBackup;
            if (-not $xrepoPrompt.StartsWith("[")) {
                Pop-Location;
                Write-Host "error: invalid environment!";
                Exit 1;
            }

            $activateCommand = (& $Env:XMAKE_PROGRAM_FILE lua --quiet private.xrepo.action.env.info script.powershell $bnd | Out-String);
        }

        Write-Verbose "[xrepo env script.powershell]`n$activateCommand";
        Invoke-Expression -Command $activateCommand;

        if ($bnd) { Pop-Location; }
        $Env:XMAKE_PROMPT_MODIFIER = $xrepoPrompt.Trim() + " ";
    }
    process {}
    end {}
}


<#
    .SYNOPSIS
        Exit the current xrepo environment, if any.

    .EXAMPLE
        Exit-XrepoEnvironment
#>
function Exit-XrepoEnvironment {
    [CmdletBinding()]
    param();

    begin {
        ForEach ($p in (Get-ChildItem Env:)) {
            [Environment]::SetEnvironmentVariable($p.Name, $Null);
        }
        ForEach ($p in $script:xrepoOldEnvs) {
            [Environment]::SetEnvironmentVariable($p.Name, $p.Value);
        }
        $Env:XMAKE_PROMPT_MODIFIER = "";
    }
    process {}
    end {}
}


if (Test-Path Function:\prompt) {
    Rename-Item Function:\prompt XrepoPromptBackup
} else {
    function XrepoPromptBackup() {
        # Restore a basic prompt if the definition is missing.
        "PS $($executionContext.SessionState.Path.CurrentLocation)$('>' * ($nestedPromptLevel + 1)) ";
    }
}


<#
    .SYNOPSIS
        Modifies the current prompt to show the current xmake project.

    .EXAMPLE
        Add-XrepoEnvironmentToPrompt

        Causes the current session's prompt to display the current xmake project name.
#>
function Add-XrepoEnvironmentToPrompt() {
    function global:prompt() {
        if ($Env:XMAKE_PROMPT_MODIFIER) {
            $Env:XMAKE_PROMPT_MODIFIER | Write-Host -NoNewline
        }
        XrepoPromptBackup;
    }
}


## EXPORTS ###################################################################

Export-ModuleMember `
    -Alias * `
    -Function `
        Add-XrepoEnvironmentToPrompt, `
        Enter-XrepoEnvironment, `
        Exit-XrepoEnvironment, `
        prompt