@teambit/objects 0.0.731 → 0.0.733

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.
@@ -28,6 +28,13 @@ function _objects() {
28
28
  };
29
29
  return data;
30
30
  }
31
+ function _versionHistory() {
32
+ const data = _interopRequireDefault(require("./version-history"));
33
+ _versionHistory = function () {
34
+ return data;
35
+ };
36
+ return data;
37
+ }
31
38
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
32
39
  const modelComponentFixture = {
33
40
  name: 'bar/foo',
@@ -109,6 +116,75 @@ describe('ModelComponent', () => {
109
116
  (0, _chai().expect)(component.getTagOfRefIfExists(ref)).to.equal('0.0.8');
110
117
  });
111
118
  });
119
+ describe('populateVersionHistoryIfMissingGracefully', () => {
120
+ const hash = i => i.toString(16).padStart(40, '0');
121
+ const ref = i => new (_objects().Ref)(hash(i));
122
+ /** a version object of the given number, as the history population reads it. */
123
+ const versionObject = (i, parents = i > 0 ? [i - 1] : []) => ({
124
+ hash: () => ref(i),
125
+ parents: parents.map(ref)
126
+ });
127
+ /** a repo holding these version objects, which records what it loads. */
128
+ const fakeRepo = versions => {
129
+ const byHash = new Map(versions.map(v => [v.hash().toString(), v]));
130
+ const loaded = [];
131
+ return {
132
+ loaded,
133
+ load: async r => {
134
+ loaded.push(r.toString());
135
+ return byHash.get(r.toString());
136
+ },
137
+ writeObjectsToTheFS: async () => {}
138
+ };
139
+ };
140
+ const component = () => getModelComponent(getModelComponentFixture());
141
+ const historyHashes = versionHistory => versionHistory.getAllHashesAsString().sort();
142
+ it('adds the head and all its ancestors to an empty history', async () => {
143
+ const versionHistory = _versionHistory().default.create('bar/foo', 'remote-scope', []);
144
+ const repo = fakeRepo([0, 1, 2, 3].map(i => versionObject(i)));
145
+ const {
146
+ err
147
+ } = await component().populateVersionHistoryIfMissingGracefully(repo, versionHistory, ref(3));
148
+ (0, _chai().expect)(err).to.be.undefined;
149
+ (0, _chai().expect)(historyHashes(versionHistory)).to.deep.equal([0, 1, 2, 3].map(hash).sort());
150
+ });
151
+ it('loads a shared ancestor of a merge snap only once', async () => {
152
+ // 0 <- 1 <- 3, 0 <- 2 <- 3
153
+ const versionHistory = _versionHistory().default.create('bar/foo', 'remote-scope', []);
154
+ const repo = fakeRepo([versionObject(0), versionObject(1, [0]), versionObject(2, [0]), versionObject(3, [1, 2])]);
155
+ await component().populateVersionHistoryIfMissingGracefully(repo, versionHistory, ref(3));
156
+ (0, _chai().expect)(repo.loaded.filter(h => h === hash(0))).to.have.length(1);
157
+ (0, _chai().expect)(historyHashes(versionHistory)).to.deep.equal([0, 1, 2, 3].map(hash).sort());
158
+ });
159
+ it('stops at versions the history already has', async () => {
160
+ const versionHistory = _versionHistory().default.create('bar/foo', 'remote-scope', []);
161
+ versionHistory.addFromVersionsObjects([versionObject(0), versionObject(1)]);
162
+ const repo = fakeRepo([0, 1, 2, 3].map(i => versionObject(i)));
163
+ await component().populateVersionHistoryIfMissingGracefully(repo, versionHistory, ref(3));
164
+ (0, _chai().expect)(repo.loaded).to.deep.equal([hash(3), hash(2)]);
165
+ });
166
+ it('returns the added versions and an error when a parent is missing', async () => {
167
+ const versionHistory = _versionHistory().default.create('bar/foo', 'remote-scope', []);
168
+ const repo = fakeRepo([versionObject(2), versionObject(3)]);
169
+ const {
170
+ err,
171
+ added
172
+ } = await component().populateVersionHistoryIfMissingGracefully(repo, versionHistory, ref(3));
173
+ (0, _chai().expect)(err).to.be.instanceOf(Error);
174
+ (0, _chai().expect)(added?.map(v => v.hash.toString())).to.deep.equal([hash(3), hash(2)]);
175
+ });
176
+ it('stays fast when the whole of a long history is missing', async () => {
177
+ const size = 10000;
178
+ const versionHistory = _versionHistory().default.create('bar/foo', 'remote-scope', []);
179
+ const repo = fakeRepo(Array.from({
180
+ length: size
181
+ }, (_, i) => versionObject(i)));
182
+ const start = Date.now();
183
+ await component().populateVersionHistoryIfMissingGracefully(repo, versionHistory, ref(size - 1));
184
+ (0, _chai().expect)(versionHistory.versions).to.have.length(size);
185
+ (0, _chai().expect)(Date.now() - start).to.be.lessThan(2000);
186
+ });
187
+ });
112
188
  });
113
189
 
114
190
  //# sourceMappingURL=model-component.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_chai","data","require","_modelComponent","_interopRequireDefault","_lodash","_objects","e","__esModule","default","modelComponentFixture","name","scope","versions","lang","deprecated","bindingPrefix","remotes","url","date","state","local","getModelComponentFixture","cloneDeep","getModelComponent","obj","ModelComponent","parse","JSON","stringify","describe","validateFunc","modelComponent","before","fixture","validate","it","expect","to","throw","tagHash","orphanedHash","setOrphanedVersion","Ref","from","getRef","toString","equal","getTagOfRefIfExists","switchHashesWithTagsIfExist","repeat","deep","component","ref","setVersion","be","undefined"],"sources":["model-component.spec.ts"],"sourcesContent":["import { expect } from 'chai';\n\nimport ModelComponent from './model-component';\nimport { cloneDeep } from 'lodash';\nimport { Ref } from '../objects';\n\nconst modelComponentFixture = {\n name: 'bar/foo',\n scope: 'remote-scope',\n versions: {\n '0.0.1': '125a37bdb17220bdc1406a9a28a3dde4eec91225',\n },\n lang: 'javascript',\n deprecated: false,\n bindingPrefix: '@bit',\n remotes: [\n {\n url: 'file:///tmp/remote-scope',\n name: 'remote-scope',\n date: '1572532837438',\n },\n ],\n state: {\n versions: {\n '0.0.1': {\n local: true,\n },\n },\n },\n};\n\nconst getModelComponentFixture = (): typeof modelComponentFixture => {\n return cloneDeep(modelComponentFixture);\n};\n\nconst getModelComponent = (obj: object): ModelComponent => {\n return ModelComponent.parse(JSON.stringify(obj));\n};\n\ndescribe('ModelComponent', () => {\n describe('validate', () => {\n let validateFunc: Function;\n describe('duplicate hashes', () => {\n let modelComponent: ModelComponent;\n before(() => {\n const fixture = getModelComponentFixture();\n fixture.versions['0.0.2'] = fixture.versions['0.0.1'];\n modelComponent = getModelComponent(fixture);\n validateFunc = () => modelComponent.validate();\n });\n it('should throw an error', () => {\n expect(validateFunc).to.throw('the following hash(es) are duplicated');\n });\n });\n });\n describe('versions lookup', () => {\n const tagHash = '125a37bdb17220bdc1406a9a28a3dde4eec91225';\n const orphanedHash = '225a37bdb17220bdc1406a9a28a3dde4eec91225';\n let modelComponent: ModelComponent;\n before(() => {\n modelComponent = getModelComponent(getModelComponentFixture());\n modelComponent.setOrphanedVersion('0.0.3', Ref.from(orphanedHash));\n });\n it('should find the ref of a tag and of an orphaned tag', () => {\n expect(modelComponent.getRef('0.0.1')?.toString()).to.equal(tagHash);\n expect(modelComponent.getRef('0.0.3')?.toString()).to.equal(orphanedHash);\n });\n it('should find the tag of a ref and of an orphaned ref', () => {\n expect(modelComponent.getTagOfRefIfExists(Ref.from(tagHash))).to.equal('0.0.1');\n expect(modelComponent.getTagOfRefIfExists(Ref.from(orphanedHash))).to.equal('0.0.3');\n expect(\n modelComponent.switchHashesWithTagsIfExist([Ref.from(orphanedHash), Ref.from('a'.repeat(40))])\n ).to.deep.equal(['0.0.3', 'a'.repeat(40)]);\n });\n it('should find the newest tag of a ref and not return a remembered tag after the versions changed', () => {\n const component = getModelComponent(getModelComponentFixture());\n const ref = Ref.from(tagHash);\n component.setVersion('0.0.2', Ref.from('b'.repeat(40)));\n expect(component.getTagOfRefIfExists(ref)).to.equal('0.0.1');\n delete component.versions['0.0.1'];\n expect(component.getTagOfRefIfExists(ref)).to.be.undefined;\n component.setVersion('0.0.5', ref);\n expect(component.getTagOfRefIfExists(ref)).to.equal('0.0.5');\n });\n it('should prefer a tag over an orphaned tag of the same ref, even after the orphaned one was found', () => {\n const component = getModelComponent(getModelComponentFixture());\n const ref = Ref.from('c'.repeat(40));\n component.setOrphanedVersion('0.0.7', ref);\n expect(component.getTagOfRefIfExists(ref)).to.equal('0.0.7');\n component.setVersion('0.0.8', ref);\n expect(component.getTagOfRefIfExists(ref)).to.equal('0.0.8');\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_chai","data","require","_modelComponent","_interopRequireDefault","_lodash","_objects","_versionHistory","e","__esModule","default","modelComponentFixture","name","scope","versions","lang","deprecated","bindingPrefix","remotes","url","date","state","local","getModelComponentFixture","cloneDeep","getModelComponent","obj","ModelComponent","parse","JSON","stringify","describe","validateFunc","modelComponent","before","fixture","validate","it","expect","to","throw","tagHash","orphanedHash","setOrphanedVersion","Ref","from","getRef","toString","equal","getTagOfRefIfExists","switchHashesWithTagsIfExist","repeat","deep","component","ref","setVersion","be","undefined","hash","i","padStart","versionObject","parents","map","fakeRepo","byHash","Map","v","loaded","load","r","push","get","writeObjectsToTheFS","historyHashes","versionHistory","getAllHashesAsString","sort","VersionHistory","create","repo","err","populateVersionHistoryIfMissingGracefully","filter","h","have","length","addFromVersionsObjects","added","instanceOf","Error","size","Array","_","start","Date","now","lessThan"],"sources":["model-component.spec.ts"],"sourcesContent":["import { expect } from 'chai';\n\nimport ModelComponent from './model-component';\nimport { cloneDeep } from 'lodash';\nimport { Ref } from '../objects';\nimport VersionHistory from './version-history';\n\nconst modelComponentFixture = {\n name: 'bar/foo',\n scope: 'remote-scope',\n versions: {\n '0.0.1': '125a37bdb17220bdc1406a9a28a3dde4eec91225',\n },\n lang: 'javascript',\n deprecated: false,\n bindingPrefix: '@bit',\n remotes: [\n {\n url: 'file:///tmp/remote-scope',\n name: 'remote-scope',\n date: '1572532837438',\n },\n ],\n state: {\n versions: {\n '0.0.1': {\n local: true,\n },\n },\n },\n};\n\nconst getModelComponentFixture = (): typeof modelComponentFixture => {\n return cloneDeep(modelComponentFixture);\n};\n\nconst getModelComponent = (obj: object): ModelComponent => {\n return ModelComponent.parse(JSON.stringify(obj));\n};\n\ndescribe('ModelComponent', () => {\n describe('validate', () => {\n let validateFunc: Function;\n describe('duplicate hashes', () => {\n let modelComponent: ModelComponent;\n before(() => {\n const fixture = getModelComponentFixture();\n fixture.versions['0.0.2'] = fixture.versions['0.0.1'];\n modelComponent = getModelComponent(fixture);\n validateFunc = () => modelComponent.validate();\n });\n it('should throw an error', () => {\n expect(validateFunc).to.throw('the following hash(es) are duplicated');\n });\n });\n });\n describe('versions lookup', () => {\n const tagHash = '125a37bdb17220bdc1406a9a28a3dde4eec91225';\n const orphanedHash = '225a37bdb17220bdc1406a9a28a3dde4eec91225';\n let modelComponent: ModelComponent;\n before(() => {\n modelComponent = getModelComponent(getModelComponentFixture());\n modelComponent.setOrphanedVersion('0.0.3', Ref.from(orphanedHash));\n });\n it('should find the ref of a tag and of an orphaned tag', () => {\n expect(modelComponent.getRef('0.0.1')?.toString()).to.equal(tagHash);\n expect(modelComponent.getRef('0.0.3')?.toString()).to.equal(orphanedHash);\n });\n it('should find the tag of a ref and of an orphaned ref', () => {\n expect(modelComponent.getTagOfRefIfExists(Ref.from(tagHash))).to.equal('0.0.1');\n expect(modelComponent.getTagOfRefIfExists(Ref.from(orphanedHash))).to.equal('0.0.3');\n expect(\n modelComponent.switchHashesWithTagsIfExist([Ref.from(orphanedHash), Ref.from('a'.repeat(40))])\n ).to.deep.equal(['0.0.3', 'a'.repeat(40)]);\n });\n it('should find the newest tag of a ref and not return a remembered tag after the versions changed', () => {\n const component = getModelComponent(getModelComponentFixture());\n const ref = Ref.from(tagHash);\n component.setVersion('0.0.2', Ref.from('b'.repeat(40)));\n expect(component.getTagOfRefIfExists(ref)).to.equal('0.0.1');\n delete component.versions['0.0.1'];\n expect(component.getTagOfRefIfExists(ref)).to.be.undefined;\n component.setVersion('0.0.5', ref);\n expect(component.getTagOfRefIfExists(ref)).to.equal('0.0.5');\n });\n it('should prefer a tag over an orphaned tag of the same ref, even after the orphaned one was found', () => {\n const component = getModelComponent(getModelComponentFixture());\n const ref = Ref.from('c'.repeat(40));\n component.setOrphanedVersion('0.0.7', ref);\n expect(component.getTagOfRefIfExists(ref)).to.equal('0.0.7');\n component.setVersion('0.0.8', ref);\n expect(component.getTagOfRefIfExists(ref)).to.equal('0.0.8');\n });\n });\n\n describe('populateVersionHistoryIfMissingGracefully', () => {\n const hash = (i: number) => i.toString(16).padStart(40, '0');\n const ref = (i: number) => new Ref(hash(i));\n /** a version object of the given number, as the history population reads it. */\n const versionObject = (i: number, parents: number[] = i > 0 ? [i - 1] : []): any => ({\n hash: () => ref(i),\n parents: parents.map(ref),\n });\n /** a repo holding these version objects, which records what it loads. */\n const fakeRepo = (versions: any[]) => {\n const byHash = new Map(versions.map((v) => [v.hash().toString(), v]));\n const loaded: string[] = [];\n return {\n loaded,\n load: async (r: Ref) => {\n loaded.push(r.toString());\n return byHash.get(r.toString());\n },\n writeObjectsToTheFS: async () => {},\n } as any;\n };\n const component = () => getModelComponent(getModelComponentFixture());\n const historyHashes = (versionHistory: VersionHistory) => versionHistory.getAllHashesAsString().sort();\n\n it('adds the head and all its ancestors to an empty history', async () => {\n const versionHistory = VersionHistory.create('bar/foo', 'remote-scope', []);\n const repo = fakeRepo([0, 1, 2, 3].map((i) => versionObject(i)));\n const { err } = await component().populateVersionHistoryIfMissingGracefully(repo, versionHistory, ref(3));\n expect(err).to.be.undefined;\n expect(historyHashes(versionHistory)).to.deep.equal([0, 1, 2, 3].map(hash).sort());\n });\n\n it('loads a shared ancestor of a merge snap only once', async () => {\n // 0 <- 1 <- 3, 0 <- 2 <- 3\n const versionHistory = VersionHistory.create('bar/foo', 'remote-scope', []);\n const repo = fakeRepo([versionObject(0), versionObject(1, [0]), versionObject(2, [0]), versionObject(3, [1, 2])]);\n await component().populateVersionHistoryIfMissingGracefully(repo, versionHistory, ref(3));\n expect(repo.loaded.filter((h: string) => h === hash(0))).to.have.length(1);\n expect(historyHashes(versionHistory)).to.deep.equal([0, 1, 2, 3].map(hash).sort());\n });\n\n it('stops at versions the history already has', async () => {\n const versionHistory = VersionHistory.create('bar/foo', 'remote-scope', []);\n versionHistory.addFromVersionsObjects([versionObject(0), versionObject(1)]);\n const repo = fakeRepo([0, 1, 2, 3].map((i) => versionObject(i)));\n await component().populateVersionHistoryIfMissingGracefully(repo, versionHistory, ref(3));\n expect(repo.loaded).to.deep.equal([hash(3), hash(2)]);\n });\n\n it('returns the added versions and an error when a parent is missing', async () => {\n const versionHistory = VersionHistory.create('bar/foo', 'remote-scope', []);\n const repo = fakeRepo([versionObject(2), versionObject(3)]);\n const { err, added } = await component().populateVersionHistoryIfMissingGracefully(repo, versionHistory, ref(3));\n expect(err).to.be.instanceOf(Error);\n expect(added?.map((v) => v.hash.toString())).to.deep.equal([hash(3), hash(2)]);\n });\n\n it('stays fast when the whole of a long history is missing', async () => {\n const size = 10000;\n const versionHistory = VersionHistory.create('bar/foo', 'remote-scope', []);\n const repo = fakeRepo(Array.from({ length: size }, (_, i) => versionObject(i)));\n const start = Date.now();\n await component().populateVersionHistoryIfMissingGracefully(repo, versionHistory, ref(size - 1));\n expect(versionHistory.versions).to.have.length(size);\n expect(Date.now() - start).to.be.lessThan(2000);\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -199,8 +199,8 @@ class VersionHistory extends _objects().BitObject {
199
199
  merge(versionHistory) {
200
200
  const existingHashes = this.getAllHashesAsString();
201
201
  const incomingHashes = versionHistory.getAllHashesAsString();
202
- const hashesInExistingOnly = (0, _lodash().difference)(existingHashes, incomingHashes);
203
- const versionsDataOnExistingOnly = this.versions.filter(v => hashesInExistingOnly.includes(v.hash.toString()));
202
+ const hashesInExistingOnly = new Set((0, _lodash().difference)(existingHashes, incomingHashes));
203
+ const versionsDataOnExistingOnly = this.versions.filter(v => hashesInExistingOnly.has(v.hash.toString()));
204
204
  const newVersions = [...versionHistory.versions, ...versionsDataOnExistingOnly];
205
205
  this.versionsObj = this.versionParentsToObject(newVersions);
206
206
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_graph","data","require","_componentId","_bitError","_lodash","_legacy","_ref","_interopRequireDefault","_objects","_component","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","VersionHistory","BitObject","constructor","props","name","scope","versionsObj","versionParentsToObject","versions","graphCompleteRefs","values","reduce","acc","version","hash","id","fromId","toObject","map","v","toString","parents","p","unrelated","squashed","undefined","pretty","args","getStringifyArgs","JSON","stringify","toBuffer","Buffer","from","getVersionData","ref","hasHash","Boolean","addFromVersionsObjects","forEach","exists","head","previousParents","versionData","getVersionParentsFromVersion","isEmpty","length","getAllHashesFrom","start","item","missing","hashSet","Set","allHashes","stack","add","ver","pop","verHash","push","parent","parentHash","has","parentVer","found","isRefPartOfHistory","startFrom","searchFor","includes","isGraphCompleteSince","isComplete","hasChanged","getAllHashesAsString","keys","merge","versionHistory","existingHashes","incomingHashes","hashesInExistingOnly","difference","versionsDataOnExistingOnly","filter","newVersions","getAncestor","numOfGenerationsToGoBack","errorMsg","compId","BitError","getGraph","modelComponent","laneHeads","shortHash","limitVersions","refToStr","toShortString","graph","Graph","allVersions","slice","compact","flat","allHashesUniq","uniqBy","getMetadata","tag","getTagOfRefIfExists","pointers","nodes","Node","edges","verEdges","Edge","s","find","isEqual","setNodes","setEdges","ComponentID","fromObject","create","parse","contents","parsed","Ref","exports","versionParentsToGraph"],"sources":["version-history.ts"],"sourcesContent":["import { Graph, Edge, Node } from '@teambit/graph.cleargraph';\nimport { ComponentID } from '@teambit/component-id';\nimport { BitError } from '@teambit/bit-error';\nimport { compact, difference, uniqBy } from 'lodash';\nimport { getStringifyArgs } from '@teambit/legacy.utils';\nimport Ref from '../objects/ref';\nimport { BitObject } from '../objects';\nimport type Version from './version';\nimport { getVersionParentsFromVersion } from '@teambit/component.snap-distance';\nimport type ModelComponent from './model-component';\n\nexport type VersionParents = {\n hash: Ref;\n parents: Ref[];\n unrelated?: Ref;\n squashed?: Ref[];\n};\n\nexport type VersionHistoryGraph = Graph<string | HashMetadata, string>;\n\ntype VersionHistoryProps = {\n name: string;\n scope: string;\n versions: VersionParents[];\n graphCompleteRefs?: string[];\n};\n\ntype HashMetadata = {\n tag?: string;\n pointers?: string[];\n};\n\nexport default class VersionHistory extends BitObject {\n name: string;\n scope: string;\n private versionsObj: { [hash: string]: VersionParents };\n graphCompleteRefs: string[];\n hasChanged = false; // whether the version history has changed since the last persist\n constructor(props: VersionHistoryProps) {\n super();\n this.name = props.name;\n this.scope = props.scope;\n this.versionsObj = this.versionParentsToObject(props.versions);\n this.graphCompleteRefs = props.graphCompleteRefs || [];\n }\n\n get versions() {\n return Object.values(this.versionsObj);\n }\n\n private versionParentsToObject(versions: VersionParents[]) {\n return versions.reduce((acc, version) => {\n acc[version.hash.hash] = version;\n return acc;\n }, {});\n }\n\n id() {\n return `${this.scope}/${this.name}:${VersionHistory.name}`;\n }\n\n static fromId(name: string, scope: string) {\n return new VersionHistory({ scope, name, versions: [] });\n }\n\n toObject(): Record<string, any> {\n return {\n name: this.name,\n scope: this.scope,\n versions: this.versions.map((v) => ({\n hash: v.hash.toString(),\n parents: v.parents.map((p) => p.toString()),\n unrelated: v.unrelated?.toString(),\n squashed: v.squashed ? v.squashed.map((p) => p.toString()) : undefined,\n })),\n graphCompleteRefs: this.graphCompleteRefs,\n };\n }\n\n toString(pretty: boolean): string {\n const args = getStringifyArgs(pretty);\n return JSON.stringify(this.toObject(), ...args);\n }\n\n toBuffer(pretty): Buffer {\n return Buffer.from(this.toString(pretty));\n }\n\n getVersionData(ref: Ref): VersionParents | undefined {\n return this.versionsObj[ref.toString()];\n }\n\n hasHash(ref: Ref) {\n return Boolean(this.getVersionData(ref));\n }\n\n addFromVersionsObjects(versions: Version[]) {\n versions.forEach((version) => {\n const exists = this.getVersionData(version.hash());\n if (exists) {\n // just in case the parents got updated as a result of a merge/squash\n exists.parents = version.parents;\n exists.unrelated = version.unrelated?.head;\n exists.squashed = version.squashed?.previousParents;\n } else {\n const versionData = getVersionParentsFromVersion(version);\n this.versionsObj[version.hash().hash] = versionData;\n }\n });\n }\n\n isEmpty() {\n return !this.versions.length;\n }\n\n getAllHashesFrom(start: Ref): { found?: string[]; missing?: string[] } {\n const item = this.getVersionData(start);\n if (!item) return { missing: [start.toString()] };\n const hashSet = new Set<string>();\n const allHashes: string[] = [];\n const missing: string[] = [];\n\n // Use iterative approach with a stack to avoid stack overflow on deep histories\n const stack: VersionParents[] = [item];\n hashSet.add(item.hash.toString());\n\n while (stack.length > 0) {\n const ver = stack.pop()!;\n const verHash = ver.hash.toString();\n allHashes.push(verHash);\n\n for (const parent of ver.parents) {\n const parentHash = parent.toString();\n if (hashSet.has(parentHash)) continue;\n const parentVer = this.getVersionData(parent);\n if (!parentVer) {\n missing.push(parentHash);\n continue;\n }\n // Mark as processed before pushing to prevent duplicate stack entries\n hashSet.add(parentHash);\n stack.push(parentVer);\n }\n }\n\n return { found: allHashes, missing };\n }\n\n isRefPartOfHistory(startFrom: Ref, searchFor: Ref) {\n const { found } = this.getAllHashesFrom(startFrom);\n return found?.includes(searchFor.toString());\n }\n\n isGraphCompleteSince(ref: Ref) {\n if (this.graphCompleteRefs.includes(ref.toString())) return true;\n const { missing } = this.getAllHashesFrom(ref);\n const isComplete = !missing || !missing.length;\n if (isComplete) {\n this.graphCompleteRefs.push(ref.toString());\n this.hasChanged = true;\n }\n return isComplete;\n }\n\n getAllHashesAsString(): string[] {\n return Object.keys(this.versionsObj);\n }\n\n merge(versionHistory: VersionHistory) {\n const existingHashes = this.getAllHashesAsString();\n const incomingHashes = versionHistory.getAllHashesAsString();\n const hashesInExistingOnly = difference(existingHashes, incomingHashes);\n const versionsDataOnExistingOnly = this.versions.filter((v) => hashesInExistingOnly.includes(v.hash.toString()));\n const newVersions = [...versionHistory.versions, ...versionsDataOnExistingOnly];\n this.versionsObj = this.versionParentsToObject(newVersions);\n }\n\n getAncestor(numOfGenerationsToGoBack: number, ref: Ref): Ref {\n const errorMsg = `unable to get an older parent of ${this.compId.toString()}`;\n const versionData = this.getVersionData(ref);\n if (!versionData)\n throw new BitError(`${errorMsg}, version \"${ref.toString()}\" was not found in the version history`);\n if (numOfGenerationsToGoBack === 0) return versionData.hash;\n if (!versionData.parents.length) throw new BitError(`${errorMsg}, version \"${ref.toString()}\" has no parents`);\n const parent = versionData.parents[0];\n return this.getAncestor(numOfGenerationsToGoBack - 1, parent);\n }\n\n getGraph(\n modelComponent?: ModelComponent,\n laneHeads?: { [hash: string]: string[] },\n shortHash = false,\n limitVersions?: number\n ): VersionHistoryGraph {\n const refToStr = (ref: Ref) => (shortHash ? ref.toShortString() : ref.toString());\n const graph = new Graph<string | HashMetadata, string>();\n const allVersions = limitVersions ? [...this.versions].slice(-limitVersions) : this.versions;\n const allHashes = allVersions\n .map((v) => compact([v.hash, ...v.parents, ...(v.squashed || []), v.unrelated]))\n .flat();\n\n const allHashesUniq = uniqBy(allHashes, 'hash');\n\n const getMetadata = (ref: Ref): HashMetadata | undefined => {\n if (!modelComponent || !laneHeads) return undefined;\n const tag = modelComponent.getTagOfRefIfExists(ref);\n const pointers = laneHeads[ref.toString()];\n return { tag, pointers };\n };\n const nodes = allHashesUniq.map((v) => new Node(refToStr(v), getMetadata(v) || refToStr(v)));\n\n const edges = allVersions\n .map((v) => {\n const verEdges = v.parents.map((p) => new Edge(refToStr(v.hash), refToStr(p), 'parent'));\n if (v.unrelated) verEdges.push(new Edge(refToStr(v.hash), refToStr(v.unrelated), 'unrelated'));\n if (v.squashed) {\n const squashed = v.squashed.filter((s) => !v.parents.find((p) => p.isEqual(s)));\n squashed.map((p) => verEdges.push(new Edge(refToStr(v.hash), refToStr(p), 'squashed')));\n }\n return verEdges;\n })\n .flat();\n graph.setNodes(nodes);\n graph.setEdges(edges);\n return graph;\n }\n\n get compId() {\n return ComponentID.fromObject({ scope: this.scope, name: this.name });\n }\n\n static create(name: string, scope: string, versions: VersionParents[]) {\n return new VersionHistory({\n name,\n scope,\n versions,\n });\n }\n\n static parse(contents: string): VersionHistory {\n const parsed = JSON.parse(contents);\n const props: VersionHistoryProps = {\n name: parsed.name,\n scope: parsed.scope,\n versions: parsed.versions.map((ver) => ({\n hash: Ref.from(ver.hash),\n parents: ver.parents.map((p) => Ref.from(p)),\n unrelated: ver.unrelated ? Ref.from(ver.unrelated) : undefined,\n squashed: ver.squashed ? ver.squashed.map((p) => Ref.from(p)) : undefined,\n })),\n graphCompleteRefs: parsed.graphCompleteRefs,\n };\n return new VersionHistory(props);\n }\n}\n\nexport function versionParentsToGraph(versions: VersionParents[]): Graph<string, string> {\n const refToStr = (ref: Ref) => ref.toString();\n const graph = new Graph<string, string>();\n const allHashes = uniqBy(\n versions\n .map((v) => {\n return compact([v.hash, ...v.parents, ...(v.squashed || []), v.unrelated]);\n })\n .flat(),\n 'hash'\n );\n const nodes = allHashes.map((v) => new Node(refToStr(v), refToStr(v)));\n const edges = versions\n .map((v) => {\n const verEdges = v.parents.map((p) => new Edge(refToStr(v.hash), refToStr(p), 'parent'));\n if (v.unrelated) verEdges.push(new Edge(refToStr(v.hash), refToStr(v.unrelated), 'unrelated'));\n if (v.squashed) {\n const squashed = v.squashed.filter((s) => !v.parents.find((p) => p.isEqual(s)));\n squashed.map((p) => verEdges.push(new Edge(refToStr(v.hash), refToStr(p), 'squashed')));\n }\n return verEdges;\n })\n .flat();\n graph.setNodes(nodes);\n graph.setEdges(edges);\n return graph;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_graph","data","require","_componentId","_bitError","_lodash","_legacy","_ref","_interopRequireDefault","_objects","_component","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","VersionHistory","BitObject","constructor","props","name","scope","versionsObj","versionParentsToObject","versions","graphCompleteRefs","values","reduce","acc","version","hash","id","fromId","toObject","map","v","toString","parents","p","unrelated","squashed","undefined","pretty","args","getStringifyArgs","JSON","stringify","toBuffer","Buffer","from","getVersionData","ref","hasHash","Boolean","addFromVersionsObjects","forEach","exists","head","previousParents","versionData","getVersionParentsFromVersion","isEmpty","length","getAllHashesFrom","start","item","missing","hashSet","Set","allHashes","stack","add","ver","pop","verHash","push","parent","parentHash","has","parentVer","found","isRefPartOfHistory","startFrom","searchFor","includes","isGraphCompleteSince","isComplete","hasChanged","getAllHashesAsString","keys","merge","versionHistory","existingHashes","incomingHashes","hashesInExistingOnly","difference","versionsDataOnExistingOnly","filter","newVersions","getAncestor","numOfGenerationsToGoBack","errorMsg","compId","BitError","getGraph","modelComponent","laneHeads","shortHash","limitVersions","refToStr","toShortString","graph","Graph","allVersions","slice","compact","flat","allHashesUniq","uniqBy","getMetadata","tag","getTagOfRefIfExists","pointers","nodes","Node","edges","verEdges","Edge","s","find","isEqual","setNodes","setEdges","ComponentID","fromObject","create","parse","contents","parsed","Ref","exports","versionParentsToGraph"],"sources":["version-history.ts"],"sourcesContent":["import { Graph, Edge, Node } from '@teambit/graph.cleargraph';\nimport { ComponentID } from '@teambit/component-id';\nimport { BitError } from '@teambit/bit-error';\nimport { compact, difference, uniqBy } from 'lodash';\nimport { getStringifyArgs } from '@teambit/legacy.utils';\nimport Ref from '../objects/ref';\nimport { BitObject } from '../objects';\nimport type Version from './version';\nimport { getVersionParentsFromVersion } from '@teambit/component.snap-distance';\nimport type ModelComponent from './model-component';\n\nexport type VersionParents = {\n hash: Ref;\n parents: Ref[];\n unrelated?: Ref;\n squashed?: Ref[];\n};\n\nexport type VersionHistoryGraph = Graph<string | HashMetadata, string>;\n\ntype VersionHistoryProps = {\n name: string;\n scope: string;\n versions: VersionParents[];\n graphCompleteRefs?: string[];\n};\n\ntype HashMetadata = {\n tag?: string;\n pointers?: string[];\n};\n\nexport default class VersionHistory extends BitObject {\n name: string;\n scope: string;\n private versionsObj: { [hash: string]: VersionParents };\n graphCompleteRefs: string[];\n hasChanged = false; // whether the version history has changed since the last persist\n constructor(props: VersionHistoryProps) {\n super();\n this.name = props.name;\n this.scope = props.scope;\n this.versionsObj = this.versionParentsToObject(props.versions);\n this.graphCompleteRefs = props.graphCompleteRefs || [];\n }\n\n get versions() {\n return Object.values(this.versionsObj);\n }\n\n private versionParentsToObject(versions: VersionParents[]) {\n return versions.reduce((acc, version) => {\n acc[version.hash.hash] = version;\n return acc;\n }, {});\n }\n\n id() {\n return `${this.scope}/${this.name}:${VersionHistory.name}`;\n }\n\n static fromId(name: string, scope: string) {\n return new VersionHistory({ scope, name, versions: [] });\n }\n\n toObject(): Record<string, any> {\n return {\n name: this.name,\n scope: this.scope,\n versions: this.versions.map((v) => ({\n hash: v.hash.toString(),\n parents: v.parents.map((p) => p.toString()),\n unrelated: v.unrelated?.toString(),\n squashed: v.squashed ? v.squashed.map((p) => p.toString()) : undefined,\n })),\n graphCompleteRefs: this.graphCompleteRefs,\n };\n }\n\n toString(pretty: boolean): string {\n const args = getStringifyArgs(pretty);\n return JSON.stringify(this.toObject(), ...args);\n }\n\n toBuffer(pretty): Buffer {\n return Buffer.from(this.toString(pretty));\n }\n\n getVersionData(ref: Ref): VersionParents | undefined {\n return this.versionsObj[ref.toString()];\n }\n\n hasHash(ref: Ref) {\n return Boolean(this.getVersionData(ref));\n }\n\n addFromVersionsObjects(versions: Version[]) {\n versions.forEach((version) => {\n const exists = this.getVersionData(version.hash());\n if (exists) {\n // just in case the parents got updated as a result of a merge/squash\n exists.parents = version.parents;\n exists.unrelated = version.unrelated?.head;\n exists.squashed = version.squashed?.previousParents;\n } else {\n const versionData = getVersionParentsFromVersion(version);\n this.versionsObj[version.hash().hash] = versionData;\n }\n });\n }\n\n isEmpty() {\n return !this.versions.length;\n }\n\n getAllHashesFrom(start: Ref): { found?: string[]; missing?: string[] } {\n const item = this.getVersionData(start);\n if (!item) return { missing: [start.toString()] };\n const hashSet = new Set<string>();\n const allHashes: string[] = [];\n const missing: string[] = [];\n\n // Use iterative approach with a stack to avoid stack overflow on deep histories\n const stack: VersionParents[] = [item];\n hashSet.add(item.hash.toString());\n\n while (stack.length > 0) {\n const ver = stack.pop()!;\n const verHash = ver.hash.toString();\n allHashes.push(verHash);\n\n for (const parent of ver.parents) {\n const parentHash = parent.toString();\n if (hashSet.has(parentHash)) continue;\n const parentVer = this.getVersionData(parent);\n if (!parentVer) {\n missing.push(parentHash);\n continue;\n }\n // Mark as processed before pushing to prevent duplicate stack entries\n hashSet.add(parentHash);\n stack.push(parentVer);\n }\n }\n\n return { found: allHashes, missing };\n }\n\n isRefPartOfHistory(startFrom: Ref, searchFor: Ref) {\n const { found } = this.getAllHashesFrom(startFrom);\n return found?.includes(searchFor.toString());\n }\n\n isGraphCompleteSince(ref: Ref) {\n if (this.graphCompleteRefs.includes(ref.toString())) return true;\n const { missing } = this.getAllHashesFrom(ref);\n const isComplete = !missing || !missing.length;\n if (isComplete) {\n this.graphCompleteRefs.push(ref.toString());\n this.hasChanged = true;\n }\n return isComplete;\n }\n\n getAllHashesAsString(): string[] {\n return Object.keys(this.versionsObj);\n }\n\n merge(versionHistory: VersionHistory) {\n const existingHashes = this.getAllHashesAsString();\n const incomingHashes = versionHistory.getAllHashesAsString();\n const hashesInExistingOnly = new Set(difference(existingHashes, incomingHashes));\n const versionsDataOnExistingOnly = this.versions.filter((v) => hashesInExistingOnly.has(v.hash.toString()));\n const newVersions = [...versionHistory.versions, ...versionsDataOnExistingOnly];\n this.versionsObj = this.versionParentsToObject(newVersions);\n }\n\n getAncestor(numOfGenerationsToGoBack: number, ref: Ref): Ref {\n const errorMsg = `unable to get an older parent of ${this.compId.toString()}`;\n const versionData = this.getVersionData(ref);\n if (!versionData)\n throw new BitError(`${errorMsg}, version \"${ref.toString()}\" was not found in the version history`);\n if (numOfGenerationsToGoBack === 0) return versionData.hash;\n if (!versionData.parents.length) throw new BitError(`${errorMsg}, version \"${ref.toString()}\" has no parents`);\n const parent = versionData.parents[0];\n return this.getAncestor(numOfGenerationsToGoBack - 1, parent);\n }\n\n getGraph(\n modelComponent?: ModelComponent,\n laneHeads?: { [hash: string]: string[] },\n shortHash = false,\n limitVersions?: number\n ): VersionHistoryGraph {\n const refToStr = (ref: Ref) => (shortHash ? ref.toShortString() : ref.toString());\n const graph = new Graph<string | HashMetadata, string>();\n const allVersions = limitVersions ? [...this.versions].slice(-limitVersions) : this.versions;\n const allHashes = allVersions\n .map((v) => compact([v.hash, ...v.parents, ...(v.squashed || []), v.unrelated]))\n .flat();\n\n const allHashesUniq = uniqBy(allHashes, 'hash');\n\n const getMetadata = (ref: Ref): HashMetadata | undefined => {\n if (!modelComponent || !laneHeads) return undefined;\n const tag = modelComponent.getTagOfRefIfExists(ref);\n const pointers = laneHeads[ref.toString()];\n return { tag, pointers };\n };\n const nodes = allHashesUniq.map((v) => new Node(refToStr(v), getMetadata(v) || refToStr(v)));\n\n const edges = allVersions\n .map((v) => {\n const verEdges = v.parents.map((p) => new Edge(refToStr(v.hash), refToStr(p), 'parent'));\n if (v.unrelated) verEdges.push(new Edge(refToStr(v.hash), refToStr(v.unrelated), 'unrelated'));\n if (v.squashed) {\n const squashed = v.squashed.filter((s) => !v.parents.find((p) => p.isEqual(s)));\n squashed.map((p) => verEdges.push(new Edge(refToStr(v.hash), refToStr(p), 'squashed')));\n }\n return verEdges;\n })\n .flat();\n graph.setNodes(nodes);\n graph.setEdges(edges);\n return graph;\n }\n\n get compId() {\n return ComponentID.fromObject({ scope: this.scope, name: this.name });\n }\n\n static create(name: string, scope: string, versions: VersionParents[]) {\n return new VersionHistory({\n name,\n scope,\n versions,\n });\n }\n\n static parse(contents: string): VersionHistory {\n const parsed = JSON.parse(contents);\n const props: VersionHistoryProps = {\n name: parsed.name,\n scope: parsed.scope,\n versions: parsed.versions.map((ver) => ({\n hash: Ref.from(ver.hash),\n parents: ver.parents.map((p) => Ref.from(p)),\n unrelated: ver.unrelated ? Ref.from(ver.unrelated) : undefined,\n squashed: ver.squashed ? ver.squashed.map((p) => Ref.from(p)) : undefined,\n })),\n graphCompleteRefs: parsed.graphCompleteRefs,\n };\n return new VersionHistory(props);\n }\n}\n\nexport function versionParentsToGraph(versions: VersionParents[]): Graph<string, string> {\n const refToStr = (ref: Ref) => ref.toString();\n const graph = new Graph<string, string>();\n const allHashes = uniqBy(\n versions\n .map((v) => {\n return compact([v.hash, ...v.parents, ...(v.squashed || []), v.unrelated]);\n })\n .flat(),\n 'hash'\n );\n const nodes = allHashes.map((v) => new Node(refToStr(v), refToStr(v)));\n const edges = versions\n .map((v) => {\n const verEdges = v.parents.map((p) => new Edge(refToStr(v.hash), refToStr(p), 'parent'));\n if (v.unrelated) verEdges.push(new Edge(refToStr(v.hash), refToStr(v.unrelated), 'unrelated'));\n if (v.squashed) {\n const squashed = v.squashed.filter((s) => !v.parents.find((p) => p.isEqual(s)));\n squashed.map((p) => verEdges.push(new Edge(refToStr(v.hash), refToStr(p), 'squashed')));\n }\n return verEdges;\n })\n .flat();\n graph.setNodes(nodes);\n graph.setEdges(edges);\n return graph;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+
3
+ function _chai() {
4
+ const data = require("chai");
5
+ _chai = function () {
6
+ return data;
7
+ };
8
+ return data;
9
+ }
10
+ function _ref() {
11
+ const data = _interopRequireDefault(require("../objects/ref"));
12
+ _ref = function () {
13
+ return data;
14
+ };
15
+ return data;
16
+ }
17
+ function _versionHistory() {
18
+ const data = _interopRequireDefault(require("./version-history"));
19
+ _versionHistory = function () {
20
+ return data;
21
+ };
22
+ return data;
23
+ }
24
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
25
+ const hash = i => i.toString(16).padStart(40, '0');
26
+ const ref = i => new (_ref().default)(hash(i));
27
+ const item = (i, parents = i > 0 ? [i - 1] : []) => ({
28
+ hash: ref(i),
29
+ parents: parents.map(ref)
30
+ });
31
+ const linear = (from, to) => Array.from({
32
+ length: to - from
33
+ }, (_, j) => item(from + j));
34
+ const create = versions => _versionHistory().default.create('button', 'acme.ui', versions);
35
+ const hashes = versionHistory => versionHistory.versions.map(v => v.hash.toString());
36
+ describe('VersionHistory', () => {
37
+ describe('merge', () => {
38
+ it('keeps the incoming versions, then the versions only the existing history has', () => {
39
+ const existing = create([...linear(0, 3), item(10, [2]), item(11, [10])]);
40
+ const incoming = create(linear(0, 5));
41
+ existing.merge(incoming);
42
+ (0, _chai().expect)(hashes(existing)).to.deep.equal([hash(0), hash(1), hash(2), hash(3), hash(4), hash(10), hash(11)]);
43
+ });
44
+ it('takes the incoming data of a version both histories have', () => {
45
+ const existing = create([item(0), item(1, [0]), item(2, [1])]);
46
+ const incoming = create([item(0), item(1, [0]), item(2, [0])]);
47
+ existing.merge(incoming);
48
+ (0, _chai().expect)(existing.getVersionData(ref(2))?.parents.map(String)).to.deep.equal([hash(0)]);
49
+ });
50
+ it('keeps the existing history when the incoming one is empty', () => {
51
+ const existing = create(linear(0, 3));
52
+ existing.merge(create([]));
53
+ (0, _chai().expect)(hashes(existing)).to.deep.equal(hashes(create(linear(0, 3))));
54
+ });
55
+ it('takes the incoming history when the existing one is empty', () => {
56
+ const existing = create([]);
57
+ existing.merge(create(linear(0, 3)));
58
+ (0, _chai().expect)(hashes(existing)).to.deep.equal(hashes(create(linear(0, 3))));
59
+ });
60
+ it('stays the same when the incoming history is already part of the existing one', () => {
61
+ const existing = create([...linear(0, 4), item(20, [3])]);
62
+ existing.merge(create(linear(0, 4)));
63
+ (0, _chai().expect)(hashes(existing).sort()).to.deep.equal([hash(0), hash(1), hash(2), hash(3), hash(20)].sort());
64
+ });
65
+ it('stays fast when the existing history has thousands of versions the incoming one does not', () => {
66
+ const size = 20000;
67
+ const existing = create([...linear(0, size), ...Array.from({
68
+ length: size
69
+ }, (_, j) => item(size + j, [j]))]);
70
+ const incoming = create(linear(0, size));
71
+ const start = Date.now();
72
+ existing.merge(incoming);
73
+ (0, _chai().expect)(existing.versions).to.have.length(size * 2);
74
+ (0, _chai().expect)(Date.now() - start).to.be.lessThan(2000);
75
+ });
76
+ });
77
+ });
78
+
79
+ //# sourceMappingURL=version-history.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_chai","data","require","_ref","_interopRequireDefault","_versionHistory","e","__esModule","default","hash","i","toString","padStart","ref","Ref","item","parents","map","linear","from","to","Array","length","_","j","create","versions","VersionHistory","hashes","versionHistory","v","describe","it","existing","incoming","merge","expect","deep","equal","getVersionData","String","sort","size","start","Date","now","have","be","lessThan"],"sources":["version-history.spec.ts"],"sourcesContent":["import { expect } from 'chai';\nimport Ref from '../objects/ref';\nimport VersionHistory from './version-history';\nimport type { VersionParents } from './version-history';\n\nconst hash = (i: number) => i.toString(16).padStart(40, '0');\nconst ref = (i: number) => new Ref(hash(i));\nconst item = (i: number, parents: number[] = i > 0 ? [i - 1] : []): VersionParents => ({\n hash: ref(i),\n parents: parents.map(ref),\n});\nconst linear = (from: number, to: number) => Array.from({ length: to - from }, (_, j) => item(from + j));\nconst create = (versions: VersionParents[]) => VersionHistory.create('button', 'acme.ui', versions);\nconst hashes = (versionHistory: VersionHistory) => versionHistory.versions.map((v) => v.hash.toString());\n\ndescribe('VersionHistory', () => {\n describe('merge', () => {\n it('keeps the incoming versions, then the versions only the existing history has', () => {\n const existing = create([...linear(0, 3), item(10, [2]), item(11, [10])]);\n const incoming = create(linear(0, 5));\n existing.merge(incoming);\n expect(hashes(existing)).to.deep.equal([hash(0), hash(1), hash(2), hash(3), hash(4), hash(10), hash(11)]);\n });\n\n it('takes the incoming data of a version both histories have', () => {\n const existing = create([item(0), item(1, [0]), item(2, [1])]);\n const incoming = create([item(0), item(1, [0]), item(2, [0])]);\n existing.merge(incoming);\n expect(existing.getVersionData(ref(2))?.parents.map(String)).to.deep.equal([hash(0)]);\n });\n\n it('keeps the existing history when the incoming one is empty', () => {\n const existing = create(linear(0, 3));\n existing.merge(create([]));\n expect(hashes(existing)).to.deep.equal(hashes(create(linear(0, 3))));\n });\n\n it('takes the incoming history when the existing one is empty', () => {\n const existing = create([]);\n existing.merge(create(linear(0, 3)));\n expect(hashes(existing)).to.deep.equal(hashes(create(linear(0, 3))));\n });\n\n it('stays the same when the incoming history is already part of the existing one', () => {\n const existing = create([...linear(0, 4), item(20, [3])]);\n existing.merge(create(linear(0, 4)));\n expect(hashes(existing).sort()).to.deep.equal([hash(0), hash(1), hash(2), hash(3), hash(20)].sort());\n });\n\n it('stays fast when the existing history has thousands of versions the incoming one does not', () => {\n const size = 20000;\n const existing = create([...linear(0, size), ...Array.from({ length: size }, (_, j) => item(size + j, [j]))]);\n const incoming = create(linear(0, size));\n const start = Date.now();\n existing.merge(incoming);\n expect(existing.versions).to.have.length(size * 2);\n expect(Date.now() - start).to.be.lessThan(2000);\n });\n });\n});\n"],"mappings":";;AAAA,SAAAA,MAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,KAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAE,KAAA;EAAA,MAAAF,IAAA,GAAAG,sBAAA,CAAAF,OAAA;EAAAC,IAAA,YAAAA,CAAA;IAAA,OAAAF,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAI,gBAAA;EAAA,MAAAJ,IAAA,GAAAG,sBAAA,CAAAF,OAAA;EAAAG,eAAA,YAAAA,CAAA;IAAA,OAAAJ,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAA+C,SAAAG,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAG/C,MAAMG,IAAI,GAAIC,CAAS,IAAKA,CAAC,CAACC,QAAQ,CAAC,EAAE,CAAC,CAACC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC;AAC5D,MAAMC,GAAG,GAAIH,CAAS,IAAK,KAAII,cAAG,EAACL,IAAI,CAACC,CAAC,CAAC,CAAC;AAC3C,MAAMK,IAAI,GAAGA,CAACL,CAAS,EAAEM,OAAiB,GAAGN,CAAC,GAAG,CAAC,GAAG,CAACA,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,MAAsB;EACrFD,IAAI,EAAEI,GAAG,CAACH,CAAC,CAAC;EACZM,OAAO,EAAEA,OAAO,CAACC,GAAG,CAACJ,GAAG;AAC1B,CAAC,CAAC;AACF,MAAMK,MAAM,GAAGA,CAACC,IAAY,EAAEC,EAAU,KAAKC,KAAK,CAACF,IAAI,CAAC;EAAEG,MAAM,EAAEF,EAAE,GAAGD;AAAK,CAAC,EAAE,CAACI,CAAC,EAAEC,CAAC,KAAKT,IAAI,CAACI,IAAI,GAAGK,CAAC,CAAC,CAAC;AACxG,MAAMC,MAAM,GAAIC,QAA0B,IAAKC,yBAAc,CAACF,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAEC,QAAQ,CAAC;AACnG,MAAME,MAAM,GAAIC,cAA8B,IAAKA,cAAc,CAACH,QAAQ,CAACT,GAAG,CAAEa,CAAC,IAAKA,CAAC,CAACrB,IAAI,CAACE,QAAQ,CAAC,CAAC,CAAC;AAExGoB,QAAQ,CAAC,gBAAgB,EAAE,MAAM;EAC/BA,QAAQ,CAAC,OAAO,EAAE,MAAM;IACtBC,EAAE,CAAC,8EAA8E,EAAE,MAAM;MACvF,MAAMC,QAAQ,GAAGR,MAAM,CAAC,CAAC,GAAGP,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAEH,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAEA,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;MACzE,MAAMmB,QAAQ,GAAGT,MAAM,CAACP,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;MACrCe,QAAQ,CAACE,KAAK,CAACD,QAAQ,CAAC;MACxB,IAAAE,cAAM,EAACR,MAAM,CAACK,QAAQ,CAAC,CAAC,CAACb,EAAE,CAACiB,IAAI,CAACC,KAAK,CAAC,CAAC7B,IAAI,CAAC,CAAC,CAAC,EAAEA,IAAI,CAAC,CAAC,CAAC,EAAEA,IAAI,CAAC,CAAC,CAAC,EAAEA,IAAI,CAAC,CAAC,CAAC,EAAEA,IAAI,CAAC,CAAC,CAAC,EAAEA,IAAI,CAAC,EAAE,CAAC,EAAEA,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3G,CAAC,CAAC;IAEFuB,EAAE,CAAC,0DAA0D,EAAE,MAAM;MACnE,MAAMC,QAAQ,GAAGR,MAAM,CAAC,CAACV,IAAI,CAAC,CAAC,CAAC,EAAEA,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAEA,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;MAC9D,MAAMmB,QAAQ,GAAGT,MAAM,CAAC,CAACV,IAAI,CAAC,CAAC,CAAC,EAAEA,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAEA,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;MAC9DkB,QAAQ,CAACE,KAAK,CAACD,QAAQ,CAAC;MACxB,IAAAE,cAAM,EAACH,QAAQ,CAACM,cAAc,CAAC1B,GAAG,CAAC,CAAC,CAAC,CAAC,EAAEG,OAAO,CAACC,GAAG,CAACuB,MAAM,CAAC,CAAC,CAACpB,EAAE,CAACiB,IAAI,CAACC,KAAK,CAAC,CAAC7B,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,CAAC,CAAC;IAEFuB,EAAE,CAAC,2DAA2D,EAAE,MAAM;MACpE,MAAMC,QAAQ,GAAGR,MAAM,CAACP,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;MACrCe,QAAQ,CAACE,KAAK,CAACV,MAAM,CAAC,EAAE,CAAC,CAAC;MAC1B,IAAAW,cAAM,EAACR,MAAM,CAACK,QAAQ,CAAC,CAAC,CAACb,EAAE,CAACiB,IAAI,CAACC,KAAK,CAACV,MAAM,CAACH,MAAM,CAACP,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC;IAEFc,EAAE,CAAC,2DAA2D,EAAE,MAAM;MACpE,MAAMC,QAAQ,GAAGR,MAAM,CAAC,EAAE,CAAC;MAC3BQ,QAAQ,CAACE,KAAK,CAACV,MAAM,CAACP,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;MACpC,IAAAkB,cAAM,EAACR,MAAM,CAACK,QAAQ,CAAC,CAAC,CAACb,EAAE,CAACiB,IAAI,CAACC,KAAK,CAACV,MAAM,CAACH,MAAM,CAACP,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC;IAEFc,EAAE,CAAC,8EAA8E,EAAE,MAAM;MACvF,MAAMC,QAAQ,GAAGR,MAAM,CAAC,CAAC,GAAGP,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAEH,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;MACzDkB,QAAQ,CAACE,KAAK,CAACV,MAAM,CAACP,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;MACpC,IAAAkB,cAAM,EAACR,MAAM,CAACK,QAAQ,CAAC,CAACQ,IAAI,CAAC,CAAC,CAAC,CAACrB,EAAE,CAACiB,IAAI,CAACC,KAAK,CAAC,CAAC7B,IAAI,CAAC,CAAC,CAAC,EAAEA,IAAI,CAAC,CAAC,CAAC,EAAEA,IAAI,CAAC,CAAC,CAAC,EAAEA,IAAI,CAAC,CAAC,CAAC,EAAEA,IAAI,CAAC,EAAE,CAAC,CAAC,CAACgC,IAAI,CAAC,CAAC,CAAC;IACtG,CAAC,CAAC;IAEFT,EAAE,CAAC,0FAA0F,EAAE,MAAM;MACnG,MAAMU,IAAI,GAAG,KAAK;MAClB,MAAMT,QAAQ,GAAGR,MAAM,CAAC,CAAC,GAAGP,MAAM,CAAC,CAAC,EAAEwB,IAAI,CAAC,EAAE,GAAGrB,KAAK,CAACF,IAAI,CAAC;QAAEG,MAAM,EAAEoB;MAAK,CAAC,EAAE,CAACnB,CAAC,EAAEC,CAAC,KAAKT,IAAI,CAAC2B,IAAI,GAAGlB,CAAC,EAAE,CAACA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;MAC7G,MAAMU,QAAQ,GAAGT,MAAM,CAACP,MAAM,CAAC,CAAC,EAAEwB,IAAI,CAAC,CAAC;MACxC,MAAMC,KAAK,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC;MACxBZ,QAAQ,CAACE,KAAK,CAACD,QAAQ,CAAC;MACxB,IAAAE,cAAM,EAACH,QAAQ,CAACP,QAAQ,CAAC,CAACN,EAAE,CAAC0B,IAAI,CAACxB,MAAM,CAACoB,IAAI,GAAG,CAAC,CAAC;MAClD,IAAAN,cAAM,EAACQ,IAAI,CAACC,GAAG,CAAC,CAAC,GAAGF,KAAK,CAAC,CAACvB,EAAE,CAAC2B,EAAE,CAACC,QAAQ,CAAC,IAAI,CAAC;IACjD,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -40,7 +40,7 @@ async function objectListToGraph(objectList) {
40
40
  async function bitObjectListToGraph(bitObjectsList) {
41
41
  const exportMetadata = bitObjectsList.getExportMetadata();
42
42
  const components = bitObjectsList.getComponents();
43
- const versions = bitObjectsList.getVersions();
43
+ const versionObjectsByHash = (0, _component().indexVersionObjects)(bitObjectsList.getVersions());
44
44
  const nodes = [];
45
45
  const edges = [];
46
46
  await Promise.all(components.map(async component => {
@@ -48,7 +48,7 @@ async function bitObjectListToGraph(bitObjectsList) {
48
48
  const startFrom = compFromMetadata?.head;
49
49
  const versionsInfo = await (0, _component().getAllVersionsInfo)({
50
50
  modelComponent: component,
51
- versionObjects: versions,
51
+ versionObjects: versionObjectsByHash,
52
52
  startFrom,
53
53
  throws: false
54
54
  });
@@ -1 +1 @@
1
- {"version":3,"names":["_graph","data","require","_lodash","_component","IdGraph","Graph","constructor","nodes","edges","exports","objectListToGraph","objectList","bitObjectsList","toBitObjects","bitObjectListToGraph","exportMetadata","getExportMetadata","components","getComponents","versions","getVersions","Promise","all","map","component","compFromMetadata","exportVersions","find","c","id","isEqualWithoutVersion","toComponentId","startFrom","head","versionsInfo","getAllVersionsInfo","modelComponent","versionObjects","throws","forEach","versionInfo","changeVersion","tag","ref","toString","idStr","push","Node","version","dependencies","devDependencies","peerDependencies","extensionDependencies","depsIdsGroupedByType","addDep","depId","edge","depIdStr","Edge","uniqNodes","uniqBy","idGraph"],"sources":["object-list-to-graph.ts"],"sourcesContent":["import { Graph, Node, Edge } from '@teambit/graph.cleargraph';\nimport { uniqBy } from 'lodash';\nimport type { ComponentID } from '@teambit/component-id';\nimport type { ObjectList } from './object-list';\nimport type { BitObjectList } from './bit-object-list';\nimport { getAllVersionsInfo } from '@teambit/component.snap-distance';\n\ntype BitIdNode = Node<ComponentID>;\ntype DependencyType = 'runtime' | 'dev' | 'peer';\ntype DependencyEdge = Edge<DependencyType>;\n\nexport class IdGraph extends Graph<ComponentID, DependencyType> {\n constructor(nodes: BitIdNode[] = [], edges: DependencyEdge[] = []) {\n super(nodes, edges);\n }\n}\n\nexport async function objectListToGraph(objectList: ObjectList): Promise<IdGraph> {\n const bitObjectsList = await objectList.toBitObjects();\n\n return bitObjectListToGraph(bitObjectsList);\n}\n\nexport async function bitObjectListToGraph(bitObjectsList: BitObjectList): Promise<IdGraph> {\n const exportMetadata = bitObjectsList.getExportMetadata();\n const components = bitObjectsList.getComponents();\n const versions = bitObjectsList.getVersions();\n const nodes: BitIdNode[] = [];\n const edges: DependencyEdge[] = [];\n await Promise.all(\n components.map(async (component) => {\n const compFromMetadata = exportMetadata?.exportVersions.find((c) =>\n c.id.isEqualWithoutVersion(component.toComponentId())\n );\n const startFrom = compFromMetadata?.head;\n const versionsInfo = await getAllVersionsInfo({\n modelComponent: component,\n versionObjects: versions,\n startFrom,\n throws: false,\n });\n versionsInfo.forEach((versionInfo) => {\n const id = component.toComponentId().changeVersion(versionInfo.tag || versionInfo.ref.toString());\n const idStr = id.toString();\n nodes.push(new Node(idStr, id));\n if (!versionInfo.version) {\n return;\n }\n const { dependencies, devDependencies, peerDependencies, extensionDependencies } =\n versionInfo.version.depsIdsGroupedByType;\n const addDep = (depId: ComponentID, edge: DependencyType) => {\n const depIdStr = depId.toString();\n nodes.push(new Node(depIdStr, depId));\n edges.push(new Edge(idStr, depIdStr, edge));\n };\n dependencies.forEach((depId) => addDep(depId, 'runtime'));\n [...devDependencies, ...extensionDependencies].forEach((depId) => addDep(depId, 'dev'));\n peerDependencies.forEach((depId) => addDep(depId, 'peer'));\n });\n })\n );\n const uniqNodes = uniqBy(nodes, 'id');\n const idGraph = new IdGraph(uniqNodes, edges);\n\n return idGraph;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_graph","data","require","_lodash","_component","IdGraph","Graph","constructor","nodes","edges","exports","objectListToGraph","objectList","bitObjectsList","toBitObjects","bitObjectListToGraph","exportMetadata","getExportMetadata","components","getComponents","versionObjectsByHash","indexVersionObjects","getVersions","Promise","all","map","component","compFromMetadata","exportVersions","find","c","id","isEqualWithoutVersion","toComponentId","startFrom","head","versionsInfo","getAllVersionsInfo","modelComponent","versionObjects","throws","forEach","versionInfo","changeVersion","tag","ref","toString","idStr","push","Node","version","dependencies","devDependencies","peerDependencies","extensionDependencies","depsIdsGroupedByType","addDep","depId","edge","depIdStr","Edge","uniqNodes","uniqBy","idGraph"],"sources":["object-list-to-graph.ts"],"sourcesContent":["import { Graph, Node, Edge } from '@teambit/graph.cleargraph';\nimport { uniqBy } from 'lodash';\nimport type { ComponentID } from '@teambit/component-id';\nimport type { ObjectList } from './object-list';\nimport type { BitObjectList } from './bit-object-list';\nimport { getAllVersionsInfo, indexVersionObjects } from '@teambit/component.snap-distance';\n\ntype BitIdNode = Node<ComponentID>;\ntype DependencyType = 'runtime' | 'dev' | 'peer';\ntype DependencyEdge = Edge<DependencyType>;\n\nexport class IdGraph extends Graph<ComponentID, DependencyType> {\n constructor(nodes: BitIdNode[] = [], edges: DependencyEdge[] = []) {\n super(nodes, edges);\n }\n}\n\nexport async function objectListToGraph(objectList: ObjectList): Promise<IdGraph> {\n const bitObjectsList = await objectList.toBitObjects();\n\n return bitObjectListToGraph(bitObjectsList);\n}\n\nexport async function bitObjectListToGraph(bitObjectsList: BitObjectList): Promise<IdGraph> {\n const exportMetadata = bitObjectsList.getExportMetadata();\n const components = bitObjectsList.getComponents();\n const versionObjectsByHash = indexVersionObjects(bitObjectsList.getVersions());\n const nodes: BitIdNode[] = [];\n const edges: DependencyEdge[] = [];\n await Promise.all(\n components.map(async (component) => {\n const compFromMetadata = exportMetadata?.exportVersions.find((c) =>\n c.id.isEqualWithoutVersion(component.toComponentId())\n );\n const startFrom = compFromMetadata?.head;\n const versionsInfo = await getAllVersionsInfo({\n modelComponent: component,\n versionObjects: versionObjectsByHash,\n startFrom,\n throws: false,\n });\n versionsInfo.forEach((versionInfo) => {\n const id = component.toComponentId().changeVersion(versionInfo.tag || versionInfo.ref.toString());\n const idStr = id.toString();\n nodes.push(new Node(idStr, id));\n if (!versionInfo.version) {\n return;\n }\n const { dependencies, devDependencies, peerDependencies, extensionDependencies } =\n versionInfo.version.depsIdsGroupedByType;\n const addDep = (depId: ComponentID, edge: DependencyType) => {\n const depIdStr = depId.toString();\n nodes.push(new Node(depIdStr, depId));\n edges.push(new Edge(idStr, depIdStr, edge));\n };\n dependencies.forEach((depId) => addDep(depId, 'runtime'));\n [...devDependencies, ...extensionDependencies].forEach((depId) => addDep(depId, 'dev'));\n peerDependencies.forEach((depId) => addDep(depId, 'peer'));\n });\n })\n );\n const uniqNodes = uniqBy(nodes, 'id');\n const idGraph = new IdGraph(uniqNodes, edges);\n\n return idGraph;\n}\n"],"mappings":";;;;;;;;AAAA,SAAAA,OAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,MAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAE,QAAA;EAAA,MAAAF,IAAA,GAAAC,OAAA;EAAAC,OAAA,YAAAA,CAAA;IAAA,OAAAF,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAIA,SAAAG,WAAA;EAAA,MAAAH,IAAA,GAAAC,OAAA;EAAAE,UAAA,YAAAA,CAAA;IAAA,OAAAH,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAMO,MAAMI,OAAO,SAASC,cAAK,CAA8B;EAC9DC,WAAWA,CAACC,KAAkB,GAAG,EAAE,EAAEC,KAAuB,GAAG,EAAE,EAAE;IACjE,KAAK,CAACD,KAAK,EAAEC,KAAK,CAAC;EACrB;AACF;AAACC,OAAA,CAAAL,OAAA,GAAAA,OAAA;AAEM,eAAeM,iBAAiBA,CAACC,UAAsB,EAAoB;EAChF,MAAMC,cAAc,GAAG,MAAMD,UAAU,CAACE,YAAY,CAAC,CAAC;EAEtD,OAAOC,oBAAoB,CAACF,cAAc,CAAC;AAC7C;AAEO,eAAeE,oBAAoBA,CAACF,cAA6B,EAAoB;EAC1F,MAAMG,cAAc,GAAGH,cAAc,CAACI,iBAAiB,CAAC,CAAC;EACzD,MAAMC,UAAU,GAAGL,cAAc,CAACM,aAAa,CAAC,CAAC;EACjD,MAAMC,oBAAoB,GAAG,IAAAC,gCAAmB,EAACR,cAAc,CAACS,WAAW,CAAC,CAAC,CAAC;EAC9E,MAAMd,KAAkB,GAAG,EAAE;EAC7B,MAAMC,KAAuB,GAAG,EAAE;EAClC,MAAMc,OAAO,CAACC,GAAG,CACfN,UAAU,CAACO,GAAG,CAAC,MAAOC,SAAS,IAAK;IAClC,MAAMC,gBAAgB,GAAGX,cAAc,EAAEY,cAAc,CAACC,IAAI,CAAEC,CAAC,IAC7DA,CAAC,CAACC,EAAE,CAACC,qBAAqB,CAACN,SAAS,CAACO,aAAa,CAAC,CAAC,CACtD,CAAC;IACD,MAAMC,SAAS,GAAGP,gBAAgB,EAAEQ,IAAI;IACxC,MAAMC,YAAY,GAAG,MAAM,IAAAC,+BAAkB,EAAC;MAC5CC,cAAc,EAAEZ,SAAS;MACzBa,cAAc,EAAEnB,oBAAoB;MACpCc,SAAS;MACTM,MAAM,EAAE;IACV,CAAC,CAAC;IACFJ,YAAY,CAACK,OAAO,CAAEC,WAAW,IAAK;MACpC,MAAMX,EAAE,GAAGL,SAAS,CAACO,aAAa,CAAC,CAAC,CAACU,aAAa,CAACD,WAAW,CAACE,GAAG,IAAIF,WAAW,CAACG,GAAG,CAACC,QAAQ,CAAC,CAAC,CAAC;MACjG,MAAMC,KAAK,GAAGhB,EAAE,CAACe,QAAQ,CAAC,CAAC;MAC3BtC,KAAK,CAACwC,IAAI,CAAC,KAAIC,aAAI,EAACF,KAAK,EAAEhB,EAAE,CAAC,CAAC;MAC/B,IAAI,CAACW,WAAW,CAACQ,OAAO,EAAE;QACxB;MACF;MACA,MAAM;QAAEC,YAAY;QAAEC,eAAe;QAAEC,gBAAgB;QAAEC;MAAsB,CAAC,GAC9EZ,WAAW,CAACQ,OAAO,CAACK,oBAAoB;MAC1C,MAAMC,MAAM,GAAGA,CAACC,KAAkB,EAAEC,IAAoB,KAAK;QAC3D,MAAMC,QAAQ,GAAGF,KAAK,CAACX,QAAQ,CAAC,CAAC;QACjCtC,KAAK,CAACwC,IAAI,CAAC,KAAIC,aAAI,EAACU,QAAQ,EAAEF,KAAK,CAAC,CAAC;QACrChD,KAAK,CAACuC,IAAI,CAAC,KAAIY,aAAI,EAACb,KAAK,EAAEY,QAAQ,EAAED,IAAI,CAAC,CAAC;MAC7C,CAAC;MACDP,YAAY,CAACV,OAAO,CAAEgB,KAAK,IAAKD,MAAM,CAACC,KAAK,EAAE,SAAS,CAAC,CAAC;MACzD,CAAC,GAAGL,eAAe,EAAE,GAAGE,qBAAqB,CAAC,CAACb,OAAO,CAAEgB,KAAK,IAAKD,MAAM,CAACC,KAAK,EAAE,KAAK,CAAC,CAAC;MACvFJ,gBAAgB,CAACZ,OAAO,CAAEgB,KAAK,IAAKD,MAAM,CAACC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC5D,CAAC,CAAC;EACJ,CAAC,CACH,CAAC;EACD,MAAMI,SAAS,GAAG,IAAAC,gBAAM,EAACtD,KAAK,EAAE,IAAI,CAAC;EACrC,MAAMuD,OAAO,GAAG,IAAI1D,OAAO,CAACwD,SAAS,EAAEpD,KAAK,CAAC;EAE7C,OAAOsD,OAAO;AAChB","ignoreList":[]}
@@ -3,6 +3,7 @@ import { expect } from 'chai';
3
3
  import ModelComponent from './model-component';
4
4
  import { cloneDeep } from 'lodash';
5
5
  import { Ref } from '../objects';
6
+ import VersionHistory from './version-history';
6
7
 
7
8
  const modelComponentFixture = {
8
9
  name: 'bar/foo',
@@ -91,4 +92,72 @@ describe('ModelComponent', () => {
91
92
  expect(component.getTagOfRefIfExists(ref)).to.equal('0.0.8');
92
93
  });
93
94
  });
95
+
96
+ describe('populateVersionHistoryIfMissingGracefully', () => {
97
+ const hash = (i: number) => i.toString(16).padStart(40, '0');
98
+ const ref = (i: number) => new Ref(hash(i));
99
+ /** a version object of the given number, as the history population reads it. */
100
+ const versionObject = (i: number, parents: number[] = i > 0 ? [i - 1] : []): any => ({
101
+ hash: () => ref(i),
102
+ parents: parents.map(ref),
103
+ });
104
+ /** a repo holding these version objects, which records what it loads. */
105
+ const fakeRepo = (versions: any[]) => {
106
+ const byHash = new Map(versions.map((v) => [v.hash().toString(), v]));
107
+ const loaded: string[] = [];
108
+ return {
109
+ loaded,
110
+ load: async (r: Ref) => {
111
+ loaded.push(r.toString());
112
+ return byHash.get(r.toString());
113
+ },
114
+ writeObjectsToTheFS: async () => {},
115
+ } as any;
116
+ };
117
+ const component = () => getModelComponent(getModelComponentFixture());
118
+ const historyHashes = (versionHistory: VersionHistory) => versionHistory.getAllHashesAsString().sort();
119
+
120
+ it('adds the head and all its ancestors to an empty history', async () => {
121
+ const versionHistory = VersionHistory.create('bar/foo', 'remote-scope', []);
122
+ const repo = fakeRepo([0, 1, 2, 3].map((i) => versionObject(i)));
123
+ const { err } = await component().populateVersionHistoryIfMissingGracefully(repo, versionHistory, ref(3));
124
+ expect(err).to.be.undefined;
125
+ expect(historyHashes(versionHistory)).to.deep.equal([0, 1, 2, 3].map(hash).sort());
126
+ });
127
+
128
+ it('loads a shared ancestor of a merge snap only once', async () => {
129
+ // 0 <- 1 <- 3, 0 <- 2 <- 3
130
+ const versionHistory = VersionHistory.create('bar/foo', 'remote-scope', []);
131
+ const repo = fakeRepo([versionObject(0), versionObject(1, [0]), versionObject(2, [0]), versionObject(3, [1, 2])]);
132
+ await component().populateVersionHistoryIfMissingGracefully(repo, versionHistory, ref(3));
133
+ expect(repo.loaded.filter((h: string) => h === hash(0))).to.have.length(1);
134
+ expect(historyHashes(versionHistory)).to.deep.equal([0, 1, 2, 3].map(hash).sort());
135
+ });
136
+
137
+ it('stops at versions the history already has', async () => {
138
+ const versionHistory = VersionHistory.create('bar/foo', 'remote-scope', []);
139
+ versionHistory.addFromVersionsObjects([versionObject(0), versionObject(1)]);
140
+ const repo = fakeRepo([0, 1, 2, 3].map((i) => versionObject(i)));
141
+ await component().populateVersionHistoryIfMissingGracefully(repo, versionHistory, ref(3));
142
+ expect(repo.loaded).to.deep.equal([hash(3), hash(2)]);
143
+ });
144
+
145
+ it('returns the added versions and an error when a parent is missing', async () => {
146
+ const versionHistory = VersionHistory.create('bar/foo', 'remote-scope', []);
147
+ const repo = fakeRepo([versionObject(2), versionObject(3)]);
148
+ const { err, added } = await component().populateVersionHistoryIfMissingGracefully(repo, versionHistory, ref(3));
149
+ expect(err).to.be.instanceOf(Error);
150
+ expect(added?.map((v) => v.hash.toString())).to.deep.equal([hash(3), hash(2)]);
151
+ });
152
+
153
+ it('stays fast when the whole of a long history is missing', async () => {
154
+ const size = 10000;
155
+ const versionHistory = VersionHistory.create('bar/foo', 'remote-scope', []);
156
+ const repo = fakeRepo(Array.from({ length: size }, (_, i) => versionObject(i)));
157
+ const start = Date.now();
158
+ await component().populateVersionHistoryIfMissingGracefully(repo, versionHistory, ref(size - 1));
159
+ expect(versionHistory.versions).to.have.length(size);
160
+ expect(Date.now() - start).to.be.lessThan(2000);
161
+ });
162
+ });
94
163
  });
@@ -1464,11 +1464,12 @@ bit import ${this.id()}@${resolvedVersion} --objects --all-history`
1464
1464
  const headExists = versionHistory.hasHash(head);
1465
1465
  if (exitWhenFind && headExists) return {};
1466
1466
  const getVersionObj = async (ref: Ref) => (await ref.load(repo)) as Version | undefined;
1467
- const versionsToAdd: Version[] = [];
1467
+ const versionsToAdd = new Map<string, Version>(); // by hash
1468
+ const addVersion = (version: Version) => versionsToAdd.set(version.hash().toString(), version);
1468
1469
  let err: Error | undefined;
1469
1470
  const addParentsRecursively = async (version: Version) => {
1470
1471
  await pMapSeries(version.parents, async (parent) => {
1471
- const foundParent = versionHistory.hasHash(parent) || versionsToAdd.find((v) => v.hash().isEqual(parent));
1472
+ const foundParent = versionHistory.hasHash(parent) || versionsToAdd.has(parent.toString());
1472
1473
  if (exitWhenFind && foundParent) {
1473
1474
  return;
1474
1475
  }
@@ -1480,7 +1481,7 @@ bit import ${this.id()}@${resolvedVersion} --objects --all-history`
1480
1481
  : new ParentNotFound(this.id(), version.hash().toString(), parent.toString());
1481
1482
  return;
1482
1483
  }
1483
- versionsToAdd.push(parentVersion);
1484
+ addVersion(parentVersion);
1484
1485
  await addParentsRecursively(parentVersion);
1485
1486
  });
1486
1487
  };
@@ -1489,15 +1490,15 @@ bit import ${this.id()}@${resolvedVersion} --objects --all-history`
1489
1490
  return { err: new HeadNotFound(this.id(), head.toString()) };
1490
1491
  }
1491
1492
  return this.populateVersionHistoryMutex.runExclusive(async () => {
1492
- if (!headExists) versionsToAdd.push(headVer);
1493
+ if (!headExists) addVersion(headVer);
1493
1494
  await addParentsRecursively(headVer);
1494
- const added = versionsToAdd.map((v) => getVersionParentsFromVersion(v));
1495
+ const added = [...versionsToAdd.values()].map((v) => getVersionParentsFromVersion(v));
1495
1496
  if (err) {
1496
1497
  return { err, added };
1497
1498
  }
1498
- versionHistory.addFromVersionsObjects(versionsToAdd);
1499
+ versionHistory.addFromVersionsObjects([...versionsToAdd.values()]);
1499
1500
  logger.debug(
1500
- `populateVersionHistoryIfMissingGracefully, updating ${this.id()} with ${versionsToAdd.length} versions`
1501
+ `populateVersionHistoryIfMissingGracefully, updating ${this.id()} with ${versionsToAdd.size} versions`
1501
1502
  );
1502
1503
  await repo.writeObjectsToTheFS([versionHistory]);
1503
1504
  return { added };