@cloudant/couchbackup 2.9.8-SNAPSHOT.94 → 2.9.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.scannerwork/report-task.txt +2 -2
- package/.scannerwork/scanner-report/analysis-warnings.pb +2 -2
- package/.scannerwork/scanner-report/analysis.log +1 -1
- package/.scannerwork/scanner-report/changesets-36.pb +1 -0
- package/.scannerwork/scanner-report/changesets-37.pb +1 -0
- package/.scannerwork/scanner-report/changesets-41.pb +1 -0
- package/.scannerwork/scanner-report/changesets-42.pb +1 -0
- package/.scannerwork/scanner-report/changesets-43.pb +1 -0
- package/.scannerwork/scanner-report/changesets-44.pb +1 -0
- package/.scannerwork/scanner-report/changesets-45.pb +1 -0
- package/.scannerwork/scanner-report/changesets-46.pb +1 -0
- package/.scannerwork/scanner-report/changesets-47.pb +1 -0
- package/.scannerwork/scanner-report/changesets-48.pb +1 -0
- package/.scannerwork/scanner-report/changesets-51.pb +1 -0
- package/.scannerwork/scanner-report/changesets-52.pb +1 -0
- package/.scannerwork/scanner-report/changesets-6.pb +0 -0
- package/.scannerwork/scanner-report/changesets-7.pb +1 -0
- package/.scannerwork/scanner-report/component-1.pb +1 -1
- package/.scannerwork/scanner-report/component-19.pb +1 -1
- package/.scannerwork/scanner-report/component-20.pb +1 -1
- package/.scannerwork/scanner-report/component-21.pb +1 -1
- package/.scannerwork/scanner-report/component-22.pb +1 -1
- package/.scannerwork/scanner-report/component-23.pb +1 -1
- package/.scannerwork/scanner-report/component-24.pb +1 -1
- package/.scannerwork/scanner-report/component-25.pb +1 -1
- package/.scannerwork/scanner-report/component-26.pb +1 -1
- package/.scannerwork/scanner-report/component-27.pb +1 -1
- package/.scannerwork/scanner-report/component-28.pb +1 -1
- package/.scannerwork/scanner-report/component-29.pb +1 -1
- package/.scannerwork/scanner-report/component-30.pb +1 -1
- package/.scannerwork/scanner-report/component-31.pb +1 -1
- package/.scannerwork/scanner-report/component-32.pb +1 -1
- package/.scannerwork/scanner-report/component-33.pb +1 -1
- package/.scannerwork/scanner-report/component-34.pb +1 -1
- package/.scannerwork/scanner-report/component-35.pb +1 -1
- package/.scannerwork/scanner-report/component-36.pb +1 -0
- package/.scannerwork/scanner-report/component-37.pb +1 -1
- package/.scannerwork/scanner-report/component-38.pb +1 -1
- package/.scannerwork/scanner-report/component-4.pb +1 -1
- package/.scannerwork/scanner-report/component-40.pb +1 -1
- package/.scannerwork/scanner-report/component-41.pb +1 -0
- package/.scannerwork/scanner-report/component-42.pb +1 -0
- package/.scannerwork/scanner-report/component-43.pb +1 -0
- package/.scannerwork/scanner-report/component-44.pb +1 -0
- package/.scannerwork/scanner-report/component-45.pb +1 -0
- package/.scannerwork/scanner-report/component-46.pb +1 -0
- package/.scannerwork/scanner-report/component-47.pb +1 -0
- package/.scannerwork/scanner-report/component-48.pb +1 -0
- package/.scannerwork/scanner-report/component-49.pb +1 -1
- package/.scannerwork/scanner-report/component-5.pb +1 -1
- package/.scannerwork/scanner-report/component-50.pb +1 -1
- package/.scannerwork/scanner-report/component-51.pb +1 -1
- package/.scannerwork/scanner-report/component-52.pb +1 -0
- package/.scannerwork/scanner-report/component-53.pb +1 -1
- package/.scannerwork/scanner-report/component-54.pb +1 -1
- package/.scannerwork/scanner-report/component-55.pb +1 -1
- package/.scannerwork/scanner-report/component-57.pb +1 -1
- package/.scannerwork/scanner-report/component-58.pb +1 -1
- package/.scannerwork/scanner-report/component-59.pb +1 -1
- package/.scannerwork/scanner-report/component-6.pb +1 -1
- package/.scannerwork/scanner-report/component-61.pb +1 -1
- package/.scannerwork/scanner-report/component-65.pb +1 -1
- package/.scannerwork/scanner-report/component-66.pb +1 -1
- package/.scannerwork/scanner-report/component-69.pb +1 -1
- package/.scannerwork/scanner-report/component-7.pb +1 -0
- package/.scannerwork/scanner-report/coverages-19.pb +0 -0
- package/.scannerwork/scanner-report/coverages-20.pb +0 -0
- package/.scannerwork/scanner-report/coverages-21.pb +0 -0
- package/.scannerwork/scanner-report/coverages-22.pb +0 -0
- package/.scannerwork/scanner-report/coverages-23.pb +0 -0
- package/.scannerwork/scanner-report/coverages-24.pb +0 -0
- package/.scannerwork/scanner-report/coverages-25.pb +0 -0
- package/.scannerwork/scanner-report/coverages-26.pb +0 -0
- package/.scannerwork/scanner-report/coverages-27.pb +0 -0
- package/.scannerwork/scanner-report/coverages-28.pb +0 -0
- package/.scannerwork/scanner-report/coverages-29.pb +0 -0
- package/.scannerwork/scanner-report/coverages-30.pb +0 -0
- package/.scannerwork/scanner-report/coverages-31.pb +0 -0
- package/.scannerwork/scanner-report/coverages-32.pb +0 -0
- package/.scannerwork/scanner-report/coverages-33.pb +0 -0
- package/.scannerwork/scanner-report/coverages-34.pb +0 -0
- package/.scannerwork/scanner-report/coverages-35.pb +0 -0
- package/.scannerwork/scanner-report/coverages-36.pb +0 -0
- package/.scannerwork/scanner-report/coverages-37.pb +0 -0
- package/.scannerwork/scanner-report/coverages-4.pb +0 -0
- package/.scannerwork/scanner-report/coverages-41.pb +0 -0
- package/.scannerwork/scanner-report/coverages-46.pb +0 -0
- package/.scannerwork/scanner-report/coverages-47.pb +0 -0
- package/.scannerwork/scanner-report/coverages-49.pb +0 -0
- package/.scannerwork/scanner-report/coverages-5.pb +0 -0
- package/.scannerwork/scanner-report/coverages-50.pb +0 -0
- package/.scannerwork/scanner-report/coverages-53.pb +0 -0
- package/.scannerwork/scanner-report/coverages-54.pb +0 -0
- package/.scannerwork/scanner-report/coverages-57.pb +0 -0
- package/.scannerwork/scanner-report/coverages-58.pb +0 -0
- package/.scannerwork/scanner-report/coverages-6.pb +0 -0
- package/.scannerwork/scanner-report/coverages-65.pb +0 -0
- package/.scannerwork/scanner-report/coverages-66.pb +0 -0
- package/.scannerwork/scanner-report/coverages-69.pb +0 -0
- package/.scannerwork/scanner-report/coverages-7.pb +0 -0
- package/.scannerwork/scanner-report/duplications-19.pb +3 -0
- package/.scannerwork/scanner-report/duplications-21.pb +2 -0
- package/.scannerwork/scanner-report/duplications-22.pb +3 -0
- package/.scannerwork/scanner-report/duplications-32.pb +2 -3
- package/.scannerwork/scanner-report/duplications-34.pb +0 -2
- package/.scannerwork/scanner-report/duplications-36.pb +2 -0
- package/.scannerwork/scanner-report/duplications-43.pb +2 -0
- package/.scannerwork/scanner-report/duplications-45.pb +2 -0
- package/.scannerwork/scanner-report/duplications-49.pb +0 -2
- package/.scannerwork/scanner-report/duplications-5.pb +3 -3
- package/.scannerwork/scanner-report/duplications-50.pb +0 -2
- package/.scannerwork/scanner-report/duplications-6.pb +0 -2
- package/.scannerwork/scanner-report/duplications-65.pb +2 -0
- package/.scannerwork/scanner-report/duplications-66.pb +2 -0
- package/.scannerwork/scanner-report/duplications-7.pb +0 -0
- package/.scannerwork/scanner-report/issues-28.pb +3 -0
- package/.scannerwork/scanner-report/issues-29.pb +4 -1
- package/.scannerwork/scanner-report/measures-19.pb +0 -0
- package/.scannerwork/scanner-report/measures-20.pb +0 -0
- package/.scannerwork/scanner-report/measures-21.pb +0 -0
- package/.scannerwork/scanner-report/measures-22.pb +0 -0
- package/.scannerwork/scanner-report/measures-23.pb +0 -0
- package/.scannerwork/scanner-report/measures-24.pb +0 -0
- package/.scannerwork/scanner-report/measures-25.pb +0 -0
- package/.scannerwork/scanner-report/measures-26.pb +0 -0
- package/.scannerwork/scanner-report/measures-27.pb +0 -0
- package/.scannerwork/scanner-report/measures-28.pb +0 -0
- package/.scannerwork/scanner-report/measures-29.pb +0 -0
- package/.scannerwork/scanner-report/measures-30.pb +0 -0
- package/.scannerwork/scanner-report/measures-31.pb +0 -0
- package/.scannerwork/scanner-report/measures-32.pb +0 -0
- package/.scannerwork/scanner-report/measures-33.pb +0 -0
- package/.scannerwork/scanner-report/measures-34.pb +0 -0
- package/.scannerwork/scanner-report/measures-35.pb +0 -0
- package/.scannerwork/scanner-report/measures-36.pb +0 -0
- package/.scannerwork/scanner-report/measures-37.pb +0 -0
- package/.scannerwork/scanner-report/measures-4.pb +0 -0
- package/.scannerwork/scanner-report/measures-41.pb +0 -0
- package/.scannerwork/scanner-report/measures-44.pb +16 -0
- package/.scannerwork/scanner-report/measures-46.pb +0 -0
- package/.scannerwork/scanner-report/measures-47.pb +0 -0
- package/.scannerwork/scanner-report/measures-49.pb +0 -0
- package/.scannerwork/scanner-report/measures-5.pb +0 -0
- package/.scannerwork/scanner-report/measures-50.pb +0 -0
- package/.scannerwork/scanner-report/measures-51.pb +0 -0
- package/.scannerwork/scanner-report/measures-52.pb +0 -0
- package/.scannerwork/scanner-report/measures-53.pb +0 -0
- package/.scannerwork/scanner-report/measures-54.pb +0 -0
- package/.scannerwork/scanner-report/measures-55.pb +0 -0
- package/.scannerwork/scanner-report/measures-57.pb +0 -0
- package/.scannerwork/scanner-report/measures-58.pb +0 -0
- package/.scannerwork/scanner-report/measures-59.pb +0 -0
- package/.scannerwork/scanner-report/measures-6.pb +0 -0
- package/.scannerwork/scanner-report/measures-61.pb +0 -0
- package/.scannerwork/scanner-report/measures-65.pb +0 -0
- package/.scannerwork/scanner-report/measures-66.pb +0 -0
- package/.scannerwork/scanner-report/measures-69.pb +0 -0
- package/.scannerwork/scanner-report/measures-7.pb +0 -0
- package/.scannerwork/scanner-report/metadata.pb +0 -0
- package/.scannerwork/scanner-report/source-19.txt +106 -11
- package/.scannerwork/scanner-report/source-20.txt +16 -73
- package/.scannerwork/scanner-report/source-21.txt +269 -23
- package/.scannerwork/scanner-report/source-22.txt +86 -123
- package/.scannerwork/scanner-report/source-23.txt +73 -15
- package/.scannerwork/scanner-report/source-24.txt +603 -14
- package/.scannerwork/scanner-report/source-25.txt +11 -127
- package/.scannerwork/scanner-report/source-26.txt +36 -41
- package/.scannerwork/scanner-report/source-27.txt +15 -14
- package/.scannerwork/scanner-report/source-28.txt +127 -85
- package/.scannerwork/scanner-report/source-29.txt +325 -101
- package/.scannerwork/scanner-report/source-30.txt +17 -49
- package/.scannerwork/scanner-report/source-31.txt +60 -585
- package/.scannerwork/scanner-report/source-32.txt +114 -88
- package/.scannerwork/scanner-report/source-33.txt +136 -9
- package/.scannerwork/scanner-report/source-34.txt +43 -200
- package/.scannerwork/scanner-report/source-35.txt +125 -92
- package/.scannerwork/scanner-report/source-36.txt +225 -0
- package/.scannerwork/scanner-report/source-37.txt +114 -509
- package/.scannerwork/scanner-report/source-38.txt +50 -50
- package/.scannerwork/scanner-report/source-4.txt +14 -346
- package/.scannerwork/scanner-report/source-40.txt +165 -165
- package/.scannerwork/scanner-report/source-41.txt +31 -0
- package/.scannerwork/scanner-report/source-44.txt +178 -0
- package/.scannerwork/scanner-report/source-46.txt +54 -0
- package/.scannerwork/scanner-report/source-47.txt +41 -0
- package/.scannerwork/scanner-report/source-49.txt +108 -154
- package/.scannerwork/scanner-report/source-5.txt +215 -102
- package/.scannerwork/scanner-report/source-50.txt +234 -143
- package/.scannerwork/scanner-report/source-51.txt +80 -509
- package/.scannerwork/scanner-report/source-52.txt +111 -0
- package/.scannerwork/scanner-report/source-53.txt +20 -138
- package/.scannerwork/scanner-report/source-54.txt +138 -20
- package/.scannerwork/scanner-report/source-55.txt +509 -178
- package/.scannerwork/scanner-report/source-57.txt +58 -22
- package/.scannerwork/scanner-report/source-58.txt +38 -36
- package/.scannerwork/scanner-report/source-59.txt +509 -111
- package/.scannerwork/scanner-report/source-6.txt +41 -266
- package/.scannerwork/scanner-report/source-61.txt +509 -80
- package/.scannerwork/scanner-report/source-65.txt +173 -14
- package/.scannerwork/scanner-report/source-66.txt +133 -239
- package/.scannerwork/scanner-report/source-69.txt +401 -39
- package/.scannerwork/scanner-report/source-7.txt +47 -0
- package/.scannerwork/scanner-report/symbols-19.pb +95 -9
- package/.scannerwork/scanner-report/symbols-20.pb +17 -60
- package/.scannerwork/scanner-report/symbols-21.pb +486 -27
- package/.scannerwork/scanner-report/symbols-22.pb +75 -110
- package/.scannerwork/scanner-report/symbols-23.pb +60 -10
- package/.scannerwork/scanner-report/symbols-24.pb +1253 -13
- package/.scannerwork/scanner-report/symbols-25.pb +9 -102
- package/.scannerwork/scanner-report/symbols-26.pb +42 -35
- package/.scannerwork/scanner-report/symbols-27.pb +11 -17
- package/.scannerwork/scanner-report/symbols-28.pb +115 -68
- package/.scannerwork/scanner-report/symbols-29.pb +494 -116
- package/.scannerwork/scanner-report/symbols-30.pb +14 -45
- package/.scannerwork/scanner-report/symbols-31.pb +68 -1253
- package/.scannerwork/scanner-report/symbols-32.pb +102 -77
- package/.scannerwork/scanner-report/symbols-33.pb +112 -9
- package/.scannerwork/scanner-report/symbols-34.pb +35 -417
- package/.scannerwork/scanner-report/symbols-35.pb +85 -28
- package/.scannerwork/scanner-report/symbols-36.pb +418 -0
- package/.scannerwork/scanner-report/symbols-37.pb +28 -0
- package/.scannerwork/scanner-report/symbols-4.pb +10 -494
- package/.scannerwork/scanner-report/symbols-41.pb +14 -0
- package/.scannerwork/scanner-report/symbols-46.pb +15 -0
- package/.scannerwork/scanner-report/symbols-47.pb +18 -0
- package/.scannerwork/scanner-report/symbols-49.pb +33 -153
- package/.scannerwork/scanner-report/symbols-5.pb +394 -97
- package/.scannerwork/scanner-report/symbols-50.pb +352 -178
- package/.scannerwork/scanner-report/symbols-53.pb +20 -126
- package/.scannerwork/scanner-report/symbols-54.pb +126 -20
- package/.scannerwork/scanner-report/symbols-57.pb +29 -17
- package/.scannerwork/scanner-report/symbols-58.pb +18 -14
- package/.scannerwork/scanner-report/symbols-6.pb +44 -485
- package/.scannerwork/scanner-report/symbols-65.pb +180 -14
- package/.scannerwork/scanner-report/symbols-66.pb +146 -347
- package/.scannerwork/scanner-report/symbols-69.pb +610 -19
- package/.scannerwork/scanner-report/symbols-7.pb +27 -0
- package/.scannerwork/scanner-report/syntax-highlightings-19.pb +142 -19
- package/.scannerwork/scanner-report/syntax-highlightings-20.pb +27 -74
- package/.scannerwork/scanner-report/syntax-highlightings-21.pb +619 -28
- package/.scannerwork/scanner-report/syntax-highlightings-22.pb +118 -183
- package/.scannerwork/scanner-report/syntax-highlightings-23.pb +74 -14
- package/.scannerwork/scanner-report/syntax-highlightings-24.pb +854 -21
- package/.scannerwork/scanner-report/syntax-highlightings-25.pb +15 -194
- package/.scannerwork/scanner-report/syntax-highlightings-26.pb +43 -56
- package/.scannerwork/scanner-report/syntax-highlightings-27.pb +23 -27
- package/.scannerwork/scanner-report/syntax-highlightings-28.pb +100 -71
- package/.scannerwork/scanner-report/syntax-highlightings-29.pb +587 -91
- package/.scannerwork/scanner-report/syntax-highlightings-30.pb +21 -77
- package/.scannerwork/scanner-report/syntax-highlightings-31.pb +64 -846
- package/.scannerwork/scanner-report/syntax-highlightings-32.pb +187 -118
- package/.scannerwork/scanner-report/syntax-highlightings-33.pb +189 -14
- package/.scannerwork/scanner-report/syntax-highlightings-34.pb +58 -294
- package/.scannerwork/scanner-report/syntax-highlightings-35.pb +156 -103
- package/.scannerwork/scanner-report/syntax-highlightings-36.pb +331 -0
- package/.scannerwork/scanner-report/syntax-highlightings-37.pb +127 -3737
- package/.scannerwork/scanner-report/syntax-highlightings-38.pb +21 -22
- package/.scannerwork/scanner-report/syntax-highlightings-4.pb +14 -594
- package/.scannerwork/scanner-report/syntax-highlightings-40.pb +100 -98
- package/.scannerwork/scanner-report/syntax-highlightings-41.pb +45 -0
- package/.scannerwork/scanner-report/syntax-highlightings-44.pb +243 -0
- package/.scannerwork/scanner-report/syntax-highlightings-46.pb +54 -0
- package/.scannerwork/scanner-report/syntax-highlightings-47.pb +50 -0
- package/.scannerwork/scanner-report/syntax-highlightings-49.pb +98 -183
- package/.scannerwork/scanner-report/syntax-highlightings-5.pb +294 -147
- package/.scannerwork/scanner-report/syntax-highlightings-50.pb +224 -164
- package/.scannerwork/scanner-report/syntax-highlightings-51.pb +84 -3738
- package/.scannerwork/scanner-report/syntax-highlightings-52.pb +133 -0
- package/.scannerwork/scanner-report/syntax-highlightings-53.pb +29 -178
- package/.scannerwork/scanner-report/syntax-highlightings-54.pb +178 -29
- package/.scannerwork/scanner-report/syntax-highlightings-55.pb +3712 -209
- package/.scannerwork/scanner-report/syntax-highlightings-57.pb +84 -31
- package/.scannerwork/scanner-report/syntax-highlightings-58.pb +63 -35
- package/.scannerwork/scanner-report/syntax-highlightings-59.pb +3736 -122
- package/.scannerwork/scanner-report/syntax-highlightings-6.pb +66 -615
- package/.scannerwork/scanner-report/syntax-highlightings-61.pb +3737 -84
- package/.scannerwork/scanner-report/syntax-highlightings-65.pb +195 -15
- package/.scannerwork/scanner-report/syntax-highlightings-66.pb +155 -226
- package/.scannerwork/scanner-report/syntax-highlightings-69.pb +624 -58
- package/.scannerwork/scanner-report/syntax-highlightings-7.pb +68 -0
- package/CHANGES.md +3 -0
- package/package.json +1 -1
- package/test-14-results.xml +165 -165
- package/test-16-results.xml +153 -153
- package/test-18-results.xml +146 -146
- package/test-19-results.xml +153 -153
- package/test-iam-18-results.xml +50 -50
- package/.scannerwork/scanner-report/changesets-18.pb +0 -1
- package/.scannerwork/scanner-report/changesets-2.pb +0 -1
- package/.scannerwork/scanner-report/changesets-3.pb +0 -1
- package/.scannerwork/scanner-report/changesets-55.pb +0 -1
- package/.scannerwork/scanner-report/changesets-56.pb +0 -1
- package/.scannerwork/scanner-report/changesets-59.pb +0 -1
- package/.scannerwork/scanner-report/changesets-60.pb +0 -1
- package/.scannerwork/scanner-report/changesets-61.pb +0 -1
- package/.scannerwork/scanner-report/changesets-62.pb +0 -1
- package/.scannerwork/scanner-report/changesets-63.pb +0 -1
- package/.scannerwork/scanner-report/changesets-64.pb +0 -1
- package/.scannerwork/scanner-report/changesets-68.pb +0 -1
- package/.scannerwork/scanner-report/changesets-70.pb +0 -1
- package/.scannerwork/scanner-report/component-18.pb +0 -1
- package/.scannerwork/scanner-report/component-2.pb +0 -1
- package/.scannerwork/scanner-report/component-3.pb +0 -1
- package/.scannerwork/scanner-report/component-56.pb +0 -1
- package/.scannerwork/scanner-report/component-60.pb +0 -1
- package/.scannerwork/scanner-report/component-62.pb +0 -1
- package/.scannerwork/scanner-report/component-63.pb +0 -1
- package/.scannerwork/scanner-report/component-64.pb +0 -1
- package/.scannerwork/scanner-report/component-67.pb +0 -1
- package/.scannerwork/scanner-report/component-68.pb +0 -1
- package/.scannerwork/scanner-report/component-70.pb +0 -1
- package/.scannerwork/scanner-report/coverages-18.pb +0 -0
- package/.scannerwork/scanner-report/coverages-2.pb +0 -0
- package/.scannerwork/scanner-report/coverages-3.pb +0 -0
- package/.scannerwork/scanner-report/coverages-56.pb +0 -0
- package/.scannerwork/scanner-report/coverages-68.pb +0 -0
- package/.scannerwork/scanner-report/coverages-70.pb +0 -0
- package/.scannerwork/scanner-report/duplications-25.pb +0 -2
- package/.scannerwork/scanner-report/duplications-3.pb +0 -3
- package/.scannerwork/scanner-report/duplications-60.pb +0 -2
- package/.scannerwork/scanner-report/duplications-62.pb +0 -2
- package/.scannerwork/scanner-report/issues-4.pb +0 -6
- package/.scannerwork/scanner-report/measures-18.pb +0 -0
- package/.scannerwork/scanner-report/measures-2.pb +0 -0
- package/.scannerwork/scanner-report/measures-3.pb +0 -0
- package/.scannerwork/scanner-report/measures-56.pb +0 -0
- package/.scannerwork/scanner-report/measures-67.pb +0 -0
- package/.scannerwork/scanner-report/measures-68.pb +0 -0
- package/.scannerwork/scanner-report/measures-70.pb +0 -0
- package/.scannerwork/scanner-report/source-18.txt +0 -63
- package/.scannerwork/scanner-report/source-2.txt +0 -147
- package/.scannerwork/scanner-report/source-3.txt +0 -244
- package/.scannerwork/scanner-report/source-56.txt +0 -129
- package/.scannerwork/scanner-report/source-67.txt +0 -509
- package/.scannerwork/scanner-report/source-68.txt +0 -77
- package/.scannerwork/scanner-report/source-70.txt +0 -418
- package/.scannerwork/scanner-report/symbols-18.pb +0 -43
- package/.scannerwork/scanner-report/symbols-2.pb +0 -85
- package/.scannerwork/scanner-report/symbols-3.pb +0 -394
- package/.scannerwork/scanner-report/symbols-56.pb +0 -33
- package/.scannerwork/scanner-report/symbols-68.pb +0 -30
- package/.scannerwork/scanner-report/symbols-70.pb +0 -610
- package/.scannerwork/scanner-report/syntax-highlightings-18.pb +0 -82
- package/.scannerwork/scanner-report/syntax-highlightings-2.pb +0 -191
- package/.scannerwork/scanner-report/syntax-highlightings-3.pb +0 -329
- package/.scannerwork/scanner-report/syntax-highlightings-56.pb +0 -129
- package/.scannerwork/scanner-report/syntax-highlightings-67.pb +0 -3747
- package/.scannerwork/scanner-report/syntax-highlightings-68.pb +0 -103
- package/.scannerwork/scanner-report/syntax-highlightings-70.pb +0 -648
- /package/.scannerwork/scanner-report/{coverages-63.pb → coverages-42.pb} +0 -0
- /package/.scannerwork/scanner-report/{coverages-60.pb → coverages-43.pb} +0 -0
- /package/.scannerwork/scanner-report/{coverages-55.pb → coverages-44.pb} +0 -0
- /package/.scannerwork/scanner-report/{coverages-62.pb → coverages-45.pb} +0 -0
- /package/.scannerwork/scanner-report/{coverages-64.pb → coverages-48.pb} +0 -0
- /package/.scannerwork/scanner-report/{coverages-61.pb → coverages-51.pb} +0 -0
- /package/.scannerwork/scanner-report/{coverages-59.pb → coverages-52.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-18.pb → duplications-33.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-2.pb → duplications-37.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-55.pb → duplications-41.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-56.pb → duplications-42.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-59.pb → duplications-44.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-61.pb → duplications-46.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-63.pb → duplications-47.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-64.pb → duplications-48.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-68.pb → duplications-51.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-70.pb → duplications-52.pb} +0 -0
- /package/.scannerwork/scanner-report/{issues-3.pb → issues-5.pb} +0 -0
- /package/.scannerwork/scanner-report/{issues-21.pb → issues-7.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-63.pb → measures-42.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-60.pb → measures-43.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-62.pb → measures-45.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-64.pb → measures-48.pb} +0 -0
- /package/.scannerwork/scanner-report/{source-63.txt → source-42.txt} +0 -0
- /package/.scannerwork/scanner-report/{source-60.txt → source-43.txt} +0 -0
- /package/.scannerwork/scanner-report/{source-62.txt → source-45.txt} +0 -0
- /package/.scannerwork/scanner-report/{source-64.txt → source-48.txt} +0 -0
- /package/.scannerwork/scanner-report/{symbols-63.pb → symbols-42.pb} +0 -0
- /package/.scannerwork/scanner-report/{symbols-60.pb → symbols-43.pb} +0 -0
- /package/.scannerwork/scanner-report/{symbols-55.pb → symbols-44.pb} +0 -0
- /package/.scannerwork/scanner-report/{symbols-62.pb → symbols-45.pb} +0 -0
- /package/.scannerwork/scanner-report/{symbols-64.pb → symbols-48.pb} +0 -0
- /package/.scannerwork/scanner-report/{symbols-61.pb → symbols-51.pb} +0 -0
- /package/.scannerwork/scanner-report/{symbols-59.pb → symbols-52.pb} +0 -0
- /package/.scannerwork/scanner-report/{syntax-highlightings-63.pb → syntax-highlightings-42.pb} +0 -0
- /package/.scannerwork/scanner-report/{syntax-highlightings-60.pb → syntax-highlightings-43.pb} +0 -0
- /package/.scannerwork/scanner-report/{syntax-highlightings-62.pb → syntax-highlightings-45.pb} +0 -0
- /package/.scannerwork/scanner-report/{syntax-highlightings-64.pb → syntax-highlightings-48.pb} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Copyright ©
|
|
1
|
+
// Copyright © 2023 IBM Corp. All rights reserved.
|
|
2
2
|
//
|
|
3
3
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
4
|
// you may not use this file except in compliance with the License.
|
|
@@ -12,614 +12,89 @@
|
|
|
12
12
|
// See the License for the specific language governing permissions and
|
|
13
13
|
// limitations under the License.
|
|
14
14
|
|
|
15
|
-
/* global */
|
|
16
15
|
'use strict';
|
|
17
16
|
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
-
const fs = require('fs');
|
|
24
|
-
const zlib = require('zlib');
|
|
25
|
-
const Tail = require('tail').Tail;
|
|
26
|
-
const compare = require('./compare.js');
|
|
27
|
-
const request = require('../includes/request.js');
|
|
17
|
+
const chunk = require('lodash/chunk');
|
|
18
|
+
const difference = require('lodash/difference');
|
|
19
|
+
const forOwn = require('lodash/forOwn');
|
|
20
|
+
const isEmpty = require('lodash/isEmpty');
|
|
21
|
+
const union = require('lodash/union');
|
|
28
22
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
23
|
+
const compare = async(database1, database2, client) => {
|
|
24
|
+
// check docs same in both dbs
|
|
25
|
+
const allDocs1 = await getAllDocs(client, database1);
|
|
26
|
+
const allDocs2 = await getAllDocs(client, database2);
|
|
32
27
|
|
|
33
|
-
|
|
34
|
-
const
|
|
35
|
-
for (let i = 0; i < arguments.length; i++) {
|
|
36
|
-
Object.assign(p, arguments[i]);
|
|
37
|
-
}
|
|
38
|
-
return p;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// Returns the event emitter for API calls, or the child process for CLI calls
|
|
42
|
-
function testBackup(params, databaseName, outputStream, callback) {
|
|
43
|
-
let gzip;
|
|
44
|
-
let openssl;
|
|
45
|
-
let backup;
|
|
46
|
-
let backupStream = outputStream;
|
|
47
|
-
|
|
48
|
-
// Configure API key if needed
|
|
49
|
-
augmentParamsWithApiKey(params);
|
|
50
|
-
|
|
51
|
-
// Pipe via compression if requested
|
|
52
|
-
if (params.compression) {
|
|
53
|
-
if (params.useApi) {
|
|
54
|
-
// If use API use the Node zlib stream
|
|
55
|
-
const zlib = require('zlib');
|
|
56
|
-
backupStream = zlib.createGzip();
|
|
57
|
-
backupStream.pipe(outputStream);
|
|
58
|
-
} else {
|
|
59
|
-
// Spawn process for gzip
|
|
60
|
-
gzip = spawn('gzip', [], { stdio: ['pipe', 'pipe', 'inherit'] });
|
|
61
|
-
// Pipe the streams as needed
|
|
62
|
-
gzip.stdout.pipe(outputStream);
|
|
63
|
-
backupStream = gzip.stdin;
|
|
64
|
-
// register an error handler
|
|
65
|
-
gzip.on('error', function(err) {
|
|
66
|
-
callback(err);
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// Pipe via encryption if requested
|
|
72
|
-
if (params.encryption) {
|
|
73
|
-
if (params.useApi) {
|
|
74
|
-
// Currently only CLI support for testing encryption
|
|
75
|
-
callback(new Error('Not implemented: cannot test encrypted API backups at this time.'));
|
|
76
|
-
} else {
|
|
77
|
-
// Spawn process for openssl
|
|
78
|
-
openssl = spawn('openssl', ['aes-128-cbc', '-pass', 'pass:12345'], { stdio: ['pipe', 'pipe', 'inherit'] });
|
|
79
|
-
// Pipe the streams as needed
|
|
80
|
-
openssl.stdout.pipe(outputStream);
|
|
81
|
-
backupStream = openssl.stdin;
|
|
82
|
-
// register an error handler
|
|
83
|
-
openssl.on('error', function(err) {
|
|
84
|
-
callback(err);
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
}
|
|
28
|
+
const onlyInDb1 = (difference(allDocs1, allDocs2));
|
|
29
|
+
const onlyInDb2 = (difference(allDocs2, allDocs1));
|
|
88
30
|
|
|
89
|
-
let
|
|
90
|
-
if (params.abort) {
|
|
91
|
-
// Create the log file for abort tests so we can tail it, other tests assert
|
|
92
|
-
// the log file is usually created normally by the backup process.
|
|
93
|
-
const f = fs.openSync(params.opts.log, 'w');
|
|
94
|
-
fs.closeSync(f);
|
|
31
|
+
let databasesSame = isEmpty(onlyInDb1) && isEmpty(onlyInDb2);
|
|
95
32
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
// Turn off the tail.
|
|
102
|
-
tail.unwatch();
|
|
103
|
-
// Abort the backup
|
|
104
|
-
backupAbort(params.useApi, backup);
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
tail.on('error', function(err) {
|
|
108
|
-
callback(err);
|
|
109
|
-
});
|
|
33
|
+
if (!databasesSame) {
|
|
34
|
+
console.log(onlyInDb1.length + ' documents only in db 1.');
|
|
35
|
+
console.log('Document IDs only in db 1: ' + onlyInDb1);
|
|
36
|
+
console.log(onlyInDb2.length + ' documents only in db 2.');
|
|
37
|
+
console.log('Document IDs only in db 2: ' + onlyInDb2);
|
|
110
38
|
}
|
|
111
39
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
if (params.expectedBackupError) {
|
|
116
|
-
try {
|
|
117
|
-
assert.strictEqual(err.name, params.expectedBackupError.name, 'The backup should receive the expected error.');
|
|
118
|
-
// Got the expected error, so wipe it for the callback
|
|
119
|
-
err = null;
|
|
120
|
-
} catch (caught) {
|
|
121
|
-
// Update the error with the assertion failure
|
|
122
|
-
err = caught;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
} else {
|
|
126
|
-
console.log(data);
|
|
127
|
-
}
|
|
128
|
-
callback(err);
|
|
129
|
-
});
|
|
130
|
-
if (backup) {
|
|
131
|
-
backup.on('error', function(err) {
|
|
132
|
-
console.error(`Caught non-fatal error: ${err}`);
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
} else {
|
|
136
|
-
// Default to pipe, but will use 'inherit' if using --output (see params.opts.output)
|
|
137
|
-
let destination = 'pipe';
|
|
138
|
-
|
|
139
|
-
// Set up default args
|
|
140
|
-
const args = ['./bin/couchbackup.bin.js', '--db', databaseName];
|
|
141
|
-
if (params.opts) {
|
|
142
|
-
if (params.opts.mode) {
|
|
143
|
-
args.push('--mode');
|
|
144
|
-
args.push(params.opts.mode);
|
|
145
|
-
}
|
|
146
|
-
if (params.opts.output) {
|
|
147
|
-
args.push('--output');
|
|
148
|
-
args.push(params.opts.output);
|
|
149
|
-
destination = 'inherit';
|
|
150
|
-
}
|
|
151
|
-
if (params.opts.log) {
|
|
152
|
-
args.push('--log');
|
|
153
|
-
args.push(params.opts.log);
|
|
154
|
-
}
|
|
155
|
-
if (params.opts.resume) {
|
|
156
|
-
args.push('--resume');
|
|
157
|
-
args.push(params.opts.resume);
|
|
158
|
-
}
|
|
159
|
-
if (params.opts.bufferSize) {
|
|
160
|
-
args.push('--buffer-size');
|
|
161
|
-
args.push(params.opts.bufferSize);
|
|
162
|
-
}
|
|
163
|
-
if (params.opts.iamApiKey) {
|
|
164
|
-
args.push('--iam-api-key');
|
|
165
|
-
args.push(params.opts.iamApiKey);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
let count = 0;
|
|
170
|
-
/**
|
|
171
|
-
* In some tests we need to wait for both the backup process
|
|
172
|
-
* and the outputStream to "close". If we callback from either
|
|
173
|
-
* event the other might not be ready and lead to flaky tests.
|
|
174
|
-
*
|
|
175
|
-
* This function delegates to the callback but only after the
|
|
176
|
-
* correct number of invocations. That is 2 when we have an
|
|
177
|
-
* output stream or 1 otherwise, and only once in the case of
|
|
178
|
-
* an error.
|
|
179
|
-
*/
|
|
180
|
-
function gatingCallback(err) {
|
|
181
|
-
count += 1;
|
|
182
|
-
if (err) {
|
|
183
|
-
if (count === 1) {
|
|
184
|
-
callback(err);
|
|
185
|
-
}
|
|
186
|
-
} else {
|
|
187
|
-
// Output stream case we want a callback from process
|
|
188
|
-
// and the stream.
|
|
189
|
-
if (outputStream && count === 2) {
|
|
190
|
-
callback();
|
|
191
|
-
} else if (!outputStream && count === 1) {
|
|
192
|
-
callback();
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
40
|
+
// check revs same in docs common to both dbs
|
|
41
|
+
const partitionSize = 500;
|
|
42
|
+
const batches = chunk(union(allDocs1, allDocs2), partitionSize);
|
|
196
43
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
.on('error', function(err) {
|
|
200
|
-
gatingCallback(err);
|
|
201
|
-
})
|
|
202
|
-
.on('close', function(code, signal) {
|
|
203
|
-
console.log(`Backup process close ${code} ${signal}`);
|
|
204
|
-
try {
|
|
205
|
-
if (params.abort) {
|
|
206
|
-
// The tail should be stopped when we match a line and abort, but if
|
|
207
|
-
// something didn't work we need to make sure the tail is stopped
|
|
208
|
-
tail.unwatch();
|
|
209
|
-
// Assert that the process was aborted as expected
|
|
210
|
-
assert.strictEqual(signal, 'SIGTERM', `The backup should have terminated with SIGTERM, but was ${signal}.`);
|
|
211
|
-
} else if (params.expectedBackupError) {
|
|
212
|
-
assert.strictEqual(code, params.expectedBackupError.code, `The backup exited with unexpected code ${code}.`);
|
|
213
|
-
} else {
|
|
214
|
-
assert.strictEqual(code, 0, `The backup should exit normally, got exit code ${code} and signal ${signal}.`);
|
|
215
|
-
}
|
|
216
|
-
gatingCallback();
|
|
217
|
-
} catch (err) {
|
|
218
|
-
gatingCallback(err);
|
|
219
|
-
}
|
|
220
|
-
});
|
|
221
|
-
// Pipe the stdout to the supplied outputStream
|
|
222
|
-
if (destination === 'pipe') {
|
|
223
|
-
backup.stdout.pipe(backupStream);
|
|
224
|
-
}
|
|
44
|
+
const missingRevsInDb2 = await getMissingRevs(client, database1, database2, batches);
|
|
45
|
+
const missingRevsInDb1 = await getMissingRevs(client, database2, database1, batches);
|
|
225
46
|
|
|
226
|
-
|
|
227
|
-
// to access this stream directly as well)
|
|
228
|
-
backup.stderr.on('data', function(data) {
|
|
229
|
-
console.error(`${data}`);
|
|
230
|
-
});
|
|
47
|
+
databasesSame = databasesSame && isEmpty(missingRevsInDb1) && isEmpty(missingRevsInDb2);
|
|
231
48
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
try {
|
|
236
|
-
assert.strictEqual(code, 0, `The compression should exit normally, got exit code ${code}.`);
|
|
237
|
-
} catch (err) {
|
|
238
|
-
gatingCallback(err);
|
|
239
|
-
}
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
if (openssl) {
|
|
243
|
-
openssl.on('close', function(code) {
|
|
244
|
-
try {
|
|
245
|
-
assert.strictEqual(code, 0, `The encryption should exit normally, got exit code ${code}.`);
|
|
246
|
-
} catch (err) {
|
|
247
|
-
gatingCallback(err);
|
|
248
|
-
}
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
if (outputStream) {
|
|
252
|
-
// Callback when the destination stream closes.
|
|
253
|
-
outputStream.on('close', gatingCallback);
|
|
254
|
-
} else if (!params.opts.output) {
|
|
255
|
-
gatingCallback(new Error('Unexpected test without outputStream or output option.'));
|
|
256
|
-
}
|
|
49
|
+
if (!databasesSame) {
|
|
50
|
+
console.log('Missing revs in db 1:' + JSON.stringify(missingRevsInDb1));
|
|
51
|
+
console.log('Missing revs in db 2:' + JSON.stringify(missingRevsInDb2));
|
|
257
52
|
}
|
|
258
|
-
return backup;
|
|
259
|
-
}
|
|
260
53
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
if (usingApi) {
|
|
264
|
-
// Currently no way to abort an API backup
|
|
265
|
-
console.error('UNSUPPORTED: cannot abort API backups at this time.');
|
|
266
|
-
} else {
|
|
267
|
-
backup.kill();
|
|
268
|
-
}
|
|
269
|
-
});
|
|
270
|
-
}
|
|
54
|
+
return databasesSame;
|
|
55
|
+
};
|
|
271
56
|
|
|
272
|
-
|
|
273
|
-
|
|
57
|
+
const getMissingRevs = async(client, databaseName1, databaseName2, batcheses) => {
|
|
58
|
+
const fakeRevisionId = '9999-a';
|
|
274
59
|
|
|
275
|
-
|
|
276
|
-
augmentParamsWithApiKey(params);
|
|
60
|
+
const missing = {};
|
|
277
61
|
|
|
278
|
-
//
|
|
279
|
-
if (params.compression) {
|
|
280
|
-
if (params.useApi) {
|
|
281
|
-
// If use API use the Node zlib stream
|
|
282
|
-
restoreStream = zlib.createGunzip();
|
|
283
|
-
inputStream.pipe(restoreStream);
|
|
284
|
-
} else {
|
|
285
|
-
// Spawn process for gunzip
|
|
286
|
-
const gunzip = spawn('gunzip', [], { stdio: ['pipe', 'pipe', 'inherit'] });
|
|
287
|
-
// Pipe the streams as needed
|
|
288
|
-
inputStream.pipe(gunzip.stdin);
|
|
289
|
-
restoreStream = gunzip.stdout;
|
|
290
|
-
}
|
|
291
|
-
}
|
|
62
|
+
// look in db1 - use a fake revision ID to fetch all leaf revisions
|
|
292
63
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
callback(new Error('Not implemented: cannot test encrypted API backups at this time.'));
|
|
297
|
-
} else {
|
|
298
|
-
// Spawn process for openssl
|
|
299
|
-
const dopenssl = spawn('openssl', ['aes-128-cbc', '-d', '-pass', 'pass:12345'], { stdio: ['pipe', 'pipe', 'inherit'] });
|
|
300
|
-
// Pipe the streams as needed
|
|
301
|
-
inputStream.pipe(dopenssl.stdin);
|
|
302
|
-
restoreStream = dopenssl.stdout;
|
|
303
|
-
}
|
|
304
|
-
}
|
|
64
|
+
for (const batches of batcheses) {
|
|
65
|
+
const documentRevisions = {};
|
|
66
|
+
batches.forEach(id => (documentRevisions[id] = [fakeRevisionId]));
|
|
305
67
|
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
err = caught;
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
} else {
|
|
318
|
-
console.log(data);
|
|
68
|
+
const result1 = await client.postRevsDiff({ db: databaseName1, documentRevisions });
|
|
69
|
+
const revsDiffRequestDb2 = {};
|
|
70
|
+
forOwn(result1.result, (v, k) => (revsDiffRequestDb2[k] = v.possible_ancestors));
|
|
71
|
+
// look in db2
|
|
72
|
+
const result2 = await client.postRevsDiff({ db: databaseName2, documentRevisions: revsDiffRequestDb2 });
|
|
73
|
+
forOwn(result2.result, (v, k) => {
|
|
74
|
+
if ('missing' in v) {
|
|
75
|
+
missing[k] = v.missing;
|
|
319
76
|
}
|
|
320
|
-
callback(err);
|
|
321
|
-
}).on('error', function(err) {
|
|
322
|
-
console.error(`Caught non-fatal error: ${err}`);
|
|
323
77
|
});
|
|
324
|
-
} else {
|
|
325
|
-
// Set up default args
|
|
326
|
-
const args = ['./bin/couchrestore.bin.js', '--db', databaseName];
|
|
327
|
-
if (params.opts) {
|
|
328
|
-
if (params.opts.bufferSize) {
|
|
329
|
-
args.push('--buffer-size');
|
|
330
|
-
args.push(params.opts.bufferSize);
|
|
331
|
-
}
|
|
332
|
-
if (params.opts.parallelism) {
|
|
333
|
-
args.push('--parallelism');
|
|
334
|
-
args.push(params.opts.parallelism);
|
|
335
|
-
}
|
|
336
|
-
if (params.opts.requestTimeout) {
|
|
337
|
-
args.push('--request-timeout');
|
|
338
|
-
args.push(params.opts.requestTimeout);
|
|
339
|
-
}
|
|
340
|
-
if (params.opts.iamApiKey) {
|
|
341
|
-
args.push('--iam-api-key');
|
|
342
|
-
args.push(params.opts.iamApiKey);
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
// Note use spawn not fork for stdio options not supported with fork in Node 4.x
|
|
347
|
-
const restore = spawn('node', args, { stdio: ['pipe', 'inherit', 'inherit'] });
|
|
348
|
-
// Pipe to write the readable inputStream into stdin
|
|
349
|
-
restoreStream.pipe(restore.stdin);
|
|
350
|
-
restore.stdin.on('error', function(err) {
|
|
351
|
-
// Suppress errors that might arise from piping of input streams
|
|
352
|
-
// from the test process to the child process (this appears to be handled
|
|
353
|
-
// gracefully in the shell)
|
|
354
|
-
console.error(`Test stream error code ${err.code}`);
|
|
355
|
-
});
|
|
356
|
-
restore.on('close', function(code) {
|
|
357
|
-
try {
|
|
358
|
-
if (params.expectedRestoreError) {
|
|
359
|
-
assert.strictEqual(code, params.expectedRestoreError.code, `The backup exited with unexpected code ${code}.`);
|
|
360
|
-
} else {
|
|
361
|
-
assert.strictEqual(code, 0, `The restore should exit normally, got exit code ${code}`);
|
|
362
|
-
}
|
|
363
|
-
callback();
|
|
364
|
-
} catch (err) {
|
|
365
|
-
callback(err);
|
|
366
|
-
}
|
|
367
|
-
});
|
|
368
|
-
restore.on('error', function(err) {
|
|
369
|
-
callback(err);
|
|
370
|
-
});
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
// Serial backup and restore via a file on disk
|
|
375
|
-
function testBackupAndRestoreViaFile(params, srcDb, backupFile, targetDb, callback) {
|
|
376
|
-
testBackupToFile(params, srcDb, backupFile, function(err) {
|
|
377
|
-
if (err) {
|
|
378
|
-
callback(err);
|
|
379
|
-
} else {
|
|
380
|
-
testRestoreFromFile(params, backupFile, targetDb, function(err) {
|
|
381
|
-
if (!err) {
|
|
382
|
-
dbCompare(srcDb, targetDb, callback);
|
|
383
|
-
} else {
|
|
384
|
-
callback(err);
|
|
385
|
-
}
|
|
386
|
-
});
|
|
387
|
-
}
|
|
388
|
-
});
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
function testBackupToFile(params, srcDb, backupFile, callback, processCallback) {
|
|
392
|
-
// Open the file for appending if this is a resume
|
|
393
|
-
const output = fs.createWriteStream(backupFile, { flags: (params.opts && params.opts.resume) ? 'a' : 'w' });
|
|
394
|
-
output.on('open', function() {
|
|
395
|
-
const backupProcess = testBackup(params, srcDb, output, function(err) {
|
|
396
|
-
if (err) {
|
|
397
|
-
callback(err);
|
|
398
|
-
} else {
|
|
399
|
-
callback();
|
|
400
|
-
}
|
|
401
|
-
});
|
|
402
|
-
if (processCallback) {
|
|
403
|
-
processCallback(backupProcess);
|
|
404
|
-
}
|
|
405
|
-
});
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
function testRestoreFromFile(params, backupFile, targetDb, callback) {
|
|
409
|
-
const input = fs.createReadStream(backupFile);
|
|
410
|
-
input.on('open', function() {
|
|
411
|
-
testRestore(params, input, targetDb, function(err) {
|
|
412
|
-
if (err) {
|
|
413
|
-
callback(err);
|
|
414
|
-
} else {
|
|
415
|
-
callback();
|
|
416
|
-
}
|
|
417
|
-
});
|
|
418
|
-
});
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
function testDirectBackupAndRestore(params, srcDb, targetDb, callback) {
|
|
422
|
-
// Allow a 64 MB highWaterMark for the passthrough during testing
|
|
423
|
-
const passthrough = new stream.PassThrough({ highWaterMark: 67108864 });
|
|
424
|
-
testBackupAndRestore(params, srcDb, passthrough, passthrough, targetDb, callback);
|
|
425
|
-
}
|
|
426
|
-
|
|
427
|
-
function testBackupAndRestore(params, srcDb, backupStream, restoreStream, targetDb, callback) {
|
|
428
|
-
testBackup(params, srcDb, backupStream, function(err) {
|
|
429
|
-
if (err) {
|
|
430
|
-
callback(err);
|
|
431
|
-
}
|
|
432
|
-
});
|
|
433
|
-
testRestore(params, restoreStream, targetDb, function(err) {
|
|
434
|
-
if (err) {
|
|
435
|
-
callback(err);
|
|
436
|
-
} else {
|
|
437
|
-
dbCompare(srcDb, targetDb, callback);
|
|
438
|
-
}
|
|
439
|
-
});
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
function assertResumedBackup(params, resumedBackup, restoreCallback) {
|
|
443
|
-
// Validate that the resume backup didn't need to write all the docs
|
|
444
|
-
if (params.useApi) {
|
|
445
|
-
resumedBackup.once('finished', function(summary) {
|
|
446
|
-
assertWrittenFewerThan(summary.total, params.exclusiveMaxExpected, restoreCallback);
|
|
447
|
-
});
|
|
448
|
-
} else {
|
|
449
|
-
// For the CLI case we need to see the output because we don't have
|
|
450
|
-
// the finished event.
|
|
451
|
-
const listener = function(data) {
|
|
452
|
-
const matches = data.toString().match(/.*Finished - Total document revisions written: (\d+).*/);
|
|
453
|
-
if (matches !== null) {
|
|
454
|
-
assertWrittenFewerThan(matches[1], params.exclusiveMaxExpected, restoreCallback);
|
|
455
|
-
resumedBackup.stderr.removeListener('data', listener);
|
|
456
|
-
}
|
|
457
|
-
};
|
|
458
|
-
resumedBackup.stderr.on('data', listener);
|
|
459
78
|
}
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
function testBackupAbortResumeRestore(params, srcDb, backupFile, targetDb, callback) {
|
|
463
|
-
const restore = function(err) {
|
|
464
|
-
if (err) {
|
|
465
|
-
callback(err);
|
|
466
|
-
} else {
|
|
467
|
-
testRestoreFromFile(params, backupFile, targetDb, function(err) {
|
|
468
|
-
if (err) {
|
|
469
|
-
callback(err);
|
|
470
|
-
} else {
|
|
471
|
-
dbCompare(srcDb, targetDb, callback);
|
|
472
|
-
}
|
|
473
|
-
});
|
|
474
|
-
}
|
|
475
|
-
};
|
|
476
|
-
|
|
477
|
-
const resume = function(err) {
|
|
478
|
-
if (err) {
|
|
479
|
-
callback(err);
|
|
480
|
-
}
|
|
481
|
-
// Remove the abort parameter and add the resume parameter
|
|
482
|
-
delete params.abort;
|
|
483
|
-
params.opts.resume = true;
|
|
79
|
+
return missing;
|
|
80
|
+
};
|
|
484
81
|
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
82
|
+
const getAllDocs = async(client, database) => {
|
|
83
|
+
let allDocIds = [];
|
|
84
|
+
const limit = 2000;
|
|
85
|
+
let startKey = '\u0000';
|
|
86
|
+
do {
|
|
87
|
+
const pageOfDocIds = (await client.postAllDocs({ db: database, startKey, limit })).result.rows.map(r => r.id);
|
|
88
|
+
allDocIds = allDocIds.concat(pageOfDocIds);
|
|
89
|
+
if (pageOfDocIds.length < limit) {
|
|
90
|
+
startKey = null;
|
|
493
91
|
} else {
|
|
494
|
-
|
|
495
|
-
if (err) {
|
|
496
|
-
callback(err);
|
|
497
|
-
}
|
|
498
|
-
},
|
|
499
|
-
function(backupProcess) {
|
|
500
|
-
assertResumedBackup(params, backupProcess, restore);
|
|
501
|
-
});
|
|
92
|
+
startKey = pageOfDocIds[limit - 1] + '\u0000';
|
|
502
93
|
}
|
|
503
|
-
};
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
testBackup(params, srcDb, null, resume);
|
|
507
|
-
} else {
|
|
508
|
-
testBackupToFile(params, srcDb, backupFile, resume);
|
|
509
|
-
}
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
function dbCompare(db1Name, db2Name, callback) {
|
|
513
|
-
const client = request.client(process.env.COUCH_BACKEND_URL, {});
|
|
514
|
-
compare.compare(db1Name, db2Name, client.service)
|
|
515
|
-
.then(result => {
|
|
516
|
-
try {
|
|
517
|
-
assert.strictEqual(result, true, 'The database comparison should succeed, but failed');
|
|
518
|
-
callback();
|
|
519
|
-
} catch (err) {
|
|
520
|
-
callback(err);
|
|
521
|
-
}
|
|
522
|
-
})
|
|
523
|
-
.catch(err => callback(err));
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
function sortByIdThenRev(o1, o2) {
|
|
527
|
-
if (o1._id < o2._id) return -1;
|
|
528
|
-
if (o1._id > o2._id) return 1;
|
|
529
|
-
if (o1._rev < o2._rev) return -1;
|
|
530
|
-
if (o1._rev > o2._rev) return 1;
|
|
531
|
-
return 0;
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
function readSortAndDeepEqual(actualContentPath, expectedContentPath, callback) {
|
|
535
|
-
const backupContent = JSON.parse(fs.readFileSync(actualContentPath, 'utf8'));
|
|
536
|
-
const expectedContent = JSON.parse(fs.readFileSync(expectedContentPath, 'utf8'));
|
|
537
|
-
// Array order of the docs is important for equality, but not for backup
|
|
538
|
-
backupContent.sort(sortByIdThenRev);
|
|
539
|
-
expectedContent.sort(sortByIdThenRev);
|
|
540
|
-
// Assert that the backup matches the expected
|
|
541
|
-
try {
|
|
542
|
-
assert.deepStrictEqual(backupContent, expectedContent);
|
|
543
|
-
callback();
|
|
544
|
-
} catch (err) {
|
|
545
|
-
callback(err);
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
|
|
549
|
-
function setTimeout(context, timeout) {
|
|
550
|
-
// Increase timeout using TEST_TIMEOUT_MULTIPLIER
|
|
551
|
-
const multiplier = (typeof process.env.TEST_TIMEOUT_MULTIPLIER !== 'undefined') ? parseInt(process.env.TEST_TIMEOUT_MULTIPLIER) : 1;
|
|
552
|
-
timeout *= multiplier;
|
|
553
|
-
// Set the mocha timeout
|
|
554
|
-
context.timeout(timeout * 1000);
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
function assertGzipFile(path, callback) {
|
|
558
|
-
try {
|
|
559
|
-
// 1f 8b is the gzip magic number
|
|
560
|
-
const expectedBytes = Buffer.from([0x1f, 0x8b]);
|
|
561
|
-
const buffer = Buffer.alloc(2);
|
|
562
|
-
const fd = fs.openSync(path, 'r');
|
|
563
|
-
// Read the first two bytes
|
|
564
|
-
fs.readSync(fd, buffer, 0, 2, 0);
|
|
565
|
-
fs.closeSync(fd);
|
|
566
|
-
// Assert the magic number corresponds to gz extension
|
|
567
|
-
assert.deepStrictEqual(buffer, expectedBytes, 'The backup file should be gz compressed.');
|
|
568
|
-
callback();
|
|
569
|
-
} catch (err) {
|
|
570
|
-
callback(err);
|
|
571
|
-
}
|
|
572
|
-
}
|
|
573
|
-
|
|
574
|
-
function assertEncryptedFile(path, callback) {
|
|
575
|
-
try {
|
|
576
|
-
// Openssl encrypted files start with Salted
|
|
577
|
-
const expectedBytes = Buffer.from('Salted');
|
|
578
|
-
const buffer = Buffer.alloc(6);
|
|
579
|
-
const fd = fs.openSync(path, 'r');
|
|
580
|
-
// Read the first six bytes
|
|
581
|
-
fs.readSync(fd, buffer, 0, 6, 0);
|
|
582
|
-
fs.closeSync(fd);
|
|
583
|
-
// Assert first 6 characters of the file are "Salted"
|
|
584
|
-
assert.deepStrictEqual(buffer, expectedBytes, 'The backup file should be encrypted.');
|
|
585
|
-
callback();
|
|
586
|
-
} catch (err) {
|
|
587
|
-
callback(err);
|
|
588
|
-
}
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
function assertWrittenFewerThan(total, number, callback) {
|
|
592
|
-
try {
|
|
593
|
-
assert(total < number && total > 0, `Saw ${total} but expected between 1 and ${number - 1} documents for the resumed backup.`);
|
|
594
|
-
callback();
|
|
595
|
-
} catch (err) {
|
|
596
|
-
callback(err);
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
function augmentParamsWithApiKey(params) {
|
|
601
|
-
if (process.env.COUCHBACKUP_TEST_IAM_API_KEY) {
|
|
602
|
-
if (!params.opts) {
|
|
603
|
-
params.opts = {};
|
|
604
|
-
}
|
|
605
|
-
params.opts.iamApiKey = process.env.COUCHBACKUP_TEST_IAM_API_KEY;
|
|
606
|
-
params.opts.iamTokenUrl = process.env.CLOUDANT_IAM_TOKEN_URL;
|
|
607
|
-
}
|
|
608
|
-
}
|
|
94
|
+
} while (startKey != null);
|
|
95
|
+
return allDocIds;
|
|
96
|
+
};
|
|
609
97
|
|
|
610
98
|
module.exports = {
|
|
611
|
-
|
|
612
|
-
p: params,
|
|
613
|
-
setTimeout,
|
|
614
|
-
dbCompare,
|
|
615
|
-
readSortAndDeepEqual,
|
|
616
|
-
assertGzipFile,
|
|
617
|
-
assertEncryptedFile,
|
|
618
|
-
testBackup,
|
|
619
|
-
testRestore,
|
|
620
|
-
testDirectBackupAndRestore,
|
|
621
|
-
testBackupToFile,
|
|
622
|
-
testRestoreFromFile,
|
|
623
|
-
testBackupAndRestoreViaFile,
|
|
624
|
-
testBackupAbortResumeRestore
|
|
99
|
+
compare
|
|
625
100
|
};
|