spawn.js 1.3 KB

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