deps.nim 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import std/[os, uri, strformat, strutils]
  2. import std/private/gitutils
  3. when defined(nimPreviewSlimSystem):
  4. import std/assertions
  5. proc tryexec(cmd: string): int =
  6. echo "deps.cmd: " & cmd
  7. execShellCmd(cmd)
  8. proc exec(cmd: string) =
  9. doAssert tryexec(cmd) == 0, cmd
  10. proc execRetry(cmd: string) =
  11. let ok = retryCall(call = block:
  12. let status = execShellCmd(cmd)
  13. let result = status == 0
  14. if not result:
  15. echo fmt"failed command: '{cmd}', status: {status}"
  16. result)
  17. doAssert ok, cmd
  18. proc cloneDependency*(destDirBase: string, url: string, commit = commitHead,
  19. appendRepoName = true, allowBundled = false) =
  20. let destDirBase = destDirBase.absolutePath
  21. let p = url.parseUri.path
  22. let name = p.splitFile.name
  23. var destDir = destDirBase
  24. if appendRepoName: destDir = destDir / name
  25. let quotedDestDir = destDir.quoteShell
  26. if not dirExists(destDir):
  27. # note: old code used `destDir / .git` but that wouldn't prevent git clone
  28. # from failing
  29. execRetry fmt"git clone -q {url} {quotedDestDir}"
  30. if isGitRepo(destDir):
  31. let oldDir = getCurrentDir()
  32. setCurrentDir(destDir)
  33. try:
  34. let checkoutCmd = fmt"git checkout -q {commit}"
  35. if tryexec(checkoutCmd) != 0:
  36. execRetry "git fetch -q"
  37. exec checkoutCmd
  38. finally:
  39. setCurrentDir(oldDir)
  40. elif allowBundled:
  41. discard "this dependency was bundled with Nim, don't do anything"
  42. else:
  43. quit "FAILURE: " & destdir & " already exists but is not a git repo"
  44. proc updateSubmodules*(dir: string, allowBundled = false) =
  45. if isGitRepo(dir):
  46. let oldDir = getCurrentDir()
  47. setCurrentDir(dir)
  48. try:
  49. exec "git submodule update --init"
  50. finally:
  51. setCurrentDir(oldDir)
  52. elif allowBundled:
  53. discard "this dependency was bundled with Nim, don't do anything"
  54. else:
  55. quit "FAILURE: " & dir & " already exists but is not a git repo"