pear-prerelease 2.0.6 → 3.1.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 +144 -118
- 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('--bootstrap'),
|
|
16
|
+
flag('--touch'),
|
|
17
|
+
flag('--storage|-s <storage>')
|
|
18
|
+
).parse()
|
|
19
|
+
|
|
20
|
+
const exit = global.Bare ? Bare.exit.bind(Bare) : process.exit.bind(process)
|
|
21
|
+
if (!app) exit(0)
|
|
22
|
+
|
|
23
|
+
const DRY_RUN = app.flags.dryRun
|
|
24
|
+
const BOOTSTRAP = app.flags.bootstrap
|
|
25
|
+
const FROM = app.flags.from ? pearLink.parse(app.flags.from) : null
|
|
26
|
+
const TO = app.flags.to ? pearLink.parse(app.flags.to) : null
|
|
27
|
+
const PROD = app.flags.production ? pearLink.parse(app.flags.production) : null
|
|
28
|
+
|
|
29
|
+
const store = new Corestore(app.flags.storage || './corestore')
|
|
30
|
+
|
|
31
|
+
if (app.flags.touch) {
|
|
32
|
+
const core = store.get({ name: Math.random() + '.' + Date.now() })
|
|
33
|
+
await core.ready()
|
|
34
|
+
console.log('pear://' + core.id)
|
|
35
|
+
await core.close()
|
|
36
|
+
}
|
|
7
37
|
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const PROD_KEY = process.argv[4]
|
|
38
|
+
if (FROM && TO && PROD) {
|
|
39
|
+
const swarm = new Hyperswarm({
|
|
40
|
+
keyPair: await store.createKeyPair('hyperswarm')
|
|
41
|
+
})
|
|
13
42
|
|
|
14
|
-
|
|
15
|
-
const swarm = new Hyperswarm({
|
|
16
|
-
keyPair: await store.createKeyPair('hyperswarm')
|
|
17
|
-
})
|
|
43
|
+
swarm.on('connection', c => store.replicate(c))
|
|
18
44
|
|
|
19
|
-
const
|
|
20
|
-
await
|
|
45
|
+
const to = new Hyperdrive(store.namespace('release'), TO.drive.key, { compat: false })
|
|
46
|
+
await to.ready()
|
|
21
47
|
|
|
22
|
-
const prod =
|
|
23
|
-
|
|
48
|
+
const prod = new Hyperdrive(store.namespace('prod'), PROD.drive.key)
|
|
49
|
+
await prod.ready()
|
|
24
50
|
|
|
25
|
-
const
|
|
26
|
-
await
|
|
51
|
+
const from = new Hyperdrive(store.session(), FROM.drive.key)
|
|
52
|
+
await from.ready()
|
|
27
53
|
|
|
28
|
-
swarm.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
})
|
|
54
|
+
swarm.join(to.discoveryKey, {
|
|
55
|
+
client: true,
|
|
56
|
+
server: true
|
|
57
|
+
})
|
|
58
|
+
swarm.join(from.discoveryKey, {
|
|
59
|
+
client: true,
|
|
60
|
+
server: false
|
|
61
|
+
})
|
|
37
62
|
|
|
38
|
-
if (prod) {
|
|
39
63
|
// hydrate prod target
|
|
40
|
-
if (prod.core.length === 0
|
|
64
|
+
if (prod.core.length === 0 && !BOOTSTRAP) {
|
|
65
|
+
await new Promise(resolve => prod.core.once('append', () => resolve()))
|
|
66
|
+
}
|
|
41
67
|
|
|
42
68
|
prod.core.download()
|
|
43
69
|
|
|
44
70
|
console.log('Copying in existing metadata data, might take a bit...')
|
|
45
|
-
while (
|
|
46
|
-
await
|
|
47
|
-
console.log('Copied blocks',
|
|
71
|
+
while (to.core.length < prod.core.length) {
|
|
72
|
+
await to.core.append(await prod.core.get(to.core.length))
|
|
73
|
+
console.log('Copied blocks', to.core.length, '/', prod.core.length)
|
|
48
74
|
}
|
|
49
75
|
console.log('Done!')
|
|
50
76
|
console.log()
|
|
51
77
|
|
|
52
|
-
await
|
|
78
|
+
await to.getBlobs()
|
|
53
79
|
await prod.getBlobs()
|
|
54
80
|
|
|
55
81
|
prod.blobs.core.download()
|
|
56
82
|
|
|
57
83
|
console.log('Copying in existing blob data, might take a bit...')
|
|
58
|
-
while (
|
|
59
|
-
await
|
|
60
|
-
console.log('Copied blob blocks',
|
|
84
|
+
while (to.blobs.core.length < prod.blobs.core.length) {
|
|
85
|
+
await to.blobs.core.append(await prod.blobs.core.get(to.blobs.core.length))
|
|
86
|
+
console.log('Copied blob blocks', to.blobs.core.length, '/', prod.blobs.core.length)
|
|
61
87
|
}
|
|
62
88
|
console.log('Done!')
|
|
63
89
|
console.log()
|
|
64
|
-
}
|
|
65
90
|
|
|
66
|
-
const co =
|
|
67
|
-
await co.ready()
|
|
68
|
-
|
|
69
|
-
let n = 0
|
|
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
|
-
}
|
|
96
|
-
|
|
97
|
-
if (!/^\d+\.\d+\.\d+$/.test(pkg.version)) {
|
|
98
|
-
console.log('Version does not look like a release version to for dry-running...')
|
|
99
|
-
await swarm.destroy()
|
|
100
|
-
process.exit(0)
|
|
101
|
-
}
|
|
91
|
+
const co = from.checkout(FROM.drive.length || from.core.length)
|
|
92
|
+
await co.ready()
|
|
102
93
|
|
|
103
|
-
|
|
104
|
-
await new Promise(resolve => setTimeout(resolve, 10_000))
|
|
105
|
-
console.log('OK THEN! Staging...')
|
|
94
|
+
let n = 0
|
|
106
95
|
|
|
107
|
-
console.log()
|
|
108
|
-
for await (const data of co.mirror(
|
|
109
|
-
if (!n) console.log('(Empty)')
|
|
110
|
-
console.log()
|
|
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)')
|
|
99
|
+
console.log('Done!')
|
|
100
|
+
console.log()
|
|
111
101
|
|
|
112
|
-
|
|
113
|
-
|
|
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()
|
|
114
106
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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()
|
|
118
115
|
|
|
119
|
-
if (
|
|
120
|
-
|
|
116
|
+
if (DRY_RUN) {
|
|
117
|
+
console.log('Exiting due to dry run...')
|
|
118
|
+
await swarm.destroy()
|
|
119
|
+
exit(0)
|
|
121
120
|
}
|
|
122
121
|
|
|
123
|
-
if (
|
|
124
|
-
console.log('
|
|
125
|
-
await
|
|
126
|
-
|
|
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)
|
|
127
126
|
}
|
|
128
127
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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...')
|
|
131
|
+
|
|
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()
|
|
136
|
+
|
|
137
|
+
// skipping release as thats non sensical
|
|
138
|
+
const keys = ['manifest', 'metadata', 'channel', 'platformVersion', 'warmup']
|
|
139
|
+
|
|
140
|
+
for (const k of keys) {
|
|
141
|
+
const src = await co.db.get(k)
|
|
142
|
+
const dst = await to.db.get(k)
|
|
143
|
+
|
|
144
|
+
if (!src && !dst) {
|
|
145
|
+
continue
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (!src && dst) {
|
|
149
|
+
console.log('Dropping pear setting', k)
|
|
150
|
+
await dst.db.del(k)
|
|
151
|
+
continue
|
|
152
|
+
}
|
|
153
|
+
|
|
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
|
+
}
|
|
132
158
|
}
|
|
133
|
-
}
|
|
134
159
|
|
|
135
|
-
if (await
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
}
|
|
160
|
+
if (await to.db.get('release')) {
|
|
161
|
+
console.log('Dropping release from target...')
|
|
162
|
+
await to.db.del('release')
|
|
163
|
+
}
|
|
139
164
|
|
|
140
|
-
console.log('Done!')
|
|
141
|
-
console.log(
|
|
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.1.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",
|