pear-prerelease 2.0.6 → 3.0.0
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/index.js +159 -133
- package/package.json +4 -2
package/index.js
CHANGED
|
@@ -4,164 +4,190 @@ import Hyperdrive from 'hyperdrive'
|
|
|
4
4
|
import Corestore from 'corestore'
|
|
5
5
|
import Hyperswarm from 'hyperswarm'
|
|
6
6
|
import id from 'hypercore-id-encoding'
|
|
7
|
+
import pearLink from 'pear-link'
|
|
8
|
+
import { flag, command } from 'paparam'
|
|
9
|
+
|
|
10
|
+
const app = command('pear-prerelease',
|
|
11
|
+
flag('--dry-run'),
|
|
12
|
+
flag('--from,-f <link>'),
|
|
13
|
+
flag('--to,-t <link>'),
|
|
14
|
+
flag('--production,-p <link>'),
|
|
15
|
+
flag('--touch'),
|
|
16
|
+
flag('--storage,-s <storage>')
|
|
17
|
+
).parse()
|
|
18
|
+
|
|
19
|
+
const exit = global.Bare ? Bare.exit.bind(Bare) : process.exit.bind(process)
|
|
20
|
+
if (!app) exit(0)
|
|
21
|
+
|
|
22
|
+
const DRY_RUN = app.flags.dryRun
|
|
23
|
+
const FROM = app.flags.from ? pearLink.parse(app.flags.from) : null
|
|
24
|
+
const TO = app.flags.to ? pearLink.parse(app.flags.to) : null
|
|
25
|
+
const PROD = app.flags.production ? pearLink.parse(app.flags.production) : null
|
|
26
|
+
|
|
27
|
+
const store = new Corestore(app.flags.storage || './corestore')
|
|
28
|
+
|
|
29
|
+
if (app.flags.touch) {
|
|
30
|
+
const core = store.get({ name: Math.random() + '.' + Date.now() })
|
|
31
|
+
await core.ready()
|
|
32
|
+
console.log('pear://' + core.id)
|
|
33
|
+
await core.close()
|
|
34
|
+
}
|
|
7
35
|
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
swarm.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
36
|
+
if (FROM && TO) {
|
|
37
|
+
const swarm = new Hyperswarm({
|
|
38
|
+
keyPair: await store.createKeyPair('hyperswarm')
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
swarm.on('connection', c => store.replicate(c))
|
|
42
|
+
|
|
43
|
+
const to = new Hyperdrive(store.namespace('release'), TO.drive.key, { compat: false })
|
|
44
|
+
await to.ready()
|
|
45
|
+
|
|
46
|
+
const prod = PROD ? new Hyperdrive(store.namespace('prod'), PROD.drive.key) : null
|
|
47
|
+
if (prod) await prod.ready()
|
|
48
|
+
|
|
49
|
+
const from = new Hyperdrive(store.session(), FROM.drive.key)
|
|
50
|
+
await from.ready()
|
|
51
|
+
|
|
52
|
+
swarm.join(to.discoveryKey, {
|
|
53
|
+
client: true,
|
|
54
|
+
server: true
|
|
55
|
+
})
|
|
56
|
+
swarm.join(from.discoveryKey, {
|
|
57
|
+
client: true,
|
|
58
|
+
server: false
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
if (prod) {
|
|
62
|
+
// hydrate prod target
|
|
63
|
+
if (prod.core.length === 0) {
|
|
64
|
+
await new Promise(resolve => prod.core.once('append', () => resolve()))
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
prod.core.download()
|
|
68
|
+
|
|
69
|
+
console.log('Copying in existing metadata data, might take a bit...')
|
|
70
|
+
while (to.core.length < prod.core.length) {
|
|
71
|
+
await to.core.append(await prod.core.get(to.core.length))
|
|
72
|
+
console.log('Copied blocks', to.core.length, '/', prod.core.length)
|
|
73
|
+
}
|
|
74
|
+
console.log('Done!')
|
|
75
|
+
console.log()
|
|
76
|
+
|
|
77
|
+
await to.getBlobs()
|
|
78
|
+
await prod.getBlobs()
|
|
79
|
+
|
|
80
|
+
prod.blobs.core.download()
|
|
81
|
+
|
|
82
|
+
console.log('Copying in existing blob data, might take a bit...')
|
|
83
|
+
while (to.blobs.core.length < prod.blobs.core.length) {
|
|
84
|
+
await to.blobs.core.append(await prod.blobs.core.get(to.blobs.core.length))
|
|
85
|
+
console.log('Copied blob blocks', to.blobs.core.length, '/', prod.blobs.core.length)
|
|
86
|
+
}
|
|
87
|
+
console.log('Done!')
|
|
88
|
+
console.log()
|
|
89
|
+
}
|
|
37
90
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
if (prod.core.length === 0) await new Promise(resolve => prod.core.once('append', () => resolve()))
|
|
91
|
+
const co = from.checkout(FROM.drive.length || from.core.length)
|
|
92
|
+
await co.ready()
|
|
41
93
|
|
|
42
|
-
|
|
94
|
+
let n = 0
|
|
43
95
|
|
|
44
|
-
console.log('
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
console.log('Copied blocks', drive.core.length, '/', prod.core.length)
|
|
48
|
-
}
|
|
96
|
+
console.log('Checking diff')
|
|
97
|
+
for await (const data of co.mirror(to, { dryRun: true, batch: true })) print(data)
|
|
98
|
+
if (!n) console.log('(Empty)')
|
|
49
99
|
console.log('Done!')
|
|
50
100
|
console.log()
|
|
51
101
|
|
|
52
|
-
await
|
|
53
|
-
|
|
102
|
+
const pkg = JSON.parse(await co.get('/package.json'))
|
|
103
|
+
console.log('Total changes', n)
|
|
104
|
+
console.log('Package version:', pkg.version)
|
|
105
|
+
console.log()
|
|
54
106
|
|
|
55
|
-
|
|
107
|
+
console.log('Core:')
|
|
108
|
+
console.log(to.core.id, to.core.length)
|
|
109
|
+
console.log(id.encode(await to.core.treeHash()))
|
|
110
|
+
console.log()
|
|
111
|
+
console.log('Blobs:')
|
|
112
|
+
console.log(to.blobs.core.id, to.blobs.core.length)
|
|
113
|
+
console.log(id.encode(await to.blobs.core.treeHash()))
|
|
114
|
+
console.log()
|
|
56
115
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
await
|
|
60
|
-
|
|
116
|
+
if (DRY_RUN) {
|
|
117
|
+
console.log('Exiting due to dry run...')
|
|
118
|
+
await swarm.destroy()
|
|
119
|
+
exit(0)
|
|
61
120
|
}
|
|
62
|
-
console.log('Done!')
|
|
63
|
-
console.log()
|
|
64
|
-
}
|
|
65
121
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
console.log('Checking diff')
|
|
72
|
-
for await (const data of co.mirror(drive, { dryRun: true, batch: true })) print(data)
|
|
73
|
-
if (!n) console.log('(Empty)')
|
|
74
|
-
console.log('Done!')
|
|
75
|
-
console.log()
|
|
76
|
-
|
|
77
|
-
const pkg = JSON.parse(await co.get('/package.json'))
|
|
78
|
-
console.log('Total changes', n)
|
|
79
|
-
console.log('Package version:', pkg.version)
|
|
80
|
-
console.log()
|
|
81
|
-
|
|
82
|
-
console.log('Core:')
|
|
83
|
-
console.log(drive.core.id, drive.core.length)
|
|
84
|
-
console.log(id.encode(await drive.core.treeHash()))
|
|
85
|
-
console.log()
|
|
86
|
-
console.log('Blobs:')
|
|
87
|
-
console.log(drive.blobs.core.id, drive.blobs.core.length)
|
|
88
|
-
console.log(id.encode(await drive.blobs.core.treeHash()))
|
|
89
|
-
console.log()
|
|
90
|
-
|
|
91
|
-
if (DRY_RUN) {
|
|
92
|
-
console.log('Exiting due to dry run...')
|
|
93
|
-
await swarm.destroy()
|
|
94
|
-
process.exit(0)
|
|
95
|
-
}
|
|
122
|
+
if (!/^\d+\.\d+\.\d+$/.test(pkg.version)) {
|
|
123
|
+
console.log('Version does not look like a release version to for dry-running...')
|
|
124
|
+
await swarm.destroy()
|
|
125
|
+
exit(0)
|
|
126
|
+
}
|
|
96
127
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
process.exit(0)
|
|
101
|
-
}
|
|
128
|
+
console.log('NOT A DRY RUN! Waiting 10s in case you wanna bail...')
|
|
129
|
+
await new Promise(resolve => setTimeout(resolve, 10_000))
|
|
130
|
+
console.log('OK THEN! Staging...')
|
|
102
131
|
|
|
103
|
-
console.log(
|
|
104
|
-
await
|
|
105
|
-
console.log('
|
|
132
|
+
console.log()
|
|
133
|
+
for await (const data of co.mirror(to, { batch: true })) print(data)
|
|
134
|
+
if (!n) console.log('(Empty)')
|
|
135
|
+
console.log()
|
|
106
136
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
if (!n) console.log('(Empty)')
|
|
110
|
-
console.log()
|
|
137
|
+
// skipping release as thats non sensical
|
|
138
|
+
const keys = ['manifest', 'metadata', 'channel', 'platformVersion', 'warmup']
|
|
111
139
|
|
|
112
|
-
|
|
113
|
-
const
|
|
140
|
+
for (const k of keys) {
|
|
141
|
+
const src = await co.db.get(k)
|
|
142
|
+
const dst = await to.db.get(k)
|
|
114
143
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
144
|
+
if (!src && !dst) {
|
|
145
|
+
continue
|
|
146
|
+
}
|
|
118
147
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
148
|
+
if (!src && dst) {
|
|
149
|
+
console.log('Dropping pear setting', k)
|
|
150
|
+
await dst.db.del(k)
|
|
151
|
+
continue
|
|
152
|
+
}
|
|
122
153
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
154
|
+
if ((src && !dst) || (JSON.stringify(src.value) !== JSON.stringify(dst.value))) {
|
|
155
|
+
console.log('Updating pear setting', k)
|
|
156
|
+
await to.db.put(k, src.value)
|
|
157
|
+
}
|
|
127
158
|
}
|
|
128
159
|
|
|
129
|
-
if (
|
|
130
|
-
console.log('
|
|
131
|
-
await
|
|
160
|
+
if (await to.db.get('release')) {
|
|
161
|
+
console.log('Dropping release from target...')
|
|
162
|
+
await to.db.del('release')
|
|
132
163
|
}
|
|
133
|
-
}
|
|
134
164
|
|
|
135
|
-
|
|
136
|
-
console.log(
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
console.log('Done!')
|
|
141
|
-
console.log(drive.core)
|
|
142
|
-
console.log()
|
|
143
|
-
console.log('Swarming until you exit...')
|
|
165
|
+
console.log('Done!')
|
|
166
|
+
console.log(to.core)
|
|
167
|
+
console.log()
|
|
168
|
+
console.log('Swarming until you exit...')
|
|
144
169
|
|
|
145
|
-
let timeout = setTimeout(teardown, 15_000)
|
|
146
|
-
const blobs = await
|
|
170
|
+
let timeout = setTimeout(teardown, 15_000)
|
|
171
|
+
const blobs = await to.getBlobs()
|
|
147
172
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
})
|
|
173
|
+
to.core.on('upload', function () {
|
|
174
|
+
clearTimeout(timeout)
|
|
175
|
+
timeout = setTimeout(teardown, 15_000)
|
|
176
|
+
})
|
|
152
177
|
|
|
153
|
-
blobs.core.on('upload', function () {
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
})
|
|
178
|
+
blobs.core.on('upload', function () {
|
|
179
|
+
clearTimeout(timeout)
|
|
180
|
+
timeout = setTimeout(teardown, 15_000)
|
|
181
|
+
})
|
|
157
182
|
|
|
158
|
-
function print (data) {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
}
|
|
183
|
+
function print (data) {
|
|
184
|
+
n++
|
|
185
|
+
console.log(data.op === 'add' ? '+' : data.op === 'remove' ? '-' : '~', data.key, [data.bytesAdded, -data.bytesRemoved])
|
|
186
|
+
}
|
|
162
187
|
|
|
163
|
-
async function teardown () {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
188
|
+
async function teardown () {
|
|
189
|
+
console.log('Shutting down due to inactivity...')
|
|
190
|
+
await swarm.destroy()
|
|
191
|
+
await to.close()
|
|
192
|
+
}
|
|
167
193
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pear-prerelease",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "Proper prerelease flows with pear",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -11,7 +11,9 @@
|
|
|
11
11
|
"corestore": "^7.5.0",
|
|
12
12
|
"hypercore-id-encoding": "^1.3.0",
|
|
13
13
|
"hyperdrive": "^13.0.2",
|
|
14
|
-
"hyperswarm": "^4.14.2"
|
|
14
|
+
"hyperswarm": "^4.14.2",
|
|
15
|
+
"paparam": "^1.9.0",
|
|
16
|
+
"pear-link": "^4.2.1"
|
|
15
17
|
},
|
|
16
18
|
"repository": {
|
|
17
19
|
"type": "git",
|