2024-02-16 08:57:13 +08:00
|
|
|
# fetch repo directly
|
2023-12-08 00:13:39 +08:00
|
|
|
param(
|
2024-02-16 08:57:13 +08:00
|
|
|
[Alias("name")]
|
|
|
|
$uri, # uri
|
|
|
|
$prefix, # fetch dest repo prefix
|
|
|
|
$version = $null, # version hint
|
|
|
|
$revision = $null, # revision
|
|
|
|
$cfg = $null
|
2023-12-08 00:13:39 +08:00
|
|
|
)
|
|
|
|
|
2024-02-16 08:57:13 +08:00
|
|
|
# content of _1kiss with yaml format
|
|
|
|
# ver: 1.0
|
|
|
|
# branch: 1.x
|
|
|
|
# commits: 2802
|
|
|
|
# rev: 29b0b28
|
|
|
|
|
|
|
|
Set-Alias println Write-Host
|
|
|
|
|
|
|
|
if (!$uri -or !$prefix) {
|
2023-12-08 00:13:39 +08:00
|
|
|
throw 'fetch.ps1: missing parameters'
|
|
|
|
}
|
|
|
|
|
2024-02-16 08:57:13 +08:00
|
|
|
function download_file($uri, $out) {
|
|
|
|
if (Test-Path $out -PathType Leaf) { return }
|
|
|
|
println "Downloading $uri to $out ..."
|
|
|
|
Invoke-WebRequest -Uri $uri -OutFile $out
|
|
|
|
}
|
|
|
|
|
|
|
|
function mkdirs($path) {
|
|
|
|
if (!(Test-Path $path -PathType Container)) {
|
|
|
|
New-Item $path -ItemType Directory 1>$null
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
$cache_dir = Join-Path (Resolve-Path $PSScriptRoot/..).Path 'cache'
|
|
|
|
|
|
|
|
if (!(Test-Path $cache_dir -PathType Container)) {
|
|
|
|
mkdirs $cache_dir
|
|
|
|
}
|
2023-12-08 00:13:39 +08:00
|
|
|
|
2024-02-16 08:57:13 +08:00
|
|
|
if (!$cfg) {
|
|
|
|
# fetch by url directly
|
|
|
|
$url = $uri
|
|
|
|
$folder_name = (Split-Path $url -leafbase)
|
|
|
|
if ($folder_name.EndsWith('.tar')) {
|
|
|
|
$folder_name = $folder_name.Substring(0, $folder_name.length - 4)
|
2023-12-20 02:34:45 +08:00
|
|
|
}
|
|
|
|
|
2024-02-16 08:57:13 +08:00
|
|
|
$lib_src = Join-Path $prefix $folder_name
|
2023-12-21 23:59:24 +08:00
|
|
|
|
2024-02-16 08:57:13 +08:00
|
|
|
function fetch_repo($url, $out) {
|
|
|
|
if (!$url.EndsWith('.git')) {
|
|
|
|
download_file $url $out
|
|
|
|
if ($out.EndsWith('.zip')) {
|
|
|
|
Expand-Archive -Path $out -DestinationPath $prefix
|
|
|
|
}
|
|
|
|
elseif ($out.EndsWith('.tar.gz')) {
|
|
|
|
tar xf "$out" -C $prefix
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
git clone $url $lib_src
|
|
|
|
if (!(Test-Path $(Join-Path $lib_src '.git')) -and (Test-Path $lib_src -PathType Container)) {
|
|
|
|
Remove-Item $lib_src -Recurse -Force
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$is_git_repo = $url.EndsWith('.git')
|
|
|
|
$sentry = Join-Path $lib_src '_1kiss'
|
|
|
|
|
|
|
|
$is_rev_modified = $false
|
2023-12-21 23:59:24 +08:00
|
|
|
# if sentry file missing, re-clone
|
|
|
|
if (!(Test-Path $sentry -PathType Leaf)) {
|
2024-02-16 08:57:13 +08:00
|
|
|
if (Test-Path $lib_src -PathType Container) {
|
|
|
|
Remove-Item $lib_src -Recurse -Force
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($url.EndsWith('.tar.gz')) {
|
|
|
|
$out_file = Join-Path $cache_dir "${folder_name}.tar.gz"
|
|
|
|
}
|
|
|
|
elseif ($url.EndsWith('.zip')) {
|
|
|
|
$out_file = Join-Path $cache_dir "${folder_name}.zip"
|
2023-12-08 00:13:39 +08:00
|
|
|
}
|
2024-02-16 08:57:13 +08:00
|
|
|
else {
|
|
|
|
$out_file = $null
|
|
|
|
}
|
|
|
|
|
|
|
|
fetch_repo -url $url -out $out_file
|
|
|
|
|
|
|
|
if (Test-Path $lib_src -PathType Container) {
|
|
|
|
New-Item $sentry -ItemType File
|
|
|
|
$is_rev_modified = $true
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
throw "fetch.ps1: fetch content from $url failed"
|
2023-12-21 23:59:24 +08:00
|
|
|
}
|
2023-12-08 00:13:39 +08:00
|
|
|
}
|
2023-12-21 23:59:24 +08:00
|
|
|
|
2024-02-16 08:57:13 +08:00
|
|
|
# checkout revision for git repo
|
|
|
|
if ($is_git_repo) {
|
|
|
|
$old_rev_hash = $(git -C $lib_src rev-parse HEAD)
|
|
|
|
|
|
|
|
$pred_rev_hash = $(git -C $lib_src rev-parse --verify --quiet "$revision^{}")
|
|
|
|
|
|
|
|
if(!$pred_rev_hash) {
|
|
|
|
git -C $lib_src pull
|
|
|
|
$pred_rev_hash = $(git -C $lib_src rev-parse --verify --quiet "$revision^{}")
|
|
|
|
if(!$pred_rev_hash) {
|
|
|
|
throw "Could not found commit hash of $revision"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
git -C $lib_src checkout $revision --force 1>$null 2>$null
|
|
|
|
|
|
|
|
$new_rev_hash = $(git -C $lib_src rev-parse HEAD)
|
|
|
|
|
|
|
|
if (!$is_rev_modified) {
|
|
|
|
$is_rev_modified = $old_rev_hash -ne $new_rev_hash
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($is_rev_modified) {
|
|
|
|
$sentry_content = "ver: $version"
|
|
|
|
|
|
|
|
if ($is_git_repo) {
|
|
|
|
$branch_name = $(git -C $lib_src branch --show-current)
|
|
|
|
if ($branch_name) {
|
|
|
|
# track branch
|
|
|
|
git -C $lib_src pull
|
|
|
|
$commits = $(git -C $lib_src rev-list --count HEAD)
|
|
|
|
$sentry_content += "`nbranch: $branch_name"
|
|
|
|
$sentry_content += "`ncommits: $commits"
|
|
|
|
$revision = $(git -C $lib_src rev-parse --short=7 HEAD)
|
|
|
|
$sentry_content += "`nrev: $revision"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[System.IO.File]::WriteAllText($sentry, $sentry_content)
|
|
|
|
|
|
|
|
git -C $lib_src add '_1kiss'
|
|
|
|
}
|
|
|
|
|
|
|
|
if (Test-Path (Join-Path $lib_src '.gn') -PathType Leaf) {
|
|
|
|
# the repo use google gn build system manage deps and build
|
|
|
|
Push-Location $lib_src
|
|
|
|
if (Test-Path 'scripts/bootstrap.py' -PathType Leaf) {
|
|
|
|
python scripts/bootstrap.py
|
|
|
|
}
|
|
|
|
gclient sync -D
|
|
|
|
Pop-Location
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
# fetch by config file
|
|
|
|
$name = $uri
|
|
|
|
$lib_src = Join-Path $prefix $name
|
|
|
|
$mirror = if (!(Test-Path (Join-Path $PSScriptRoot '.gitee') -PathType Leaf)) { 'github' } else { 'gitee' }
|
|
|
|
$url_base = @{'github' = 'https://github.com/'; 'gitee' = 'https://gitee.com/' }[$mirror]
|
|
|
|
|
|
|
|
$manifest_map = ConvertFrom-Json (Get-Content $cfg -raw)
|
|
|
|
$version_map = $manifest_map.versions
|
|
|
|
$pkg_ver = $version_map.PSObject.Properties[$name].Value
|
|
|
|
if ($pkg_ver) {
|
|
|
|
$url_path = $manifest_map.mirrors.PSObject.Properties[$mirror].Value.PSObject.Properties[$name].Value
|
|
|
|
if (!$url_path) {
|
|
|
|
throw "fetch.ps1 missing mirror config for package: '$name'"
|
|
|
|
}
|
|
|
|
|
|
|
|
$url = "$url_base/$url_path"
|
|
|
|
|
|
|
|
$sentry = Join-Path $lib_src '_1kiss'
|
|
|
|
# if sentry file missing, re-clone
|
|
|
|
if (!(Test-Path $sentry -PathType Leaf)) {
|
|
|
|
if (Test-Path $lib_src -PathType Container) {
|
|
|
|
Remove-Item $lib_src -Recurse -Force
|
|
|
|
}
|
|
|
|
git clone $url $lib_src
|
|
|
|
if ($? -and (Test-Path $(Join-Path $lib_src '.git') -PathType Container)) {
|
|
|
|
[System.IO.File]::WriteAllText($sentry, "$(git -C $lib_src rev-parse HEAD)")
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
throw "fetch.ps1: execute git clone $url failed"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$pkg_ver = $pkg_ver.Split('-')
|
|
|
|
$use_hash = $pkg_ver.Count -gt 1
|
|
|
|
$revision = $pkg_ver[$use_hash].Trim()
|
|
|
|
$tag_info = git -C $lib_src tag | Select-String $revision
|
|
|
|
if ($tag_info) {
|
|
|
|
git -C $lib_src checkout ([array]$tag_info.Line)[0] --force 1>$null 2>$null
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
git -C $lib_src checkout $revision --force 1>$null 2>$null
|
|
|
|
}
|
|
|
|
git -C $lib_src add '_1kiss'
|
2023-12-08 00:13:39 +08:00
|
|
|
}
|
|
|
|
else {
|
2024-02-16 08:57:13 +08:00
|
|
|
throw "fetch.ps1: not found version for package ${name}"
|
2023-12-08 00:13:39 +08:00
|
|
|
}
|
|
|
|
}
|