@teambit/objects 0.0.703 → 0.0.705
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/dist/models/version.d.ts +5 -5
- package/dist/objects/object-list.d.ts +23 -0
- package/dist/objects/object-list.js +58 -12
- package/dist/objects/object-list.js.map +1 -1
- package/dist/objects/repository.d.ts +22 -3
- package/dist/objects/repository.js +99 -32
- package/dist/objects/repository.js.map +1 -1
- package/dist/objects/repository.spec.js +115 -0
- package/dist/objects/repository.spec.js.map +1 -1
- package/objects/object-list.ts +51 -14
- package/objects/repository.spec.ts +102 -0
- package/objects/repository.ts +85 -23
- package/package.json +11 -11
- /package/dist/{preview-1790963186429.js → preview-1790971258035.js} +0 -0
package/dist/models/version.d.ts
CHANGED
|
@@ -192,11 +192,6 @@ export default class Version extends BitObject {
|
|
|
192
192
|
private filesToObject;
|
|
193
193
|
private logToObject;
|
|
194
194
|
toObject(): import("lodash").Dictionary<string | boolean | string[] | import("@teambit/component-id").ComponentIdObj[] | Doclet[] | Log[] | Record<string, any>[] | {
|
|
195
|
-
file: string;
|
|
196
|
-
relativePath: string;
|
|
197
|
-
name: string;
|
|
198
|
-
test: boolean;
|
|
199
|
-
}[] | {
|
|
200
195
|
extensionId: ComponentID | import("@teambit/component-id").ComponentIdObj | undefined;
|
|
201
196
|
config: {
|
|
202
197
|
[key: string]: any;
|
|
@@ -207,6 +202,11 @@ export default class Version extends BitObject {
|
|
|
207
202
|
legacyId: string | undefined;
|
|
208
203
|
name: string | undefined;
|
|
209
204
|
newExtensionId: ComponentID | undefined;
|
|
205
|
+
}[] | {
|
|
206
|
+
file: string;
|
|
207
|
+
relativePath: string;
|
|
208
|
+
name: string;
|
|
209
|
+
test: boolean;
|
|
210
210
|
}[] | Record<string, any> | VersionOrigin | {
|
|
211
211
|
[key: string]: string;
|
|
212
212
|
} | {
|
|
@@ -13,6 +13,19 @@ export declare const FETCH_FORMAT_OBJECT_LIST = "ObjectList";
|
|
|
13
13
|
* Stream.Readable that operates with objectMode, while each 'data' event emits one ObjectItem object.
|
|
14
14
|
*/
|
|
15
15
|
export type ObjectItemsStream = Readable;
|
|
16
|
+
/**
|
|
17
|
+
* compressed buffer of an object (as stored on the filesystem) and the size of its inflated content.
|
|
18
|
+
*/
|
|
19
|
+
export type CompressedObject = {
|
|
20
|
+
buffer: Buffer;
|
|
21
|
+
inflatedSize: number;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* hash => compressed object
|
|
25
|
+
*/
|
|
26
|
+
export type RawObjectsMap = Map<BitObject, CompressedObject & {
|
|
27
|
+
ref: Ref;
|
|
28
|
+
}>;
|
|
16
29
|
export declare class ObjectList {
|
|
17
30
|
objects: ObjectItem[];
|
|
18
31
|
constructor(objects?: ObjectItem[]);
|
|
@@ -46,6 +59,16 @@ export declare class ObjectList {
|
|
|
46
59
|
static combineScopeAndHash(objectItem: ObjectItem): string;
|
|
47
60
|
addIfNotExist(objectItems: ObjectItem[]): void;
|
|
48
61
|
toBitObjects(throwForUnknownTypes?: boolean): Promise<BitObjectList>;
|
|
62
|
+
/**
|
|
63
|
+
* same as `toBitObjects`, but also returns the original compressed buffers of the Source objects (files/artifacts)
|
|
64
|
+
* whose content matches their ref. Sources are immutable, so these buffers can be written to the filesystem as is,
|
|
65
|
+
* saving the costly re-compression. (significant for components with thousands of files).
|
|
66
|
+
*/
|
|
67
|
+
toBitObjectsWithRawSources(): Promise<{
|
|
68
|
+
bitObjectList: BitObjectList;
|
|
69
|
+
rawSources: RawObjectsMap;
|
|
70
|
+
}>;
|
|
71
|
+
private parseObjects;
|
|
49
72
|
static fromBitObjects(bitObjects: BitObject[]): Promise<ObjectList>;
|
|
50
73
|
addScopeName(scopeName: string): void;
|
|
51
74
|
splitByScopeName(): {
|
|
@@ -111,6 +111,14 @@ const FETCH_FORMAT_OBJECT_LIST = exports.FETCH_FORMAT_OBJECT_LIST = 'ObjectList'
|
|
|
111
111
|
* Stream.Readable that operates with objectMode, while each 'data' event emits one ObjectItem object.
|
|
112
112
|
*/
|
|
113
113
|
|
|
114
|
+
/**
|
|
115
|
+
* compressed buffer of an object (as stored on the filesystem) and the size of its inflated content.
|
|
116
|
+
*/
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* hash => compressed object
|
|
120
|
+
*/
|
|
121
|
+
|
|
114
122
|
class ObjectList {
|
|
115
123
|
constructor(objects = []) {
|
|
116
124
|
this.objects = objects;
|
|
@@ -187,7 +195,11 @@ class ObjectList {
|
|
|
187
195
|
extract.on('finish', () => {
|
|
188
196
|
resolve(objects);
|
|
189
197
|
});
|
|
190
|
-
|
|
198
|
+
|
|
199
|
+
// unlike `pipe`, it rejects when the input stream fails or the extractor fails (e.g. a truncated tar).
|
|
200
|
+
(0, _stream().pipeline)(packStream, extract, err => {
|
|
201
|
+
if (err) reject(err);
|
|
202
|
+
});
|
|
191
203
|
});
|
|
192
204
|
return new ObjectList(objectItems);
|
|
193
205
|
}
|
|
@@ -319,18 +331,48 @@ class ObjectList {
|
|
|
319
331
|
return `${scope}${objectItem.ref.hash}`;
|
|
320
332
|
}
|
|
321
333
|
addIfNotExist(objectItems) {
|
|
334
|
+
const existing = new Set(this.objects.map(object => ObjectList.combineScopeAndHash(object)));
|
|
322
335
|
objectItems.forEach(objectItem => {
|
|
323
|
-
const
|
|
324
|
-
if (
|
|
325
|
-
|
|
326
|
-
|
|
336
|
+
const key = ObjectList.combineScopeAndHash(objectItem);
|
|
337
|
+
if (existing.has(key)) return;
|
|
338
|
+
existing.add(key);
|
|
339
|
+
this.objects.push(objectItem);
|
|
327
340
|
});
|
|
328
341
|
}
|
|
329
342
|
async toBitObjects(throwForUnknownTypes = false) {
|
|
343
|
+
const {
|
|
344
|
+
bitObjectList
|
|
345
|
+
} = await this.parseObjects(throwForUnknownTypes);
|
|
346
|
+
return bitObjectList;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* same as `toBitObjects`, but also returns the original compressed buffers of the Source objects (files/artifacts)
|
|
351
|
+
* whose content matches their ref. Sources are immutable, so these buffers can be written to the filesystem as is,
|
|
352
|
+
* saving the costly re-compression. (significant for components with thousands of files).
|
|
353
|
+
*/
|
|
354
|
+
async toBitObjectsWithRawSources() {
|
|
355
|
+
return this.parseObjects(false, true);
|
|
356
|
+
}
|
|
357
|
+
async parseObjects(throwForUnknownTypes, collectRawSources = false) {
|
|
330
358
|
const concurrency = (0, _harmonyModules().concurrentIOLimit)();
|
|
359
|
+
const rawSources = new Map();
|
|
331
360
|
const bitObjects = await (0, _toolboxPromise().pMapPool)(this.objects, async object => {
|
|
332
361
|
try {
|
|
333
|
-
|
|
362
|
+
const {
|
|
363
|
+
object: bitObject,
|
|
364
|
+
inflatedSize
|
|
365
|
+
} = await _object().default.parseObjectWithSize(object.buffer);
|
|
366
|
+
if (collectRawSources && bitObject.getType() === 'Source') {
|
|
367
|
+
if (bitObject.hash().isEqual(object.ref)) {
|
|
368
|
+
rawSources.set(bitObject, {
|
|
369
|
+
buffer: object.buffer,
|
|
370
|
+
inflatedSize,
|
|
371
|
+
ref: object.ref
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
return bitObject;
|
|
334
376
|
} catch (err) {
|
|
335
377
|
if (throwForUnknownTypes || !(err instanceof _legacy2().UnknownObjectType)) {
|
|
336
378
|
throw err;
|
|
@@ -341,7 +383,10 @@ class ObjectList {
|
|
|
341
383
|
}, {
|
|
342
384
|
concurrency
|
|
343
385
|
});
|
|
344
|
-
return
|
|
386
|
+
return {
|
|
387
|
+
bitObjectList: new (_bitObjectList().BitObjectList)((0, _lodash().compact)(bitObjects)),
|
|
388
|
+
rawSources
|
|
389
|
+
};
|
|
345
390
|
}
|
|
346
391
|
static async fromBitObjects(bitObjects) {
|
|
347
392
|
const concurrency = (0, _harmonyModules().concurrentIOLimit)();
|
|
@@ -361,6 +406,7 @@ class ObjectList {
|
|
|
361
406
|
}
|
|
362
407
|
splitByScopeName() {
|
|
363
408
|
const objectListPerScope = {};
|
|
409
|
+
const added = new Set();
|
|
364
410
|
this.objects.forEach(obj => {
|
|
365
411
|
if (obj.type === _models().ExportMetadata.name) {
|
|
366
412
|
return; // no scope for this type. it's general for all export data from all scopes
|
|
@@ -368,11 +414,11 @@ class ObjectList {
|
|
|
368
414
|
if (!obj.scope) {
|
|
369
415
|
throw new Error(`ObjectList: unable to split by scopeName, the scopeName is missing for ${obj.ref.hash}`);
|
|
370
416
|
}
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
417
|
+
const key = ObjectList.combineScopeAndHash(obj);
|
|
418
|
+
if (added.has(key)) return;
|
|
419
|
+
added.add(key);
|
|
420
|
+
if (!objectListPerScope[obj.scope]) objectListPerScope[obj.scope] = new ObjectList();
|
|
421
|
+
objectListPerScope[obj.scope].objects.push(obj);
|
|
376
422
|
});
|
|
377
423
|
return objectListPerScope;
|
|
378
424
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_tarStream","data","_interopRequireDefault","require","_toolboxPromise","_lodash","_stream","_crypto","_object","_bitObjectList","_ref","_legacy","_harmonyModules","_models","_legacy2","e","__esModule","default","ownKeys","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_toPropertyKey","value","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","TAR_STREAM_ERROR_FILENAME","OBJECT_LIST_CURRENT_SCHEMA","TAR_STREAM_START_FILENAME","TAR_STREAM_END_FILENAME","FETCH_FORMAT_OBJECT_LIST","exports","ObjectList","constructor","objects","count","getSha1Hash","hash","crypto","createHash","obj","update","Uint8Array","buffer","digest","mergeMultipleInstances","objectLists","objectList","objList","mergeObjectList","addIfNotExist","fromJsonString","jsonStr","jsonParsed","JSON","parse","Array","isArray","Error","ref","Ref","Buffer","from","toJsonString","stringify","toTar","pack","tarStream","entry","name","combineScopeAndHash","finalize","toReadableStream","Readable","fromTar","packStream","extract","objectItems","Promise","resolve","reject","on","header","stream","next","chunk","extractScopeAndHash","concat","err","resume","pipe","fromTarToObjectStream","passThrough","PassThrough","objectMode","startData","endData","allData","emit","toString","logger","debug","write","schema","end","pipeline","error","fromObjectStreamToTar","readable","scopeName","startFile","numOfFiles","endFile","errorMessage","message","fromReadableStream","nameSplit","split","hasScope","scope","undefined","objectItem","exists","find","object","isEqual","toBitObjects","throwForUnknownTypes","concurrency","concurrentIOLimit","bitObjects","pMapPool","BitObject","parseObject","UnknownObjectType","type","BitObjectList","compact","fromBitObjects","compress","getType","addScopeName","splitByScopeName","objectListPerScope","ExportMetadata","toConsoleLog","console","log","map","join"],"sources":["object-list.ts"],"sourcesContent":["import tarStream from 'tar-stream';\nimport { pMapPool } from '@teambit/toolbox.promise.map-pool';\nimport { compact } from 'lodash';\nimport { Readable, PassThrough, pipeline } from 'stream';\nimport crypto from 'crypto';\nimport BitObject from './object';\nimport { BitObjectList } from './bit-object-list';\nimport Ref from './ref';\nimport { logger } from '@teambit/legacy.logger';\nimport { concurrentIOLimit } from '@teambit/harmony.modules.concurrency';\nimport { ExportMetadata } from '../models';\nimport { UnknownObjectType } from '@teambit/legacy.scope';\n\n/**\n * when error occurred during streaming between HTTP server and client, there is no good way to\n * indicate this other than sending a new file with a special name and the error message.\n */\nconst TAR_STREAM_ERROR_FILENAME = '.BIT.ERROR';\n/**\n * schema 1.0.0 - added the start and end file with basic info\n */\nconst OBJECT_LIST_CURRENT_SCHEMA = '1.0.0';\nconst TAR_STREAM_START_FILENAME = '.BIT.START';\nconst TAR_STREAM_END_FILENAME = '.BIT.END';\n\ntype StartFile = {\n schema: string;\n scopeName: string;\n};\ntype EndFile = {\n numOfFiles: number;\n scopeName: string;\n};\n\nexport type ObjectItem = {\n ref: Ref;\n buffer: Buffer; // zlib deflated BitObject\n type?: string; // for future use. e.g. to be able to export only Component/Version types but not Source/Artifact, etc.\n scope?: string; // used for the export process\n};\n\nexport const FETCH_FORMAT_OBJECT_LIST = 'ObjectList';\n\n/**\n * Stream.Readable that operates with objectMode, while each 'data' event emits one ObjectItem object.\n */\nexport type ObjectItemsStream = Readable;\n\nexport class ObjectList {\n constructor(public objects: ObjectItem[] = []) {}\n\n count() {\n return this.objects.length;\n }\n\n /**\n * Generates a SHA1 hash from all object buffers.\n * Used to identify duplicate export requests during retries.\n * Performance wise, it's not too bad. ~98ms for 150 components on CircleCI.\n */\n getSha1Hash(): string {\n const hash = crypto.createHash('sha1');\n for (const obj of this.objects) {\n hash.update(new Uint8Array(obj.buffer));\n }\n return hash.digest('hex');\n }\n\n static mergeMultipleInstances(objectLists: ObjectList[]): ObjectList {\n const objectList = new ObjectList();\n objectLists.forEach((objList) => objectList.mergeObjectList(objList));\n return objectList;\n }\n mergeObjectList(objectList: ObjectList) {\n this.addIfNotExist(objectList.objects);\n }\n static fromJsonString(jsonStr: string): ObjectList {\n const jsonParsed = JSON.parse(jsonStr);\n if (!Array.isArray(jsonParsed)) {\n throw new Error(`fromJsonString expect an array, got ${typeof jsonParsed}`);\n }\n jsonParsed.forEach((obj) => {\n obj.ref = new Ref(obj.ref.hash);\n obj.buffer = Buffer.from(obj.buffer);\n });\n return new ObjectList(jsonParsed);\n }\n toJsonString(): string {\n return JSON.stringify(this.objects);\n }\n toTar(): NodeJS.ReadableStream {\n const pack = tarStream.pack();\n this.objects.forEach((obj) => {\n pack.entry({ name: ObjectList.combineScopeAndHash(obj) }, obj.buffer);\n });\n pack.finalize();\n return pack;\n }\n toReadableStream(): ObjectItemsStream {\n return Readable.from(this.objects);\n }\n static async fromTar(packStream: NodeJS.ReadableStream): Promise<ObjectList> {\n const extract = tarStream.extract();\n const objectItems: ObjectItem[] = await new Promise((resolve, reject) => {\n const objects: ObjectItem[] = [];\n extract.on('entry', (header, stream, next) => {\n const data: Buffer[] = [];\n stream.on('data', (chunk) => {\n data.push(chunk);\n });\n stream.on('end', () => {\n objects.push({\n ...ObjectList.extractScopeAndHash(header.name),\n buffer: Buffer.concat(data as unknown as Uint8Array[]),\n });\n next(); // ready for next entry\n });\n stream.on('error', (err) => reject(err));\n\n stream.resume(); // just auto drain the stream\n });\n\n extract.on('finish', () => {\n resolve(objects);\n });\n\n packStream.pipe(extract);\n });\n return new ObjectList(objectItems);\n }\n\n static fromTarToObjectStream(packStream: NodeJS.ReadableStream): ObjectItemsStream {\n const passThrough = new PassThrough({ objectMode: true });\n const extract = tarStream.extract();\n let startData: StartFile | undefined;\n let endData: EndFile | undefined;\n extract.on('entry', (header, stream, next) => {\n const data: Buffer[] = [];\n stream.on('data', (chunk) => {\n data.push(chunk);\n });\n stream.on('end', () => {\n const allData = Buffer.concat(data as unknown as Uint8Array[]);\n if (header.name === TAR_STREAM_ERROR_FILENAME) {\n passThrough.emit('error', new Error(allData.toString()));\n return;\n }\n if (header.name === TAR_STREAM_START_FILENAME) {\n startData = JSON.parse(allData.toString());\n logger.debug('fromTarToObjectStream, start getting data', startData);\n next();\n return;\n }\n if (header.name === TAR_STREAM_END_FILENAME) {\n endData = JSON.parse(allData.toString());\n logger.debug('fromTarToObjectStream, finished getting data', endData);\n next();\n return;\n }\n passThrough.write({ ...ObjectList.extractScopeAndHash(header.name), buffer: allData });\n next(); // ready for next entry\n });\n stream.on('error', (err) => {\n passThrough.emit('error', err);\n });\n\n stream.resume(); // just auto drain the stream\n });\n\n // not sure if needed\n extract.on('error', (err) => {\n passThrough.emit('error', err);\n });\n\n extract.on('finish', () => {\n if (startData?.schema === OBJECT_LIST_CURRENT_SCHEMA && !endData) {\n // wasn't able to find a better way to indicate whether the server aborted the request\n // see https://github.com/node-fetch/node-fetch/issues/1117\n passThrough.emit(\n 'error',\n new Error(`server terminated the stream unexpectedly (metadata: ${JSON.stringify(startData)})`)\n );\n }\n passThrough.end();\n });\n pipeline(packStream, extract, (err) => {\n if (err) {\n logger.error('fromTarToObjectStream, pipeline', err);\n passThrough.emit('error', err);\n } else {\n logger.debug('fromTarToObjectStream, pipeline is completed');\n }\n });\n\n return passThrough;\n }\n\n static fromObjectStreamToTar(readable: Readable, scopeName: string) {\n const pack = tarStream.pack();\n const startFile: StartFile = { schema: OBJECT_LIST_CURRENT_SCHEMA, scopeName };\n logger.debug('fromObjectStreamToTar, start sending data', startFile);\n pack.entry({ name: TAR_STREAM_START_FILENAME }, JSON.stringify(startFile));\n let numOfFiles = 0;\n readable.on('data', (obj: ObjectItem) => {\n numOfFiles += 1;\n pack.entry({ name: ObjectList.combineScopeAndHash(obj) }, obj.buffer);\n });\n readable.on('end', () => {\n const endFile: EndFile = { numOfFiles, scopeName };\n logger.debug('fromObjectStreamToTar, finished sending data', endFile);\n pack.entry({ name: TAR_STREAM_END_FILENAME }, JSON.stringify(endFile));\n pack.finalize();\n });\n readable.on('error', (err) => {\n const errorMessage = err.message || `unexpected error (${err.name})`;\n logger.error(`ObjectList.fromObjectStreamToTar, streaming an error as a file`, err);\n pack.entry({ name: TAR_STREAM_ERROR_FILENAME }, errorMessage);\n pack.finalize();\n });\n return pack;\n }\n\n static async fromReadableStream(readable: ObjectItemsStream): Promise<ObjectList> {\n const objectItems: ObjectItem[] = [];\n for await (const obj of readable) {\n objectItems.push(obj);\n }\n return new ObjectList(objectItems);\n }\n\n /**\n * the opposite of this.combineScopeAndHash\n */\n static extractScopeAndHash(name: string): { scope?: string; ref: Ref } {\n const nameSplit = name.split('/');\n const hasScope = nameSplit.length > 1;\n return {\n scope: hasScope ? nameSplit[0] : undefined,\n ref: new Ref(hasScope ? nameSplit[1] : nameSplit[0]),\n };\n }\n /**\n * the opposite of this.extractScopeAndHash\n */\n static combineScopeAndHash(objectItem: ObjectItem): string {\n const scope = objectItem.scope ? `${objectItem.scope}/` : '';\n return `${scope}${objectItem.ref.hash}`;\n }\n\n addIfNotExist(objectItems: ObjectItem[]) {\n objectItems.forEach((objectItem) => {\n const exists = this.objects.find(\n (object) => object.ref.isEqual(objectItem.ref) && object.scope === objectItem.scope\n );\n if (!exists) {\n this.objects.push(objectItem);\n }\n });\n }\n\n async toBitObjects(throwForUnknownTypes = false): Promise<BitObjectList> {\n const concurrency = concurrentIOLimit();\n const bitObjects = await pMapPool(\n this.objects,\n async (object) => {\n try {\n return await BitObject.parseObject(object.buffer);\n } catch (err) {\n if (throwForUnknownTypes || !(err instanceof UnknownObjectType)) {\n throw err;\n }\n logger.error(\n `toBitObjects, unable to parse object of type ${err.type}, ignoring it. please update your bit version`\n );\n return null;\n }\n },\n { concurrency }\n );\n return new BitObjectList(compact(bitObjects));\n }\n\n static async fromBitObjects(bitObjects: BitObject[]): Promise<ObjectList> {\n const concurrency = concurrentIOLimit();\n const objectItems = await pMapPool(\n bitObjects,\n async (obj) => ({\n ref: obj.hash(),\n buffer: await obj.compress(),\n type: obj.getType(),\n }),\n { concurrency }\n );\n return new ObjectList(objectItems);\n }\n\n addScopeName(scopeName: string) {\n this.objects.forEach((object) => {\n object.scope = scopeName;\n });\n }\n\n splitByScopeName(): { [scopeName: string]: ObjectList } {\n const objectListPerScope: { [scopeName: string]: ObjectList } = {};\n this.objects.forEach((obj) => {\n if (obj.type === ExportMetadata.name) {\n return; // no scope for this type. it's general for all export data from all scopes\n }\n if (!obj.scope) {\n throw new Error(`ObjectList: unable to split by scopeName, the scopeName is missing for ${obj.ref.hash}`);\n }\n if (objectListPerScope[obj.scope]) {\n objectListPerScope[obj.scope].addIfNotExist([obj]);\n } else {\n objectListPerScope[obj.scope] = new ObjectList([obj]);\n }\n });\n return objectListPerScope;\n }\n\n /**\n * helps debugging\n */\n toConsoleLog() {\n console.log(this.objects.map((o) => o.ref.hash).join('\\n')); // eslint-disable-line no-console\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_tarStream","data","_interopRequireDefault","require","_toolboxPromise","_lodash","_stream","_crypto","_object","_bitObjectList","_ref","_legacy","_harmonyModules","_models","_legacy2","e","__esModule","default","ownKeys","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_toPropertyKey","value","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","TAR_STREAM_ERROR_FILENAME","OBJECT_LIST_CURRENT_SCHEMA","TAR_STREAM_START_FILENAME","TAR_STREAM_END_FILENAME","FETCH_FORMAT_OBJECT_LIST","exports","ObjectList","constructor","objects","count","getSha1Hash","hash","crypto","createHash","obj","update","Uint8Array","buffer","digest","mergeMultipleInstances","objectLists","objectList","objList","mergeObjectList","addIfNotExist","fromJsonString","jsonStr","jsonParsed","JSON","parse","Array","isArray","Error","ref","Ref","Buffer","from","toJsonString","stringify","toTar","pack","tarStream","entry","name","combineScopeAndHash","finalize","toReadableStream","Readable","fromTar","packStream","extract","objectItems","Promise","resolve","reject","on","header","stream","next","chunk","extractScopeAndHash","concat","err","resume","pipeline","fromTarToObjectStream","passThrough","PassThrough","objectMode","startData","endData","allData","emit","toString","logger","debug","write","schema","end","error","fromObjectStreamToTar","readable","scopeName","startFile","numOfFiles","endFile","errorMessage","message","fromReadableStream","nameSplit","split","hasScope","scope","undefined","objectItem","existing","Set","map","object","key","has","add","toBitObjects","throwForUnknownTypes","bitObjectList","parseObjects","toBitObjectsWithRawSources","collectRawSources","concurrency","concurrentIOLimit","rawSources","Map","bitObjects","pMapPool","bitObject","inflatedSize","BitObject","parseObjectWithSize","getType","isEqual","set","UnknownObjectType","type","BitObjectList","compact","fromBitObjects","compress","addScopeName","splitByScopeName","objectListPerScope","added","ExportMetadata","toConsoleLog","console","log","join"],"sources":["object-list.ts"],"sourcesContent":["import tarStream from 'tar-stream';\nimport { pMapPool } from '@teambit/toolbox.promise.map-pool';\nimport { compact } from 'lodash';\nimport { Readable, PassThrough, pipeline } from 'stream';\nimport crypto from 'crypto';\nimport BitObject from './object';\nimport { BitObjectList } from './bit-object-list';\nimport Ref from './ref';\nimport { logger } from '@teambit/legacy.logger';\nimport { concurrentIOLimit } from '@teambit/harmony.modules.concurrency';\nimport { ExportMetadata } from '../models';\nimport { UnknownObjectType } from '@teambit/legacy.scope';\n\n/**\n * when error occurred during streaming between HTTP server and client, there is no good way to\n * indicate this other than sending a new file with a special name and the error message.\n */\nconst TAR_STREAM_ERROR_FILENAME = '.BIT.ERROR';\n/**\n * schema 1.0.0 - added the start and end file with basic info\n */\nconst OBJECT_LIST_CURRENT_SCHEMA = '1.0.0';\nconst TAR_STREAM_START_FILENAME = '.BIT.START';\nconst TAR_STREAM_END_FILENAME = '.BIT.END';\n\ntype StartFile = {\n schema: string;\n scopeName: string;\n};\ntype EndFile = {\n numOfFiles: number;\n scopeName: string;\n};\n\nexport type ObjectItem = {\n ref: Ref;\n buffer: Buffer; // zlib deflated BitObject\n type?: string; // for future use. e.g. to be able to export only Component/Version types but not Source/Artifact, etc.\n scope?: string; // used for the export process\n};\n\nexport const FETCH_FORMAT_OBJECT_LIST = 'ObjectList';\n\n/**\n * Stream.Readable that operates with objectMode, while each 'data' event emits one ObjectItem object.\n */\nexport type ObjectItemsStream = Readable;\n\n/**\n * compressed buffer of an object (as stored on the filesystem) and the size of its inflated content.\n */\nexport type CompressedObject = { buffer: Buffer; inflatedSize: number };\n\n/**\n * hash => compressed object\n */\nexport type RawObjectsMap = Map<BitObject, CompressedObject & { ref: Ref }>;\n\nexport class ObjectList {\n constructor(public objects: ObjectItem[] = []) {}\n\n count() {\n return this.objects.length;\n }\n\n /**\n * Generates a SHA1 hash from all object buffers.\n * Used to identify duplicate export requests during retries.\n * Performance wise, it's not too bad. ~98ms for 150 components on CircleCI.\n */\n getSha1Hash(): string {\n const hash = crypto.createHash('sha1');\n for (const obj of this.objects) {\n hash.update(new Uint8Array(obj.buffer));\n }\n return hash.digest('hex');\n }\n\n static mergeMultipleInstances(objectLists: ObjectList[]): ObjectList {\n const objectList = new ObjectList();\n objectLists.forEach((objList) => objectList.mergeObjectList(objList));\n return objectList;\n }\n mergeObjectList(objectList: ObjectList) {\n this.addIfNotExist(objectList.objects);\n }\n static fromJsonString(jsonStr: string): ObjectList {\n const jsonParsed = JSON.parse(jsonStr);\n if (!Array.isArray(jsonParsed)) {\n throw new Error(`fromJsonString expect an array, got ${typeof jsonParsed}`);\n }\n jsonParsed.forEach((obj) => {\n obj.ref = new Ref(obj.ref.hash);\n obj.buffer = Buffer.from(obj.buffer);\n });\n return new ObjectList(jsonParsed);\n }\n toJsonString(): string {\n return JSON.stringify(this.objects);\n }\n toTar(): NodeJS.ReadableStream {\n const pack = tarStream.pack();\n this.objects.forEach((obj) => {\n pack.entry({ name: ObjectList.combineScopeAndHash(obj) }, obj.buffer);\n });\n pack.finalize();\n return pack;\n }\n toReadableStream(): ObjectItemsStream {\n return Readable.from(this.objects);\n }\n static async fromTar(packStream: NodeJS.ReadableStream): Promise<ObjectList> {\n const extract = tarStream.extract();\n const objectItems: ObjectItem[] = await new Promise((resolve, reject) => {\n const objects: ObjectItem[] = [];\n extract.on('entry', (header, stream, next) => {\n const data: Buffer[] = [];\n stream.on('data', (chunk) => {\n data.push(chunk);\n });\n stream.on('end', () => {\n objects.push({\n ...ObjectList.extractScopeAndHash(header.name),\n buffer: Buffer.concat(data as unknown as Uint8Array[]),\n });\n next(); // ready for next entry\n });\n stream.on('error', (err) => reject(err));\n\n stream.resume(); // just auto drain the stream\n });\n\n extract.on('finish', () => {\n resolve(objects);\n });\n\n // unlike `pipe`, it rejects when the input stream fails or the extractor fails (e.g. a truncated tar).\n pipeline(packStream, extract, (err) => {\n if (err) reject(err);\n });\n });\n return new ObjectList(objectItems);\n }\n\n static fromTarToObjectStream(packStream: NodeJS.ReadableStream): ObjectItemsStream {\n const passThrough = new PassThrough({ objectMode: true });\n const extract = tarStream.extract();\n let startData: StartFile | undefined;\n let endData: EndFile | undefined;\n extract.on('entry', (header, stream, next) => {\n const data: Buffer[] = [];\n stream.on('data', (chunk) => {\n data.push(chunk);\n });\n stream.on('end', () => {\n const allData = Buffer.concat(data as unknown as Uint8Array[]);\n if (header.name === TAR_STREAM_ERROR_FILENAME) {\n passThrough.emit('error', new Error(allData.toString()));\n return;\n }\n if (header.name === TAR_STREAM_START_FILENAME) {\n startData = JSON.parse(allData.toString());\n logger.debug('fromTarToObjectStream, start getting data', startData);\n next();\n return;\n }\n if (header.name === TAR_STREAM_END_FILENAME) {\n endData = JSON.parse(allData.toString());\n logger.debug('fromTarToObjectStream, finished getting data', endData);\n next();\n return;\n }\n passThrough.write({ ...ObjectList.extractScopeAndHash(header.name), buffer: allData });\n next(); // ready for next entry\n });\n stream.on('error', (err) => {\n passThrough.emit('error', err);\n });\n\n stream.resume(); // just auto drain the stream\n });\n\n // not sure if needed\n extract.on('error', (err) => {\n passThrough.emit('error', err);\n });\n\n extract.on('finish', () => {\n if (startData?.schema === OBJECT_LIST_CURRENT_SCHEMA && !endData) {\n // wasn't able to find a better way to indicate whether the server aborted the request\n // see https://github.com/node-fetch/node-fetch/issues/1117\n passThrough.emit(\n 'error',\n new Error(`server terminated the stream unexpectedly (metadata: ${JSON.stringify(startData)})`)\n );\n }\n passThrough.end();\n });\n pipeline(packStream, extract, (err) => {\n if (err) {\n logger.error('fromTarToObjectStream, pipeline', err);\n passThrough.emit('error', err);\n } else {\n logger.debug('fromTarToObjectStream, pipeline is completed');\n }\n });\n\n return passThrough;\n }\n\n static fromObjectStreamToTar(readable: Readable, scopeName: string) {\n const pack = tarStream.pack();\n const startFile: StartFile = { schema: OBJECT_LIST_CURRENT_SCHEMA, scopeName };\n logger.debug('fromObjectStreamToTar, start sending data', startFile);\n pack.entry({ name: TAR_STREAM_START_FILENAME }, JSON.stringify(startFile));\n let numOfFiles = 0;\n readable.on('data', (obj: ObjectItem) => {\n numOfFiles += 1;\n pack.entry({ name: ObjectList.combineScopeAndHash(obj) }, obj.buffer);\n });\n readable.on('end', () => {\n const endFile: EndFile = { numOfFiles, scopeName };\n logger.debug('fromObjectStreamToTar, finished sending data', endFile);\n pack.entry({ name: TAR_STREAM_END_FILENAME }, JSON.stringify(endFile));\n pack.finalize();\n });\n readable.on('error', (err) => {\n const errorMessage = err.message || `unexpected error (${err.name})`;\n logger.error(`ObjectList.fromObjectStreamToTar, streaming an error as a file`, err);\n pack.entry({ name: TAR_STREAM_ERROR_FILENAME }, errorMessage);\n pack.finalize();\n });\n return pack;\n }\n\n static async fromReadableStream(readable: ObjectItemsStream): Promise<ObjectList> {\n const objectItems: ObjectItem[] = [];\n for await (const obj of readable) {\n objectItems.push(obj);\n }\n return new ObjectList(objectItems);\n }\n\n /**\n * the opposite of this.combineScopeAndHash\n */\n static extractScopeAndHash(name: string): { scope?: string; ref: Ref } {\n const nameSplit = name.split('/');\n const hasScope = nameSplit.length > 1;\n return {\n scope: hasScope ? nameSplit[0] : undefined,\n ref: new Ref(hasScope ? nameSplit[1] : nameSplit[0]),\n };\n }\n /**\n * the opposite of this.extractScopeAndHash\n */\n static combineScopeAndHash(objectItem: ObjectItem): string {\n const scope = objectItem.scope ? `${objectItem.scope}/` : '';\n return `${scope}${objectItem.ref.hash}`;\n }\n\n addIfNotExist(objectItems: ObjectItem[]) {\n const existing = new Set(this.objects.map((object) => ObjectList.combineScopeAndHash(object)));\n objectItems.forEach((objectItem) => {\n const key = ObjectList.combineScopeAndHash(objectItem);\n if (existing.has(key)) return;\n existing.add(key);\n this.objects.push(objectItem);\n });\n }\n\n async toBitObjects(throwForUnknownTypes = false): Promise<BitObjectList> {\n const { bitObjectList } = await this.parseObjects(throwForUnknownTypes);\n return bitObjectList;\n }\n\n /**\n * same as `toBitObjects`, but also returns the original compressed buffers of the Source objects (files/artifacts)\n * whose content matches their ref. Sources are immutable, so these buffers can be written to the filesystem as is,\n * saving the costly re-compression. (significant for components with thousands of files).\n */\n async toBitObjectsWithRawSources(): Promise<{ bitObjectList: BitObjectList; rawSources: RawObjectsMap }> {\n return this.parseObjects(false, true);\n }\n\n private async parseObjects(\n throwForUnknownTypes: boolean,\n collectRawSources = false\n ): Promise<{ bitObjectList: BitObjectList; rawSources: RawObjectsMap }> {\n const concurrency = concurrentIOLimit();\n const rawSources: RawObjectsMap = new Map();\n const bitObjects = await pMapPool(\n this.objects,\n async (object) => {\n try {\n const { object: bitObject, inflatedSize } = await BitObject.parseObjectWithSize(object.buffer);\n if (collectRawSources && bitObject.getType() === 'Source') {\n if (bitObject.hash().isEqual(object.ref)) {\n rawSources.set(bitObject, { buffer: object.buffer, inflatedSize, ref: object.ref });\n }\n }\n return bitObject;\n } catch (err) {\n if (throwForUnknownTypes || !(err instanceof UnknownObjectType)) {\n throw err;\n }\n logger.error(\n `toBitObjects, unable to parse object of type ${err.type}, ignoring it. please update your bit version`\n );\n return null;\n }\n },\n { concurrency }\n );\n return { bitObjectList: new BitObjectList(compact(bitObjects)), rawSources };\n }\n\n static async fromBitObjects(bitObjects: BitObject[]): Promise<ObjectList> {\n const concurrency = concurrentIOLimit();\n const objectItems = await pMapPool(\n bitObjects,\n async (obj) => ({\n ref: obj.hash(),\n buffer: await obj.compress(),\n type: obj.getType(),\n }),\n { concurrency }\n );\n return new ObjectList(objectItems);\n }\n\n addScopeName(scopeName: string) {\n this.objects.forEach((object) => {\n object.scope = scopeName;\n });\n }\n\n splitByScopeName(): { [scopeName: string]: ObjectList } {\n const objectListPerScope: { [scopeName: string]: ObjectList } = {};\n const added = new Set<string>();\n this.objects.forEach((obj) => {\n if (obj.type === ExportMetadata.name) {\n return; // no scope for this type. it's general for all export data from all scopes\n }\n if (!obj.scope) {\n throw new Error(`ObjectList: unable to split by scopeName, the scopeName is missing for ${obj.ref.hash}`);\n }\n const key = ObjectList.combineScopeAndHash(obj);\n if (added.has(key)) return;\n added.add(key);\n if (!objectListPerScope[obj.scope]) objectListPerScope[obj.scope] = new ObjectList();\n objectListPerScope[obj.scope].objects.push(obj);\n });\n return objectListPerScope;\n }\n\n /**\n * helps debugging\n */\n toConsoleLog() {\n console.log(this.objects.map((o) => o.ref.hash).join('\\n')); // eslint-disable-line no-console\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -6,12 +6,16 @@ import { UnmergedComponents, RemoteLanes } from '@teambit/legacy.scope';
|
|
|
6
6
|
import type { IndexType } from './scope-index';
|
|
7
7
|
import { ScopeIndex } from './scope-index';
|
|
8
8
|
import BitObject from './object';
|
|
9
|
-
import type { ObjectItem } from './object-list';
|
|
9
|
+
import type { ObjectItem, RawObjectsMap, CompressedObject } from './object-list';
|
|
10
10
|
import { ObjectList } from './object-list';
|
|
11
11
|
import BitRawObject from './raw-object';
|
|
12
12
|
import Ref from './ref';
|
|
13
13
|
import type { InMemoryCache } from '@teambit/harmony.modules.in-memory-cache';
|
|
14
14
|
type ContentTransformer = (content: Buffer) => Buffer;
|
|
15
|
+
type ObjectChownOptions = {
|
|
16
|
+
uid: number;
|
|
17
|
+
gid: number;
|
|
18
|
+
} | null;
|
|
15
19
|
/** `mtimeMs` lets a caller tell an object that has been here a while from one just written */
|
|
16
20
|
export type ObjectWithType = {
|
|
17
21
|
ref: Ref;
|
|
@@ -201,7 +205,7 @@ export default class Repository {
|
|
|
201
205
|
/**
|
|
202
206
|
* write all objects to the FS and index the components/lanes/symlink objects
|
|
203
207
|
*/
|
|
204
|
-
writeObjectsToTheFS(objects: BitObject[]): Promise<void>;
|
|
208
|
+
writeObjectsToTheFS(objects: BitObject[], rawObjects?: RawObjectsMap): Promise<void>;
|
|
205
209
|
/**
|
|
206
210
|
* do not call this method directly. always call this.removeObject() and once done with all objects,
|
|
207
211
|
* call this.persist()
|
|
@@ -212,9 +216,24 @@ export default class Repository {
|
|
|
212
216
|
* this method doesn't write to scopeIndex. so using this method for ModelComponent or
|
|
213
217
|
* Symlink makes the index outdated.
|
|
214
218
|
*/
|
|
215
|
-
_writeOne(object: BitObject
|
|
219
|
+
_writeOne(object: BitObject, raw?: CompressedObject & {
|
|
220
|
+
ref: Ref;
|
|
221
|
+
}, chownOptions?: ObjectChownOptions): Promise<void>;
|
|
216
222
|
writeObjectsToPendingDir(objectList: ObjectList, pendingDir: PathOsBasedAbsolute): Promise<void>;
|
|
217
223
|
readObjectsFromPendingDir(pendingDir: PathOsBasedAbsolute): Promise<ObjectList>;
|
|
224
|
+
/**
|
|
225
|
+
* the owner to set on written object files. `null` when the scope has no group (or it can't be resolved), in which
|
|
226
|
+
* case the owner of an existing file is kept.
|
|
227
|
+
*/
|
|
228
|
+
private getChownOptions;
|
|
229
|
+
/**
|
|
230
|
+
* writes the file atomically (tmp file + rename), the same way `writeFile` of legacy.utils does with write-file-atomic,
|
|
231
|
+
* including keeping the mode (and owner, when no chown is given) of an existing file and ignoring the same chown/chmod
|
|
232
|
+
* errors. it's called for every object, so it saves the fs calls write-file-atomic and `ensureDir` do on every write
|
|
233
|
+
* (realpath, stat of the dir, exit handlers). the parent dir is created only when the first write fails with ENOENT.
|
|
234
|
+
* the tmp file is a dotfile, which `listRefs()` ignores in case it's left behind.
|
|
235
|
+
*/
|
|
236
|
+
private writeObjectFile;
|
|
218
237
|
private hashPath;
|
|
219
238
|
}
|
|
220
239
|
export {};
|
|
@@ -46,6 +46,13 @@ function path() {
|
|
|
46
46
|
};
|
|
47
47
|
return data;
|
|
48
48
|
}
|
|
49
|
+
function _os() {
|
|
50
|
+
const data = require("os");
|
|
51
|
+
_os = function () {
|
|
52
|
+
return data;
|
|
53
|
+
};
|
|
54
|
+
return data;
|
|
55
|
+
}
|
|
49
56
|
function _toolboxPromise() {
|
|
50
57
|
const data = require("@teambit/toolbox.promise.map-pool");
|
|
51
58
|
_toolboxPromise = function () {
|
|
@@ -67,13 +74,6 @@ function _legacy2() {
|
|
|
67
74
|
};
|
|
68
75
|
return data;
|
|
69
76
|
}
|
|
70
|
-
function _legacy3() {
|
|
71
|
-
const data = require("@teambit/legacy.utils");
|
|
72
|
-
_legacy3 = function () {
|
|
73
|
-
return data;
|
|
74
|
-
};
|
|
75
|
-
return data;
|
|
76
|
-
}
|
|
77
77
|
function _glob() {
|
|
78
78
|
const data = require("glob");
|
|
79
79
|
_glob = function () {
|
|
@@ -95,9 +95,9 @@ function _harmonyModules() {
|
|
|
95
95
|
};
|
|
96
96
|
return data;
|
|
97
97
|
}
|
|
98
|
-
function
|
|
98
|
+
function _legacy3() {
|
|
99
99
|
const data = require("@teambit/legacy.scope");
|
|
100
|
-
|
|
100
|
+
_legacy3 = function () {
|
|
101
101
|
return data;
|
|
102
102
|
};
|
|
103
103
|
return data;
|
|
@@ -166,6 +166,7 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
|
|
|
166
166
|
const OBJECTS_BACKUP_DIR = `${_legacy().OBJECTS_DIR}.bak`;
|
|
167
167
|
const TRASH_DIR = 'trash';
|
|
168
168
|
const MAX_COMPRESSED_SIZE_TO_CACHE = 100 * 1024; // don't cache big files (mainly artifacts) to prevent out-of-memory
|
|
169
|
+
let objectFileWriteCounter = 0;
|
|
169
170
|
/**
|
|
170
171
|
* how much of an object file to read when all that's needed is its header. the header holds the
|
|
171
172
|
* type and is a few dozen bytes, which 512 compressed bytes always cover - and every byte past it
|
|
@@ -215,8 +216,8 @@ class Repository {
|
|
|
215
216
|
async init() {
|
|
216
217
|
const scopeIndex = await this.loadOptionallyCreateScopeIndex();
|
|
217
218
|
this.scopeIndex = scopeIndex;
|
|
218
|
-
this.remoteLanes = new (
|
|
219
|
-
this.unmergedComponents = await
|
|
219
|
+
this.remoteLanes = new (_legacy3().RemoteLanes)(this.scopePath);
|
|
220
|
+
this.unmergedComponents = await _legacy3().UnmergedComponents.load(this.scopePath);
|
|
220
221
|
}
|
|
221
222
|
static async create({
|
|
222
223
|
scopePath,
|
|
@@ -225,8 +226,8 @@ class Repository {
|
|
|
225
226
|
const repository = new Repository(scopePath, scopeJson);
|
|
226
227
|
const scopeIndex = _scopeIndex().ScopeIndex.create(scopePath);
|
|
227
228
|
repository.scopeIndex = scopeIndex;
|
|
228
|
-
repository.unmergedComponents = await
|
|
229
|
-
repository.remoteLanes = new (
|
|
229
|
+
repository.unmergedComponents = await _legacy3().UnmergedComponents.load(scopePath);
|
|
230
|
+
repository.remoteLanes = new (_legacy3().RemoteLanes)(scopePath);
|
|
230
231
|
return repository;
|
|
231
232
|
}
|
|
232
233
|
static reset(scopePath) {
|
|
@@ -490,7 +491,7 @@ class Repository {
|
|
|
490
491
|
type = await this.readTypeFromHeader(objectPath);
|
|
491
492
|
} catch (err) {
|
|
492
493
|
// an unregistered type is not one of the types asked for - the same answer the full read gives
|
|
493
|
-
if (err instanceof
|
|
494
|
+
if (err instanceof _legacy3().UnknownObjectType) return null;
|
|
494
495
|
throw err;
|
|
495
496
|
}
|
|
496
497
|
if (type && !typeNames.includes(type)) return null;
|
|
@@ -568,7 +569,7 @@ class Repository {
|
|
|
568
569
|
this.scopeIndex.removeMany(missingIndexItems.map(item => new (_ref().default)(item.hash)));
|
|
569
570
|
await this.scopeIndex.write();
|
|
570
571
|
const missingStringified = missingIndexItems.map(item => item.toIdentifierString());
|
|
571
|
-
throw new (
|
|
572
|
+
throw new (_legacy3().OutdatedIndexJson)(missingStringified);
|
|
572
573
|
}
|
|
573
574
|
return (0, _lodash().compact)(bitObjects);
|
|
574
575
|
}
|
|
@@ -653,7 +654,7 @@ class Repository {
|
|
|
653
654
|
return _object().default.parseSync(transformedContent);
|
|
654
655
|
} catch {
|
|
655
656
|
if (throws) {
|
|
656
|
-
throw new (
|
|
657
|
+
throw new (_legacy3().HashNotFound)(ref.toString());
|
|
657
658
|
}
|
|
658
659
|
// @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
|
|
659
660
|
return null;
|
|
@@ -870,12 +871,13 @@ class Repository {
|
|
|
870
871
|
/**
|
|
871
872
|
* write all objects to the FS and index the components/lanes/symlink objects
|
|
872
873
|
*/
|
|
873
|
-
async writeObjectsToTheFS(objects) {
|
|
874
|
+
async writeObjectsToTheFS(objects, rawObjects) {
|
|
874
875
|
const count = objects.length;
|
|
875
876
|
if (!count) return;
|
|
876
877
|
_legacy2().logger.trace(`Repository.writeObjectsToTheFS: started writing ${count} objects`);
|
|
877
878
|
const concurrency = (0, _harmonyModules().concurrentIOLimit)();
|
|
878
|
-
|
|
879
|
+
const chownOptions = await this.getChownOptions();
|
|
880
|
+
await (0, _toolboxPromise().pMapPool)(objects, obj => this._writeOne(obj, rawObjects?.get(obj), chownOptions), {
|
|
879
881
|
concurrency
|
|
880
882
|
});
|
|
881
883
|
_legacy2().logger.trace(`Repository.writeObjectsToTheFS: completed writing ${count} objects`);
|
|
@@ -899,19 +901,20 @@ class Repository {
|
|
|
899
901
|
* this method doesn't write to scopeIndex. so using this method for ModelComponent or
|
|
900
902
|
* Symlink makes the index outdated.
|
|
901
903
|
*/
|
|
902
|
-
async _writeOne(object) {
|
|
904
|
+
async _writeOne(object, raw, chownOptions) {
|
|
905
|
+
// when the already-compressed buffer of an unchanged object is available, skip the costly re-compression.
|
|
903
906
|
const {
|
|
904
907
|
buffer: contents,
|
|
905
908
|
inflatedSize
|
|
906
|
-
} = await object.compressWithSize();
|
|
907
|
-
const options =
|
|
908
|
-
|
|
909
|
-
const hash = object.hash();
|
|
909
|
+
} = raw || (await object.compressWithSize());
|
|
910
|
+
const options = chownOptions === undefined ? await this.getChownOptions() : chownOptions;
|
|
911
|
+
// hashing a Source is sha1 of its content. the raw buffer's ref was already checked against it.
|
|
912
|
+
const hash = raw?.ref || object.hash();
|
|
910
913
|
const objectPath = this.objectPath(hash);
|
|
911
914
|
_legacy2().logger.trace(`repository._writeOne: ${objectPath}`);
|
|
912
915
|
// Run hook to transform content pre persisting
|
|
913
916
|
const transformedContent = this.onPersist(contents);
|
|
914
|
-
await
|
|
917
|
+
await this.writeObjectFile(objectPath, transformedContent, options);
|
|
915
918
|
// once written, the object is the up-to-date one. this also replaces the size-estimate of objects that
|
|
916
919
|
// were cached by `add()`.
|
|
917
920
|
if (this.cache.has(hash.toString())) this.cache.set(hash.toString(), object, inflatedSize);
|
|
@@ -926,24 +929,78 @@ class Repository {
|
|
|
926
929
|
const ref = object.ref.toString();
|
|
927
930
|
if (!(0, _componentVersion().isSnap)(ref)) throw new (_bitError().BitError)(`invalid object ref: ${JSON.stringify(ref)}`);
|
|
928
931
|
}
|
|
929
|
-
const
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
await (0, _legacy3().writeFile)(objPath, object.buffer, options);
|
|
934
|
-
}));
|
|
932
|
+
const chownOptions = await this.getChownOptions();
|
|
933
|
+
await (0, _toolboxPromise().pMapPool)(objectList.objects, object => this.writeObjectFile(path().join(pendingDir, this.hashPath(object.ref)), object.buffer, chownOptions), {
|
|
934
|
+
concurrency: (0, _harmonyModules().concurrentIOLimit)()
|
|
935
|
+
});
|
|
935
936
|
}
|
|
936
937
|
async readObjectsFromPendingDir(pendingDir) {
|
|
937
938
|
const refs = await this.listRefs(pendingDir);
|
|
938
|
-
const objects = await
|
|
939
|
+
const objects = await (0, _toolboxPromise().pMapPool)(refs, async ref => {
|
|
939
940
|
const buffer = await _fsExtra().default.readFile(path().join(pendingDir, this.hashPath(ref)));
|
|
940
941
|
return {
|
|
941
942
|
ref,
|
|
942
943
|
buffer
|
|
943
944
|
};
|
|
944
|
-
}
|
|
945
|
+
}, {
|
|
946
|
+
concurrency: (0, _harmonyModules().concurrentIOLimit)()
|
|
947
|
+
});
|
|
945
948
|
return new (_objectList().ObjectList)(objects);
|
|
946
949
|
}
|
|
950
|
+
|
|
951
|
+
/**
|
|
952
|
+
* the owner to set on written object files. `null` when the scope has no group (or it can't be resolved), in which
|
|
953
|
+
* case the owner of an existing file is kept.
|
|
954
|
+
*/
|
|
955
|
+
async getChownOptions() {
|
|
956
|
+
if (!this.scopeJson.groupName) return null;
|
|
957
|
+
const gid = await resolveGroupId(this.scopeJson.groupName);
|
|
958
|
+
return gid ? {
|
|
959
|
+
uid: (0, _os().userInfo)().uid,
|
|
960
|
+
gid
|
|
961
|
+
} : null;
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
/**
|
|
965
|
+
* writes the file atomically (tmp file + rename), the same way `writeFile` of legacy.utils does with write-file-atomic,
|
|
966
|
+
* including keeping the mode (and owner, when no chown is given) of an existing file and ignoring the same chown/chmod
|
|
967
|
+
* errors. it's called for every object, so it saves the fs calls write-file-atomic and `ensureDir` do on every write
|
|
968
|
+
* (realpath, stat of the dir, exit handlers). the parent dir is created only when the first write fails with ENOENT.
|
|
969
|
+
* the tmp file is a dotfile, which `listRefs()` ignores in case it's left behind.
|
|
970
|
+
*/
|
|
971
|
+
async writeObjectFile(filePath, contents, chownOptions) {
|
|
972
|
+
const existing = await _fsExtra().default.stat(filePath).catch(() => undefined);
|
|
973
|
+
const mode = existing?.mode;
|
|
974
|
+
// process.getuid is undefined on Windows, where there's no owner to keep.
|
|
975
|
+
const keepOwner = existing && typeof process.getuid === 'function' ? {
|
|
976
|
+
uid: existing.uid,
|
|
977
|
+
gid: existing.gid
|
|
978
|
+
} : null;
|
|
979
|
+
const chown = chownOptions || keepOwner;
|
|
980
|
+
objectFileWriteCounter += 1;
|
|
981
|
+
const tmpPath = path().join(path().dirname(filePath), `.${path().basename(filePath)}.${process.pid}.${objectFileWriteCounter}`);
|
|
982
|
+
try {
|
|
983
|
+
try {
|
|
984
|
+
await _fsExtra().default.writeFile(tmpPath, contents, {
|
|
985
|
+
mode
|
|
986
|
+
});
|
|
987
|
+
} catch (err) {
|
|
988
|
+
if (err.code !== 'ENOENT') throw err;
|
|
989
|
+
await _fsExtra().default.mkdir(path().dirname(filePath), {
|
|
990
|
+
recursive: true
|
|
991
|
+
});
|
|
992
|
+
await _fsExtra().default.writeFile(tmpPath, contents, {
|
|
993
|
+
mode
|
|
994
|
+
});
|
|
995
|
+
}
|
|
996
|
+
if (chown) await _fsExtra().default.chown(tmpPath, chown.uid, chown.gid).catch(throwUnlessChownErrOk);
|
|
997
|
+
if (mode) await _fsExtra().default.chmod(tmpPath, mode).catch(throwUnlessChownErrOk);
|
|
998
|
+
await _fsExtra().default.rename(tmpPath, filePath);
|
|
999
|
+
} catch (err) {
|
|
1000
|
+
await _fsExtra().default.remove(tmpPath).catch(() => {});
|
|
1001
|
+
throw err;
|
|
1002
|
+
}
|
|
1003
|
+
}
|
|
947
1004
|
hashPath(ref) {
|
|
948
1005
|
const hash = ref.toString();
|
|
949
1006
|
return path().join(hash.slice(0, 2), hash.slice(2));
|
|
@@ -988,6 +1045,16 @@ async function removeFile(filePath, propagateDirs = false) {
|
|
|
988
1045
|
await (0, _toolboxFs().removeEmptyDir)(dir);
|
|
989
1046
|
return true;
|
|
990
1047
|
}
|
|
1048
|
+
|
|
1049
|
+
/**
|
|
1050
|
+
* same as write-file-atomic: a non-root user can't always chown/chmod, and it's not an error.
|
|
1051
|
+
*/
|
|
1052
|
+
function throwUnlessChownErrOk(err) {
|
|
1053
|
+
if (err.code === 'ENOSYS') return;
|
|
1054
|
+
const nonRoot = !process.getuid || process.getuid() !== 0;
|
|
1055
|
+
if (nonRoot && (err.code === 'EINVAL' || err.code === 'EPERM')) return;
|
|
1056
|
+
throw err;
|
|
1057
|
+
}
|
|
991
1058
|
async function resolveGroupId(groupName) {
|
|
992
1059
|
// unix group ids are meaningless on Windows, which has no /etc/group and no process.getgid
|
|
993
1060
|
if (!process.getgid) return null;
|