mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-30 18:02:05 +00:00
52 lines
1.7 KiB
Nim
52 lines
1.7 KiB
Nim
## OS utilities like 'withDir'.
|
|
## (c) 2021 Andreas Rumpf
|
|
|
|
import os, strutils, osproc
|
|
|
|
proc isUrl*(x: string): bool =
|
|
x.startsWith("git://") or x.startsWith("https://") or x.startsWith("http://")
|
|
|
|
proc cloneUrl*(url, dest: string; cloneUsingHttps: bool): string =
|
|
## Returns an error message on error or else "".
|
|
result = ""
|
|
var modUrl =
|
|
if url.startsWith("git://") and cloneUsingHttps:
|
|
"https://" & url[6 .. ^1]
|
|
else: url
|
|
|
|
# github + https + trailing url slash causes a
|
|
# checkout/ls-remote to fail with Repository not found
|
|
var isGithub = false
|
|
if modUrl.contains("github.com") and modUrl.endsWith("/"):
|
|
modUrl = modUrl[0 .. ^2]
|
|
isGithub = true
|
|
|
|
let (_, exitCode) = execCmdEx("git ls-remote --quiet --tags " & modUrl)
|
|
var xcode = exitCode
|
|
if isGithub and exitCode != QuitSuccess:
|
|
# retry multiple times to avoid annoying github timeouts:
|
|
for i in 0..4:
|
|
os.sleep(4000)
|
|
xcode = execCmdEx("git ls-remote --quiet --tags " & modUrl)[1]
|
|
if xcode == QuitSuccess: break
|
|
|
|
if xcode == QuitSuccess:
|
|
# retry multiple times to avoid annoying github timeouts:
|
|
let cmd = "git clone " & modUrl & " " & dest
|
|
for i in 0..4:
|
|
if execShellCmd(cmd) == 0: return ""
|
|
os.sleep(4000)
|
|
result = "exernal program failed: " & cmd
|
|
elif not isGithub:
|
|
let (_, exitCode) = execCmdEx("hg identify " & modUrl)
|
|
if exitCode == QuitSuccess:
|
|
let cmd = "hg clone " & modUrl & " " & dest
|
|
for i in 0..4:
|
|
if execShellCmd(cmd) == 0: return ""
|
|
os.sleep(4000)
|
|
result = "exernal program failed: " & cmd
|
|
else:
|
|
result = "Unable to identify url: " & modUrl
|
|
else:
|
|
result = "Unable to identify url: " & modUrl
|