Skip to content
This repository was archived by the owner on Oct 1, 2021. It is now read-only.

Commit 11111b7

Browse files
committed
Adding parameter ignoreLock
License: MIT Signed-off-by: Adam Uhlir <uhlir.a@gmail.com>
1 parent 526d191 commit 11111b7

File tree

3 files changed

+67
-29
lines changed

3 files changed

+67
-29
lines changed

src/commands.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,12 @@ function reportingClosure (action) {
3030

3131
async function migrate ({ repoPath, ver, dry }) {
3232
repoPath = repoPath || process.env.IPFS_PATH || path.join(os.homedir(), '.jsipfs')
33-
await migrator.migrate(repoPath, ver, reportingClosure(dry ? 'loaded migration' : 'migrated to version'), dry)
33+
await migrator.migrate(repoPath, ver, false, reportingClosure(dry ? 'loaded migration' : 'migrated to version'), dry)
3434
}
3535

3636
async function revert ({ repoPath, ver, dry }) {
3737
repoPath = repoPath || process.env.IPFS_PATH || path.join(os.homedir(), '.jsipfs')
38-
await migrator.revert(repoPath, ver, reportingClosure(dry ? 'loaded migration' : 'reverted version'), dry)
38+
await migrator.revert(repoPath, ver, false, reportingClosure(dry ? 'loaded migration' : 'reverted version'), dry)
3939
}
4040

4141
async function status ({ repoPath }) {

src/index.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,13 @@ exports.getLatestMigrationVersion = getLatestMigrationVersion
3838
*
3939
* @param {string} path - Path to initialized (!) JS-IPFS repo
4040
* @param {int?} toVersion - Version to which the repo should be migrated, if undefined repo will be migrated to the latest version.
41+
* @param {boolean?} ignoreLock - Won't lock the repo for applying the migrations. Use with caution.
4142
* @param {function?} progressCb - Callback which will be called after each executed migration to report progress
4243
* @param {boolean?} isDryRun - Allows to simulate the execution of the migrations without any effect.
4344
* @param {array?} migrations - Array of migrations to migrate. If undefined, the bundled migrations are used. Mainly for testing purpose.
4445
* @returns {Promise<void>}
4546
*/
46-
async function migrate (path, toVersion, progressCb, isDryRun, migrations) {
47+
async function migrate (path, toVersion, ignoreLock, progressCb, isDryRun, migrations) {
4748
migrations = migrations || defaultMigrations
4849

4950
if (!path) {
@@ -72,7 +73,7 @@ async function migrate (path, toVersion, progressCb, isDryRun, migrations) {
7273
}
7374

7475
let lock
75-
if (!isDryRun) lock = await repoLock.lock(currentVersion, path)
76+
if (!isDryRun && !ignoreLock) lock = await repoLock.lock(currentVersion, path)
7677

7778
try {
7879
let counter = 0
@@ -100,7 +101,7 @@ async function migrate (path, toVersion, progressCb, isDryRun, migrations) {
100101
if (!isDryRun) await repoVersion.setVersion(path, toVersion || getLatestMigrationVersion(migrations))
101102
log('All migrations successfully migrated ', toVersion !== undefined ? `to version ${toVersion}!` : 'to latest version!')
102103
} finally {
103-
if (!isDryRun) await lock.close()
104+
if (!isDryRun && !ignoreLock) await lock.close()
104105
}
105106
}
106107

@@ -116,10 +117,11 @@ exports.migrate = migrate
116117
* @param {int} toVersion - Version to which the repo will be reverted.
117118
* @param {function?} progressCb - Callback which will be called after each reverted migration to report progress
118119
* @param {boolean?} isDryRun - Allows to simulate the execution of the reversion without any effects. Make sense to utilize progressCb with this argument.
120+
* @param {boolean?} ignoreLock - Won't lock the repo for reverting the migrations. Use with caution.
119121
* @param {array?} migrations - Array of migrations to migrate. If undefined, the bundled migrations are used. Mainly for testing purpose.
120122
* @returns {Promise<void>}
121123
*/
122-
async function revert (path, toVersion, progressCb, isDryRun, migrations) {
124+
async function revert (path, toVersion, ignoreLock, progressCb, isDryRun, migrations) {
123125
migrations = migrations || defaultMigrations
124126

125127
if (!path) {
@@ -155,7 +157,7 @@ async function revert (path, toVersion, progressCb, isDryRun, migrations) {
155157
}
156158

157159
let lock
158-
if (!isDryRun) lock = await repoLock.lock(currentVersion, path)
160+
if (!isDryRun && !ignoreLock) lock = await repoLock.lock(currentVersion, path)
159161

160162
log(`Reverting from version ${currentVersion} to ${toVersion}`)
161163
try {
@@ -186,7 +188,7 @@ async function revert (path, toVersion, progressCb, isDryRun, migrations) {
186188
if (!isDryRun) await repoVersion.setVersion(path, toVersion)
187189
log(`All migrations successfully reverted to version ${toVersion}!`)
188190
} finally {
189-
if (!isDryRun) await lock.close()
191+
if (!isDryRun && !ignoreLock) await lock.close()
190192
}
191193
}
192194

test/index.spec.js

Lines changed: 57 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,14 @@ describe('index.js', () => {
8787
it('should error with out path argument', () => {
8888
const migrationsMock = createMigrations()
8989

90-
return expect(migrator.revert(undefined, undefined, undefined, undefined, migrationsMock))
90+
return expect(migrator.revert(undefined, undefined, undefined, undefined, undefined, migrationsMock))
9191
.to.eventually.be.rejectedWith('Path argument is required!')
9292
})
9393

9494
it('should error with out toVersion argument', () => {
9595
const migrationsMock = createMigrations()
9696

97-
return expect(migrator.revert('/some/path', undefined, undefined, undefined, migrationsMock))
97+
return expect(migrator.revert('/some/path', undefined, undefined, undefined, undefined, migrationsMock))
9898
.to.eventually.be.rejectedWith('When reverting migrations, you have to specify to which version to revert!')
9999
})
100100

@@ -103,7 +103,7 @@ describe('index.js', () => {
103103
const migrationsMock = createMigrations()
104104

105105
return Promise.all(
106-
invalidValues.map((value) => expect(migrator.revert('/some/path', value, undefined, undefined, migrationsMock))
106+
invalidValues.map((value) => expect(migrator.revert('/some/path', value, undefined, undefined, undefined, migrationsMock))
107107
.to.eventually.be.rejectedWith('Version has to be positive integer!'))
108108
)
109109
})
@@ -112,7 +112,7 @@ describe('index.js', () => {
112112
getVersionStub.returns(2)
113113
const migrationsMock = createMigrations()
114114

115-
await expect(migrator.revert('/some/path', 2, undefined, undefined, migrationsMock))
115+
await expect(migrator.revert('/some/path', 2, undefined, undefined, undefined, migrationsMock))
116116
.to.eventually.be.fulfilled()
117117

118118
expect(lockStub.called).to.be.false()
@@ -122,7 +122,7 @@ describe('index.js', () => {
122122
getVersionStub.returns(2)
123123
const migrationsMock = createMigrations()
124124

125-
await expect(migrator.revert('/some/path', 3, undefined, undefined, migrationsMock))
125+
await expect(migrator.revert('/some/path', 3, undefined, undefined, undefined, migrationsMock))
126126
.to.eventually.be.fulfilled()
127127

128128
expect(lockStub.called).to.be.false()
@@ -134,15 +134,15 @@ describe('index.js', () => {
134134

135135
getVersionStub.returns(4)
136136
return expect(
137-
migrator.revert('/some/path', 1, undefined, undefined, nonReversibleMigrationsMock)
137+
migrator.revert('/some/path', 1, undefined, undefined, undefined, nonReversibleMigrationsMock)
138138
).to.eventually.be.rejectedWith('Migration version 3 is not possible to revert! Cancelling reversion.')
139139
})
140140

141141
it('should revert expected migrations', async () => {
142142
const migrationsMock = createMigrations()
143143
getVersionStub.returns(3)
144144

145-
await expect(migrator.revert('/some/path', 1, undefined, undefined, migrationsMock))
145+
await expect(migrator.revert('/some/path', 1, undefined, undefined, undefined, migrationsMock))
146146
.to.eventually.be.fulfilled()
147147

148148
expect(lockCloseStub.calledOnce).to.be.true()
@@ -160,7 +160,7 @@ describe('index.js', () => {
160160
const migrationsMock = createMigrations()
161161
getVersionStub.returns(2)
162162

163-
await expect(migrator.revert('/some/path', 1, undefined, undefined, migrationsMock))
163+
await expect(migrator.revert('/some/path', 1, undefined, undefined, undefined, migrationsMock))
164164
.to.eventually.be.fulfilled()
165165

166166
expect(lockCloseStub.calledOnce).to.be.true()
@@ -185,7 +185,7 @@ describe('index.js', () => {
185185
]
186186
getVersionStub.returns(2)
187187

188-
await expect(migrator.revert('/some/path', 1, undefined, undefined, migrationsMock))
188+
await expect(migrator.revert('/some/path', 1, undefined, undefined, undefined, migrationsMock))
189189
.to.eventually.be.fulfilled()
190190

191191
expect(lockCloseStub.calledOnce).to.be.true()
@@ -200,7 +200,7 @@ describe('index.js', () => {
200200
const migrationsMock = createMigrations()
201201
getVersionStub.returns(4)
202202

203-
await expect(migrator.revert('/some/path', 2, undefined, true, migrationsMock))
203+
await expect(migrator.revert('/some/path', 2, undefined, undefined, true, migrationsMock))
204204
.to.eventually.be.fulfilled()
205205

206206
expect(lockCloseStub.called).to.be.false()
@@ -210,12 +210,30 @@ describe('index.js', () => {
210210
return migrationsMock.forEach(({ revert }) => expect(revert.calledOnce).to.be.false)
211211
})
212212

213+
it('should not lock repo when ignoreLock is used', async () => {
214+
const migrationsMock = createMigrations()
215+
getVersionStub.returns(4)
216+
217+
await expect(migrator.revert('/some/path', 2, true, undefined, undefined, migrationsMock))
218+
.to.eventually.be.fulfilled()
219+
220+
expect(lockCloseStub.called).to.be.false()
221+
expect(lockStub.called).to.be.false()
222+
expect(setVersionStub.calledOnceWith('/some/path', 2)).to.be.true()
223+
224+
// Checking migrations
225+
expect(migrationsMock[3].revert.calledOnce).to.be.true()
226+
expect(migrationsMock[2].revert.calledOnce).to.be.true()
227+
expect(migrationsMock[1].revert.called).to.be.false()
228+
expect(migrationsMock[0].revert.called).to.be.false()
229+
})
230+
213231
it('should report progress when progress callback is supplied', async () => {
214232
const migrationsMock = createMigrations()
215233
getVersionStub.returns(4)
216234
const progressCb = sinon.stub()
217235

218-
await expect(migrator.revert('/some/path', 2, progressCb, undefined, migrationsMock))
236+
await expect(migrator.revert('/some/path', 2, undefined, progressCb, undefined, migrationsMock))
219237
.to.eventually.be.fulfilled()
220238

221239
expect(progressCb.getCall(0).calledWith(sinon.match.any, 1, 2)).to.be.true()
@@ -227,7 +245,7 @@ describe('index.js', () => {
227245
const migrationsMock = createMigrations()
228246
migrationsMock[3].revert = sinon.stub().rejects()
229247

230-
await expect(migrator.revert('/some/path', 2, undefined, undefined, migrationsMock))
248+
await expect(migrator.revert('/some/path', 2, undefined, undefined, undefined, migrationsMock))
231249
.to.eventually.be.rejected()
232250

233251
expect(lockCloseStub.calledOnce).to.be.true()
@@ -240,7 +258,7 @@ describe('index.js', () => {
240258
it('should error with out path argument', () => {
241259
const migrationsMock = createMigrations()
242260

243-
return expect(migrator.migrate(undefined, undefined, undefined, undefined, migrationsMock))
261+
return expect(migrator.migrate(undefined, undefined, undefined, undefined, undefined, migrationsMock))
244262
.to.eventually.be.rejectedWith('Path argument is required!')
245263
})
246264

@@ -249,7 +267,7 @@ describe('index.js', () => {
249267
const migrationsMock = createMigrations()
250268

251269
return Promise.all(
252-
invalidValues.map((value) => expect(migrator.migrate('/some/path', value, undefined, undefined, migrationsMock))
270+
invalidValues.map((value) => expect(migrator.migrate('/some/path', value, undefined, undefined, undefined, migrationsMock))
253271
.to.eventually.be.rejectedWith('Version has to be positive integer!'))
254272
)
255273
})
@@ -258,7 +276,7 @@ describe('index.js', () => {
258276
const migrationsMock = createMigrations()
259277
getVersionStub.returns(2)
260278

261-
await expect(migrator.migrate('/some/path', undefined, undefined, undefined, migrationsMock))
279+
await expect(migrator.migrate('/some/path', undefined, undefined, undefined, undefined, migrationsMock))
262280
.to.eventually.be.fulfilled()
263281

264282
setVersionStub.calledOnceWithExactly('/some/path', 4) // 4 is the latest migration's version
@@ -268,7 +286,7 @@ describe('index.js', () => {
268286
getVersionStub.returns(2)
269287
const migrationsMock = createMigrations()
270288

271-
await expect(migrator.migrate('/some/path', 2, undefined, undefined, migrationsMock))
289+
await expect(migrator.migrate('/some/path', 2, undefined, undefined, undefined, migrationsMock))
272290
.to.eventually.be.fulfilled()
273291

274292
expect(lockStub.called).to.be.false()
@@ -278,7 +296,7 @@ describe('index.js', () => {
278296
getVersionStub.returns(3)
279297
const migrationsMock = createMigrations()
280298

281-
await expect(migrator.migrate('/some/path', 2, undefined, undefined, migrationsMock))
299+
await expect(migrator.migrate('/some/path', 2, undefined, undefined, undefined, migrationsMock))
282300
.to.eventually.be.fulfilled()
283301

284302
expect(lockStub.called).to.be.false()
@@ -288,7 +306,7 @@ describe('index.js', () => {
288306
const migrationsMock = createMigrations()
289307
getVersionStub.returns(1)
290308

291-
await expect(migrator.migrate('/some/path', 3, undefined, undefined, migrationsMock))
309+
await expect(migrator.migrate('/some/path', 3, undefined, undefined, undefined, migrationsMock))
292310
.to.eventually.be.fulfilled()
293311

294312
expect(lockCloseStub.calledOnce).to.be.true()
@@ -306,7 +324,7 @@ describe('index.js', () => {
306324
const migrationsMock = createMigrations()
307325
getVersionStub.returns(2)
308326

309-
await expect(migrator.migrate('/some/path', 4, undefined, true, migrationsMock))
327+
await expect(migrator.migrate('/some/path', 4, undefined, undefined, true, migrationsMock))
310328
.to.eventually.be.fulfilled()
311329

312330
expect(lockCloseStub.called).to.be.false()
@@ -316,12 +334,30 @@ describe('index.js', () => {
316334
return migrationsMock.forEach(({ migrate }) => expect(migrate.calledOnce).to.be.false)
317335
})
318336

337+
it('should not lock repo when ignoreLock is used', async () => {
338+
const migrationsMock = createMigrations()
339+
getVersionStub.returns(2)
340+
341+
await expect(migrator.migrate('/some/path', 4, true, undefined, undefined, migrationsMock))
342+
.to.eventually.be.fulfilled()
343+
344+
expect(lockCloseStub.called).to.be.false()
345+
expect(lockStub.called).to.be.false()
346+
expect(setVersionStub.calledOnceWith('/some/path', 4)).to.be.true()
347+
348+
// Checking migrations
349+
expect(migrationsMock[3].migrate.calledOnce).to.be.true()
350+
expect(migrationsMock[2].migrate.calledOnce).to.be.true()
351+
expect(migrationsMock[1].migrate.called).to.be.false()
352+
expect(migrationsMock[0].migrate.called).to.be.false()
353+
})
354+
319355
it('should report progress when progress callback is supplied', async () => {
320356
const migrationsMock = createMigrations()
321357
getVersionStub.returns(2)
322358
const progressCb = sinon.stub()
323359

324-
await expect(migrator.migrate('/some/path', 4, progressCb, undefined, migrationsMock))
360+
await expect(migrator.migrate('/some/path', 4, undefined, progressCb, undefined, migrationsMock))
325361
.to.eventually.be.fulfilled()
326362

327363
expect(progressCb.getCall(0).calledWith(sinon.match.any, 1, 2)).to.be.true()
@@ -333,7 +369,7 @@ describe('index.js', () => {
333369
const migrationsMock = createMigrations()
334370
migrationsMock[3].migrate = sinon.stub().rejects()
335371

336-
await expect(migrator.migrate('/some/path', 4, undefined, undefined, migrationsMock))
372+
await expect(migrator.migrate('/some/path', 4, undefined, undefined, undefined, migrationsMock))
337373
.to.eventually.be.rejected()
338374

339375
expect(lockCloseStub.calledOnce).to.be.true()

0 commit comments

Comments
 (0)