autoFixConflicts.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #!/usr/bin/env node
  2. // Usage: autoFixConflicts.js | sh
  3. import { createInterface as readLines } from 'node:readline'
  4. import { spawn } from 'node:child_process'
  5. const VERSION_URL = /(?<=https:\/\/\S+\/v)\d+\.\d+\.\d+(?:-(?:alpha|beta)(?:[.-]\d+)?)?(?=\/)/
  6. const gitStatus = spawn('git', ['status', '--porcelain'])
  7. for await (const line of readLines(gitStatus.stdout)) {
  8. // eslint-disable-next-line no-continue
  9. if (!line.startsWith('UU ')) continue
  10. const file = line.slice(3)
  11. if (file === 'yarn.lock') {
  12. console.log('corepack yarn install')
  13. console.log('git add yarn.lock')
  14. // eslint-disable-next-line no-continue
  15. continue
  16. }
  17. if (file.endsWith('/package.json')) {
  18. console.log(`git checkout --ours ${file}`)
  19. console.log(`git add ${file}`)
  20. // eslint-disable-next-line no-continue
  21. continue
  22. }
  23. const gitDiff = spawn('git', ['--no-pager', 'diff', '--', file])
  24. let conflictHasStarted = false
  25. let containsCDNChanges = true
  26. let currentConflictContainsCDNChanges = false
  27. // eslint-disable-next-line no-shadow
  28. for await (const line of readLines(gitDiff.stdout)) {
  29. if (conflictHasStarted) {
  30. if (line.startsWith('++>>>>>>>')) {
  31. conflictHasStarted = false
  32. containsCDNChanges &&= currentConflictContainsCDNChanges
  33. currentConflictContainsCDNChanges = false
  34. } else {
  35. currentConflictContainsCDNChanges ||= VERSION_URL.test(line)
  36. }
  37. } else if (line === '++<<<<<<< HEAD') {
  38. conflictHasStarted = true
  39. }
  40. }
  41. if (containsCDNChanges) {
  42. console.log(`git checkout --ours ${file}`)
  43. console.log(`git add ${file}`)
  44. // eslint-disable-next-line no-continue
  45. continue
  46. }
  47. }