mirror of
https://github.com/dolthub/dolt.git
synced 2026-02-11 18:49:14 -06:00
Merge pull request #2075 from arv/new-commit-type
Compute commit type based on value and parents
This commit is contained in:
@@ -72,7 +72,7 @@ func (s *nomsDsTestSuite) TestNomsDs() {
|
||||
|
||||
// delete one dataset, print message at delete
|
||||
rtnVal, _ = s.Run(main, []string{"ds", "-d", datasetName})
|
||||
s.Equal("Deleted dataset "+id+" (was nhccndis1da8k9n6ov10jm4itjcviq7v)\n\n", rtnVal)
|
||||
s.Equal("Deleted dataset "+id+" (was ut18culn13pjtpcadkcb0f1b9pmob8v6)\n\n", rtnVal)
|
||||
|
||||
// print datasets, just one left
|
||||
rtnVal, _ = s.Run(main, []string{"ds", dbSpec})
|
||||
@@ -80,7 +80,7 @@ func (s *nomsDsTestSuite) TestNomsDs() {
|
||||
|
||||
// delete the second dataset
|
||||
rtnVal, _ = s.Run(main, []string{"ds", "-d", dataset2Name})
|
||||
s.Equal("Deleted dataset "+id2+" (was 3ft9uuvqn3gdnmijmc5cb0i137jj2u6u)\n\n", rtnVal)
|
||||
s.Equal("Deleted dataset "+id2+" (was 4v9i4n996pue84mn97gd9ntk880i93k7)\n\n", rtnVal)
|
||||
|
||||
// print datasets, none left
|
||||
rtnVal, _ = s.Run(main, []string{"ds", dbSpec})
|
||||
|
||||
@@ -73,7 +73,7 @@ func runLog(args []string) int {
|
||||
waitChan := outputpager.PageOutput()
|
||||
|
||||
origCommit, ok := value.(types.Struct)
|
||||
if !ok || !origCommit.Type().Equals(datas.CommitType()) {
|
||||
if !ok || !datas.IsCommitType(origCommit.Type()) {
|
||||
d.CheckError(fmt.Errorf("%s does not reference a Commit object", args[0]))
|
||||
}
|
||||
|
||||
|
||||
@@ -305,21 +305,21 @@ func TestBranchlistSplice(t *testing.T) {
|
||||
}
|
||||
|
||||
const (
|
||||
graphRes1 = "* 4dg0oimsg3tre4jbe1qsilj4f15oap3f\n| Parent: f49bmcf6n58hpvn54qmfitjfdr02m6g3\n| \"7\"\n| \n* f49bmcf6n58hpvn54qmfitjfdr02m6g3\n| Parent: mfrfoasnm5mhqqckd5s62mahukgdd68i\n| \"6\"\n| \n* mfrfoasnm5mhqqckd5s62mahukgdd68i\n| Parent: 4cn8842dp10b3qffmp45215usd9iis8a\n| \"5\"\n| \n* 4cn8842dp10b3qffmp45215usd9iis8a\n|\\ Merge: ntsqt2hjgak13sajaie7v66tiqjjuema qscelstrle3hsc90h26unmsrnjbm5bsr\n| | \"4\"\n| | \n* | ntsqt2hjgak13sajaie7v66tiqjjuema\n| | Parent: ojsjscjv0r5bjrpnpmi156dvp2vff4r7\n| | \"3.7\"\n| | \n* | ojsjscjv0r5bjrpnpmi156dvp2vff4r7\n|\\ \\ Merge: r3ho54b5uptf19v8g3a739hq1t2k4ud7 1na3ei1q1or75oljn59e7guqejgg8cgf\n| | | \"3.5\"\n| | | \n* | | r3ho54b5uptf19v8g3a739hq1t2k4ud7\n| | | Parent: l3bqmbcks0i3h8d1o2chjmsbl4njcr1n\n| | | \"3.1.7\"\n| | | \n* | | l3bqmbcks0i3h8d1o2chjmsbl4njcr1n\n| | | Parent: it1egd8n791tci10g6n8jra5uq1g2gs2\n| | | \"3.1.5\"\n| | | \n* | | it1egd8n791tci10g6n8jra5uq1g2gs2\n| | | Parent: 1na3ei1q1or75oljn59e7guqejgg8cgf\n| | | \"3.1.3\"\n| | | \n| | * qscelstrle3hsc90h26unmsrnjbm5bsr\n|/ | Parent: hl8k9pi7v0tnmv5ru4c748l9icjkr55j\n| | \"3.6\"\n| | \n* | 1na3ei1q1or75oljn59e7guqejgg8cgf\n| | Parent: ao4ik7qgsts8vhoa2jtqbfu95kdlkr44\n| | \"3.1\"\n| | \n| * hl8k9pi7v0tnmv5ru4c748l9icjkr55j\n|/ Parent: ao4ik7qgsts8vhoa2jtqbfu95kdlkr44\n| \"3.2\"\n| \n* ao4ik7qgsts8vhoa2jtqbfu95kdlkr44\n| Parent: daiikqvqtgm56jpc8hg8m4k610t7e9m3\n| \"3\"\n| \n* daiikqvqtgm56jpc8hg8m4k610t7e9m3\n| Parent: 2l7i0aj5660cdb7v8rg93mgtaj6nihub\n| \"2\"\n| \n* 2l7i0aj5660cdb7v8rg93mgtaj6nihub\n| Parent: None\n| \"1\"\n"
|
||||
diffRes1 = "* 4dg0oimsg3tre4jbe1qsilj4f15oap3f\n| Parent: f49bmcf6n58hpvn54qmfitjfdr02m6g3\n| - \"6\"\n| + \"7\"\n| \n* f49bmcf6n58hpvn54qmfitjfdr02m6g3\n| Parent: mfrfoasnm5mhqqckd5s62mahukgdd68i\n| - \"5\"\n| + \"6\"\n| \n* mfrfoasnm5mhqqckd5s62mahukgdd68i\n| Parent: 4cn8842dp10b3qffmp45215usd9iis8a\n| - \"4\"\n| + \"5\"\n| \n* 4cn8842dp10b3qffmp45215usd9iis8a\n|\\ Merge: ntsqt2hjgak13sajaie7v66tiqjjuema qscelstrle3hsc90h26unmsrnjbm5bsr\n| | - \"3.7\"\n| | + \"4\"\n| | \n* | ntsqt2hjgak13sajaie7v66tiqjjuema\n| | Parent: ojsjscjv0r5bjrpnpmi156dvp2vff4r7\n| | - \"3.5\"\n| | + \"3.7\"\n| | \n* | ojsjscjv0r5bjrpnpmi156dvp2vff4r7\n|\\ \\ Merge: r3ho54b5uptf19v8g3a739hq1t2k4ud7 1na3ei1q1or75oljn59e7guqejgg8cgf\n| | | - \"3.1.7\"\n| | | + \"3.5\"\n| | | \n* | | r3ho54b5uptf19v8g3a739hq1t2k4ud7\n| | | Parent: l3bqmbcks0i3h8d1o2chjmsbl4njcr1n\n| | | - \"3.1.5\"\n| | | + \"3.1.7\"\n| | | \n* | | l3bqmbcks0i3h8d1o2chjmsbl4njcr1n\n| | | Parent: it1egd8n791tci10g6n8jra5uq1g2gs2\n| | | - \"3.1.3\"\n| | | + \"3.1.5\"\n| | | \n* | | it1egd8n791tci10g6n8jra5uq1g2gs2\n| | | Parent: 1na3ei1q1or75oljn59e7guqejgg8cgf\n| | | - \"3.1\"\n| | | + \"3.1.3\"\n| | | \n| | * qscelstrle3hsc90h26unmsrnjbm5bsr\n|/ | Parent: hl8k9pi7v0tnmv5ru4c748l9icjkr55j\n| | - \"3.2\"\n| | + \"3.6\"\n| | \n* | 1na3ei1q1or75oljn59e7guqejgg8cgf\n| | Parent: ao4ik7qgsts8vhoa2jtqbfu95kdlkr44\n| | - \"3\"\n| | + \"3.1\"\n| | \n| * hl8k9pi7v0tnmv5ru4c748l9icjkr55j\n|/ Parent: ao4ik7qgsts8vhoa2jtqbfu95kdlkr44\n| - \"3\"\n| + \"3.2\"\n| \n* ao4ik7qgsts8vhoa2jtqbfu95kdlkr44\n| Parent: daiikqvqtgm56jpc8hg8m4k610t7e9m3\n| - \"2\"\n| + \"3\"\n| \n* daiikqvqtgm56jpc8hg8m4k610t7e9m3\n| Parent: 2l7i0aj5660cdb7v8rg93mgtaj6nihub\n| - \"1\"\n| + \"2\"\n| \n* 2l7i0aj5660cdb7v8rg93mgtaj6nihub\n| Parent: None\n| \n"
|
||||
graphRes1 = "* 91h4s89cr5npidfk74v2i7pg0u467sj3\n| Parent: 4vtujeavsaea0g3rf8ceus0452a6qcpv\n| \"7\"\n| \n* 4vtujeavsaea0g3rf8ceus0452a6qcpv\n| Parent: gtd79j3i0cbmecqsavmpns0doub5uh48\n| \"6\"\n| \n* gtd79j3i0cbmecqsavmpns0doub5uh48\n| Parent: hmilshma5m5tghrmeqsl5guvhq4jrj1p\n| \"5\"\n| \n* hmilshma5m5tghrmeqsl5guvhq4jrj1p\n|\\ Merge: b5uu96npfn8hns3djrr06uf07rsre5jl p70ra0af223q7082hrccmmq52adlq5qc\n| | \"4\"\n| | \n* | b5uu96npfn8hns3djrr06uf07rsre5jl\n| | Parent: 3qnjukjdf6bi6dhech80p1mp44lqv8t6\n| | \"3.7\"\n| | \n* | 3qnjukjdf6bi6dhech80p1mp44lqv8t6\n|\\ \\ Merge: cfq2u3akjrjj2mg00h22miq85ukdovho 28oue1i24hr3vvhfh9ppjqpv2lk8ou7c\n| | | \"3.5\"\n| | | \n| * | 28oue1i24hr3vvhfh9ppjqpv2lk8ou7c\n| | | Parent: 3o1fpog1r9kflm9m47qk0fc8j5kjnggm\n| | | \"3.1.7\"\n| | | \n| * | 3o1fpog1r9kflm9m47qk0fc8j5kjnggm\n| | | Parent: rt9m1mqbstb21h6r3gjnd70lt7eat2jd\n| | | \"3.1.5\"\n| | | \n| * | rt9m1mqbstb21h6r3gjnd70lt7eat2jd\n| | | Parent: cfq2u3akjrjj2mg00h22miq85ukdovho\n| | | \"3.1.3\"\n| | | \n| | * p70ra0af223q7082hrccmmq52adlq5qc\n|/ | Parent: s85k2cs8rkhs1lk8kvdcr1g66doe1ot1\n| | \"3.6\"\n| | \n* | cfq2u3akjrjj2mg00h22miq85ukdovho\n| | Parent: i0do4efohj7679fr9pe4v79281l66nf3\n| | \"3.1\"\n| | \n| * s85k2cs8rkhs1lk8kvdcr1g66doe1ot1\n|/ Parent: i0do4efohj7679fr9pe4v79281l66nf3\n| \"3.2\"\n| \n* i0do4efohj7679fr9pe4v79281l66nf3\n| Parent: qjslbtifp9ueasdh50p989p31u5dqgl9\n| \"3\"\n| \n* qjslbtifp9ueasdh50p989p31u5dqgl9\n| Parent: hjrlok9ts52founodvoj8sn9nr0cln2a\n| \"2\"\n| \n* hjrlok9ts52founodvoj8sn9nr0cln2a\n| Parent: None\n| \"1\"\n"
|
||||
diffRes1 = "* 91h4s89cr5npidfk74v2i7pg0u467sj3\n| Parent: 4vtujeavsaea0g3rf8ceus0452a6qcpv\n| - \"6\"\n| + \"7\"\n| \n* 4vtujeavsaea0g3rf8ceus0452a6qcpv\n| Parent: gtd79j3i0cbmecqsavmpns0doub5uh48\n| - \"5\"\n| + \"6\"\n| \n* gtd79j3i0cbmecqsavmpns0doub5uh48\n| Parent: hmilshma5m5tghrmeqsl5guvhq4jrj1p\n| - \"4\"\n| + \"5\"\n| \n* hmilshma5m5tghrmeqsl5guvhq4jrj1p\n|\\ Merge: b5uu96npfn8hns3djrr06uf07rsre5jl p70ra0af223q7082hrccmmq52adlq5qc\n| | - \"3.7\"\n| | + \"4\"\n| | \n* | b5uu96npfn8hns3djrr06uf07rsre5jl\n| | Parent: 3qnjukjdf6bi6dhech80p1mp44lqv8t6\n| | - \"3.5\"\n| | + \"3.7\"\n| | \n* | 3qnjukjdf6bi6dhech80p1mp44lqv8t6\n|\\ \\ Merge: cfq2u3akjrjj2mg00h22miq85ukdovho 28oue1i24hr3vvhfh9ppjqpv2lk8ou7c\n| | | - \"3.1\"\n| | | + \"3.5\"\n| | | \n| * | 28oue1i24hr3vvhfh9ppjqpv2lk8ou7c\n| | | Parent: 3o1fpog1r9kflm9m47qk0fc8j5kjnggm\n| | | - \"3.1.5\"\n| | | + \"3.1.7\"\n| | | \n| * | 3o1fpog1r9kflm9m47qk0fc8j5kjnggm\n| | | Parent: rt9m1mqbstb21h6r3gjnd70lt7eat2jd\n| | | - \"3.1.3\"\n| | | + \"3.1.5\"\n| | | \n| * | rt9m1mqbstb21h6r3gjnd70lt7eat2jd\n| | | Parent: cfq2u3akjrjj2mg00h22miq85ukdovho\n| | | - \"3.1\"\n| | | + \"3.1.3\"\n| | | \n| | * p70ra0af223q7082hrccmmq52adlq5qc\n|/ | Parent: s85k2cs8rkhs1lk8kvdcr1g66doe1ot1\n| | - \"3.2\"\n| | + \"3.6\"\n| | \n* | cfq2u3akjrjj2mg00h22miq85ukdovho\n| | Parent: i0do4efohj7679fr9pe4v79281l66nf3\n| | - \"3\"\n| | + \"3.1\"\n| | \n| * s85k2cs8rkhs1lk8kvdcr1g66doe1ot1\n|/ Parent: i0do4efohj7679fr9pe4v79281l66nf3\n| - \"3\"\n| + \"3.2\"\n| \n* i0do4efohj7679fr9pe4v79281l66nf3\n| Parent: qjslbtifp9ueasdh50p989p31u5dqgl9\n| - \"2\"\n| + \"3\"\n| \n* qjslbtifp9ueasdh50p989p31u5dqgl9\n| Parent: hjrlok9ts52founodvoj8sn9nr0cln2a\n| - \"1\"\n| + \"2\"\n| \n* hjrlok9ts52founodvoj8sn9nr0cln2a\n| Parent: None\n| \n"
|
||||
|
||||
graphRes2 = "* 5119sh098873f2jeo17sl6v1l80racqs\n|\\ Merge: 17mij6308if7gllcr6gd4telmgg98912 d74abc1c79ad3umado4q2c50f0kictk9\n| | \"101\"\n| | \n* | 17mij6308if7gllcr6gd4telmgg98912\n|\\ \\ Merge: 2l7i0aj5660cdb7v8rg93mgtaj6nihub q5skait8n0rbkcvsoe02lb9k26s8j3k9\n| | | \"11\"\n| | | \n* | 2l7i0aj5660cdb7v8rg93mgtaj6nihub\n| | Parent: None\n| | \"1\"\n| | \n* q5skait8n0rbkcvsoe02lb9k26s8j3k9\n| Parent: None\n| \"10\"\n| \n* d74abc1c79ad3umado4q2c50f0kictk9\n| Parent: None\n| \"100\"\n"
|
||||
diffRes2 = "* 5119sh098873f2jeo17sl6v1l80racqs\n|\\ Merge: 17mij6308if7gllcr6gd4telmgg98912 d74abc1c79ad3umado4q2c50f0kictk9\n| | - \"11\"\n| | + \"101\"\n| | \n* | 17mij6308if7gllcr6gd4telmgg98912\n|\\ \\ Merge: 2l7i0aj5660cdb7v8rg93mgtaj6nihub q5skait8n0rbkcvsoe02lb9k26s8j3k9\n| | | - \"1\"\n| | | + \"11\"\n| | | \n* | 2l7i0aj5660cdb7v8rg93mgtaj6nihub\n| | Parent: None\n| | \n* q5skait8n0rbkcvsoe02lb9k26s8j3k9\n| Parent: None\n| \n* d74abc1c79ad3umado4q2c50f0kictk9\n| Parent: None\n| \n"
|
||||
graphRes2 = "* t4hqesdg07nhc0aifdd3upm1qm764hj3\n|\\ Merge: d605af3j18dfo1tvqq7ng6kg9kbpa83t c02vftjngvm9rjkrtkl3q7pu6i1j183h\n| | \"101\"\n| | \n* | d605af3j18dfo1tvqq7ng6kg9kbpa83t\n|\\ \\ Merge: hjrlok9ts52founodvoj8sn9nr0cln2a peq91jhoui1epom2bqtnks02s3oqqcqa\n| | | \"11\"\n| | | \n* | hjrlok9ts52founodvoj8sn9nr0cln2a\n| | Parent: None\n| | \"1\"\n| | \n* peq91jhoui1epom2bqtnks02s3oqqcqa\n| Parent: None\n| \"10\"\n| \n* c02vftjngvm9rjkrtkl3q7pu6i1j183h\n| Parent: None\n| \"100\"\n"
|
||||
diffRes2 = "* t4hqesdg07nhc0aifdd3upm1qm764hj3\n|\\ Merge: d605af3j18dfo1tvqq7ng6kg9kbpa83t c02vftjngvm9rjkrtkl3q7pu6i1j183h\n| | - \"11\"\n| | + \"101\"\n| | \n* | d605af3j18dfo1tvqq7ng6kg9kbpa83t\n|\\ \\ Merge: hjrlok9ts52founodvoj8sn9nr0cln2a peq91jhoui1epom2bqtnks02s3oqqcqa\n| | | - \"1\"\n| | | + \"11\"\n| | | \n* | hjrlok9ts52founodvoj8sn9nr0cln2a\n| | Parent: None\n| | \n* peq91jhoui1epom2bqtnks02s3oqqcqa\n| Parent: None\n| \n* c02vftjngvm9rjkrtkl3q7pu6i1j183h\n| Parent: None\n| \n"
|
||||
|
||||
graphRes3 = "* 0fvfhp2ikn5es1knjb41psebr6cl4cng\n|\\ Merge: vabcvup1l7dds6l9rgr89r2tog6jmdaj s0tcbso3bdrlto2sab5te0i8vc241svl\n| | \"2222-wz\"\n| | \n* | vabcvup1l7dds6l9rgr89r2tog6jmdaj\n|\\ \\ Merge: 67ique94lduk28nh0gaq8bs8b7klr69k gla0tb1iduit5q3s2o0j5g0jo98adsdh\n| | | \"222-wy\"\n| | | \n* | | 67ique94lduk28nh0gaq8bs8b7klr69k\n|\\ \\ \\ Merge: daiikqvqtgm56jpc8hg8m4k610t7e9m3 eran7ce7vqsjqirnfi4jra1nd86p0vov\n| | | | \"22-wx\"\n| | | | \n| * | | eran7ce7vqsjqirnfi4jra1nd86p0vov\n| | | | Parent: daiikqvqtgm56jpc8hg8m4k610t7e9m3\n| | | | \"20-x\"\n| | | | \n| | * | gla0tb1iduit5q3s2o0j5g0jo98adsdh\n| | | | Parent: daiikqvqtgm56jpc8hg8m4k610t7e9m3\n| | | | \"200-y\"\n| | | | \n| | | * s0tcbso3bdrlto2sab5te0i8vc241svl\n|/ / / Parent: daiikqvqtgm56jpc8hg8m4k610t7e9m3\n| \"2000-z\"\n| \n* daiikqvqtgm56jpc8hg8m4k610t7e9m3\n| Parent: 2l7i0aj5660cdb7v8rg93mgtaj6nihub\n| \"2\"\n| \n* 2l7i0aj5660cdb7v8rg93mgtaj6nihub\n| Parent: None\n| \"1\"\n"
|
||||
diffRes3 = "* 0fvfhp2ikn5es1knjb41psebr6cl4cng\n|\\ Merge: vabcvup1l7dds6l9rgr89r2tog6jmdaj s0tcbso3bdrlto2sab5te0i8vc241svl\n| | - \"222-wy\"\n| | + \"2222-wz\"\n| | \n* | vabcvup1l7dds6l9rgr89r2tog6jmdaj\n|\\ \\ Merge: 67ique94lduk28nh0gaq8bs8b7klr69k gla0tb1iduit5q3s2o0j5g0jo98adsdh\n| | | - \"22-wx\"\n| | | + \"222-wy\"\n| | | \n* | | 67ique94lduk28nh0gaq8bs8b7klr69k\n|\\ \\ \\ Merge: daiikqvqtgm56jpc8hg8m4k610t7e9m3 eran7ce7vqsjqirnfi4jra1nd86p0vov\n| | | | - \"2\"\n| | | | + \"22-wx\"\n| | | | \n| * | | eran7ce7vqsjqirnfi4jra1nd86p0vov\n| | | | Parent: daiikqvqtgm56jpc8hg8m4k610t7e9m3\n| | | | - \"2\"\n| | | | + \"20-x\"\n| | | | \n| | * | gla0tb1iduit5q3s2o0j5g0jo98adsdh\n| | | | Parent: daiikqvqtgm56jpc8hg8m4k610t7e9m3\n| | | | - \"2\"\n| | | | + \"200-y\"\n| | | | \n| | | * s0tcbso3bdrlto2sab5te0i8vc241svl\n|/ / / Parent: daiikqvqtgm56jpc8hg8m4k610t7e9m3\n| - \"2\"\n| + \"2000-z\"\n| \n* daiikqvqtgm56jpc8hg8m4k610t7e9m3\n| Parent: 2l7i0aj5660cdb7v8rg93mgtaj6nihub\n| - \"1\"\n| + \"2\"\n| \n* 2l7i0aj5660cdb7v8rg93mgtaj6nihub\n| Parent: None\n| \n"
|
||||
graphRes3 = "* qgjpni6tolcadp9pav77lrbrf3cqbp0p\n|\\ Merge: tagot7fan400kdk9sb9rta21dgq1hpa1 81q75vat1jgrr2chnnn3vv3v42g3bli4\n| | \"2222-wz\"\n| | \n| * 81q75vat1jgrr2chnnn3vv3v42g3bli4\n| |\\ Merge: p77qd1jgnkb1gi8ra44vpg4hj4pd0ql5 6c9tlms349lkv7qdvksbcqd55lf87nrh\n| | | \"222-wy\"\n| | | \n| * | p77qd1jgnkb1gi8ra44vpg4hj4pd0ql5\n| |\\ \\ Merge: qjslbtifp9ueasdh50p989p31u5dqgl9 gcv2e7tj9qqncbog7uobddr3r8mr7flb\n| | | | \"22-wx\"\n| | | | \n* | | | tagot7fan400kdk9sb9rta21dgq1hpa1\n| | | | Parent: qjslbtifp9ueasdh50p989p31u5dqgl9\n| | | | \"2000-z\"\n| | | | \n| | * | gcv2e7tj9qqncbog7uobddr3r8mr7flb\n| | | | Parent: qjslbtifp9ueasdh50p989p31u5dqgl9\n| | | | \"20-x\"\n| | | | \n| | | * 6c9tlms349lkv7qdvksbcqd55lf87nrh\n|/ / / Parent: qjslbtifp9ueasdh50p989p31u5dqgl9\n| \"200-y\"\n| \n* qjslbtifp9ueasdh50p989p31u5dqgl9\n| Parent: hjrlok9ts52founodvoj8sn9nr0cln2a\n| \"2\"\n| \n* hjrlok9ts52founodvoj8sn9nr0cln2a\n| Parent: None\n| \"1\"\n"
|
||||
diffRes3 = "* qgjpni6tolcadp9pav77lrbrf3cqbp0p\n|\\ Merge: tagot7fan400kdk9sb9rta21dgq1hpa1 81q75vat1jgrr2chnnn3vv3v42g3bli4\n| | - \"2000-z\"\n| | + \"2222-wz\"\n| | \n| * 81q75vat1jgrr2chnnn3vv3v42g3bli4\n| |\\ Merge: p77qd1jgnkb1gi8ra44vpg4hj4pd0ql5 6c9tlms349lkv7qdvksbcqd55lf87nrh\n| | | - \"22-wx\"\n| | | + \"222-wy\"\n| | | \n| * | p77qd1jgnkb1gi8ra44vpg4hj4pd0ql5\n| |\\ \\ Merge: qjslbtifp9ueasdh50p989p31u5dqgl9 gcv2e7tj9qqncbog7uobddr3r8mr7flb\n| | | | - \"2\"\n| | | | + \"22-wx\"\n| | | | \n* | | | tagot7fan400kdk9sb9rta21dgq1hpa1\n| | | | Parent: qjslbtifp9ueasdh50p989p31u5dqgl9\n| | | | - \"2\"\n| | | | + \"2000-z\"\n| | | | \n| | * | gcv2e7tj9qqncbog7uobddr3r8mr7flb\n| | | | Parent: qjslbtifp9ueasdh50p989p31u5dqgl9\n| | | | - \"2\"\n| | | | + \"20-x\"\n| | | | \n| | | * 6c9tlms349lkv7qdvksbcqd55lf87nrh\n|/ / / Parent: qjslbtifp9ueasdh50p989p31u5dqgl9\n| - \"2\"\n| + \"200-y\"\n| \n* qjslbtifp9ueasdh50p989p31u5dqgl9\n| Parent: hjrlok9ts52founodvoj8sn9nr0cln2a\n| - \"1\"\n| + \"2\"\n| \n* hjrlok9ts52founodvoj8sn9nr0cln2a\n| Parent: None\n| \n"
|
||||
|
||||
truncRes1 = "* uh5nncena0mrqobcj1vlkq7rflka5iko\n| Parent: e8aercec2ohjam7tudotofsdousoeas3\n| List<String>([ // 11 items\n| \"one\",\n| \"two\",\n| \"three\",\n| \"four\",\n| \"five\",\n| \"six\",\n| \"seven\",\n| ...\n| \n* e8aercec2ohjam7tudotofsdousoeas3\n| Parent: None\n| \"the first line\"\n"
|
||||
diffTrunc1 = "* uh5nncena0mrqobcj1vlkq7rflka5iko\n| Parent: e8aercec2ohjam7tudotofsdousoeas3\n| - \"the first line\"\n| + [ // 11 items\n| + \"one\",\n| + \"two\",\n| + \"three\",\n| + \"four\",\n| + \"five\",\n| + \"six\",\n| ...\n| \n* e8aercec2ohjam7tudotofsdousoeas3\n| Parent: None\n| \n"
|
||||
truncRes1 = "* 4tig337dohlmek0n2o3iah9qd76ac5cd\n| Parent: is6oujms9lhrnf4uc39um6kd7ej12h1f\n| List<String>([ // 11 items\n| \"one\",\n| \"two\",\n| \"three\",\n| \"four\",\n| \"five\",\n| \"six\",\n| \"seven\",\n| ...\n| \n* is6oujms9lhrnf4uc39um6kd7ej12h1f\n| Parent: None\n| \"the first line\"\n"
|
||||
diffTrunc1 = "* 4tig337dohlmek0n2o3iah9qd76ac5cd\n| Parent: is6oujms9lhrnf4uc39um6kd7ej12h1f\n| - \"the first line\"\n| + [ // 11 items\n| + \"one\",\n| + \"two\",\n| + \"three\",\n| + \"four\",\n| + \"five\",\n| + \"six\",\n| ...\n| \n* is6oujms9lhrnf4uc39um6kd7ej12h1f\n| Parent: None\n| \n"
|
||||
|
||||
truncRes2 = "* uh5nncena0mrqobcj1vlkq7rflka5iko\n| Parent: e8aercec2ohjam7tudotofsdousoeas3\n| List<String>([ // 11 items\n| \"one\",\n| \"two\",\n| \"three\",\n| \"four\",\n| \"five\",\n| \"six\",\n| \"seven\",\n| \"eight\",\n| \"nine\",\n| \"ten\",\n| \"eleven\",\n| ])\n| \n* e8aercec2ohjam7tudotofsdousoeas3\n| Parent: None\n| \"the first line\"\n"
|
||||
diffTrunc2 = "* uh5nncena0mrqobcj1vlkq7rflka5iko\n| Parent: e8aercec2ohjam7tudotofsdousoeas3\n| - \"the first line\"\n| + [ // 11 items\n| + \"one\",\n| + \"two\",\n| + \"three\",\n| + \"four\",\n| + \"five\",\n| + \"six\",\n| + \"seven\",\n| + \"eight\",\n| + \"nine\",\n| + \"ten\",\n| + \"eleven\",\n| + ]\n| \n* e8aercec2ohjam7tudotofsdousoeas3\n| Parent: None\n| \n"
|
||||
truncRes2 = "* 4tig337dohlmek0n2o3iah9qd76ac5cd\n| Parent: is6oujms9lhrnf4uc39um6kd7ej12h1f\n| List<String>([ // 11 items\n| \"one\",\n| \"two\",\n| \"three\",\n| \"four\",\n| \"five\",\n| \"six\",\n| \"seven\",\n| \"eight\",\n| \"nine\",\n| \"ten\",\n| \"eleven\",\n| ])\n| \n* is6oujms9lhrnf4uc39um6kd7ej12h1f\n| Parent: None\n| \"the first line\"\n"
|
||||
diffTrunc2 = "* 4tig337dohlmek0n2o3iah9qd76ac5cd\n| Parent: is6oujms9lhrnf4uc39um6kd7ej12h1f\n| - \"the first line\"\n| + [ // 11 items\n| + \"one\",\n| + \"two\",\n| + \"three\",\n| + \"four\",\n| + \"five\",\n| + \"six\",\n| + \"seven\",\n| + \"eight\",\n| + \"nine\",\n| + \"ten\",\n| + \"eleven\",\n| + ]\n| \n* is6oujms9lhrnf4uc39um6kd7ej12h1f\n| Parent: None\n| \n"
|
||||
|
||||
truncRes3 = "* uh5nncena0mrqobcj1vlkq7rflka5iko\n| Parent: e8aercec2ohjam7tudotofsdousoeas3\n* e8aercec2ohjam7tudotofsdousoeas3\n| Parent: None\n"
|
||||
diffTrunc3 = "* uh5nncena0mrqobcj1vlkq7rflka5iko\n| Parent: e8aercec2ohjam7tudotofsdousoeas3\n* e8aercec2ohjam7tudotofsdousoeas3\n| Parent: None\n"
|
||||
truncRes3 = "* 4tig337dohlmek0n2o3iah9qd76ac5cd\n| Parent: is6oujms9lhrnf4uc39um6kd7ej12h1f\n* is6oujms9lhrnf4uc39um6kd7ej12h1f\n| Parent: None\n"
|
||||
diffTrunc3 = "* 4tig337dohlmek0n2o3iah9qd76ac5cd\n| Parent: is6oujms9lhrnf4uc39um6kd7ej12h1f\n* is6oujms9lhrnf4uc39um6kd7ej12h1f\n| Parent: None\n"
|
||||
)
|
||||
|
||||
@@ -23,11 +23,11 @@ type nomsShowTestSuite struct {
|
||||
}
|
||||
|
||||
const (
|
||||
res1 = "struct Commit {\n parents: Set<Ref<Cycle<0>>>,\n value: Value,\n}({\n parents: {},\n value: 5cgfu2vk4nc21m1vjkjjpd2kvcm2df7q,\n})\n"
|
||||
res1 = "struct Commit {\n parents: Set<Ref<Cycle<0>>>,\n value: Ref<String>,\n}({\n parents: {},\n value: 5cgfu2vk4nc21m1vjkjjpd2kvcm2df7q,\n})\n"
|
||||
res2 = "\"test string\"\n"
|
||||
res3 = "struct Commit {\n parents: Set<Ref<Cycle<0>>>,\n value: Value,\n}({\n parents: {\n ihintmoi5knee7o5d2jddkpmrheqr6lt,\n },\n value: 82adk7hfcudg8fktittm672to66t6qeu,\n})\n"
|
||||
res3 = "struct Commit {\n parents: Set<Ref<struct Commit {\n parents: Set<Ref<Cycle<0>>>,\n value: Ref<String> | Ref<List<Number | String>>,\n }>>,\n value: Ref<List<Number | String>>,\n}({\n parents: {\n tenjp25hbcqm6m73pm3k5hrpihse9tk8,\n },\n value: 82adk7hfcudg8fktittm672to66t6qeu,\n})\n"
|
||||
res4 = "List<Number | String>([\n \"elem1\",\n 2,\n \"elem3\",\n])\n"
|
||||
res5 = "struct Commit {\n parents: Set<Ref<Cycle<0>>>,\n value: Value,\n}({\n parents: {\n tc0pgcgnnl8mi9slcg027sfa7vkrfheu,\n },\n value: 5cgfu2vk4nc21m1vjkjjpd2kvcm2df7q,\n})\n"
|
||||
res5 = "struct Commit {\n parents: Set<Ref<struct Commit {\n parents: Set<Ref<Cycle<0>>>,\n value: Ref<String> | Ref<List<Number | String>>,\n }>>,\n value: Ref<String>,\n}({\n parents: {\n 5vfutgr7bjj9lk982b2mj1sirj9qenqv,\n },\n value: 5cgfu2vk4nc21m1vjkjjpd2kvcm2df7q,\n})\n"
|
||||
)
|
||||
|
||||
func writeTestData(str string, value types.Value) types.Ref {
|
||||
|
||||
@@ -4,54 +4,111 @@
|
||||
|
||||
package datas
|
||||
|
||||
import "github.com/attic-labs/noms/go/types"
|
||||
|
||||
var commitType *types.Type
|
||||
var refOfCommitType *types.Type
|
||||
import (
|
||||
"github.com/attic-labs/noms/go/d"
|
||||
"github.com/attic-labs/noms/go/types"
|
||||
)
|
||||
|
||||
const (
|
||||
ParentsField = "parents"
|
||||
ValueField = "value"
|
||||
)
|
||||
|
||||
func init() {
|
||||
// struct Commit {
|
||||
// parents: Set<Ref<Commit>>
|
||||
// value: Value
|
||||
// }
|
||||
var valueCommitType = makeCommitType(types.ValueType)
|
||||
|
||||
commitType = types.MakeStructType("Commit",
|
||||
[]string{ParentsField, ValueField},
|
||||
[]*types.Type{
|
||||
// NewCommit creates a new commit object. The type of Commit is computed based on the type of the value and the type of the parents.
|
||||
//
|
||||
// For the first commit we get:
|
||||
//
|
||||
// ```
|
||||
// struct Commit {
|
||||
// parents: Set<Ref<Cycle<0>>>,
|
||||
// value: T,
|
||||
// }
|
||||
// ```
|
||||
//
|
||||
// As long as we continue to commit values with type T that type stays the same.
|
||||
//
|
||||
// When we later commits a value of type U we get:
|
||||
//
|
||||
// ```
|
||||
// struct Commit {
|
||||
// parents: Set<Ref<struct Commit {
|
||||
// parents: Set<Ref<Cycle<0>>>,
|
||||
// value: T | U
|
||||
// }>>,
|
||||
// value: U,
|
||||
// }
|
||||
// ```
|
||||
//
|
||||
// The new type gets combined as a union type for the value of the inner commit struct.
|
||||
|
||||
func NewCommit(value types.Value, parents types.Set) types.Struct {
|
||||
t := makeCommitType(value.Type(), valueTypesFromParents(parents)...)
|
||||
return types.NewStructWithType(t, types.ValueSlice{parents, value})
|
||||
}
|
||||
|
||||
func makeCommitType(valueType *types.Type, parentsValueTypes ...*types.Type) *types.Type {
|
||||
tmp := make([]*types.Type, len(parentsValueTypes)+1)
|
||||
copy(tmp, parentsValueTypes)
|
||||
tmp[len(tmp)-1] = valueType
|
||||
parentsValueUnionType := types.MakeUnionType(tmp...)
|
||||
if parentsValueUnionType.Equals(valueType) {
|
||||
return types.MakeStructType("Commit", []string{
|
||||
ParentsField, ValueField,
|
||||
}, []*types.Type{
|
||||
types.MakeSetType(types.MakeRefType(types.MakeCycleType(0))),
|
||||
types.ValueType,
|
||||
},
|
||||
)
|
||||
|
||||
refOfCommitType = types.MakeRefType(commitType)
|
||||
}
|
||||
|
||||
func NewCommit() types.Struct {
|
||||
initialFields := types.ValueSlice{
|
||||
types.NewSet(), // parents
|
||||
types.String(""), // value
|
||||
valueType,
|
||||
})
|
||||
}
|
||||
|
||||
return types.NewStructWithType(commitType, initialFields)
|
||||
return types.MakeStructType("Commit", []string{ParentsField, ValueField}, []*types.Type{
|
||||
types.MakeSetType(types.MakeRefType(types.MakeStructType("Commit", []string{
|
||||
ParentsField, ValueField,
|
||||
}, []*types.Type{
|
||||
types.MakeSetType(types.MakeRefType(types.MakeCycleType(0))),
|
||||
parentsValueUnionType,
|
||||
}))),
|
||||
valueType,
|
||||
})
|
||||
}
|
||||
|
||||
func typeForMapOfStringToRefOfCommit() *types.Type {
|
||||
return types.MakeMapType(types.StringType, refOfCommitType)
|
||||
func valueTypesFromParents(parents types.Set) []*types.Type {
|
||||
elemType := getSetElementType(parents.Type())
|
||||
switch elemType.Kind() {
|
||||
case types.UnionKind:
|
||||
ts := []*types.Type{}
|
||||
for _, rt := range elemType.Desc.(types.CompoundDesc).ElemTypes {
|
||||
ts = append(ts, valueFromRefOfCommit(rt))
|
||||
}
|
||||
return ts
|
||||
default:
|
||||
return []*types.Type{valueFromRefOfCommit(elemType)}
|
||||
}
|
||||
}
|
||||
|
||||
func NewMapOfStringToRefOfCommit() types.Map {
|
||||
return types.NewMap()
|
||||
func getSetElementType(t *types.Type) *types.Type {
|
||||
d.Chk.True(t.Kind() == types.SetKind)
|
||||
return t.Desc.(types.CompoundDesc).ElemTypes[0]
|
||||
}
|
||||
|
||||
func typeForSetOfRefOfCommit() *types.Type {
|
||||
return types.MakeSetType(refOfCommitType)
|
||||
func valueFromRefOfCommit(t *types.Type) *types.Type {
|
||||
return valueTypeFromCommit(getRefElementType(t))
|
||||
}
|
||||
|
||||
func CommitType() *types.Type {
|
||||
return commitType
|
||||
func getRefElementType(t *types.Type) *types.Type {
|
||||
d.Chk.True(t.Kind() == types.RefKind)
|
||||
return t.Desc.(types.CompoundDesc).ElemTypes[0]
|
||||
}
|
||||
|
||||
func valueTypeFromCommit(t *types.Type) *types.Type {
|
||||
d.Chk.True(t.Kind() == types.StructKind && t.Name() == "Commit")
|
||||
return t.Desc.(types.StructDesc).Field(ValueField)
|
||||
}
|
||||
|
||||
func IsCommitType(t *types.Type) bool {
|
||||
return types.IsSubtype(valueCommitType, t)
|
||||
}
|
||||
|
||||
func isRefOfCommitType(t *types.Type) bool {
|
||||
return t.Kind() == types.RefKind && IsCommitType(getRefElementType(t))
|
||||
}
|
||||
|
||||
51
go/datas/commit_test.go
Normal file
51
go/datas/commit_test.go
Normal file
@@ -0,0 +1,51 @@
|
||||
// Copyright 2016 Attic Labs, Inc. All rights reserved.
|
||||
// Licensed under the Apache License, version 2.0:
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
package datas
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/attic-labs/noms/go/types"
|
||||
"github.com/attic-labs/testify/assert"
|
||||
)
|
||||
|
||||
func TestNewCommit(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
assertTypeEquals := func(e, a *types.Type) {
|
||||
assert.True(a.Equals(e), "Actual: %s\nExpected %s", a.Describe(), e.Describe())
|
||||
}
|
||||
|
||||
commit := NewCommit(types.Number(1), types.NewSet())
|
||||
at := commit.Type()
|
||||
et := types.MakeStructType("Commit", []string{
|
||||
ParentsField, ValueField,
|
||||
}, []*types.Type{
|
||||
types.MakeSetType(types.MakeRefType(types.MakeCycleType(0))),
|
||||
types.NumberType,
|
||||
})
|
||||
assertTypeEquals(et, at)
|
||||
|
||||
// Commiting another Number
|
||||
commit2 := NewCommit(types.Number(2), types.NewSet(types.NewRef(commit)))
|
||||
at2 := commit2.Type()
|
||||
et2 := et
|
||||
assertTypeEquals(et2, at2)
|
||||
|
||||
// Now commit a String
|
||||
commit3 := NewCommit(types.String("Hi"), types.NewSet(types.NewRef(commit2)))
|
||||
at3 := commit3.Type()
|
||||
et3 := types.MakeStructType("Commit", []string{
|
||||
ParentsField, ValueField,
|
||||
}, []*types.Type{
|
||||
types.MakeSetType(types.MakeRefType(types.MakeStructType("Commit", []string{
|
||||
ParentsField, ValueField,
|
||||
}, []*types.Type{
|
||||
types.MakeSetType(types.MakeRefType(types.MakeCycleType(0))),
|
||||
types.MakeUnionType(types.NumberType, types.StringType),
|
||||
}))),
|
||||
types.StringType,
|
||||
})
|
||||
assertTypeEquals(et3, at3)
|
||||
}
|
||||
@@ -34,7 +34,7 @@ func (ds *databaseCommon) MaybeHead(datasetID string) (types.Struct, bool) {
|
||||
if r, ok := ds.MaybeHeadRef(datasetID); ok {
|
||||
return r.TargetValue(ds).(types.Struct), true
|
||||
}
|
||||
return NewCommit(), false
|
||||
return types.Struct{}, false
|
||||
}
|
||||
|
||||
func (ds *databaseCommon) MaybeHeadRef(datasetID string) (types.Ref, bool) {
|
||||
@@ -59,7 +59,7 @@ func (ds *databaseCommon) HeadRef(datasetID string) types.Ref {
|
||||
func (ds *databaseCommon) Datasets() types.Map {
|
||||
if ds.datasets == nil {
|
||||
if ds.rootRef.IsEmpty() {
|
||||
emptyMap := NewMapOfStringToRefOfCommit()
|
||||
emptyMap := types.NewMap()
|
||||
ds.datasets = &emptyMap
|
||||
} else {
|
||||
ds.datasets = ds.datasetsFromRef(ds.rootRef)
|
||||
|
||||
@@ -63,7 +63,7 @@ func (suite *DatabaseSuite) TestReadWriteCache() {
|
||||
var v types.Value = types.Bool(true)
|
||||
suite.NotEqual(hash.Hash{}, suite.ds.WriteValue(v))
|
||||
r := suite.ds.WriteValue(v).TargetHash()
|
||||
commit := NewCommit().Set(ValueField, v)
|
||||
commit := NewCommit(v, types.NewSet())
|
||||
newDs, err := suite.ds.Commit("foo", commit)
|
||||
suite.NoError(err)
|
||||
suite.Equal(1, suite.cs.Writes-writesOnCommit)
|
||||
@@ -77,12 +77,12 @@ func (suite *DatabaseSuite) TestReadWriteCachePersists() {
|
||||
var v types.Value = types.Bool(true)
|
||||
suite.NotEqual(hash.Hash{}, suite.ds.WriteValue(v))
|
||||
r := suite.ds.WriteValue(v)
|
||||
commit := NewCommit().Set(ValueField, v)
|
||||
commit := NewCommit(v, types.NewSet())
|
||||
suite.ds, err = suite.ds.Commit("foo", commit)
|
||||
suite.NoError(err)
|
||||
suite.Equal(1, suite.cs.Writes-writesOnCommit)
|
||||
|
||||
newCommit := NewCommit().Set(ValueField, r).Set(ParentsField, types.NewSet(types.NewRef(commit)))
|
||||
newCommit := NewCommit(r, types.NewSet(types.NewRef(commit)))
|
||||
suite.ds, err = suite.ds.Commit("foo", newCommit)
|
||||
suite.NoError(err)
|
||||
}
|
||||
@@ -102,7 +102,7 @@ func (suite *DatabaseSuite) TestDatabaseCommit() {
|
||||
|
||||
// |a|
|
||||
a := types.String("a")
|
||||
aCommit := NewCommit().Set(ValueField, a)
|
||||
aCommit := NewCommit(a, types.NewSet())
|
||||
ds2, err := suite.ds.Commit(datasetID, aCommit)
|
||||
suite.NoError(err)
|
||||
|
||||
@@ -122,7 +122,7 @@ func (suite *DatabaseSuite) TestDatabaseCommit() {
|
||||
|
||||
// |a| <- |b|
|
||||
b := types.String("b")
|
||||
bCommit := NewCommit().Set(ValueField, b).Set(ParentsField, types.NewSet(types.NewRef(aCommit)))
|
||||
bCommit := NewCommit(b, types.NewSet(types.NewRef(aCommit)))
|
||||
suite.ds, err = suite.ds.Commit(datasetID, bCommit)
|
||||
suite.NoError(err)
|
||||
suite.True(suite.ds.Head(datasetID).Get(ValueField).Equals(b))
|
||||
@@ -132,14 +132,14 @@ func (suite *DatabaseSuite) TestDatabaseCommit() {
|
||||
// \----|c|
|
||||
// Should be disallowed.
|
||||
c := types.String("c")
|
||||
cCommit := NewCommit().Set(ValueField, c).Set(ParentsField, types.NewSet(types.NewRef(aCommit)))
|
||||
cCommit := NewCommit(c, types.NewSet(types.NewRef(aCommit)))
|
||||
suite.ds, err = suite.ds.Commit(datasetID, cCommit)
|
||||
suite.Error(err)
|
||||
suite.True(suite.ds.Head(datasetID).Get(ValueField).Equals(b))
|
||||
|
||||
// |a| <- |b| <- |d|
|
||||
d := types.String("d")
|
||||
dCommit := NewCommit().Set(ValueField, d).Set(ParentsField, types.NewSet(types.NewRef(bCommit)))
|
||||
dCommit := NewCommit(d, types.NewSet(types.NewRef(bCommit)))
|
||||
suite.ds, err = suite.ds.Commit(datasetID, dCommit)
|
||||
suite.NoError(err)
|
||||
suite.True(suite.ds.Head(datasetID).Get(ValueField).Equals(d))
|
||||
@@ -170,21 +170,21 @@ func (suite *DatabaseSuite) TestDatabaseDelete() {
|
||||
// |a|
|
||||
var err error
|
||||
a := types.String("a")
|
||||
suite.ds, err = suite.ds.Commit(datasetID1, NewCommit().Set(ValueField, a))
|
||||
suite.ds, err = suite.ds.Commit(datasetID1, NewCommit(a, types.NewSet()))
|
||||
suite.NoError(err)
|
||||
suite.True(suite.ds.Head(datasetID1).Get(ValueField).Equals(a))
|
||||
|
||||
// ds1; |a|, ds2: |b|
|
||||
b := types.String("b")
|
||||
suite.ds, err = suite.ds.Commit(datasetID2, NewCommit().Set(ValueField, b))
|
||||
suite.ds, err = suite.ds.Commit(datasetID2, NewCommit(b, types.NewSet()))
|
||||
suite.NoError(err)
|
||||
suite.True(suite.ds.Head(datasetID2).Get(ValueField).Equals(b))
|
||||
|
||||
suite.ds, err = suite.ds.Delete(datasetID1)
|
||||
suite.NoError(err)
|
||||
suite.True(suite.ds.Head(datasetID2).Get(ValueField).Equals(b))
|
||||
h, present := suite.ds.MaybeHead(datasetID1)
|
||||
suite.False(present, "Dataset %s should not be present, but head is %v", datasetID1, h.Get(ValueField))
|
||||
_, present := suite.ds.MaybeHead(datasetID1)
|
||||
suite.False(present, "Dataset %s should not be present", datasetID1)
|
||||
|
||||
// Get a fresh database, and verify that only ds1 is present
|
||||
newDs := suite.makeDs(suite.cs)
|
||||
@@ -202,13 +202,13 @@ func (suite *DatabaseSuite) TestDatabaseDeleteConcurrent() {
|
||||
|
||||
// |a|
|
||||
a := types.String("a")
|
||||
aCommit := NewCommit().Set(ValueField, a)
|
||||
aCommit := NewCommit(a, types.NewSet())
|
||||
suite.ds, err = suite.ds.Commit(datasetID, aCommit)
|
||||
suite.NoError(err)
|
||||
|
||||
// |a| <- |b|
|
||||
b := types.String("b")
|
||||
bCommit := NewCommit().Set(ValueField, b).Set(ParentsField, types.NewSet(types.NewRef(aCommit)))
|
||||
bCommit := NewCommit(b, types.NewSet(types.NewRef(aCommit)))
|
||||
ds2, err := suite.ds.Commit(datasetID, bCommit)
|
||||
suite.NoError(err)
|
||||
suite.True(suite.ds.Head(datasetID).Get(ValueField).Equals(a))
|
||||
@@ -216,9 +216,9 @@ func (suite *DatabaseSuite) TestDatabaseDeleteConcurrent() {
|
||||
|
||||
suite.ds, err = suite.ds.Delete(datasetID)
|
||||
suite.NoError(err)
|
||||
h, present := suite.ds.MaybeHead(datasetID)
|
||||
suite.False(present, "Dataset %s should not be present, but head is %v", datasetID, h.Get(ValueField))
|
||||
h, present = ds2.MaybeHead(datasetID)
|
||||
_, present := suite.ds.MaybeHead(datasetID)
|
||||
suite.False(present, "Dataset %s should not be present", datasetID)
|
||||
_, present = ds2.MaybeHead(datasetID)
|
||||
suite.True(present, "Dataset %s should be present", datasetID)
|
||||
|
||||
// Get a fresh database, and verify that no databases are present
|
||||
@@ -234,10 +234,10 @@ func (suite *DatabaseSuite) TestDatabaseConcurrency() {
|
||||
// Setup:
|
||||
// |a| <- |b|
|
||||
a := types.String("a")
|
||||
aCommit := NewCommit().Set(ValueField, a)
|
||||
aCommit := NewCommit(a, types.NewSet())
|
||||
suite.ds, err = suite.ds.Commit(datasetID, aCommit)
|
||||
b := types.String("b")
|
||||
bCommit := NewCommit().Set(ValueField, b).Set(ParentsField, types.NewSet(types.NewRef(aCommit)))
|
||||
bCommit := NewCommit(b, types.NewSet(types.NewRef(aCommit)))
|
||||
suite.ds, err = suite.ds.Commit(datasetID, bCommit)
|
||||
suite.NoError(err)
|
||||
suite.True(suite.ds.Head(datasetID).Get(ValueField).Equals(b))
|
||||
@@ -248,7 +248,7 @@ func (suite *DatabaseSuite) TestDatabaseConcurrency() {
|
||||
// Change 1:
|
||||
// |a| <- |b| <- |c|
|
||||
c := types.String("c")
|
||||
cCommit := NewCommit().Set(ValueField, c).Set(ParentsField, types.NewSet(types.NewRef(bCommit)))
|
||||
cCommit := NewCommit(c, types.NewSet(types.NewRef(bCommit)))
|
||||
suite.ds, err = suite.ds.Commit(datasetID, cCommit)
|
||||
suite.NoError(err)
|
||||
suite.True(suite.ds.Head(datasetID).Get(ValueField).Equals(c))
|
||||
@@ -257,7 +257,7 @@ func (suite *DatabaseSuite) TestDatabaseConcurrency() {
|
||||
// |a| <- |b| <- |e|
|
||||
// Should be disallowed, Database returned by Commit() should have |c| as Head.
|
||||
e := types.String("e")
|
||||
eCommit := NewCommit().Set(ValueField, e).Set(ParentsField, types.NewSet(types.NewRef(bCommit)))
|
||||
eCommit := NewCommit(e, types.NewSet(types.NewRef(bCommit)))
|
||||
ds2, err = ds2.Commit(datasetID, eCommit)
|
||||
suite.Error(err)
|
||||
suite.True(ds2.Head(datasetID).Get(ValueField).Equals(c))
|
||||
|
||||
@@ -225,7 +225,7 @@ func traverseSink(sinkRef types.Ref, db Database) traverseResult {
|
||||
}
|
||||
|
||||
func traverseCommon(comRef, sinkHead types.Ref, db Database) traverseResult {
|
||||
if comRef.Height() > 1 && comRef.Type().Equals(refOfCommitType) {
|
||||
if comRef.Height() > 1 && isRefOfCommitType(comRef.Type()) {
|
||||
commit := comRef.TargetValue(db).(types.Struct)
|
||||
// We don't want to traverse the parents of sinkHead, but we still want to traverse its Value on the sinkDB side. We also still want to traverse all children, in both the srcDB and sinkDB, of any common Commit that is not at the Head of sinkDB.
|
||||
exclusionSet := types.NewSet()
|
||||
|
||||
@@ -310,14 +310,14 @@ func (suite *PullSuite) TestPullUpdates() {
|
||||
|
||||
func (suite *PullSuite) commitToSource(v types.Value, p types.Set) types.Ref {
|
||||
var err error
|
||||
suite.source, err = suite.source.Commit(dsID, NewCommit().Set(ValueField, v).Set(ParentsField, p))
|
||||
suite.source, err = suite.source.Commit(dsID, NewCommit(v, p))
|
||||
suite.NoError(err)
|
||||
return suite.source.HeadRef(dsID)
|
||||
}
|
||||
|
||||
func (suite *PullSuite) commitToSink(v types.Value, p types.Set) types.Ref {
|
||||
var err error
|
||||
suite.sink, err = suite.sink.Commit(dsID, NewCommit().Set(ValueField, v).Set(ParentsField, p))
|
||||
suite.sink, err = suite.sink.Commit(dsID, NewCommit(v, p))
|
||||
suite.NoError(err)
|
||||
return suite.sink.HeadRef(dsID)
|
||||
}
|
||||
|
||||
@@ -86,7 +86,7 @@ func (ds *Dataset) Commit(v types.Value) (Dataset, error) {
|
||||
// CommitWithParents updates the commit that a dataset points at. The new Commit is constructed using v and p.
|
||||
// If the update cannot be performed, e.g., because of a conflict, CommitWithParents returns an 'ErrMergeNeeded' error and the current snapshot of the dataset so that the client can merge the changes and try again.
|
||||
func (ds *Dataset) CommitWithParents(v types.Value, p types.Set) (Dataset, error) {
|
||||
newCommit := datas.NewCommit().Set(datas.ParentsField, p).Set(datas.ValueField, v)
|
||||
newCommit := datas.NewCommit(v, p)
|
||||
store, err := ds.Database().Commit(ds.id, newCommit)
|
||||
return Dataset{store, ds.id}, err
|
||||
}
|
||||
@@ -117,7 +117,7 @@ func (ds *Dataset) validateRefAsCommit(r types.Ref) types.Struct {
|
||||
if v == nil {
|
||||
panic(r.TargetHash().String() + " not found")
|
||||
}
|
||||
if !v.Type().Equals(datas.CommitType()) {
|
||||
if !datas.IsCommitType(v.Type()) {
|
||||
panic("Not a commit: " + types.EncodedValue(v))
|
||||
}
|
||||
return v.(types.Struct)
|
||||
|
||||
@@ -34,7 +34,7 @@ func TestDatasetCommitTracker(t *testing.T) {
|
||||
assert.False(ds2.Head().Get(datas.ValueField).Equals(ds1Commit))
|
||||
assert.False(ds1.Head().Get(datas.ValueField).Equals(ds2Commit))
|
||||
|
||||
assert.Equal("v9t3egr7nk7gdd9cvns48cc17b4pl5vp", cs.Root().String())
|
||||
assert.Equal("j8fhllbp344jj06983r2mjpi1tjdeaks", cs.Root().String())
|
||||
}
|
||||
|
||||
func newDS(id string, cs *chunks.MemoryStore) Dataset {
|
||||
|
||||
@@ -44,7 +44,7 @@ func TestAbsolutePaths(t *testing.T) {
|
||||
db.WriteValue(emptySet)
|
||||
|
||||
var err error
|
||||
db, err = db.Commit("ds", datas.NewCommit().Set(datas.ValueField, list))
|
||||
db, err = db.Commit("ds", datas.NewCommit(list, types.NewSet()))
|
||||
assert.NoError(err)
|
||||
head := db.Head("ds")
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ func TestLDBDatabase(t *testing.T) {
|
||||
|
||||
s1 := types.String("A String")
|
||||
s1Hash := ds.WriteValue(s1)
|
||||
ds.Commit("testDs", datas.NewCommit().Set(datas.ValueField, s1Hash))
|
||||
ds.Commit("testDs", datas.NewCommit(s1Hash, types.NewSet()))
|
||||
ds.Close()
|
||||
|
||||
sp, errRead := parseDatabaseSpec(spec)
|
||||
|
||||
@@ -12,6 +12,11 @@ func assertSubtype(t *Type, v Value) {
|
||||
}
|
||||
}
|
||||
|
||||
// IsSubtype determines whether concreteType is a subtype is requiredType. For example, `Number` is a subtype of `Number | String`.
|
||||
func IsSubtype(requiredType, concreteType *Type) bool {
|
||||
return isSubtype(requiredType, concreteType, nil)
|
||||
}
|
||||
|
||||
func isSubtype(requiredType, concreteType *Type, parentStructTypes []*Type) bool {
|
||||
if requiredType.Equals(concreteType) {
|
||||
return true
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@attic/noms",
|
||||
"license": "Apache-2.0",
|
||||
"version": "51.1.1",
|
||||
"version": "52.0.0",
|
||||
"description": "Noms JS SDK",
|
||||
"repository": "https://github.com/attic-labs/noms",
|
||||
"main": "dist/commonjs/noms.js",
|
||||
|
||||
@@ -4,30 +4,31 @@
|
||||
// Licensed under the Apache License, version 2.0:
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
import {invariant} from './assert.js';
|
||||
import {invariant, notNull} from './assert.js';
|
||||
import Struct from './struct.js';
|
||||
import type Value from './value.js';
|
||||
import type Ref from './ref.js';
|
||||
import Set from './set.js';
|
||||
import {
|
||||
getTypeOfValue,
|
||||
makeCycleType,
|
||||
makeRefType,
|
||||
makeStructType,
|
||||
makeSetType,
|
||||
valueType,
|
||||
makeStructType,
|
||||
makeUnionType,
|
||||
} from './type.js';
|
||||
import {equals} from './compare.js';
|
||||
import {Kind} from './noms-kind.js';
|
||||
import type {
|
||||
CompoundDesc,
|
||||
StructDesc,
|
||||
Type,
|
||||
} from './type.js';
|
||||
|
||||
export const commitType = makeStructType('Commit',
|
||||
['parents', 'value'],
|
||||
[
|
||||
makeSetType(makeRefType(makeCycleType(0))),
|
||||
valueType,
|
||||
]
|
||||
);
|
||||
|
||||
export default class Commit<T: Value> extends Struct {
|
||||
constructor(value: T, parents: Set<Ref<Commit>> = new Set()) {
|
||||
super(commitType, [parents, value]);
|
||||
const t = makeCommitType(getTypeOfValue(value), valueTypesFromParents(parents));
|
||||
super(t, [parents, value]);
|
||||
}
|
||||
|
||||
get value(): T {
|
||||
@@ -53,3 +54,54 @@ export default class Commit<T: Value> extends Struct {
|
||||
return new Commit(this.value, parents);
|
||||
}
|
||||
}
|
||||
|
||||
function makeCommitType(valueType: Type<*>, parentsValueTypes: Type<*>[]): Type<StructDesc> {
|
||||
const tmp = parentsValueTypes.concat(valueType);
|
||||
const parentsValueUnionType = makeUnionType(tmp);
|
||||
if (equals(parentsValueUnionType, valueType)) {
|
||||
return makeStructType('Commit', [
|
||||
'parents', 'value',
|
||||
], [
|
||||
makeSetType(makeRefType(makeCycleType(0))),
|
||||
valueType,
|
||||
]);
|
||||
}
|
||||
return makeStructType('Commit', ['parents', 'value'], [
|
||||
makeSetType(makeRefType(makeStructType('Commit', [
|
||||
'parents', 'value',
|
||||
], [
|
||||
makeSetType(makeRefType(makeCycleType(0))),
|
||||
parentsValueUnionType,
|
||||
]))),
|
||||
valueType,
|
||||
]);
|
||||
}
|
||||
|
||||
function valueTypesFromParents(parents: Set): Type<*>[] {
|
||||
const elemType = getSetElementType(parents.type);
|
||||
switch (elemType.kind) {
|
||||
case Kind.Union:
|
||||
return elemType.desc.elemTypes.map(valueFromRefOfCommit);
|
||||
default:
|
||||
return [valueFromRefOfCommit(elemType)];
|
||||
}
|
||||
}
|
||||
|
||||
function getSetElementType(t: Type<CompoundDesc>): Type<*> {
|
||||
invariant(t.kind === Kind.Set);
|
||||
return t.desc.elemTypes[0];
|
||||
}
|
||||
|
||||
function valueFromRefOfCommit(t: Type<CompoundDesc>): Type<*> {
|
||||
return valueTypeFromCommit(getRefElementType(t));
|
||||
}
|
||||
|
||||
function getRefElementType(t: Type<CompoundDesc>): Type<*> {
|
||||
invariant(t.kind === Kind.Ref);
|
||||
return t.desc.elemTypes[0];
|
||||
}
|
||||
|
||||
function valueTypeFromCommit(t: Type<StructDesc>): Type<*> {
|
||||
invariant(t.name === 'Commit');
|
||||
return notNull(t.desc.getField('value'));
|
||||
}
|
||||
|
||||
@@ -247,7 +247,11 @@ export function makeStructType(name: string, fieldNames: string[], fieldTypes: T
|
||||
return staticTypeCache.makeStructType(name, fieldNames, fieldTypes);
|
||||
}
|
||||
|
||||
export function makeUnionType(types: Type[]): Type {
|
||||
/**
|
||||
* Creates a union type unless the number of distinct types is 1, in which case that type is
|
||||
* returned.
|
||||
*/
|
||||
export function makeUnionType(types: Type<*>[]): Type<*> {
|
||||
return staticTypeCache.makeUnionType(types);
|
||||
}
|
||||
|
||||
|
||||
@@ -204,7 +204,7 @@ export default class ValueDecoder {
|
||||
return newStructWithType(type, values);
|
||||
}
|
||||
|
||||
readCachedStructType(): Type {
|
||||
readCachedStructType(): ?Type<StructDesc> {
|
||||
let trie = notNull(this._tc.trieRoots.get(Kind.Struct)).traverse(this._r.readIdent(this._tc));
|
||||
const count = this._r.readUint32();
|
||||
for (let i = 0; i < count; i++) {
|
||||
@@ -212,10 +212,10 @@ export default class ValueDecoder {
|
||||
trie = trie.traverse(this.readType().id);
|
||||
}
|
||||
|
||||
return notNull(trie.t);
|
||||
return trie.t;
|
||||
}
|
||||
|
||||
readStructType(): Type {
|
||||
readStructType(): Type<StructDesc> {
|
||||
const pos = this._r.pos();
|
||||
const t = this.readCachedStructType();
|
||||
if (t) {
|
||||
|
||||
Reference in New Issue
Block a user