diff --git a/repoquickset.ps1 b/repoquickset.ps1 new file mode 100644 index 0000000..cc27b49 --- /dev/null +++ b/repoquickset.ps1 @@ -0,0 +1,222 @@ +# common setup script for forge repositories +# structure: +# +# Shared Repository/Monorepository (a la Integrated Project) +# ├── .git/ +# ├── Game +# │ ├── .gitignore (from Unity.gitignore) +# │ ├── .gitattributes (from Unity.gitattributes) +# │ └── ... +# ├── Modelling +# │ ├── .gitattributes (from Modelling.gitattributes) +# │ └── ... +# └── ... +# +# Game (Unity) Repository Folder +# ├── .git/ +# ├── .gitignore (from Unity.gitignore) +# ├── .gitattributes (from Unity.gitattributes) +# └── ... +# +# Modelling (Maya / Z Brush / Substance Painter) Repository Folder +# ├── .git/ +# ├── .gitattributes (from Modelling.gitattributes) +# └── ... + +# git files +$GIT_IGNR_UNITY="https://forge.joshwel.co/mark/common/raw/branch/main/Unity.gitignore" +$GIT_ATTR_UNITY="https://forge.joshwel.co/mark/common/raw/branch/main/Unity.gitattributes" +$GIT_ATTR_MODEL="https://forge.joshwel.co/mark/common/raw/branch/main/Modelling.gitattributes" +$GIT_ATTR_GENRC="https://forge.joshwel.co/mark/common/raw/branch/main/Generic.gitattributes" +$GIT_ATTR_DESGN="https://forge.joshwel.co/mark/common/raw/branch/main/Design.gitattributes" +$GIT_ATTR_GITHB="https://forge.joshwel.co/mark/common/raw/branch/main/GitHub.gitattributes" + +# functions +function setupSharedRepository { + # ask if the repo will be pushed to github or the forge + Write-Output ("`n!!! will this repo be pushed to github or the forge? (g/f)`n" + + "!!! - [g]ithub: github.com`n" + + "!!! - [f]orge: forge.joshwel.co`n" + + "!!!`n" + + "!!! (this will affect how git lfs is setup, but it will be enabled regardless`n" + + "!!! ---`n" + + "!!! github has a 1gb lfs storage/bandwidth limit, while the forge doesn't care`n" + + "!!! saying 'f' will use actually defined .gitattributes,`n" + + "!!! while saying 'g' will use a basic .gitattributes that MIGHT not wreck your`n" + + "!!! 1gb git lfs allowance as long as you dont commit files bigger than 100mb)") + + while ($true) { + $repoHost = Read-Host + if ($repoHost -eq "g" -or $repoHost -eq "f") { + break + } + Write-Output "!!! expected: 'g', 'f'" + } + + # re-set variables if the repo will be pushed to the github (use github.gitattributes) + if ($repoHost -eq "g") { + $GIT_ATTR_UNITY=$GIT_ATTR_GITHB + $GIT_ATTR_MODEL=$GIT_ATTR_GITHB + $GIT_ATTR_DESGN=$GIT_ATTR_GITHB + $GIT_ATTR_GENRC=$GIT_ATTR_GITHB + } + + # make folders + if (-not (Test-Path -Path "Game")) { + New-Item -ItemType Directory -Name "Game" + } + if (-not (Test-Path -Path "Modelling")) { + New-Item -ItemType Directory -Name "Modelling" + } + if (-not (Test-Path -Path "Design")) { + New-Item -ItemType Directory -Name "Design" + } + + # download .gitignore and .gitattributes + Write-Output ">>> shared/game: dl '$GIT_IGNR_UNITY' -> 'Game/.gitignore'" + Invoke-WebRequest -Uri $GIT_IGNR_UNITY -OutFile "Game/.gitignore" + + Write-Output ">>> shared/game: dl '$GIT_ATTR_UNITY' -> 'Game/.gitattributes'" + Invoke-WebRequest -Uri $GIT_ATTR_UNITY -OutFile "Game/.gitattributes" + + Write-Output ">>> shared/modelling: dl '$GIT_ATTR_MODEL' -> 'Modelling/.gitattributes'" + Invoke-WebRequest -Uri $GIT_ATTR_MODEL -OutFile "Modelling/.gitattributes" + + Write-Output ">>> shared/design: dl '$GIT_ATTR_DESGN' -> 'Design/.gitattributes'" + Invoke-WebRequest -Uri $GIT_ATTR_DESGN -OutFile "Design/.gitattributes" + + Write-Output ">>> shared/generic: dl '$GIT_ATTR_GENRC' -> '.gitattributes'" + Invoke-WebRequest -Uri $GIT_ATTR_GENRC -OutFile ".gitattributes" + + # warn that shared repos cant be pushed to github for free due to git lfs restrictions + Write-Output ("`n!!! the shared repo CANT be pushed to github for free due to git lfs restrictions" + + "`n!!! use the forge instead") +} + +function setupSingleRepository { + # ask if it is a maya, unity, design, or other (generic) project + Write-Output ("`n!!! what type of project is this? (m/u/d/g)`n" + + "!!! - [m]odelling: maya, zbrush, substance painter`n" + + "!!! - [u]nity: unity lol`n" + + "!!! - [d]esign: adobe design files, audiovisual files, figma`n" + + "!!! - [g]eneric: other project") + + while ($true) { + $projectType = Read-Host + if ($projectType -eq "m" -or $projectType -eq "u" -or $projectType -eq "d" -or $projectType -eq "g") { + break + } + Write-Output "!!! expected: 'm', 'u', 'd', 'g'" + } + + Write-Output "" + + # ask if the repo will be pushed to github or the forge + Write-Output ("`n!!! will this repo be pushed to github or the forge? (g/f)`n" + + "!!! - [g]ithub: github.com`n" + + "!!! - [f]orge: forge.joshwel.co`n" + + "!!!`n" + + "!!! (this will affect how git lfs is setup, but it will be enabled regardless`n" + + "!!! ---`n" + + "!!! github has a 1gb lfs storage/bandwidth limit, while the forge doesn't care`n" + + "!!! saying 'f' will use actually defined .gitattributes,`n" + + "!!! while saying 'g' will use a basic .gitattributes that MIGHT not wreck your`n" + + "!!! 1gb git lfs allowance as long as you dont commit files bigger than 100mb)") + + while ($true) { + $repoHost = Read-Host + if ($repoHost -eq "g" -or $repoHost -eq "f") { + break + } + Write-Output "!!! expected: 'g', 'f'" + } + + Write-Output "" + + # re-set variables if the repo will be pushed to the github (use github.gitattributes) + if ($repoHost -eq "g") { + $GIT_ATTR_UNITY=$GIT_ATTR_GITHB + $GIT_ATTR_MODEL=$GIT_ATTR_GITHB + $GIT_ATTR_DESGN=$GIT_ATTR_GITHB + $GIT_ATTR_GENRC=$GIT_ATTR_GITHB + } + + # download appropriate .gitattribute and .gitignore + if ($projectType -eq "m") { + Write-Output ">>> modelling: dl '$GIT_ATTR_MODEL' -> '.gitattributes'" + Invoke-WebRequest -Uri $GIT_ATTR_MODEL -OutFile ".gitattributes" + + } elseif ($projectType -eq "u") { + Write-Output ">>> unity: dl '$GIT_IGNR_UNITY' -> '.gitignore'" + Invoke-WebRequest -Uri $GIT_ATTR_UNITY -OutFile ".gitattributes" + Write-Output ">>> unity: dl '$GIT_ATTR_UNITY' -> '.gitattributes'" + Invoke-WebRequest -Uri $GIT_IGNR_UNITY -OutFile ".gitignore" + + } elseif ($projectType -eq "d") { + Write-Output ">>> design: dl '$GIT_ATTR_DESGN' -> '.gitattributes'" + Invoke-WebRequest -Uri $GIT_ATTR_DESGN -OutFile ".gitattributes" + + } else { + Write-Output ">>> generic: dl '$GIT_ATTR_GENRC' -> '.gitattributes'" + Invoke-WebRequest -Uri $GIT_ATTR_GENRC -OutFile ".gitattributes" + } +} + +# pre-script setup +$oldErrorActionPreference = $ErrorActionPreference +$ErrorActionPreference = 'Stop' +$OutputEncoding = [System.Text.Encoding]::UTF8 + +Write-Output ("`nforge/lfs-compatible repo quickstart setup`n" + + "with all my heart, mark 2024`n") + +# check if .git exists in current directory +# if not, 'git init' to create a new repository +if (-not (Test-Path -Path ".git")) { + Write-Output ">> 'git init' (.git repo folder not found)" + git init +} + +Write-Output ">> 'git lfs install'" +git lfs install + +# ask the user if it is a shared or a single repository +# validate the input via a loop +Write-Output ("`n!!! shared repository: multiple projects in one repository`n" + + "!!! |-- .git/`n" + + "!!! |-- Game`n" + + "!!! | |-- .gitignore`n" + + "!!! | |-- .gitattributes`n" + + "!!! | ``-- ...`n" + + "!!! |-- Modelling`n" + + "!!! | |-- .gitattributes`n" + + "!!! | ``-- ...`n" + + "!!! ``-- ...`n" + + "!!!`n" + + "!!! single repository/monorepo: one project`n" + + "!!! |-- .git/`n" + + "!!! |-- .gitignore`n" + + "!!! |-- .gitattributes`n" + + "!!! ``-- ...`n" + + "!!!`n" + + "!!! is this a shared or mono repository? (s/m)") + +while ($true) { + $repoType = Read-Host + if ($repoType -eq "s" -or $repoType -eq "m") { + break + } + Write-Output "!!! expected: 's', 'm'" +} + +# setup the repository +if ($repoType -eq "s") { + setupSharedRepository +} else { + setupSingleRepository +} + +# reset error action preference +$ErrorActionPreference = $oldErrorActionPreference + +Write-Output ("`ndone~! ☆*: .。. o(≧▽≦)o .。.:*☆`n" | Out-String -Stream)