spawn.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. const spawn = require('@npmcli/promise-spawn')
  2. const promiseRetry = require('promise-retry')
  3. const makeError = require('./make-error.js')
  4. const whichGit = require('./which.js')
  5. const makeOpts = require('./opts.js')
  6. const procLog = require('./proc-log.js')
  7. module.exports = (gitArgs, opts = {}) => {
  8. const gitPath = whichGit(opts)
  9. if (gitPath instanceof Error) { return Promise.reject(gitPath) }
  10. // undocumented option, mostly only here for tests
  11. const args = opts.allowReplace || gitArgs[0] === '--no-replace-objects'
  12. ? gitArgs
  13. : ['--no-replace-objects', ...gitArgs]
  14. const log = opts.log || procLog
  15. let retry = opts.retry
  16. if (retry === null || retry === undefined) {
  17. retry = {
  18. retries: opts.fetchRetries || 2,
  19. factor: opts.fetchRetryFactor || 10,
  20. maxTimeout: opts.fetchRetryMaxtimeout || 60000,
  21. minTimeout: opts.fetchRetryMintimeout || 1000
  22. }
  23. }
  24. return promiseRetry((retry, number) => {
  25. if (number !== 1) {
  26. log.silly('git', `Retrying git command: ${
  27. args.join(' ')} attempt # ${number}`)
  28. }
  29. return spawn(gitPath, args, makeOpts(opts))
  30. .catch(er => {
  31. const gitError = makeError(er)
  32. if (!gitError.shouldRetry(number)) {
  33. throw gitError
  34. }
  35. retry(gitError)
  36. })
  37. }, retry)
  38. }