migrate_history_fixes.patch 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. --- services/track-changes/app/js/DiffGenerator.js
  2. +++ services/track-changes/app/js/DiffGenerator.js
  3. @@ -63,6 +63,7 @@ module.exports = DiffGenerator = {
  4. if (p > max_p) {
  5. logger.warn({ max_p, p }, 'truncating position to content length')
  6. p = max_p
  7. + op.p = p // fix out of range offsets to avoid invalid history exports in ZipManager
  8. }
  9. const textToBeRemoved = content.slice(p, p + op.i.length)
  10. @@ -74,6 +75,9 @@ module.exports = DiffGenerator = {
  11. return content.slice(0, p) + content.slice(p + op.i.length)
  12. } else if (op.d != null) {
  13. + if (op.p > content.length) {
  14. + op.p = content.length // fix out of range offsets to avoid invalid history exports in ZipManager
  15. + }
  16. return content.slice(0, op.p) + op.d + content.slice(op.p)
  17. } else {
  18. return content
  19. --- services/web/modules/history-migration/app/src/HistoryUpgradeHelper.js
  20. +++ services/web/modules/history-migration/app/src/HistoryUpgradeHelper.js
  21. @@ -107,6 +107,15 @@ async function upgradeProject(project, options) {
  22. if (!upgradeFn) {
  23. return { error: 'unsupported history type' }
  24. }
  25. + if (options.forceClean) {
  26. + try {
  27. + const projectId = project._id
  28. + // delete any existing history stored in the mongo backend
  29. + await HistoryManager.promises.deleteProject(projectId, projectId)
  30. + } catch (err) {
  31. + // failed to delete existing history, but we can try to continue
  32. + }
  33. + }
  34. const result = await upgradeFn(project, options)
  35. result.historyType = historyType
  36. return result
  37. --- services/web/scripts/history/migrate_history.js
  38. +++ services/web/scripts/history/migrate_history.js
  39. @@ -2,6 +2,25 @@
  40. process.env.MONGO_SOCKET_TIMEOUT =
  41. parseInt(process.env.MONGO_SOCKET_TIMEOUT, 10) || 3600000
  42. +const fs = require('fs')
  43. +
  44. +if (fs.existsSync('/etc/container_environment.json')) {
  45. + try {
  46. + const envData = JSON.parse(
  47. + fs.readFileSync('/etc/container_environment.json', 'utf8')
  48. + )
  49. + for (const [key, value] of Object.entries(envData)) {
  50. + process.env[key] = value
  51. + }
  52. + } catch (err) {
  53. + console.error(
  54. + 'cannot read /etc/container_environment.json, the script needs to be run as root',
  55. + err
  56. + )
  57. + process.exit(1)
  58. + }
  59. +}
  60. +
  61. const VERSION = '0.9.0-cli'
  62. const {
  63. countProjects,
  64. @@ -11,7 +30,6 @@ const {
  65. } = require('../../modules/history-migration/app/src/HistoryUpgradeHelper')
  66. const { waitForDb } = require('../../app/src/infrastructure/mongodb')
  67. const minimist = require('minimist')
  68. -const fs = require('fs')
  69. const util = require('util')
  70. const pLimit = require('p-limit')
  71. const logger = require('@overleaf/logger')
  72. @@ -34,6 +52,7 @@ const argv = minimist(process.argv.slice(2), {
  73. 'use-query-hint',
  74. 'retry-failed',
  75. 'archive-on-failure',
  76. + 'force-clean',
  77. ],
  78. string: ['output', 'user-id'],
  79. alias: {
  80. @@ -168,6 +187,7 @@ async function migrateProjects(projectsToMigrate) {
  81. convertLargeDocsToFile: argv['convert-large-docs-to-file'],
  82. userId: argv['user-id'],
  83. reason: VERSION,
  84. + forceClean: argv['force-clean'],
  85. }
  86. async function _migrateProject(project) {
  87. if (INTERRUPT) {