@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.
- package/dist/models/model-component.js +8 -7
- package/dist/models/model-component.js.map +1 -1
- package/dist/models/model-component.spec.js +76 -0
- package/dist/models/model-component.spec.js.map +1 -1
- package/dist/models/version-history.js +2 -2
- package/dist/models/version-history.js.map +1 -1
- package/dist/models/version-history.spec.d.ts +1 -0
- package/dist/models/version-history.spec.js +79 -0
- package/dist/models/version-history.spec.js.map +1 -0
- package/dist/objects/object-list-to-graph.js +2 -2
- package/dist/objects/object-list-to-graph.js.map +1 -1
- package/models/model-component.spec.ts +69 -0
- package/models/model-component.ts +8 -7
- package/models/version-history.spec.ts +60 -0
- package/models/version-history.ts +2 -2
- package/objects/object-list-to-graph.ts +3 -3
- package/package.json +26 -26
- /package/dist/{preview-1793117184976.js → preview-1793136394048.js} +0 -0
|
@@ -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.
|
|
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":"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","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
|
|
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:
|
|
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","
|
|
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":"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","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
|
|
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.
|
|
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
|
-
|
|
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)
|
|
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.
|
|
1501
|
+
`populateVersionHistoryIfMissingGracefully, updating ${this.id()} with ${versionsToAdd.size} versions`
|
|
1501
1502
|
);
|
|
1502
1503
|
await repo.writeObjectsToTheFS([versionHistory]);
|
|
1503
1504
|
return { added };
|