@teambit/objects 0.0.703 → 0.0.704
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 +26 -26
- /package/dist/{preview-1790963186429.js → preview-1790967211144.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_fsExtra","data","_interopRequireDefault","require","_asyncMutex","_lodash","_bitError","_componentVersion","path","_interopRequireWildcard","_toolboxPromise","_legacy","_legacy2","_legacy3","_glob","_toolboxFs","_harmonyModules","_legacy4","_scopeIndex","_object","_objectList","_rawObject","_ref","_liveObjects","_harmonyModules2","_models","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_defineProperty","_toPropertyKey","value","enumerable","configurable","writable","_toPrimitive","Symbol","toPrimitive","TypeError","String","Number","OBJECTS_BACKUP_DIR","OBJECTS_DIR","TRASH_DIR","MAX_COMPRESSED_SIZE_TO_CACHE","OBJECT_HEADER_CHUNK_SIZE","Repository","constructor","scopePath","scopeJson","LiveObjects","onRead","content","onPostObjectRead","onPersist","onPreObjectPersist","cache","createInMemoryCache","getCacheOptionsForObjects","persistMutex","_persistMutex","Mutex","load","repository","init","scopeIndex","loadOptionallyCreateScopeIndex","remoteLanes","RemoteLanes","unmergedComponents","UnmergedComponents","create","ScopeIndex","reset","getPathByScopePath","join","reLoadScopeIndex","reloadScopeIndexIfNeed","force","latestScopeIndex","currentAllScopeIndexItems","getAll","latestAllScopeIndexItems","length","differenceWith","isEqual","ensureDir","fs","getPath","getBackupPath","dirName","backupPath","getTrashDir","getLicense","getPopulatedLicense","getScopeMetaObject","license","object","ScopeMeta","fromObject","name","ref","hash","buffer","compress","objectPath","hashPath","pathExists","hasMultiple","refs","concurrency","concurrentIOLimit","existingRefs","pMapPool","compact","throws","inMemoryObjects","objects","toString","HASH_SIZE","getFullRefFromShortHash","cached","getCache","fileContentsRaw","readFile","err","code","logger","error","message","trace","msg","assign","stack","Error","compressedSize","byteLength","fileContents","parsedObject","inflatedSize","BitObject","parseObjectWithSize","setCache","liveObjects","list","types","listRefs","debug","map","loadGracefully","process","argv","includes","isTypeIncluded","obj","some","type","loadRefDeleteIfInvalid","loadRefOnlyIfType","push","onCompletedChunk","completed","listObjectsWithType","results","getObjectTypeGracefully","result","unreadable","warn","stat","readObjectType","size","mtimeMs","readInFull","parseObjectType","isContentTransformed","readTypeFromHeader","hasPostObjectReadTransformer","Boolean","chunk","Uint8Array","fileDescriptor","open","bytesRead","read","close","parseObjectTypeFromChunk","subarray","moveOneObjectToTrash","undefined","typeNames","UnknownObjectType","parseObjectOnlyIfType","cwd","matches","glob","str","replace","sep","isSnap","Ref","listRefsStartWith","shortHash","pathPrefix","listRawObjects","loadRaw","bitRawObject","BitRawObject","fromDeflatedBuffer","listObjectsFromIndex","indexType","filter","hashes","getHashesByQuery","getHashes","_getBitObjectsByHashes","getHashFromIndex","missingIndexItems","bitObjects","Promise","all","bitObject","indexItem","find","removeMany","item","write","missingStringified","toIdentifierString","OutdatedIndexJson","ModelComponent","Lane","added","addMany","raw","transformedContent","loadManyRaw","uniqRefs","uniqBy","loadManyRawIgnoreMissing","loadRawObject","loadSync","objectFile","readFileSync","parseSync","HashNotFound","key","live","cacheable","removeFromCache","delete","clearCache","clearObjectsFromCache","deleteAll","clear","backup","backupDir","objectsDir","emptyDirSync","copySync","add","forEach","removeObject","objectsToRemove","removeManyObjects","findMany","persist","validate","runExclusive","deleteObjectsFromFS","validateObjects","values","writeObjectsToTheFS","writeRemoteLanes","clearObjects","onPostObjectsPersist","catch","validateBeforePersist","_deleteOne","removed","moveObjectsToDir","dir","moveOneObjectToDir","moveObjectsToTrash","listTrash","getFromTrash","objectsFromTrash","trashObjPath","BitError","parseObject","restoreFromTrash","restoreFromDir","overwrite","copy","currentPath","absDir","fullPath","move","deleteRecordsFromUnmergedComponents","compIds","removeMultipleComponents","count","_writeOne","pathToDelete","removeFile","contents","compressWithSize","options","groupName","gid","resolveGroupId","writeFile","writeObjectsToPendingDir","objectList","pendingDir","JSON","stringify","objPath","readObjectsFromPendingDir","ObjectList","slice","exports","filePath","propagateDirs","unlink","parse","removeEmptyDir","getgid","groupFileContent","groupLine","split","line","isNaN"],"sources":["repository.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport { Mutex } from 'async-mutex';\nimport { compact, uniqBy, differenceWith, isEqual } from 'lodash';\nimport { BitError } from '@teambit/bit-error';\nimport type { ComponentID } from '@teambit/component-id';\nimport { HASH_SIZE, isSnap } from '@teambit/component-version';\nimport * as path from 'path';\nimport { pMapPool } from '@teambit/toolbox.promise.map-pool';\nimport { OBJECTS_DIR } from '@teambit/legacy.constants';\nimport { logger } from '@teambit/legacy.logger';\nimport type { ChownOptions, PathOsBasedAbsolute } from '@teambit/legacy.utils';\nimport { writeFile } from '@teambit/legacy.utils';\nimport { glob } from 'glob';\nimport { removeEmptyDir } from '@teambit/toolbox.fs.remove-empty-dir';\nimport { concurrentIOLimit } from '@teambit/harmony.modules.concurrency';\nimport type { Types, ScopeJson } from '@teambit/legacy.scope';\nimport {\n HashNotFound,\n OutdatedIndexJson,\n UnknownObjectType,\n UnmergedComponents,\n RemoteLanes,\n} from '@teambit/legacy.scope';\nimport type { IndexType, IndexItem } from './scope-index';\nimport { ScopeIndex } from './scope-index';\nimport BitObject from './object';\nimport type { ObjectItem } from './object-list';\nimport { ObjectList } from './object-list';\nimport BitRawObject from './raw-object';\nimport Ref from './ref';\nimport { LiveObjects } from './live-objects';\nimport type { InMemoryCache } from '@teambit/harmony.modules.in-memory-cache';\nimport { getCacheOptionsForObjects, createInMemoryCache } from '@teambit/harmony.modules.in-memory-cache';\nimport { ScopeMeta, Lane, ModelComponent } from '../models';\n\ntype ContentTransformer = (content: Buffer) => Buffer;\nconst OBJECTS_BACKUP_DIR = `${OBJECTS_DIR}.bak`;\nconst TRASH_DIR = 'trash';\nconst MAX_COMPRESSED_SIZE_TO_CACHE = 100 * 1024; // don't cache big files (mainly artifacts) to prevent out-of-memory\n/**\n * how much of an object file to read when all that's needed is its header. the header holds the\n * type and is a few dozen bytes, which 512 compressed bytes always cover - and every byte past it\n * is inflated for nothing (4KB inflates ten times as much, across every object in the scope). a\n * chunk that falls short anyway is read in full.\n */\nconst OBJECT_HEADER_CHUNK_SIZE = 512;\n\n/** `mtimeMs` lets a caller tell an object that has been here a while from one just written */\nexport type ObjectWithType = { ref: Ref; type: string; size: number; mtimeMs: number };\n/** `unreadable` holds the objects that couldn't be classified, so a caller can refuse to act on a partial inventory */\nexport type ObjectsWithType = { objects: ObjectWithType[]; unreadable: Ref[] };\n\nexport default class Repository {\n objects: { [key: string]: BitObject } = {};\n objectsToRemove: Ref[] = [];\n scopeJson: ScopeJson;\n onRead: ContentTransformer;\n onPersist: ContentTransformer;\n scopePath: string;\n scopeIndex: ScopeIndex;\n protected cache: InMemoryCache<BitObject>;\n private liveObjects = new LiveObjects();\n remoteLanes!: RemoteLanes;\n unmergedComponents!: UnmergedComponents;\n _persistMutex?: Mutex;\n constructor(scopePath: string, scopeJson: ScopeJson) {\n this.scopePath = scopePath;\n this.scopeJson = scopeJson;\n this.onRead = (content: Buffer) => Repository.onPostObjectRead?.(content) || content;\n this.onPersist = (content: Buffer) => Repository.onPreObjectPersist?.(content) || content;\n this.cache = createInMemoryCache(getCacheOptionsForObjects());\n }\n\n get persistMutex() {\n if (!this._persistMutex) {\n this._persistMutex = new Mutex();\n }\n return this._persistMutex;\n }\n\n static async load({ scopePath, scopeJson }: { scopePath: string; scopeJson: ScopeJson }): Promise<Repository> {\n const repository = new Repository(scopePath, scopeJson);\n await repository.init();\n return repository;\n }\n\n async init() {\n const scopeIndex = await this.loadOptionallyCreateScopeIndex();\n this.scopeIndex = scopeIndex;\n this.remoteLanes = new RemoteLanes(this.scopePath);\n this.unmergedComponents = await UnmergedComponents.load(this.scopePath);\n }\n\n static async create({ scopePath, scopeJson }: { scopePath: string; scopeJson: ScopeJson }): Promise<Repository> {\n const repository = new Repository(scopePath, scopeJson);\n const scopeIndex = ScopeIndex.create(scopePath);\n repository.scopeIndex = scopeIndex;\n repository.unmergedComponents = await UnmergedComponents.load(scopePath);\n repository.remoteLanes = new RemoteLanes(scopePath);\n return repository;\n }\n\n static reset(scopePath: string): Promise<void> {\n return ScopeIndex.reset(scopePath);\n }\n\n static getPathByScopePath(scopePath: string) {\n return path.join(scopePath, OBJECTS_DIR);\n }\n\n static onPostObjectsPersist: () => Promise<void>;\n\n /**\n * Hook for transforming content before objects are persisted to the filesystem.\n * Note: This function cannot be async because it's used by the synchronous `loadSync` method\n * which needs to maintain sync behavior for compatibility with existing code.\n */\n static onPreObjectPersist?: (content: Buffer) => Buffer;\n\n /**\n * Hook for transforming content after objects are read from the filesystem.\n * Note: This function cannot be async because it's used by the synchronous `loadSync` method\n * which needs to maintain sync behavior for compatibility with existing code.\n */\n static onPostObjectRead?: (content: Buffer) => Buffer;\n\n /**\n * whether `onPostObjectRead` actually transforms anything.\n *\n * the scope aspect installs the hook above unconditionally - it's a reduce over a slot that is\n * usually empty - so the hook being set says nothing about whether object content is transformed.\n * only a caller that can skip reading content altogether needs to tell the two apart.\n */\n static hasPostObjectReadTransformer?: () => boolean;\n\n async reLoadScopeIndex() {\n this.scopeIndex = await this.loadOptionallyCreateScopeIndex();\n }\n\n /**\n * current scope index difference with <scope_folder>/index.json content, reload it\n * @deprecated use Scope aspect `watchSystemFiles` instead, it's way more efficient.\n */\n public async reloadScopeIndexIfNeed(force = false) {\n const latestScopeIndex = await this.loadOptionallyCreateScopeIndex();\n if (force) {\n this.scopeIndex = latestScopeIndex;\n return;\n }\n\n const currentAllScopeIndexItems = this.scopeIndex.getAll();\n const latestAllScopeIndexItems = latestScopeIndex.getAll();\n\n if (currentAllScopeIndexItems.length !== latestAllScopeIndexItems.length) {\n this.scopeIndex = latestScopeIndex;\n return;\n }\n\n if (differenceWith(currentAllScopeIndexItems, latestAllScopeIndexItems, isEqual).length) {\n this.scopeIndex = latestScopeIndex;\n }\n }\n\n ensureDir() {\n return fs.ensureDir(this.getPath());\n }\n\n getPath() {\n return Repository.getPathByScopePath(this.scopePath);\n }\n\n getBackupPath(dirName?: string): string {\n const backupPath = path.join(this.scopePath, OBJECTS_BACKUP_DIR);\n return dirName ? path.join(backupPath, dirName) : backupPath;\n }\n\n getTrashDir() {\n return path.join(this.scopePath, TRASH_DIR);\n }\n\n getLicense(): Promise<string> {\n // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!\n return this.scopeJson.getPopulatedLicense();\n }\n\n async getScopeMetaObject(): Promise<ObjectItem> {\n const license = await this.getLicense();\n const object = ScopeMeta.fromObject({ license, name: this.scopeJson.name });\n return { ref: object.hash(), buffer: await object.compress() };\n }\n\n objectPath(ref: Ref): string {\n return path.join(this.getPath(), this.hashPath(ref));\n }\n\n async has(ref: Ref): Promise<boolean> {\n const objectPath = this.objectPath(ref);\n return fs.pathExists(objectPath);\n }\n\n async hasMultiple(refs: Ref[]): Promise<Ref[]> {\n const concurrency = concurrentIOLimit();\n const existingRefs = await pMapPool(\n refs,\n async (ref) => {\n const pathExists = await this.has(ref);\n return pathExists ? ref : null;\n },\n { concurrency }\n );\n return compact(existingRefs);\n }\n\n async load(ref: Ref, throws = false): Promise<BitObject> {\n // during tag, the updated objects are in `this.objects`.\n // `this.cache` is less reliable, because if it reaches its max, then it loads from the filesystem, which may not\n // be there yet (in case of \"version\" object), or may be out-of-date (in case of \"component\" object).\n const inMemoryObjects = this.objects[ref.hash.toString()];\n if (inMemoryObjects) return inMemoryObjects;\n if (ref.hash.length < HASH_SIZE) {\n ref = await this.getFullRefFromShortHash(ref);\n }\n const cached = this.getCache(ref);\n if (cached) {\n return cached;\n }\n let fileContentsRaw: Buffer;\n const objectPath = this.objectPath(ref);\n try {\n fileContentsRaw = await fs.readFile(objectPath);\n } catch (err: any) {\n if (err.code !== 'ENOENT') {\n logger.error(`Failed reading a ref file ${objectPath}. Error: ${err.message}`);\n throw err;\n }\n logger.trace(`Failed finding a ref file ${objectPath}.`);\n if (throws) {\n // if we just `throw err` we loose the stack trace.\n // see https://stackoverflow.com/questions/68022123/no-stack-in-fs-promises-readfile-enoent-error\n const msg = `fatal: failed finding an object file ${objectPath} in the filesystem at ${err.path}`;\n throw Object.assign(err, { stack: new Error(msg).stack });\n }\n // @ts-ignore @todo: fix! it should return BitObject | null.\n return null;\n }\n const compressedSize = fileContentsRaw.byteLength;\n const fileContents = this.onRead(fileContentsRaw);\n // uncomment to debug the transformed objects by onRead\n // console.log('transformedContent load', ref.toString(), BitObject.parseSync(fileContents).getType());\n const { object: parsedObject, inflatedSize } = await BitObject.parseObjectWithSize(fileContents, objectPath);\n if (compressedSize < MAX_COMPRESSED_SIZE_TO_CACHE) {\n this.setCache(parsedObject, inflatedSize);\n } else {\n this.liveObjects.set(ref.toString(), parsedObject, inflatedSize, false);\n }\n return parsedObject;\n }\n\n /**\n * this is restricted to provide objects according to the given types. Otherwise, big scopes (>1GB) could crush.\n * example usage: `this.list([ModelComponent, Symlink, Lane])`\n */\n async list(types: Types): Promise<BitObject[]> {\n const refs = await this.listRefs();\n const concurrency = concurrentIOLimit();\n logger.debug(\n `Repository.list, ${refs.length} refs are going to be loaded, searching for types: ${types.map((t) => t.name).join(', ')}`\n );\n const objects: BitObject[] = [];\n const loadGracefully = process.argv.includes('--never-exported');\n const isTypeIncluded = (obj: BitObject) => types.some((type) => type.name === obj.constructor.name); // avoid using \"obj instanceof type\" for Harmony to call this function successfully\n await pMapPool(\n refs,\n async (ref) => {\n const object = loadGracefully\n ? await this.loadRefDeleteIfInvalid(ref)\n : await this.loadRefOnlyIfType(ref, types);\n if (!object) return;\n if (loadGracefully && !isTypeIncluded(object)) return;\n objects.push(object);\n },\n {\n concurrency,\n onCompletedChunk: (completed) => {\n if (completed % 1000 === 0) logger.debug(`Repository.list, completed ${completed} out of ${refs.length}`);\n },\n }\n );\n return objects;\n }\n\n /**\n * classify every object in the scope by its type, along with its size on the filesystem.\n *\n * needed by the garbage collector, which must know the type of each object but has no use for\n * its content. inflating every object would mean inflating gigabytes of file-content (`Source`)\n * objects, so only the first chunk of each file is read - enough to hold the header, which is\n * where the type is. when a content transformer is registered (`onPostObjectRead`), it applies\n * to the whole buffer, so in that case the file is read in full.\n */\n async listObjectsWithType(): Promise<ObjectsWithType> {\n const refs = await this.listRefs();\n const concurrency = concurrentIOLimit();\n logger.debug(`Repository.listObjectsWithType, classifying ${refs.length} objects`);\n const results = await pMapPool(refs, (ref) => this.getObjectTypeGracefully(ref), { concurrency });\n const objects = compact(results.map((result) => result.object));\n const unreadable = compact(results.map((result) => result.unreadable));\n if (unreadable.length) {\n logger.warn(`Repository.listObjectsWithType, unable to classify ${unreadable.length} objects`);\n }\n return { objects, unreadable };\n }\n\n /**\n * the objects that couldn't be classified are reported rather than skipped. a caller that acts on\n * this inventory (the garbage collector) has to know that it's incomplete, because an object it\n * can't see is one it can't reason about.\n */\n private async getObjectTypeGracefully(ref: Ref): Promise<{ object?: ObjectWithType; unreadable?: Ref }> {\n const objectPath = this.objectPath(ref);\n try {\n const stat = await fs.stat(objectPath);\n const type = await this.readObjectType(objectPath);\n return { object: { ref, type, size: stat.size, mtimeMs: stat.mtimeMs } };\n } catch (err: any) {\n logger.warn(`Repository.listObjectsWithType, failed reading ${objectPath}. Error: ${err.message}`);\n return { unreadable: ref };\n }\n }\n\n private async readObjectType(objectPath: string): Promise<string> {\n const readInFull = async () => BitObject.parseObjectType(this.onRead(await fs.readFile(objectPath)), objectPath);\n if (this.isContentTransformed()) return readInFull();\n return (await this.readTypeFromHeader(objectPath)) || readInFull();\n }\n\n /**\n * whether object files have to go through `onPostObjectRead` before their header can be read.\n * when there's no way to tell, assume they do. it's the slow answer, never the wrong one.\n */\n private isContentTransformed(): boolean {\n return Repository.hasPostObjectReadTransformer\n ? Repository.hasPostObjectReadTransformer()\n : Boolean(Repository.onPostObjectRead);\n }\n\n /**\n * the type an object file names in its header, read from the first chunk of the file only.\n * null when that chunk doesn't hold the whole header, in which case the file has to be read in\n * full. throws `UnknownObjectType` when the header names a type nothing is registered under.\n */\n private async readTypeFromHeader(objectPath: string): Promise<string | null> {\n // `Uint8Array` rather than `Buffer` - see `parseObjectTypeFromChunk`\n const chunk = new Uint8Array(OBJECT_HEADER_CHUNK_SIZE);\n const fileDescriptor = await fs.open(objectPath, 'r');\n let bytesRead: number;\n try {\n ({ bytesRead } = await fs.read(fileDescriptor, chunk, 0, chunk.length, 0));\n } finally {\n await fs.close(fileDescriptor);\n }\n return BitObject.parseObjectTypeFromChunk(chunk.subarray(0, bytesRead));\n }\n\n async loadRefDeleteIfInvalid(ref: Ref) {\n try {\n return await this.load(ref, true);\n } catch (err: any) {\n // this is needed temporarily to allow `bit reset --never-exported` to fix the bit-id-comp-id error.\n // in a few months, we can remove this condition (around min 2024)\n if (err.constructor.name === 'BitIdCompIdError' || err.constructor.name === 'MissingScope') {\n logger.debug(`bit-id-comp-id error, moving an object to trash ${ref.toString()}`);\n await this.moveOneObjectToTrash(ref);\n return undefined;\n }\n throw err;\n }\n }\n\n async loadRefOnlyIfType(ref: Ref, types: Types): Promise<BitObject | null> {\n const objectPath = this.objectPath(ref);\n const typeNames = types.map((type) => type.name);\n // most of a scope is file contents, which callers of this never ask for. the header says\n // whether an object is wanted, so the rest of the file is only read and inflated when it is.\n // transformed content has no header to read on its own, so it keeps to the single full read.\n if (!this.isContentTransformed()) {\n let type: string | null;\n try {\n type = await this.readTypeFromHeader(objectPath);\n } catch (err: any) {\n // an unregistered type is not one of the types asked for - the same answer the full read gives\n if (err instanceof UnknownObjectType) return null;\n throw err;\n }\n if (type && !typeNames.includes(type)) return null;\n }\n const fileContents = this.onRead(await fs.readFile(objectPath));\n return BitObject.parseObjectOnlyIfType(fileContents, typeNames, objectPath);\n }\n\n async listRefs(cwd = this.getPath()): Promise<Array<Ref>> {\n const matches = await glob(path.join('*', '*'), { cwd });\n const refs = matches.map((str) => {\n const hash = str.replace(path.sep, '');\n if (!isSnap(hash)) {\n logger.error(`fatal: the file \"${str}\" is not a valid bit object path`);\n return null;\n }\n return new Ref(hash);\n });\n return compact(refs);\n }\n\n async listRefsStartWith(shortHash: Ref): Promise<Array<Ref>> {\n const pathPrefix = this.hashPath(shortHash);\n const matches = await glob(`${pathPrefix}*`, { cwd: this.getPath() });\n const refs = matches.map((str) => {\n const hash = str.replace(path.sep, '');\n if (!isSnap(hash)) {\n logger.error(`fatal: the file \"${str}\" is not a valid bit object path`);\n return null;\n }\n return new Ref(hash);\n });\n return compact(refs);\n }\n\n async listRawObjects(): Promise<any> {\n const refs = await this.listRefs();\n const concurrency = concurrentIOLimit();\n return pMapPool(\n refs,\n async (ref) => {\n try {\n const buffer = await this.loadRaw(ref);\n const bitRawObject = await BitRawObject.fromDeflatedBuffer(buffer, ref.hash);\n return bitRawObject;\n } catch {\n logger.error(`Couldn't load the ref ${ref} this object is probably corrupted and should be delete`);\n return null;\n }\n },\n { concurrency }\n );\n }\n\n async listObjectsFromIndex(indexType: IndexType, filter?: Function): Promise<BitObject[]> {\n const hashes = filter ? this.scopeIndex.getHashesByQuery(indexType, filter) : this.scopeIndex.getHashes(indexType);\n return this._getBitObjectsByHashes(hashes);\n }\n\n getHashFromIndex(indexType: IndexType, filter: Function): string | null {\n const hashes = this.scopeIndex.getHashesByQuery(indexType, filter);\n if (hashes.length > 2) throw new Error('getHashFromIndex expect to get zero or one result');\n return hashes.length ? hashes[0] : null;\n }\n\n async _getBitObjectsByHashes(hashes: string[]): Promise<BitObject[]> {\n const missingIndexItems: IndexItem[] = [];\n const bitObjects = await Promise.all(\n hashes.map(async (hash) => {\n const bitObject = await this.load(new Ref(hash));\n if (!bitObject) {\n const indexItem = this.scopeIndex.find(hash);\n if (!indexItem) throw new Error(`_getBitObjectsByHashes failed finding ${hash}`);\n missingIndexItems.push(indexItem);\n return;\n }\n return bitObject;\n })\n );\n if (missingIndexItems.length) {\n this.scopeIndex.removeMany(missingIndexItems.map((item) => new Ref(item.hash)));\n await this.scopeIndex.write();\n const missingStringified = missingIndexItems.map((item) => item.toIdentifierString());\n throw new OutdatedIndexJson(missingStringified);\n }\n return compact(bitObjects);\n }\n\n async loadOptionallyCreateScopeIndex(): Promise<ScopeIndex> {\n try {\n const scopeIndex = await ScopeIndex.load(this.scopePath);\n return scopeIndex;\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n const bitObjects: BitObject[] = await this.list([ModelComponent, Lane]);\n const scopeIndex = ScopeIndex.create(this.scopePath);\n const added = scopeIndex.addMany(bitObjects);\n if (added) await scopeIndex.write();\n return scopeIndex;\n }\n throw err;\n }\n }\n\n async loadRaw(ref: Ref): Promise<Buffer> {\n if (ref.hash.length < HASH_SIZE) {\n ref = await this.getFullRefFromShortHash(ref);\n }\n const raw = await fs.readFile(this.objectPath(ref));\n // Run hook to transform content pre reading\n const transformedContent = this.onRead(raw);\n // uncomment to debug the transformed objects by onRead\n // console.log('transformedContent loadRaw', ref.toString(), BitObject.parseSync(transformedContent).getType());\n return transformedContent;\n }\n\n async getFullRefFromShortHash(ref: Ref): Promise<Ref> {\n const refs = await this.listRefsStartWith(ref);\n if (refs.length > 1) {\n throw new Error(\n `found ${refs.length} objects with the same short hash ${ref.toString()}, please use longer hash`\n );\n }\n if (refs.length === 0) {\n throw new Error(`failed finding an object with the short hash ${ref.toString()}`);\n }\n return refs[0];\n }\n\n async loadManyRaw(refs: Ref[]): Promise<ObjectItem[]> {\n const concurrency = concurrentIOLimit();\n const uniqRefs = uniqBy(refs, 'hash');\n return pMapPool(uniqRefs, async (ref) => ({ ref, buffer: await this.loadRaw(ref) }), { concurrency });\n }\n\n async loadManyRawIgnoreMissing(refs: Ref[]): Promise<ObjectItem[]> {\n const concurrency = concurrentIOLimit();\n const results = await pMapPool(\n refs,\n async (ref) => {\n try {\n const buffer = await this.loadRaw(ref);\n return { ref, buffer };\n } catch (err: any) {\n if (err.code === 'ENOENT') return null;\n throw err;\n }\n },\n { concurrency }\n );\n return compact(results);\n }\n\n async loadRawObject(ref: Ref): Promise<BitRawObject> {\n const buffer = await this.loadRaw(ref);\n const bitRawObject = await BitRawObject.fromDeflatedBuffer(buffer, ref.hash);\n return bitRawObject as any as BitRawObject;\n }\n\n /**\n * prefer using `this.load()` for an async version, which also writes to the cache\n */\n loadSync(ref: Ref, throws = true): BitObject {\n try {\n const objectFile = fs.readFileSync(this.objectPath(ref));\n // Run hook to transform content pre reading\n const transformedContent = this.onRead(objectFile);\n return BitObject.parseSync(transformedContent);\n } catch {\n if (throws) {\n throw new HashNotFound(ref.toString());\n }\n // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!\n return null;\n }\n }\n\n /**\n * `size` is the object's inflated content size (see `InMemoryCache.set`).\n */\n setCache(object: BitObject, size?: number) {\n const key = object.hash().toString();\n this.cache.set(key, object, size);\n this.liveObjects.set(key, object, size, true);\n return this;\n }\n\n /**\n * an object evicted from the cache is still returned as long as it's in use elsewhere (see `LiveObjects`).\n */\n getCache(ref: Ref): BitObject | undefined {\n const key = ref.toString();\n const cached = this.cache.get(key);\n if (cached) return cached;\n const live = this.liveObjects.get(key);\n if (!live) return undefined;\n if (live.cacheable) this.cache.set(key, live.object, live.size); // it's in use again\n return live.object;\n }\n\n removeFromCache(ref: Ref) {\n this.cache.delete(ref.toString());\n this.liveObjects.delete(ref.toString());\n }\n\n async clearCache() {\n logger.debug('repository.clearCache');\n this.clearObjectsFromCache();\n await this.init();\n }\n clearObjectsFromCache() {\n logger.debug('repository.clearObjectsFromCache');\n this.cache.deleteAll();\n this.liveObjects.clear();\n }\n\n backup(dirName?: string) {\n const backupDir = this.getBackupPath(dirName);\n const objectsDir = this.getPath();\n logger.debug(`making a backup of all objects from ${objectsDir} to ${backupDir}`);\n fs.emptyDirSync(backupDir);\n fs.copySync(objectsDir, backupDir);\n }\n\n add(object: BitObject | null | undefined): Repository {\n // console.trace(`repository: adding object ${object?.hash().toString()}`);\n if (!object) return this;\n // leave the following commented log message, it is very useful for debugging but too verbose when not needed.\n // logger.debug(`repository: adding object ${object.hash().toString()} which consist of the following id: ${object.id()}`);\n this.objects[object.hash().toString()] = object;\n this.setCache(object);\n return this;\n }\n\n addMany(objects: BitObject[]): Repository {\n if (!objects || !objects.length) return this;\n objects.forEach((obj) => this.add(obj));\n return this;\n }\n\n removeObject(ref: Ref) {\n this.objectsToRemove.push(ref);\n }\n\n removeManyObjects(refs: Ref[]) {\n if (!refs || !refs.length) return;\n refs.forEach((ref) => this.removeObject(ref));\n }\n\n findMany(refs: Ref[]): Promise<BitObject[]> {\n return Promise.all(refs.map((ref) => this.load(ref)));\n }\n\n /**\n * important! use this method only for commands that are non running on an http server.\n *\n * it's better to remove/delete objects directly and not using the `objects` member.\n * it helps to avoid multiple processes running concurrently on an http server.\n *\n * persist objects changes (added and removed) into the filesystem\n * do not call this function multiple times in parallel, otherwise, it'll damage the index.json file.\n * call this function only once after you added and removed all applicable objects.\n */\n async persist(validate = true): Promise<void> {\n // do not let two requests enter this critical area, otherwise, refs/index.json/objects could\n // be corrupted\n logger.debug(`Repository.persist, going to acquire a lock`);\n await this.persistMutex.runExclusive(async () => {\n logger.debug(`Repository.persist, validate = ${validate.toString()}, a lock has been acquired`);\n await this.deleteObjectsFromFS(this.objectsToRemove);\n this.validateObjects(validate, Object.values(this.objects));\n await this.writeObjectsToTheFS(Object.values(this.objects));\n await this.writeRemoteLanes();\n await this.unmergedComponents.write();\n });\n logger.debug(`Repository.persist, completed. the lock has been released`);\n this.clearObjects();\n if (Repository.onPostObjectsPersist) {\n Repository.onPostObjectsPersist().catch((err) => {\n logger.error('fatal: onPostObjectsPersist encountered an error (this error does not stop the process)', err);\n });\n }\n }\n\n async writeRemoteLanes() {\n await this.remoteLanes.write();\n }\n\n /**\n * this is especially critical for http server, where one process lives long and serves multiple\n * exports. without this, the objects get accumulated over time and being rewritten over and over\n * again.\n */\n private clearObjects() {\n this.objects = {};\n this.objectsToRemove = [];\n }\n\n /**\n * normally, the validation step takes place just before the acutal writing of the file.\n * however, this can be an issue where a component has an invalid version. the component could\n * be saved before validating the version (see #1727). that's why we validate here before writing\n * anything to the filesystem.\n * the open question here is whether should we validate again before the actual writing or it\n * should be enough to validate here?\n * for now, it does validate again before saving, only to be 100% sure nothing happens in a few\n * lines of code until the actual writing. however, if the performance penalty is noticeable, we\n * can easily revert it by changing `bitObject.validateBeforePersist = false` line run regardless\n * the `validate` argument.\n */\n validateObjects(validate: boolean, objects: BitObject[]) {\n objects.forEach((bitObject) => {\n // @ts-ignore some BitObject classes have validate() method\n if (validate && bitObject.validate) {\n // @ts-ignore\n bitObject.validate();\n }\n if (!validate) {\n bitObject.validateBeforePersist = false;\n }\n });\n }\n\n async deleteObjectsFromFS(refs: Ref[]): Promise<void> {\n if (!refs.length) return;\n const uniqRefs = uniqBy(refs, 'hash');\n logger.debug(`Repository._deleteMany: deleting ${uniqRefs.length} objects`);\n const concurrency = concurrentIOLimit();\n await pMapPool(uniqRefs, (ref) => this._deleteOne(ref), { concurrency });\n const removed = this.scopeIndex.removeMany(uniqRefs);\n if (removed) await this.scopeIndex.write();\n }\n\n async moveObjectsToDir(refs: Ref[], dir: string): Promise<void> {\n if (!refs.length) return;\n const uniqRefs = uniqBy(refs, 'hash');\n logger.debug(`Repository.moveObjectsToDir: ${uniqRefs.length} objects`);\n const concurrency = concurrentIOLimit();\n await pMapPool(uniqRefs, (ref) => this.moveOneObjectToDir(ref, dir), { concurrency });\n const removed = this.scopeIndex.removeMany(uniqRefs);\n if (removed) await this.scopeIndex.write();\n }\n\n async moveObjectsToTrash(refs: Ref[]): Promise<void> {\n await this.moveObjectsToDir(refs, TRASH_DIR);\n }\n\n async listTrash(): Promise<Ref[]> {\n return this.listRefs(this.getTrashDir());\n }\n\n async getFromTrash(refs: Ref[]): Promise<BitObject[]> {\n const objectsFromTrash = await Promise.all(\n refs.map(async (ref) => {\n const trashObjPath = path.join(this.getTrashDir(), this.hashPath(ref));\n let buffer: Buffer;\n try {\n buffer = await fs.readFile(trashObjPath);\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n throw new BitError(`unable to find the object ${ref.toString()} in the trash`);\n }\n throw err;\n }\n return BitObject.parseObject(buffer, trashObjPath);\n })\n );\n return objectsFromTrash;\n }\n\n async restoreFromTrash(refs: Ref[]) {\n logger.debug(`Repository.restoreFromTrash: ${refs.length} objects`);\n const objectsFromTrash = await this.getFromTrash(refs);\n await this.writeObjectsToTheFS(objectsFromTrash);\n }\n\n async restoreFromDir(dir: string, overwrite = false) {\n await fs.copy(path.join(this.scopePath, dir), this.getPath(), { overwrite });\n }\n\n private async moveOneObjectToDir(ref: Ref, dir: string) {\n const currentPath = this.objectPath(ref);\n const absDir = path.join(this.scopePath, dir);\n const fullPath = path.join(absDir, this.hashPath(ref));\n await fs.move(currentPath, fullPath, { overwrite: true });\n this.removeFromCache(ref);\n }\n\n private async moveOneObjectToTrash(ref: Ref) {\n await this.moveOneObjectToDir(ref, TRASH_DIR);\n }\n\n async deleteRecordsFromUnmergedComponents(compIds: ComponentID[]) {\n this.unmergedComponents.removeMultipleComponents(compIds);\n await this.unmergedComponents.write();\n }\n\n /**\n * write all objects to the FS and index the components/lanes/symlink objects\n */\n async writeObjectsToTheFS(objects: BitObject[]): Promise<void> {\n const count = objects.length;\n if (!count) return;\n logger.trace(`Repository.writeObjectsToTheFS: started writing ${count} objects`);\n const concurrency = concurrentIOLimit();\n await pMapPool(objects, (obj) => this._writeOne(obj), {\n concurrency,\n });\n logger.trace(`Repository.writeObjectsToTheFS: completed writing ${count} objects`);\n\n const added = this.scopeIndex.addMany(objects);\n if (added) await this.scopeIndex.write();\n }\n\n /**\n * do not call this method directly. always call this.removeObject() and once done with all objects,\n * call this.persist()\n */\n _deleteOne(ref: Ref): Promise<boolean> {\n this.removeFromCache(ref);\n const pathToDelete = this.objectPath(ref);\n logger.trace(`repository._deleteOne: deleting ${pathToDelete}`);\n return removeFile(pathToDelete, true);\n }\n\n /**\n * always prefer this.persist() or this.writeObjectsToTheFS()\n * this method doesn't write to scopeIndex. so using this method for ModelComponent or\n * Symlink makes the index outdated.\n */\n async _writeOne(object: BitObject): Promise<void> {\n const { buffer: contents, inflatedSize } = await object.compressWithSize();\n const options: ChownOptions = {};\n if (this.scopeJson.groupName) options.gid = await resolveGroupId(this.scopeJson.groupName);\n const hash = object.hash();\n const objectPath = this.objectPath(hash);\n logger.trace(`repository._writeOne: ${objectPath}`);\n // Run hook to transform content pre persisting\n const transformedContent = this.onPersist(contents);\n await writeFile(objectPath, transformedContent, options);\n // once written, the object is the up-to-date one. this also replaces the size-estimate of objects that\n // were cached by `add()`.\n if (this.cache.has(hash.toString())) this.cache.set(hash.toString(), object, inflatedSize);\n this.liveObjects.set(\n hash.toString(),\n object,\n inflatedSize,\n transformedContent.byteLength < MAX_COMPRESSED_SIZE_TO_CACHE\n );\n }\n\n async writeObjectsToPendingDir(objectList: ObjectList, pendingDir: PathOsBasedAbsolute) {\n // Refs come from client-supplied tar entry names. Validate the whole batch\n // before any writes so a crafted ref can't escape pendingDir AND so we\n // don't leave orphan files in pendingDir when one entry is rejected mid-batch.\n // Mirrors the isSnap check listRefs already applies on the read path.\n for (const object of objectList.objects) {\n const ref = object.ref.toString();\n if (!isSnap(ref)) throw new BitError(`invalid object ref: ${JSON.stringify(ref)}`);\n }\n const options: ChownOptions = {};\n if (this.scopeJson.groupName) options.gid = await resolveGroupId(this.scopeJson.groupName);\n await Promise.all(\n objectList.objects.map(async (object) => {\n const objPath = path.join(pendingDir, this.hashPath(object.ref));\n await writeFile(objPath, object.buffer, options);\n })\n );\n }\n\n async readObjectsFromPendingDir(pendingDir: PathOsBasedAbsolute) {\n const refs = await this.listRefs(pendingDir);\n const objects = await Promise.all(\n refs.map(async (ref) => {\n const buffer = await fs.readFile(path.join(pendingDir, this.hashPath(ref)));\n return { ref, buffer };\n })\n );\n return new ObjectList(objects);\n }\n\n private hashPath(ref: Ref) {\n const hash = ref.toString();\n return path.join(hash.slice(0, 2), hash.slice(2));\n }\n}\n\nasync function removeFile(filePath: string, propagateDirs = false): Promise<boolean> {\n try {\n await fs.unlink(filePath);\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n // the file doesn't exist, that's fine, no need to do anything\n return false;\n }\n throw err;\n }\n if (!propagateDirs) return true;\n const { dir } = path.parse(filePath);\n await removeEmptyDir(dir);\n return true;\n}\n\nasync function resolveGroupId(groupName: string): Promise<number | null | undefined> {\n // unix group ids are meaningless on Windows, which has no /etc/group and no process.getgid\n if (!process.getgid) return null;\n let groupFileContent: string;\n try {\n groupFileContent = await fs.readFile('/etc/group', 'utf8');\n } catch (err: any) {\n logger.error('resolveGroupId', err);\n throw new BitError(`unable to resolve group id of \"${groupName}\", got an error ${err.message}`);\n }\n const groupLine = groupFileContent.split('\\n').find((line) => line.split(':')[0] === groupName);\n if (!groupLine) {\n throw new BitError(`unable to resolve group id of \"${groupName}\", the group does not exist`);\n }\n const gid = Number(groupLine.split(':')[2]);\n if (Number.isNaN(gid)) {\n throw new BitError(`unable to resolve group id of \"${groupName}\", got an error parsing /etc/group`);\n }\n return gid;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_fsExtra","data","_interopRequireDefault","require","_asyncMutex","_lodash","_bitError","_componentVersion","path","_interopRequireWildcard","_os","_toolboxPromise","_legacy","_legacy2","_glob","_toolboxFs","_harmonyModules","_legacy3","_scopeIndex","_object","_objectList","_rawObject","_ref","_liveObjects","_harmonyModules2","_models","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_defineProperty","_toPropertyKey","value","enumerable","configurable","writable","_toPrimitive","Symbol","toPrimitive","TypeError","String","Number","OBJECTS_BACKUP_DIR","OBJECTS_DIR","TRASH_DIR","MAX_COMPRESSED_SIZE_TO_CACHE","objectFileWriteCounter","OBJECT_HEADER_CHUNK_SIZE","Repository","constructor","scopePath","scopeJson","LiveObjects","onRead","content","onPostObjectRead","onPersist","onPreObjectPersist","cache","createInMemoryCache","getCacheOptionsForObjects","persistMutex","_persistMutex","Mutex","load","repository","init","scopeIndex","loadOptionallyCreateScopeIndex","remoteLanes","RemoteLanes","unmergedComponents","UnmergedComponents","create","ScopeIndex","reset","getPathByScopePath","join","reLoadScopeIndex","reloadScopeIndexIfNeed","force","latestScopeIndex","currentAllScopeIndexItems","getAll","latestAllScopeIndexItems","length","differenceWith","isEqual","ensureDir","fs","getPath","getBackupPath","dirName","backupPath","getTrashDir","getLicense","getPopulatedLicense","getScopeMetaObject","license","object","ScopeMeta","fromObject","name","ref","hash","buffer","compress","objectPath","hashPath","pathExists","hasMultiple","refs","concurrency","concurrentIOLimit","existingRefs","pMapPool","compact","throws","inMemoryObjects","objects","toString","HASH_SIZE","getFullRefFromShortHash","cached","getCache","fileContentsRaw","readFile","err","code","logger","error","message","trace","msg","assign","stack","Error","compressedSize","byteLength","fileContents","parsedObject","inflatedSize","BitObject","parseObjectWithSize","setCache","liveObjects","list","types","listRefs","debug","map","loadGracefully","process","argv","includes","isTypeIncluded","obj","some","type","loadRefDeleteIfInvalid","loadRefOnlyIfType","push","onCompletedChunk","completed","listObjectsWithType","results","getObjectTypeGracefully","result","unreadable","warn","stat","readObjectType","size","mtimeMs","readInFull","parseObjectType","isContentTransformed","readTypeFromHeader","hasPostObjectReadTransformer","Boolean","chunk","Uint8Array","fileDescriptor","open","bytesRead","read","close","parseObjectTypeFromChunk","subarray","moveOneObjectToTrash","undefined","typeNames","UnknownObjectType","parseObjectOnlyIfType","cwd","matches","glob","str","replace","sep","isSnap","Ref","listRefsStartWith","shortHash","pathPrefix","listRawObjects","loadRaw","bitRawObject","BitRawObject","fromDeflatedBuffer","listObjectsFromIndex","indexType","filter","hashes","getHashesByQuery","getHashes","_getBitObjectsByHashes","getHashFromIndex","missingIndexItems","bitObjects","Promise","all","bitObject","indexItem","find","removeMany","item","write","missingStringified","toIdentifierString","OutdatedIndexJson","ModelComponent","Lane","added","addMany","raw","transformedContent","loadManyRaw","uniqRefs","uniqBy","loadManyRawIgnoreMissing","loadRawObject","loadSync","objectFile","readFileSync","parseSync","HashNotFound","key","live","cacheable","removeFromCache","delete","clearCache","clearObjectsFromCache","deleteAll","clear","backup","backupDir","objectsDir","emptyDirSync","copySync","add","forEach","removeObject","objectsToRemove","removeManyObjects","findMany","persist","validate","runExclusive","deleteObjectsFromFS","validateObjects","values","writeObjectsToTheFS","writeRemoteLanes","clearObjects","onPostObjectsPersist","catch","validateBeforePersist","_deleteOne","removed","moveObjectsToDir","dir","moveOneObjectToDir","moveObjectsToTrash","listTrash","getFromTrash","objectsFromTrash","trashObjPath","BitError","parseObject","restoreFromTrash","restoreFromDir","overwrite","copy","currentPath","absDir","fullPath","move","deleteRecordsFromUnmergedComponents","compIds","removeMultipleComponents","rawObjects","count","chownOptions","getChownOptions","_writeOne","pathToDelete","removeFile","contents","compressWithSize","options","writeObjectFile","writeObjectsToPendingDir","objectList","pendingDir","JSON","stringify","readObjectsFromPendingDir","ObjectList","groupName","gid","resolveGroupId","uid","userInfo","filePath","existing","mode","keepOwner","getuid","chown","tmpPath","dirname","basename","pid","writeFile","mkdir","recursive","throwUnlessChownErrOk","chmod","rename","remove","slice","exports","propagateDirs","unlink","parse","removeEmptyDir","nonRoot","getgid","groupFileContent","groupLine","split","line","isNaN"],"sources":["repository.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport { Mutex } from 'async-mutex';\nimport { compact, uniqBy, differenceWith, isEqual } from 'lodash';\nimport { BitError } from '@teambit/bit-error';\nimport type { ComponentID } from '@teambit/component-id';\nimport { HASH_SIZE, isSnap } from '@teambit/component-version';\nimport * as path from 'path';\nimport { userInfo } from 'os';\nimport { pMapPool } from '@teambit/toolbox.promise.map-pool';\nimport { OBJECTS_DIR } from '@teambit/legacy.constants';\nimport { logger } from '@teambit/legacy.logger';\nimport type { PathOsBasedAbsolute } from '@teambit/legacy.utils';\nimport { glob } from 'glob';\nimport { removeEmptyDir } from '@teambit/toolbox.fs.remove-empty-dir';\nimport { concurrentIOLimit } from '@teambit/harmony.modules.concurrency';\nimport type { Types, ScopeJson } from '@teambit/legacy.scope';\nimport {\n HashNotFound,\n OutdatedIndexJson,\n UnknownObjectType,\n UnmergedComponents,\n RemoteLanes,\n} from '@teambit/legacy.scope';\nimport type { IndexType, IndexItem } from './scope-index';\nimport { ScopeIndex } from './scope-index';\nimport BitObject from './object';\nimport type { ObjectItem, RawObjectsMap, CompressedObject } from './object-list';\nimport { ObjectList } from './object-list';\nimport BitRawObject from './raw-object';\nimport Ref from './ref';\nimport { LiveObjects } from './live-objects';\nimport type { InMemoryCache } from '@teambit/harmony.modules.in-memory-cache';\nimport { getCacheOptionsForObjects, createInMemoryCache } from '@teambit/harmony.modules.in-memory-cache';\nimport { ScopeMeta, Lane, ModelComponent } from '../models';\n\ntype ContentTransformer = (content: Buffer) => Buffer;\nconst OBJECTS_BACKUP_DIR = `${OBJECTS_DIR}.bak`;\nconst TRASH_DIR = 'trash';\nconst MAX_COMPRESSED_SIZE_TO_CACHE = 100 * 1024; // don't cache big files (mainly artifacts) to prevent out-of-memory\nlet objectFileWriteCounter = 0;\ntype ObjectChownOptions = { uid: number; gid: number } | null;\n/**\n * how much of an object file to read when all that's needed is its header. the header holds the\n * type and is a few dozen bytes, which 512 compressed bytes always cover - and every byte past it\n * is inflated for nothing (4KB inflates ten times as much, across every object in the scope). a\n * chunk that falls short anyway is read in full.\n */\nconst OBJECT_HEADER_CHUNK_SIZE = 512;\n\n/** `mtimeMs` lets a caller tell an object that has been here a while from one just written */\nexport type ObjectWithType = { ref: Ref; type: string; size: number; mtimeMs: number };\n/** `unreadable` holds the objects that couldn't be classified, so a caller can refuse to act on a partial inventory */\nexport type ObjectsWithType = { objects: ObjectWithType[]; unreadable: Ref[] };\n\nexport default class Repository {\n objects: { [key: string]: BitObject } = {};\n objectsToRemove: Ref[] = [];\n scopeJson: ScopeJson;\n onRead: ContentTransformer;\n onPersist: ContentTransformer;\n scopePath: string;\n scopeIndex: ScopeIndex;\n protected cache: InMemoryCache<BitObject>;\n private liveObjects = new LiveObjects();\n remoteLanes!: RemoteLanes;\n unmergedComponents!: UnmergedComponents;\n _persistMutex?: Mutex;\n constructor(scopePath: string, scopeJson: ScopeJson) {\n this.scopePath = scopePath;\n this.scopeJson = scopeJson;\n this.onRead = (content: Buffer) => Repository.onPostObjectRead?.(content) || content;\n this.onPersist = (content: Buffer) => Repository.onPreObjectPersist?.(content) || content;\n this.cache = createInMemoryCache(getCacheOptionsForObjects());\n }\n\n get persistMutex() {\n if (!this._persistMutex) {\n this._persistMutex = new Mutex();\n }\n return this._persistMutex;\n }\n\n static async load({ scopePath, scopeJson }: { scopePath: string; scopeJson: ScopeJson }): Promise<Repository> {\n const repository = new Repository(scopePath, scopeJson);\n await repository.init();\n return repository;\n }\n\n async init() {\n const scopeIndex = await this.loadOptionallyCreateScopeIndex();\n this.scopeIndex = scopeIndex;\n this.remoteLanes = new RemoteLanes(this.scopePath);\n this.unmergedComponents = await UnmergedComponents.load(this.scopePath);\n }\n\n static async create({ scopePath, scopeJson }: { scopePath: string; scopeJson: ScopeJson }): Promise<Repository> {\n const repository = new Repository(scopePath, scopeJson);\n const scopeIndex = ScopeIndex.create(scopePath);\n repository.scopeIndex = scopeIndex;\n repository.unmergedComponents = await UnmergedComponents.load(scopePath);\n repository.remoteLanes = new RemoteLanes(scopePath);\n return repository;\n }\n\n static reset(scopePath: string): Promise<void> {\n return ScopeIndex.reset(scopePath);\n }\n\n static getPathByScopePath(scopePath: string) {\n return path.join(scopePath, OBJECTS_DIR);\n }\n\n static onPostObjectsPersist: () => Promise<void>;\n\n /**\n * Hook for transforming content before objects are persisted to the filesystem.\n * Note: This function cannot be async because it's used by the synchronous `loadSync` method\n * which needs to maintain sync behavior for compatibility with existing code.\n */\n static onPreObjectPersist?: (content: Buffer) => Buffer;\n\n /**\n * Hook for transforming content after objects are read from the filesystem.\n * Note: This function cannot be async because it's used by the synchronous `loadSync` method\n * which needs to maintain sync behavior for compatibility with existing code.\n */\n static onPostObjectRead?: (content: Buffer) => Buffer;\n\n /**\n * whether `onPostObjectRead` actually transforms anything.\n *\n * the scope aspect installs the hook above unconditionally - it's a reduce over a slot that is\n * usually empty - so the hook being set says nothing about whether object content is transformed.\n * only a caller that can skip reading content altogether needs to tell the two apart.\n */\n static hasPostObjectReadTransformer?: () => boolean;\n\n async reLoadScopeIndex() {\n this.scopeIndex = await this.loadOptionallyCreateScopeIndex();\n }\n\n /**\n * current scope index difference with <scope_folder>/index.json content, reload it\n * @deprecated use Scope aspect `watchSystemFiles` instead, it's way more efficient.\n */\n public async reloadScopeIndexIfNeed(force = false) {\n const latestScopeIndex = await this.loadOptionallyCreateScopeIndex();\n if (force) {\n this.scopeIndex = latestScopeIndex;\n return;\n }\n\n const currentAllScopeIndexItems = this.scopeIndex.getAll();\n const latestAllScopeIndexItems = latestScopeIndex.getAll();\n\n if (currentAllScopeIndexItems.length !== latestAllScopeIndexItems.length) {\n this.scopeIndex = latestScopeIndex;\n return;\n }\n\n if (differenceWith(currentAllScopeIndexItems, latestAllScopeIndexItems, isEqual).length) {\n this.scopeIndex = latestScopeIndex;\n }\n }\n\n ensureDir() {\n return fs.ensureDir(this.getPath());\n }\n\n getPath() {\n return Repository.getPathByScopePath(this.scopePath);\n }\n\n getBackupPath(dirName?: string): string {\n const backupPath = path.join(this.scopePath, OBJECTS_BACKUP_DIR);\n return dirName ? path.join(backupPath, dirName) : backupPath;\n }\n\n getTrashDir() {\n return path.join(this.scopePath, TRASH_DIR);\n }\n\n getLicense(): Promise<string> {\n // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!\n return this.scopeJson.getPopulatedLicense();\n }\n\n async getScopeMetaObject(): Promise<ObjectItem> {\n const license = await this.getLicense();\n const object = ScopeMeta.fromObject({ license, name: this.scopeJson.name });\n return { ref: object.hash(), buffer: await object.compress() };\n }\n\n objectPath(ref: Ref): string {\n return path.join(this.getPath(), this.hashPath(ref));\n }\n\n async has(ref: Ref): Promise<boolean> {\n const objectPath = this.objectPath(ref);\n return fs.pathExists(objectPath);\n }\n\n async hasMultiple(refs: Ref[]): Promise<Ref[]> {\n const concurrency = concurrentIOLimit();\n const existingRefs = await pMapPool(\n refs,\n async (ref) => {\n const pathExists = await this.has(ref);\n return pathExists ? ref : null;\n },\n { concurrency }\n );\n return compact(existingRefs);\n }\n\n async load(ref: Ref, throws = false): Promise<BitObject> {\n // during tag, the updated objects are in `this.objects`.\n // `this.cache` is less reliable, because if it reaches its max, then it loads from the filesystem, which may not\n // be there yet (in case of \"version\" object), or may be out-of-date (in case of \"component\" object).\n const inMemoryObjects = this.objects[ref.hash.toString()];\n if (inMemoryObjects) return inMemoryObjects;\n if (ref.hash.length < HASH_SIZE) {\n ref = await this.getFullRefFromShortHash(ref);\n }\n const cached = this.getCache(ref);\n if (cached) {\n return cached;\n }\n let fileContentsRaw: Buffer;\n const objectPath = this.objectPath(ref);\n try {\n fileContentsRaw = await fs.readFile(objectPath);\n } catch (err: any) {\n if (err.code !== 'ENOENT') {\n logger.error(`Failed reading a ref file ${objectPath}. Error: ${err.message}`);\n throw err;\n }\n logger.trace(`Failed finding a ref file ${objectPath}.`);\n if (throws) {\n // if we just `throw err` we loose the stack trace.\n // see https://stackoverflow.com/questions/68022123/no-stack-in-fs-promises-readfile-enoent-error\n const msg = `fatal: failed finding an object file ${objectPath} in the filesystem at ${err.path}`;\n throw Object.assign(err, { stack: new Error(msg).stack });\n }\n // @ts-ignore @todo: fix! it should return BitObject | null.\n return null;\n }\n const compressedSize = fileContentsRaw.byteLength;\n const fileContents = this.onRead(fileContentsRaw);\n // uncomment to debug the transformed objects by onRead\n // console.log('transformedContent load', ref.toString(), BitObject.parseSync(fileContents).getType());\n const { object: parsedObject, inflatedSize } = await BitObject.parseObjectWithSize(fileContents, objectPath);\n if (compressedSize < MAX_COMPRESSED_SIZE_TO_CACHE) {\n this.setCache(parsedObject, inflatedSize);\n } else {\n this.liveObjects.set(ref.toString(), parsedObject, inflatedSize, false);\n }\n return parsedObject;\n }\n\n /**\n * this is restricted to provide objects according to the given types. Otherwise, big scopes (>1GB) could crush.\n * example usage: `this.list([ModelComponent, Symlink, Lane])`\n */\n async list(types: Types): Promise<BitObject[]> {\n const refs = await this.listRefs();\n const concurrency = concurrentIOLimit();\n logger.debug(\n `Repository.list, ${refs.length} refs are going to be loaded, searching for types: ${types.map((t) => t.name).join(', ')}`\n );\n const objects: BitObject[] = [];\n const loadGracefully = process.argv.includes('--never-exported');\n const isTypeIncluded = (obj: BitObject) => types.some((type) => type.name === obj.constructor.name); // avoid using \"obj instanceof type\" for Harmony to call this function successfully\n await pMapPool(\n refs,\n async (ref) => {\n const object = loadGracefully\n ? await this.loadRefDeleteIfInvalid(ref)\n : await this.loadRefOnlyIfType(ref, types);\n if (!object) return;\n if (loadGracefully && !isTypeIncluded(object)) return;\n objects.push(object);\n },\n {\n concurrency,\n onCompletedChunk: (completed) => {\n if (completed % 1000 === 0) logger.debug(`Repository.list, completed ${completed} out of ${refs.length}`);\n },\n }\n );\n return objects;\n }\n\n /**\n * classify every object in the scope by its type, along with its size on the filesystem.\n *\n * needed by the garbage collector, which must know the type of each object but has no use for\n * its content. inflating every object would mean inflating gigabytes of file-content (`Source`)\n * objects, so only the first chunk of each file is read - enough to hold the header, which is\n * where the type is. when a content transformer is registered (`onPostObjectRead`), it applies\n * to the whole buffer, so in that case the file is read in full.\n */\n async listObjectsWithType(): Promise<ObjectsWithType> {\n const refs = await this.listRefs();\n const concurrency = concurrentIOLimit();\n logger.debug(`Repository.listObjectsWithType, classifying ${refs.length} objects`);\n const results = await pMapPool(refs, (ref) => this.getObjectTypeGracefully(ref), { concurrency });\n const objects = compact(results.map((result) => result.object));\n const unreadable = compact(results.map((result) => result.unreadable));\n if (unreadable.length) {\n logger.warn(`Repository.listObjectsWithType, unable to classify ${unreadable.length} objects`);\n }\n return { objects, unreadable };\n }\n\n /**\n * the objects that couldn't be classified are reported rather than skipped. a caller that acts on\n * this inventory (the garbage collector) has to know that it's incomplete, because an object it\n * can't see is one it can't reason about.\n */\n private async getObjectTypeGracefully(ref: Ref): Promise<{ object?: ObjectWithType; unreadable?: Ref }> {\n const objectPath = this.objectPath(ref);\n try {\n const stat = await fs.stat(objectPath);\n const type = await this.readObjectType(objectPath);\n return { object: { ref, type, size: stat.size, mtimeMs: stat.mtimeMs } };\n } catch (err: any) {\n logger.warn(`Repository.listObjectsWithType, failed reading ${objectPath}. Error: ${err.message}`);\n return { unreadable: ref };\n }\n }\n\n private async readObjectType(objectPath: string): Promise<string> {\n const readInFull = async () => BitObject.parseObjectType(this.onRead(await fs.readFile(objectPath)), objectPath);\n if (this.isContentTransformed()) return readInFull();\n return (await this.readTypeFromHeader(objectPath)) || readInFull();\n }\n\n /**\n * whether object files have to go through `onPostObjectRead` before their header can be read.\n * when there's no way to tell, assume they do. it's the slow answer, never the wrong one.\n */\n private isContentTransformed(): boolean {\n return Repository.hasPostObjectReadTransformer\n ? Repository.hasPostObjectReadTransformer()\n : Boolean(Repository.onPostObjectRead);\n }\n\n /**\n * the type an object file names in its header, read from the first chunk of the file only.\n * null when that chunk doesn't hold the whole header, in which case the file has to be read in\n * full. throws `UnknownObjectType` when the header names a type nothing is registered under.\n */\n private async readTypeFromHeader(objectPath: string): Promise<string | null> {\n // `Uint8Array` rather than `Buffer` - see `parseObjectTypeFromChunk`\n const chunk = new Uint8Array(OBJECT_HEADER_CHUNK_SIZE);\n const fileDescriptor = await fs.open(objectPath, 'r');\n let bytesRead: number;\n try {\n ({ bytesRead } = await fs.read(fileDescriptor, chunk, 0, chunk.length, 0));\n } finally {\n await fs.close(fileDescriptor);\n }\n return BitObject.parseObjectTypeFromChunk(chunk.subarray(0, bytesRead));\n }\n\n async loadRefDeleteIfInvalid(ref: Ref) {\n try {\n return await this.load(ref, true);\n } catch (err: any) {\n // this is needed temporarily to allow `bit reset --never-exported` to fix the bit-id-comp-id error.\n // in a few months, we can remove this condition (around min 2024)\n if (err.constructor.name === 'BitIdCompIdError' || err.constructor.name === 'MissingScope') {\n logger.debug(`bit-id-comp-id error, moving an object to trash ${ref.toString()}`);\n await this.moveOneObjectToTrash(ref);\n return undefined;\n }\n throw err;\n }\n }\n\n async loadRefOnlyIfType(ref: Ref, types: Types): Promise<BitObject | null> {\n const objectPath = this.objectPath(ref);\n const typeNames = types.map((type) => type.name);\n // most of a scope is file contents, which callers of this never ask for. the header says\n // whether an object is wanted, so the rest of the file is only read and inflated when it is.\n // transformed content has no header to read on its own, so it keeps to the single full read.\n if (!this.isContentTransformed()) {\n let type: string | null;\n try {\n type = await this.readTypeFromHeader(objectPath);\n } catch (err: any) {\n // an unregistered type is not one of the types asked for - the same answer the full read gives\n if (err instanceof UnknownObjectType) return null;\n throw err;\n }\n if (type && !typeNames.includes(type)) return null;\n }\n const fileContents = this.onRead(await fs.readFile(objectPath));\n return BitObject.parseObjectOnlyIfType(fileContents, typeNames, objectPath);\n }\n\n async listRefs(cwd = this.getPath()): Promise<Array<Ref>> {\n const matches = await glob(path.join('*', '*'), { cwd });\n const refs = matches.map((str) => {\n const hash = str.replace(path.sep, '');\n if (!isSnap(hash)) {\n logger.error(`fatal: the file \"${str}\" is not a valid bit object path`);\n return null;\n }\n return new Ref(hash);\n });\n return compact(refs);\n }\n\n async listRefsStartWith(shortHash: Ref): Promise<Array<Ref>> {\n const pathPrefix = this.hashPath(shortHash);\n const matches = await glob(`${pathPrefix}*`, { cwd: this.getPath() });\n const refs = matches.map((str) => {\n const hash = str.replace(path.sep, '');\n if (!isSnap(hash)) {\n logger.error(`fatal: the file \"${str}\" is not a valid bit object path`);\n return null;\n }\n return new Ref(hash);\n });\n return compact(refs);\n }\n\n async listRawObjects(): Promise<any> {\n const refs = await this.listRefs();\n const concurrency = concurrentIOLimit();\n return pMapPool(\n refs,\n async (ref) => {\n try {\n const buffer = await this.loadRaw(ref);\n const bitRawObject = await BitRawObject.fromDeflatedBuffer(buffer, ref.hash);\n return bitRawObject;\n } catch {\n logger.error(`Couldn't load the ref ${ref} this object is probably corrupted and should be delete`);\n return null;\n }\n },\n { concurrency }\n );\n }\n\n async listObjectsFromIndex(indexType: IndexType, filter?: Function): Promise<BitObject[]> {\n const hashes = filter ? this.scopeIndex.getHashesByQuery(indexType, filter) : this.scopeIndex.getHashes(indexType);\n return this._getBitObjectsByHashes(hashes);\n }\n\n getHashFromIndex(indexType: IndexType, filter: Function): string | null {\n const hashes = this.scopeIndex.getHashesByQuery(indexType, filter);\n if (hashes.length > 2) throw new Error('getHashFromIndex expect to get zero or one result');\n return hashes.length ? hashes[0] : null;\n }\n\n async _getBitObjectsByHashes(hashes: string[]): Promise<BitObject[]> {\n const missingIndexItems: IndexItem[] = [];\n const bitObjects = await Promise.all(\n hashes.map(async (hash) => {\n const bitObject = await this.load(new Ref(hash));\n if (!bitObject) {\n const indexItem = this.scopeIndex.find(hash);\n if (!indexItem) throw new Error(`_getBitObjectsByHashes failed finding ${hash}`);\n missingIndexItems.push(indexItem);\n return;\n }\n return bitObject;\n })\n );\n if (missingIndexItems.length) {\n this.scopeIndex.removeMany(missingIndexItems.map((item) => new Ref(item.hash)));\n await this.scopeIndex.write();\n const missingStringified = missingIndexItems.map((item) => item.toIdentifierString());\n throw new OutdatedIndexJson(missingStringified);\n }\n return compact(bitObjects);\n }\n\n async loadOptionallyCreateScopeIndex(): Promise<ScopeIndex> {\n try {\n const scopeIndex = await ScopeIndex.load(this.scopePath);\n return scopeIndex;\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n const bitObjects: BitObject[] = await this.list([ModelComponent, Lane]);\n const scopeIndex = ScopeIndex.create(this.scopePath);\n const added = scopeIndex.addMany(bitObjects);\n if (added) await scopeIndex.write();\n return scopeIndex;\n }\n throw err;\n }\n }\n\n async loadRaw(ref: Ref): Promise<Buffer> {\n if (ref.hash.length < HASH_SIZE) {\n ref = await this.getFullRefFromShortHash(ref);\n }\n const raw = await fs.readFile(this.objectPath(ref));\n // Run hook to transform content pre reading\n const transformedContent = this.onRead(raw);\n // uncomment to debug the transformed objects by onRead\n // console.log('transformedContent loadRaw', ref.toString(), BitObject.parseSync(transformedContent).getType());\n return transformedContent;\n }\n\n async getFullRefFromShortHash(ref: Ref): Promise<Ref> {\n const refs = await this.listRefsStartWith(ref);\n if (refs.length > 1) {\n throw new Error(\n `found ${refs.length} objects with the same short hash ${ref.toString()}, please use longer hash`\n );\n }\n if (refs.length === 0) {\n throw new Error(`failed finding an object with the short hash ${ref.toString()}`);\n }\n return refs[0];\n }\n\n async loadManyRaw(refs: Ref[]): Promise<ObjectItem[]> {\n const concurrency = concurrentIOLimit();\n const uniqRefs = uniqBy(refs, 'hash');\n return pMapPool(uniqRefs, async (ref) => ({ ref, buffer: await this.loadRaw(ref) }), { concurrency });\n }\n\n async loadManyRawIgnoreMissing(refs: Ref[]): Promise<ObjectItem[]> {\n const concurrency = concurrentIOLimit();\n const results = await pMapPool(\n refs,\n async (ref) => {\n try {\n const buffer = await this.loadRaw(ref);\n return { ref, buffer };\n } catch (err: any) {\n if (err.code === 'ENOENT') return null;\n throw err;\n }\n },\n { concurrency }\n );\n return compact(results);\n }\n\n async loadRawObject(ref: Ref): Promise<BitRawObject> {\n const buffer = await this.loadRaw(ref);\n const bitRawObject = await BitRawObject.fromDeflatedBuffer(buffer, ref.hash);\n return bitRawObject as any as BitRawObject;\n }\n\n /**\n * prefer using `this.load()` for an async version, which also writes to the cache\n */\n loadSync(ref: Ref, throws = true): BitObject {\n try {\n const objectFile = fs.readFileSync(this.objectPath(ref));\n // Run hook to transform content pre reading\n const transformedContent = this.onRead(objectFile);\n return BitObject.parseSync(transformedContent);\n } catch {\n if (throws) {\n throw new HashNotFound(ref.toString());\n }\n // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!\n return null;\n }\n }\n\n /**\n * `size` is the object's inflated content size (see `InMemoryCache.set`).\n */\n setCache(object: BitObject, size?: number) {\n const key = object.hash().toString();\n this.cache.set(key, object, size);\n this.liveObjects.set(key, object, size, true);\n return this;\n }\n\n /**\n * an object evicted from the cache is still returned as long as it's in use elsewhere (see `LiveObjects`).\n */\n getCache(ref: Ref): BitObject | undefined {\n const key = ref.toString();\n const cached = this.cache.get(key);\n if (cached) return cached;\n const live = this.liveObjects.get(key);\n if (!live) return undefined;\n if (live.cacheable) this.cache.set(key, live.object, live.size); // it's in use again\n return live.object;\n }\n\n removeFromCache(ref: Ref) {\n this.cache.delete(ref.toString());\n this.liveObjects.delete(ref.toString());\n }\n\n async clearCache() {\n logger.debug('repository.clearCache');\n this.clearObjectsFromCache();\n await this.init();\n }\n clearObjectsFromCache() {\n logger.debug('repository.clearObjectsFromCache');\n this.cache.deleteAll();\n this.liveObjects.clear();\n }\n\n backup(dirName?: string) {\n const backupDir = this.getBackupPath(dirName);\n const objectsDir = this.getPath();\n logger.debug(`making a backup of all objects from ${objectsDir} to ${backupDir}`);\n fs.emptyDirSync(backupDir);\n fs.copySync(objectsDir, backupDir);\n }\n\n add(object: BitObject | null | undefined): Repository {\n // console.trace(`repository: adding object ${object?.hash().toString()}`);\n if (!object) return this;\n // leave the following commented log message, it is very useful for debugging but too verbose when not needed.\n // logger.debug(`repository: adding object ${object.hash().toString()} which consist of the following id: ${object.id()}`);\n this.objects[object.hash().toString()] = object;\n this.setCache(object);\n return this;\n }\n\n addMany(objects: BitObject[]): Repository {\n if (!objects || !objects.length) return this;\n objects.forEach((obj) => this.add(obj));\n return this;\n }\n\n removeObject(ref: Ref) {\n this.objectsToRemove.push(ref);\n }\n\n removeManyObjects(refs: Ref[]) {\n if (!refs || !refs.length) return;\n refs.forEach((ref) => this.removeObject(ref));\n }\n\n findMany(refs: Ref[]): Promise<BitObject[]> {\n return Promise.all(refs.map((ref) => this.load(ref)));\n }\n\n /**\n * important! use this method only for commands that are non running on an http server.\n *\n * it's better to remove/delete objects directly and not using the `objects` member.\n * it helps to avoid multiple processes running concurrently on an http server.\n *\n * persist objects changes (added and removed) into the filesystem\n * do not call this function multiple times in parallel, otherwise, it'll damage the index.json file.\n * call this function only once after you added and removed all applicable objects.\n */\n async persist(validate = true): Promise<void> {\n // do not let two requests enter this critical area, otherwise, refs/index.json/objects could\n // be corrupted\n logger.debug(`Repository.persist, going to acquire a lock`);\n await this.persistMutex.runExclusive(async () => {\n logger.debug(`Repository.persist, validate = ${validate.toString()}, a lock has been acquired`);\n await this.deleteObjectsFromFS(this.objectsToRemove);\n this.validateObjects(validate, Object.values(this.objects));\n await this.writeObjectsToTheFS(Object.values(this.objects));\n await this.writeRemoteLanes();\n await this.unmergedComponents.write();\n });\n logger.debug(`Repository.persist, completed. the lock has been released`);\n this.clearObjects();\n if (Repository.onPostObjectsPersist) {\n Repository.onPostObjectsPersist().catch((err) => {\n logger.error('fatal: onPostObjectsPersist encountered an error (this error does not stop the process)', err);\n });\n }\n }\n\n async writeRemoteLanes() {\n await this.remoteLanes.write();\n }\n\n /**\n * this is especially critical for http server, where one process lives long and serves multiple\n * exports. without this, the objects get accumulated over time and being rewritten over and over\n * again.\n */\n private clearObjects() {\n this.objects = {};\n this.objectsToRemove = [];\n }\n\n /**\n * normally, the validation step takes place just before the acutal writing of the file.\n * however, this can be an issue where a component has an invalid version. the component could\n * be saved before validating the version (see #1727). that's why we validate here before writing\n * anything to the filesystem.\n * the open question here is whether should we validate again before the actual writing or it\n * should be enough to validate here?\n * for now, it does validate again before saving, only to be 100% sure nothing happens in a few\n * lines of code until the actual writing. however, if the performance penalty is noticeable, we\n * can easily revert it by changing `bitObject.validateBeforePersist = false` line run regardless\n * the `validate` argument.\n */\n validateObjects(validate: boolean, objects: BitObject[]) {\n objects.forEach((bitObject) => {\n // @ts-ignore some BitObject classes have validate() method\n if (validate && bitObject.validate) {\n // @ts-ignore\n bitObject.validate();\n }\n if (!validate) {\n bitObject.validateBeforePersist = false;\n }\n });\n }\n\n async deleteObjectsFromFS(refs: Ref[]): Promise<void> {\n if (!refs.length) return;\n const uniqRefs = uniqBy(refs, 'hash');\n logger.debug(`Repository._deleteMany: deleting ${uniqRefs.length} objects`);\n const concurrency = concurrentIOLimit();\n await pMapPool(uniqRefs, (ref) => this._deleteOne(ref), { concurrency });\n const removed = this.scopeIndex.removeMany(uniqRefs);\n if (removed) await this.scopeIndex.write();\n }\n\n async moveObjectsToDir(refs: Ref[], dir: string): Promise<void> {\n if (!refs.length) return;\n const uniqRefs = uniqBy(refs, 'hash');\n logger.debug(`Repository.moveObjectsToDir: ${uniqRefs.length} objects`);\n const concurrency = concurrentIOLimit();\n await pMapPool(uniqRefs, (ref) => this.moveOneObjectToDir(ref, dir), { concurrency });\n const removed = this.scopeIndex.removeMany(uniqRefs);\n if (removed) await this.scopeIndex.write();\n }\n\n async moveObjectsToTrash(refs: Ref[]): Promise<void> {\n await this.moveObjectsToDir(refs, TRASH_DIR);\n }\n\n async listTrash(): Promise<Ref[]> {\n return this.listRefs(this.getTrashDir());\n }\n\n async getFromTrash(refs: Ref[]): Promise<BitObject[]> {\n const objectsFromTrash = await Promise.all(\n refs.map(async (ref) => {\n const trashObjPath = path.join(this.getTrashDir(), this.hashPath(ref));\n let buffer: Buffer;\n try {\n buffer = await fs.readFile(trashObjPath);\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n throw new BitError(`unable to find the object ${ref.toString()} in the trash`);\n }\n throw err;\n }\n return BitObject.parseObject(buffer, trashObjPath);\n })\n );\n return objectsFromTrash;\n }\n\n async restoreFromTrash(refs: Ref[]) {\n logger.debug(`Repository.restoreFromTrash: ${refs.length} objects`);\n const objectsFromTrash = await this.getFromTrash(refs);\n await this.writeObjectsToTheFS(objectsFromTrash);\n }\n\n async restoreFromDir(dir: string, overwrite = false) {\n await fs.copy(path.join(this.scopePath, dir), this.getPath(), { overwrite });\n }\n\n private async moveOneObjectToDir(ref: Ref, dir: string) {\n const currentPath = this.objectPath(ref);\n const absDir = path.join(this.scopePath, dir);\n const fullPath = path.join(absDir, this.hashPath(ref));\n await fs.move(currentPath, fullPath, { overwrite: true });\n this.removeFromCache(ref);\n }\n\n private async moveOneObjectToTrash(ref: Ref) {\n await this.moveOneObjectToDir(ref, TRASH_DIR);\n }\n\n async deleteRecordsFromUnmergedComponents(compIds: ComponentID[]) {\n this.unmergedComponents.removeMultipleComponents(compIds);\n await this.unmergedComponents.write();\n }\n\n /**\n * write all objects to the FS and index the components/lanes/symlink objects\n */\n async writeObjectsToTheFS(objects: BitObject[], rawObjects?: RawObjectsMap): Promise<void> {\n const count = objects.length;\n if (!count) return;\n logger.trace(`Repository.writeObjectsToTheFS: started writing ${count} objects`);\n const concurrency = concurrentIOLimit();\n const chownOptions = await this.getChownOptions();\n await pMapPool(objects, (obj) => this._writeOne(obj, rawObjects?.get(obj), chownOptions), { concurrency });\n logger.trace(`Repository.writeObjectsToTheFS: completed writing ${count} objects`);\n\n const added = this.scopeIndex.addMany(objects);\n if (added) await this.scopeIndex.write();\n }\n\n /**\n * do not call this method directly. always call this.removeObject() and once done with all objects,\n * call this.persist()\n */\n _deleteOne(ref: Ref): Promise<boolean> {\n this.removeFromCache(ref);\n const pathToDelete = this.objectPath(ref);\n logger.trace(`repository._deleteOne: deleting ${pathToDelete}`);\n return removeFile(pathToDelete, true);\n }\n\n /**\n * always prefer this.persist() or this.writeObjectsToTheFS()\n * this method doesn't write to scopeIndex. so using this method for ModelComponent or\n * Symlink makes the index outdated.\n */\n async _writeOne(\n object: BitObject,\n raw?: CompressedObject & { ref: Ref },\n chownOptions?: ObjectChownOptions\n ): Promise<void> {\n // when the already-compressed buffer of an unchanged object is available, skip the costly re-compression.\n const { buffer: contents, inflatedSize } = raw || (await object.compressWithSize());\n const options = chownOptions === undefined ? await this.getChownOptions() : chownOptions;\n // hashing a Source is sha1 of its content. the raw buffer's ref was already checked against it.\n const hash = raw?.ref || object.hash();\n const objectPath = this.objectPath(hash);\n logger.trace(`repository._writeOne: ${objectPath}`);\n // Run hook to transform content pre persisting\n const transformedContent = this.onPersist(contents);\n await this.writeObjectFile(objectPath, transformedContent, options);\n // once written, the object is the up-to-date one. this also replaces the size-estimate of objects that\n // were cached by `add()`.\n if (this.cache.has(hash.toString())) this.cache.set(hash.toString(), object, inflatedSize);\n this.liveObjects.set(\n hash.toString(),\n object,\n inflatedSize,\n transformedContent.byteLength < MAX_COMPRESSED_SIZE_TO_CACHE\n );\n }\n\n async writeObjectsToPendingDir(objectList: ObjectList, pendingDir: PathOsBasedAbsolute) {\n // Refs come from client-supplied tar entry names. Validate the whole batch\n // before any writes so a crafted ref can't escape pendingDir AND so we\n // don't leave orphan files in pendingDir when one entry is rejected mid-batch.\n // Mirrors the isSnap check listRefs already applies on the read path.\n for (const object of objectList.objects) {\n const ref = object.ref.toString();\n if (!isSnap(ref)) throw new BitError(`invalid object ref: ${JSON.stringify(ref)}`);\n }\n const chownOptions = await this.getChownOptions();\n await pMapPool(\n objectList.objects,\n (object) => this.writeObjectFile(path.join(pendingDir, this.hashPath(object.ref)), object.buffer, chownOptions),\n { concurrency: concurrentIOLimit() }\n );\n }\n\n async readObjectsFromPendingDir(pendingDir: PathOsBasedAbsolute) {\n const refs = await this.listRefs(pendingDir);\n const objects = await pMapPool(\n refs,\n async (ref) => {\n const buffer = await fs.readFile(path.join(pendingDir, this.hashPath(ref)));\n return { ref, buffer };\n },\n { concurrency: concurrentIOLimit() }\n );\n return new ObjectList(objects);\n }\n\n /**\n * the owner to set on written object files. `null` when the scope has no group (or it can't be resolved), in which\n * case the owner of an existing file is kept.\n */\n private async getChownOptions(): Promise<ObjectChownOptions> {\n if (!this.scopeJson.groupName) return null;\n const gid = await resolveGroupId(this.scopeJson.groupName);\n return gid ? { uid: userInfo().uid, gid } : null;\n }\n\n /**\n * writes the file atomically (tmp file + rename), the same way `writeFile` of legacy.utils does with write-file-atomic,\n * including keeping the mode (and owner, when no chown is given) of an existing file and ignoring the same chown/chmod\n * errors. it's called for every object, so it saves the fs calls write-file-atomic and `ensureDir` do on every write\n * (realpath, stat of the dir, exit handlers). the parent dir is created only when the first write fails with ENOENT.\n * the tmp file is a dotfile, which `listRefs()` ignores in case it's left behind.\n */\n private async writeObjectFile(filePath: string, contents: Buffer, chownOptions: ObjectChownOptions) {\n const existing = await fs.stat(filePath).catch(() => undefined);\n const mode = existing?.mode;\n // process.getuid is undefined on Windows, where there's no owner to keep.\n const keepOwner =\n existing && typeof process.getuid === 'function' ? { uid: existing.uid, gid: existing.gid } : null;\n const chown = chownOptions || keepOwner;\n objectFileWriteCounter += 1;\n const tmpPath = path.join(\n path.dirname(filePath),\n `.${path.basename(filePath)}.${process.pid}.${objectFileWriteCounter}`\n );\n try {\n try {\n await fs.writeFile(tmpPath, contents, { mode });\n } catch (err: any) {\n if (err.code !== 'ENOENT') throw err;\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(tmpPath, contents, { mode });\n }\n if (chown) await fs.chown(tmpPath, chown.uid, chown.gid).catch(throwUnlessChownErrOk);\n if (mode) await fs.chmod(tmpPath, mode).catch(throwUnlessChownErrOk);\n await fs.rename(tmpPath, filePath);\n } catch (err) {\n await fs.remove(tmpPath).catch(() => {});\n throw err;\n }\n }\n\n private hashPath(ref: Ref) {\n const hash = ref.toString();\n return path.join(hash.slice(0, 2), hash.slice(2));\n }\n}\n\nasync function removeFile(filePath: string, propagateDirs = false): Promise<boolean> {\n try {\n await fs.unlink(filePath);\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n // the file doesn't exist, that's fine, no need to do anything\n return false;\n }\n throw err;\n }\n if (!propagateDirs) return true;\n const { dir } = path.parse(filePath);\n await removeEmptyDir(dir);\n return true;\n}\n\n/**\n * same as write-file-atomic: a non-root user can't always chown/chmod, and it's not an error.\n */\nfunction throwUnlessChownErrOk(err: any) {\n if (err.code === 'ENOSYS') return;\n const nonRoot = !process.getuid || process.getuid() !== 0;\n if (nonRoot && (err.code === 'EINVAL' || err.code === 'EPERM')) return;\n throw err;\n}\n\nasync function resolveGroupId(groupName: string): Promise<number | null | undefined> {\n // unix group ids are meaningless on Windows, which has no /etc/group and no process.getgid\n if (!process.getgid) return null;\n let groupFileContent: string;\n try {\n groupFileContent = await fs.readFile('/etc/group', 'utf8');\n } catch (err: any) {\n logger.error('resolveGroupId', err);\n throw new BitError(`unable to resolve group id of \"${groupName}\", got an error ${err.message}`);\n }\n const groupLine = groupFileContent.split('\\n').find((line) => line.split(':')[0] === groupName);\n if (!groupLine) {\n throw new BitError(`unable to resolve group id of \"${groupName}\", the group does not exist`);\n }\n const gid = Number(groupLine.split(':')[2]);\n if (Number.isNaN(gid)) {\n throw new BitError(`unable to resolve group id of \"${groupName}\", got an error parsing /etc/group`);\n }\n return gid;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -28,6 +28,13 @@ function _path() {
|
|
|
28
28
|
};
|
|
29
29
|
return data;
|
|
30
30
|
}
|
|
31
|
+
function _stream() {
|
|
32
|
+
const data = require("stream");
|
|
33
|
+
_stream = function () {
|
|
34
|
+
return data;
|
|
35
|
+
};
|
|
36
|
+
return data;
|
|
37
|
+
}
|
|
31
38
|
function _zlib() {
|
|
32
39
|
const data = _interopRequireDefault(require("zlib"));
|
|
33
40
|
_zlib = function () {
|
|
@@ -49,6 +56,13 @@ function _models() {
|
|
|
49
56
|
};
|
|
50
57
|
return data;
|
|
51
58
|
}
|
|
59
|
+
function _objectList() {
|
|
60
|
+
const data = require("./object-list");
|
|
61
|
+
_objectList = function () {
|
|
62
|
+
return data;
|
|
63
|
+
};
|
|
64
|
+
return data;
|
|
65
|
+
}
|
|
52
66
|
function _ref() {
|
|
53
67
|
const data = _interopRequireDefault(require("./ref"));
|
|
54
68
|
_ref = function () {
|
|
@@ -156,4 +170,105 @@ describe('Repository.list', () => {
|
|
|
156
170
|
});
|
|
157
171
|
});
|
|
158
172
|
|
|
173
|
+
/**
|
|
174
|
+
* the export flow moves every object through these methods, so for components with thousands of files, the number of
|
|
175
|
+
* fs operations and compressions per object is what makes an export fast or slow.
|
|
176
|
+
*/
|
|
177
|
+
describe('Repository writing objects for export', () => {
|
|
178
|
+
let scopePath;
|
|
179
|
+
let repository;
|
|
180
|
+
beforeEach(async () => {
|
|
181
|
+
scopePath = await _fsExtra().default.mkdtemp(_path().default.join(_os().default.tmpdir(), 'bit-repository-spec-'));
|
|
182
|
+
const scopeJson = new (_legacy().ScopeJson)({
|
|
183
|
+
name: SCOPE_NAME,
|
|
184
|
+
version: '1.0.0',
|
|
185
|
+
groupName: null
|
|
186
|
+
}, _path().default.join(scopePath, 'scope.json'));
|
|
187
|
+
repository = await _repository().default.create({
|
|
188
|
+
scopePath,
|
|
189
|
+
scopeJson
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
afterEach(async () => {
|
|
193
|
+
await _fsExtra().default.remove(scopePath);
|
|
194
|
+
});
|
|
195
|
+
const createObjectList = async count => {
|
|
196
|
+
const sources = Array.from({
|
|
197
|
+
length: count
|
|
198
|
+
}, (_, i) => _models().Source.from(Buffer.from(`file ${i}`)));
|
|
199
|
+
return _objectList().ObjectList.fromBitObjects(sources);
|
|
200
|
+
};
|
|
201
|
+
it('should write a file per pending object and read them back', async () => {
|
|
202
|
+
const objectList = await createObjectList(SOURCES_COUNT);
|
|
203
|
+
const pendingDir = _path().default.join(scopePath, 'pending-objects', 'client-1');
|
|
204
|
+
await repository.writeObjectsToPendingDir(objectList, pendingDir);
|
|
205
|
+
for (const objectItem of objectList.objects) {
|
|
206
|
+
const hash = objectItem.ref.toString();
|
|
207
|
+
const written = await _fsExtra().default.readFile(_path().default.join(pendingDir, hash.slice(0, 2), hash.slice(2)));
|
|
208
|
+
(0, _chai().expect)(written.equals(objectItem.buffer)).to.be.true;
|
|
209
|
+
}
|
|
210
|
+
const loaded = await repository.readObjectsFromPendingDir(pendingDir);
|
|
211
|
+
(0, _chai().expect)(loaded.objects.map(o => o.ref.toString()).sort()).to.deep.equal(objectList.objects.map(o => o.ref.toString()).sort());
|
|
212
|
+
});
|
|
213
|
+
it('should write the given raw buffers of sources without re-compressing them, and leave no tmp files', async () => {
|
|
214
|
+
const objectList = await createObjectList(SOURCES_COUNT);
|
|
215
|
+
const {
|
|
216
|
+
bitObjectList,
|
|
217
|
+
rawSources
|
|
218
|
+
} = await objectList.toBitObjectsWithRawSources();
|
|
219
|
+
(0, _chai().expect)(rawSources.size).to.equal(SOURCES_COUNT);
|
|
220
|
+
bitObjectList.getAll().forEach(obj => {
|
|
221
|
+
obj.compressWithSize = async () => {
|
|
222
|
+
throw new Error('should not re-compress');
|
|
223
|
+
};
|
|
224
|
+
});
|
|
225
|
+
await repository.writeObjectsToTheFS(bitObjectList.getAll(), rawSources);
|
|
226
|
+
for (const objectItem of objectList.objects) {
|
|
227
|
+
const written = await _fsExtra().default.readFile(repository.objectPath(objectItem.ref));
|
|
228
|
+
(0, _chai().expect)(written.equals(objectItem.buffer)).to.be.true;
|
|
229
|
+
}
|
|
230
|
+
const objectDirs = await _fsExtra().default.readdir(repository.getPath());
|
|
231
|
+
const allFiles = (await Promise.all(objectDirs.map(dir => _fsExtra().default.readdir(_path().default.join(repository.getPath(), dir))))).flat();
|
|
232
|
+
(0, _chai().expect)(allFiles).to.have.lengthOf(SOURCES_COUNT);
|
|
233
|
+
(0, _chai().expect)(allFiles.filter(fileName => fileName.startsWith('.'))).to.have.lengthOf(0);
|
|
234
|
+
});
|
|
235
|
+
it('should not use a raw buffer of a source whose content does not match its ref', async () => {
|
|
236
|
+
const [first, second] = (await createObjectList(2)).objects;
|
|
237
|
+
const tampered = new (_objectList().ObjectList)([{
|
|
238
|
+
ref: first.ref,
|
|
239
|
+
buffer: second.buffer
|
|
240
|
+
}]);
|
|
241
|
+
const {
|
|
242
|
+
rawSources
|
|
243
|
+
} = await tampered.toBitObjectsWithRawSources();
|
|
244
|
+
(0, _chai().expect)(rawSources.size).to.equal(0);
|
|
245
|
+
});
|
|
246
|
+
it('should re-create an object dir that was removed after it was written to', async () => {
|
|
247
|
+
const source = _models().Source.from(Buffer.from('some content'));
|
|
248
|
+
await repository.writeObjectsToTheFS([source]);
|
|
249
|
+
await _fsExtra().default.remove(_path().default.dirname(repository.objectPath(source.hash())));
|
|
250
|
+
await repository.writeObjectsToTheFS([source]);
|
|
251
|
+
(0, _chai().expect)(await _fsExtra().default.pathExists(repository.objectPath(source.hash()))).to.be.true;
|
|
252
|
+
});
|
|
253
|
+
it('should keep the mode of an existing object file it overwrites, as write-file-atomic does', async () => {
|
|
254
|
+
const source = _models().Source.from(Buffer.from('some content'));
|
|
255
|
+
await repository.writeObjectsToTheFS([source]);
|
|
256
|
+
const objectPath = repository.objectPath(source.hash());
|
|
257
|
+
await _fsExtra().default.chmod(objectPath, 0o640);
|
|
258
|
+
await repository.writeObjectsToTheFS([source]);
|
|
259
|
+
(0, _chai().expect)((await _fsExtra().default.stat(objectPath)).mode & 0o777).to.equal(0o640);
|
|
260
|
+
});
|
|
261
|
+
it('should reject reading a truncated tar of objects rather than hang', async () => {
|
|
262
|
+
const objectList = await createObjectList(SOURCES_COUNT);
|
|
263
|
+
const chunks = [];
|
|
264
|
+
for await (const chunk of objectList.toTar()) chunks.push(chunk);
|
|
265
|
+
const truncated = Buffer.concat(chunks).subarray(0, 700);
|
|
266
|
+
let error;
|
|
267
|
+
await _objectList().ObjectList.fromTar(_stream().Readable.from([truncated])).catch(err => {
|
|
268
|
+
error = err;
|
|
269
|
+
});
|
|
270
|
+
(0, _chai().expect)(error).to.be.instanceOf(Error);
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
|
|
159
274
|
//# sourceMappingURL=repository.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_chai","data","require","_fsExtra","_interopRequireDefault","_os","_path","_zlib","_legacy","_models","_ref","_repository","_scopeIndex","e","__esModule","default","SCOPE_NAME","SOURCES_COUNT","describe","scopePath","scopeJson","repository","contentReads","original","onPostObjectRead","Repository","hasPostObjectReadTransformer","beforeEach","fs","mkdtemp","path","join","os","tmpdir","ScopeJson","name","version","groupName","create","modelComponent","ModelComponent","from","scope","lang","deprecated","bindingPrefix","versions","sources","Array","length","_","i","Source","Buffer","objects","forEach","object","validateBeforePersist","writeObjectsToTheFS","content","afterEach","remove","it","reset","loaded","load","expect","scopeIndex","getHashes","IndexType","components","to","have","lengthOf","equal","list","hash","repeat","unknownObject","zlib","deflateSync","objectPath","Ref","outputFile","be","instanceOf"],"sources":["repository.spec.ts"],"sourcesContent":["import { expect } from 'chai';\nimport fs from 'fs-extra';\nimport os from 'os';\nimport path from 'path';\nimport zlib from 'zlib';\nimport { ScopeJson } from '@teambit/legacy.scope';\nimport { ModelComponent, Source } from '../models';\nimport Ref from './ref';\nimport Repository from './repository';\nimport { IndexType } from './scope-index';\n\nconst SCOPE_NAME = 'my-scope';\nconst SOURCES_COUNT = 5;\n\n/**\n * `Repository.list(types)` is what rebuilds a missing `index.json`, and it's asked for a handful of\n * object types in a scope that is mostly file contents. the type is in each file's header, so the\n * rest of a file should only be read when its type is one that was asked for.\n */\ndescribe('Repository.list', () => {\n let scopePath: string;\n let scopeJson: ScopeJson;\n let repository: Repository;\n let contentReads: number;\n const original = {\n onPostObjectRead: Repository.onPostObjectRead,\n hasPostObjectReadTransformer: Repository.hasPostObjectReadTransformer,\n };\n\n beforeEach(async () => {\n scopePath = await fs.mkdtemp(path.join(os.tmpdir(), 'bit-repository-spec-'));\n scopeJson = new ScopeJson(\n { name: SCOPE_NAME, version: '1.0.0', groupName: null },\n path.join(scopePath, 'scope.json')\n );\n repository = await Repository.create({ scopePath, scopeJson });\n const modelComponent = ModelComponent.from({\n name: 'bar/foo',\n scope: SCOPE_NAME,\n lang: 'javascript',\n deprecated: false,\n bindingPrefix: '@bit',\n versions: {},\n });\n const sources = Array.from({ length: SOURCES_COUNT }, (_, i) => Source.from(Buffer.from(`file ${i}`)));\n const objects = [modelComponent, ...sources];\n objects.forEach((object) => {\n object.validateBeforePersist = false;\n });\n await repository.writeObjectsToTheFS(objects);\n\n contentReads = 0;\n // every full read of an object file goes through this hook, while a header read doesn't\n Repository.onPostObjectRead = (content) => {\n contentReads += 1;\n return content;\n };\n });\n\n afterEach(async () => {\n Repository.onPostObjectRead = original.onPostObjectRead;\n Repository.hasPostObjectReadTransformer = original.hasPostObjectReadTransformer;\n await fs.remove(scopePath);\n });\n\n it('should rebuild a missing index.json reading the contents of the wanted objects only', async () => {\n Repository.hasPostObjectReadTransformer = () => false;\n await Repository.reset(scopePath);\n const loaded = await Repository.load({ scopePath, scopeJson });\n expect(loaded.scopeIndex.getHashes(IndexType.components)).to.have.lengthOf(1);\n expect(contentReads).to.equal(1);\n });\n\n it('should read every object once when a transformer is registered, as the header is transformed too', async () => {\n Repository.hasPostObjectReadTransformer = () => true;\n const objects = await repository.list([ModelComponent]);\n expect(objects).to.have.lengthOf(1);\n expect(contentReads).to.equal(SOURCES_COUNT + 1);\n });\n\n it('should skip an object whose header names a type nothing is registered under, as the full read does', async () => {\n Repository.hasPostObjectReadTransformer = () => false;\n const hash = 'a'.repeat(40);\n const content = 'whatever';\n const unknownObject = zlib.deflateSync(Buffer.from(`NotARealType ${hash} ${content.length}\\0${content}`));\n const objectPath = repository.objectPath(Ref.from(hash));\n await fs.outputFile(objectPath, unknownObject);\n const objects = await repository.list([ModelComponent]);\n expect(objects).to.have.lengthOf(1);\n expect(objects[0]).to.be.instanceOf(ModelComponent);\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_chai","data","require","_fsExtra","_interopRequireDefault","_os","_path","_stream","_zlib","_legacy","_models","_objectList","_ref","_repository","_scopeIndex","e","__esModule","default","SCOPE_NAME","SOURCES_COUNT","describe","scopePath","scopeJson","repository","contentReads","original","onPostObjectRead","Repository","hasPostObjectReadTransformer","beforeEach","fs","mkdtemp","path","join","os","tmpdir","ScopeJson","name","version","groupName","create","modelComponent","ModelComponent","from","scope","lang","deprecated","bindingPrefix","versions","sources","Array","length","_","i","Source","Buffer","objects","forEach","object","validateBeforePersist","writeObjectsToTheFS","content","afterEach","remove","it","reset","loaded","load","expect","scopeIndex","getHashes","IndexType","components","to","have","lengthOf","equal","list","hash","repeat","unknownObject","zlib","deflateSync","objectPath","Ref","outputFile","be","instanceOf","createObjectList","count","ObjectList","fromBitObjects","objectList","pendingDir","writeObjectsToPendingDir","objectItem","ref","toString","written","readFile","slice","equals","buffer","true","readObjectsFromPendingDir","map","o","sort","deep","bitObjectList","rawSources","toBitObjectsWithRawSources","size","getAll","obj","compressWithSize","Error","objectDirs","readdir","getPath","allFiles","Promise","all","dir","flat","filter","fileName","startsWith","first","second","tampered","source","dirname","pathExists","chmod","stat","mode","chunks","chunk","toTar","push","truncated","concat","subarray","error","fromTar","Readable","catch","err"],"sources":["repository.spec.ts"],"sourcesContent":["import { expect } from 'chai';\nimport fs from 'fs-extra';\nimport os from 'os';\nimport path from 'path';\nimport { Readable } from 'stream';\nimport zlib from 'zlib';\nimport { ScopeJson } from '@teambit/legacy.scope';\nimport { ModelComponent, Source } from '../models';\nimport { ObjectList } from './object-list';\nimport Ref from './ref';\nimport Repository from './repository';\nimport { IndexType } from './scope-index';\n\nconst SCOPE_NAME = 'my-scope';\nconst SOURCES_COUNT = 5;\n\n/**\n * `Repository.list(types)` is what rebuilds a missing `index.json`, and it's asked for a handful of\n * object types in a scope that is mostly file contents. the type is in each file's header, so the\n * rest of a file should only be read when its type is one that was asked for.\n */\ndescribe('Repository.list', () => {\n let scopePath: string;\n let scopeJson: ScopeJson;\n let repository: Repository;\n let contentReads: number;\n const original = {\n onPostObjectRead: Repository.onPostObjectRead,\n hasPostObjectReadTransformer: Repository.hasPostObjectReadTransformer,\n };\n\n beforeEach(async () => {\n scopePath = await fs.mkdtemp(path.join(os.tmpdir(), 'bit-repository-spec-'));\n scopeJson = new ScopeJson(\n { name: SCOPE_NAME, version: '1.0.0', groupName: null },\n path.join(scopePath, 'scope.json')\n );\n repository = await Repository.create({ scopePath, scopeJson });\n const modelComponent = ModelComponent.from({\n name: 'bar/foo',\n scope: SCOPE_NAME,\n lang: 'javascript',\n deprecated: false,\n bindingPrefix: '@bit',\n versions: {},\n });\n const sources = Array.from({ length: SOURCES_COUNT }, (_, i) => Source.from(Buffer.from(`file ${i}`)));\n const objects = [modelComponent, ...sources];\n objects.forEach((object) => {\n object.validateBeforePersist = false;\n });\n await repository.writeObjectsToTheFS(objects);\n\n contentReads = 0;\n // every full read of an object file goes through this hook, while a header read doesn't\n Repository.onPostObjectRead = (content) => {\n contentReads += 1;\n return content;\n };\n });\n\n afterEach(async () => {\n Repository.onPostObjectRead = original.onPostObjectRead;\n Repository.hasPostObjectReadTransformer = original.hasPostObjectReadTransformer;\n await fs.remove(scopePath);\n });\n\n it('should rebuild a missing index.json reading the contents of the wanted objects only', async () => {\n Repository.hasPostObjectReadTransformer = () => false;\n await Repository.reset(scopePath);\n const loaded = await Repository.load({ scopePath, scopeJson });\n expect(loaded.scopeIndex.getHashes(IndexType.components)).to.have.lengthOf(1);\n expect(contentReads).to.equal(1);\n });\n\n it('should read every object once when a transformer is registered, as the header is transformed too', async () => {\n Repository.hasPostObjectReadTransformer = () => true;\n const objects = await repository.list([ModelComponent]);\n expect(objects).to.have.lengthOf(1);\n expect(contentReads).to.equal(SOURCES_COUNT + 1);\n });\n\n it('should skip an object whose header names a type nothing is registered under, as the full read does', async () => {\n Repository.hasPostObjectReadTransformer = () => false;\n const hash = 'a'.repeat(40);\n const content = 'whatever';\n const unknownObject = zlib.deflateSync(Buffer.from(`NotARealType ${hash} ${content.length}\\0${content}`));\n const objectPath = repository.objectPath(Ref.from(hash));\n await fs.outputFile(objectPath, unknownObject);\n const objects = await repository.list([ModelComponent]);\n expect(objects).to.have.lengthOf(1);\n expect(objects[0]).to.be.instanceOf(ModelComponent);\n });\n});\n\n/**\n * the export flow moves every object through these methods, so for components with thousands of files, the number of\n * fs operations and compressions per object is what makes an export fast or slow.\n */\ndescribe('Repository writing objects for export', () => {\n let scopePath: string;\n let repository: Repository;\n\n beforeEach(async () => {\n scopePath = await fs.mkdtemp(path.join(os.tmpdir(), 'bit-repository-spec-'));\n const scopeJson = new ScopeJson(\n { name: SCOPE_NAME, version: '1.0.0', groupName: null },\n path.join(scopePath, 'scope.json')\n );\n repository = await Repository.create({ scopePath, scopeJson });\n });\n\n afterEach(async () => {\n await fs.remove(scopePath);\n });\n\n const createObjectList = async (count: number) => {\n const sources = Array.from({ length: count }, (_, i) => Source.from(Buffer.from(`file ${i}`)));\n return ObjectList.fromBitObjects(sources);\n };\n\n it('should write a file per pending object and read them back', async () => {\n const objectList = await createObjectList(SOURCES_COUNT);\n const pendingDir = path.join(scopePath, 'pending-objects', 'client-1');\n await repository.writeObjectsToPendingDir(objectList, pendingDir);\n for (const objectItem of objectList.objects) {\n const hash = objectItem.ref.toString();\n const written = await fs.readFile(path.join(pendingDir, hash.slice(0, 2), hash.slice(2)));\n expect(written.equals(objectItem.buffer)).to.be.true;\n }\n const loaded = await repository.readObjectsFromPendingDir(pendingDir);\n expect(loaded.objects.map((o) => o.ref.toString()).sort()).to.deep.equal(\n objectList.objects.map((o) => o.ref.toString()).sort()\n );\n });\n\n it('should write the given raw buffers of sources without re-compressing them, and leave no tmp files', async () => {\n const objectList = await createObjectList(SOURCES_COUNT);\n const { bitObjectList, rawSources } = await objectList.toBitObjectsWithRawSources();\n expect(rawSources.size).to.equal(SOURCES_COUNT);\n bitObjectList.getAll().forEach((obj) => {\n obj.compressWithSize = async () => {\n throw new Error('should not re-compress');\n };\n });\n await repository.writeObjectsToTheFS(bitObjectList.getAll(), rawSources);\n for (const objectItem of objectList.objects) {\n const written = await fs.readFile(repository.objectPath(objectItem.ref));\n expect(written.equals(objectItem.buffer)).to.be.true;\n }\n const objectDirs = await fs.readdir(repository.getPath());\n const allFiles = (\n await Promise.all(objectDirs.map((dir) => fs.readdir(path.join(repository.getPath(), dir))))\n ).flat();\n expect(allFiles).to.have.lengthOf(SOURCES_COUNT);\n expect(allFiles.filter((fileName) => fileName.startsWith('.'))).to.have.lengthOf(0);\n });\n\n it('should not use a raw buffer of a source whose content does not match its ref', async () => {\n const [first, second] = (await createObjectList(2)).objects;\n const tampered = new ObjectList([{ ref: first.ref, buffer: second.buffer }]);\n const { rawSources } = await tampered.toBitObjectsWithRawSources();\n expect(rawSources.size).to.equal(0);\n });\n\n it('should re-create an object dir that was removed after it was written to', async () => {\n const source = Source.from(Buffer.from('some content'));\n await repository.writeObjectsToTheFS([source]);\n await fs.remove(path.dirname(repository.objectPath(source.hash())));\n await repository.writeObjectsToTheFS([source]);\n expect(await fs.pathExists(repository.objectPath(source.hash()))).to.be.true;\n });\n\n it('should keep the mode of an existing object file it overwrites, as write-file-atomic does', async () => {\n const source = Source.from(Buffer.from('some content'));\n await repository.writeObjectsToTheFS([source]);\n const objectPath = repository.objectPath(source.hash());\n await fs.chmod(objectPath, 0o640);\n await repository.writeObjectsToTheFS([source]);\n expect((await fs.stat(objectPath)).mode & 0o777).to.equal(0o640);\n });\n\n it('should reject reading a truncated tar of objects rather than hang', async () => {\n const objectList = await createObjectList(SOURCES_COUNT);\n const chunks: Buffer[] = [];\n for await (const chunk of objectList.toTar() as AsyncIterable<Buffer>) chunks.push(chunk);\n const truncated = Buffer.concat(chunks).subarray(0, 700);\n let error: Error | undefined;\n await ObjectList.fromTar(Readable.from([truncated])).catch((err) => {\n error = err;\n });\n expect(error).to.be.instanceOf(Error);\n });\n});\n"],"mappings":"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","ignoreList":[]}
|