const spawn = require('@npmcli/promise-spawn')
const promiseRetry = require('promise-retry')
const shouldRetry = require('./should-retry.js')
const whichGit = require('./which.js')
const makeOpts = require('./opts.js')
const procLog = require('./proc-log.js')

module.exports = (gitArgs, opts = {}) => {
  const gitPath = whichGit(opts)

  if (gitPath instanceof Error)
    return Promise.reject(gitPath)

  const log = opts.log || procLog
  return promiseRetry((retry, number) => {
    if (number !== 1)
      log.silly('pacote', `Retrying git command: ${
        gitArgs.join(' ')} attempt # ${number}`)

    return spawn(gitPath, gitArgs, makeOpts(opts))
      .catch(er => {
        if (shouldRetry(er.stderr, number))
          retry(er)
        else
          throw er
      })
  }, opts.retry !== null && opts.retry !== undefined ? opts.retry : {
    retries: opts.fetchRetries || 2,
    factor: opts.fetchRetryFactor || 10,
    maxTimeout: opts.fetchRetryMaxtimeout || 60000,
    minTimeout: opts.fetchRetryMintimeout || 1000,
  })
}
