Simplify basic commit type for validation check

This commit is contained in:
Dan Willhite
2016-07-21 10:44:05 -07:00
parent b349b6f2e6
commit 4e1bbfcfa5
4 changed files with 87 additions and 16 deletions

View File

@@ -116,10 +116,12 @@ func runLog(args []string) int {
func printCommit(node LogNode, w io.Writer, db datas.Database) (err error) {
maxMetaFieldNameLength := func(commit types.Struct) int {
maxLen := 0
meta := commit.Get(datas.MetaField).(types.Struct)
meta.Type().Desc.(types.StructDesc).IterFields(func(name string, t *types.Type) {
maxLen = max(maxLen, len(name))
})
if m, ok := commit.MaybeGet(datas.MetaField); ok {
meta := m.(types.Struct)
meta.Type().Desc.(types.StructDesc).IterFields(func(name string, t *types.Type) {
maxLen = max(maxLen, len(name))
})
}
return maxLen
}
@@ -226,17 +228,20 @@ func genGraph(node LogNode, lineno int) string {
}
func writeMetaLines(node LogNode, maxLines, lineno, maxLabelLen int, w io.Writer) (int, error) {
meta := node.commit.Get(datas.MetaField).(types.Struct)
mlw := &maxLineWriter{numLines: lineno, maxLines: maxLines, node: node, dest: w, needsPrefix: true, showGraph: showGraph}
err := d.Try(func() {
meta.Type().Desc.(types.StructDesc).IterFields(func(fieldName string, t *types.Type) {
v := meta.Get(fieldName)
fmt.Fprintf(mlw, "%-*s", maxLabelLen+2, strings.Title(fieldName)+":")
types.WriteEncodedValue(mlw, v)
fmt.Fprintf(mlw, "\n")
if m, ok := node.commit.MaybeGet(datas.MetaField); ok {
meta := m.(types.Struct)
mlw := &maxLineWriter{numLines: lineno, maxLines: maxLines, node: node, dest: w, needsPrefix: true, showGraph: showGraph}
err := d.Try(func() {
meta.Type().Desc.(types.StructDesc).IterFields(func(fieldName string, t *types.Type) {
v := meta.Get(fieldName)
fmt.Fprintf(mlw, "%-*s", maxLabelLen+2, strings.Title(fieldName)+":")
types.WriteEncodedValue(mlw, v)
fmt.Fprintf(mlw, "\n")
})
})
})
return mlw.numLines, err
return mlw.numLines, err
}
return lineno, nil
}
func writeCommitLines(node LogNode, maxLines, lineno int, w io.Writer) (lineCnt int, err error) {

View File

@@ -202,6 +202,32 @@ func (s *nomsLogTestSuite) TestNomsGraph2() {
s.Equal(diffRes2, res)
}
func (s *nomsLogTestSuite) TestNoMetaCommit() {
str := spec.CreateDatabaseSpecString("ldb", s.LdbDir)
db, err := spec.GetDatabase(str)
s.NoError(err)
ds := dataset.NewDataset(db, "ds1")
meta := types.NewStruct("Meta", map[string]types.Value{
"test1": types.String("Yoo"),
"test2": types.String("Hoo"),
})
ds, err = ds.Commit(types.String("1"), dataset.CommitOptions{Meta: meta})
s.NoError(err)
r1 := ds.HeadRef()
noMetaCommit := types.NewStruct("Commit", map[string]types.Value{
"value": types.String("2"),
"parents": types.NewSet(r1),
})
ds.Database().Commit("ds1", noMetaCommit)
db.Close()
res, _ := s.Run(main, []string{"log", "-show-value=false", spec.CreateValueSpecString("ldb", s.LdbDir, "ds1")})
s.Equal(metaRes1, res)
}
func (s *nomsLogTestSuite) TestNomsGraph3() {
str := spec.CreateDatabaseSpecString("ldb", s.LdbDir)
db, err := spec.GetDatabase(str)
@@ -324,4 +350,6 @@ const (
truncRes3 = "* p1442asfqnhgv1ebg6rijhl3kb9n4vt3\n| Parent: 4tq9si4tk8n0pead7hovehcbuued45sa\n* 4tq9si4tk8n0pead7hovehcbuued45sa\n| Parent: None\n"
diffTrunc3 = "* p1442asfqnhgv1ebg6rijhl3kb9n4vt3\n| Parent: 4tq9si4tk8n0pead7hovehcbuued45sa\n* 4tq9si4tk8n0pead7hovehcbuued45sa\n| Parent: None\n"
metaRes1 = "82pdg48mjv5noo1bn0k6mhbqe2daunt8\nParent: pv77djqjgu33b5lko9l3f7s3i15me2k2\n- \"1\"\n+ \"2\"\n\npv77djqjgu33b5lko9l3f7s3i15me2k2\nParent: None\nTest1: \"Yoo\"\nTest2: \"Hoo\"\n\n"
)

View File

@@ -15,7 +15,7 @@ const (
MetaField = "meta"
)
var valueCommitType = makeCommitType(types.ValueType, types.EmptyStructType)
var valueCommitType = makeValueCommitType()
// 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.
// It also includes a Meta field whose type is always the empty struct
@@ -52,6 +52,14 @@ func NewCommit(value types.Value, parents types.Set, meta types.Struct) types.St
return types.NewStructWithType(t, types.ValueSlice{meta, parents, value})
}
func makeValueCommitType() *types.Type {
fieldNames := []string{ParentsField, ValueField}
return types.MakeStructType("Commit", fieldNames, []*types.Type{
types.MakeSetType(types.MakeRefType(types.MakeCycleType(0))),
types.ValueType,
})
}
func makeCommitType(valueType *types.Type, parentsValueTypes ...*types.Type) *types.Type {
tmp := make([]*types.Type, len(parentsValueTypes)+1)
copy(tmp, parentsValueTypes)

View File

@@ -12,8 +12,9 @@ import (
)
func TestNewCommit(t *testing.T) {
commitFieldNames := []string{MetaField, ParentsField, ValueField}
assert := assert.New(t)
commitFieldNames := []string{MetaField, ParentsField, ValueField}
assertTypeEquals := func(e, a *types.Type) {
assert.True(a.Equals(e), "Actual: %s\nExpected %s", a.Describe(), e.Describe())
}
@@ -62,3 +63,32 @@ func TestNewCommit(t *testing.T) {
})
assertTypeEquals(et4, at4)
}
func TestCommitWithoutMetaField(t *testing.T) {
assert := assert.New(t)
metaCommit := types.NewStruct("Commit", map[string]types.Value{
"value": types.Number(9),
"parents": types.NewSet(),
"meta": types.EmptyStruct,
})
assert.True(IsCommitType(metaCommit.Type()))
noMetaCommit := types.NewStruct("Commit", map[string]types.Value{
"value": types.Number(9),
"parents": types.NewSet(),
})
assert.True(IsCommitType(noMetaCommit.Type()))
badCommit := types.NewStruct("Commit", map[string]types.Value{
"value": types.Number(9),
"parents1": types.NewSet(),
})
assert.False(IsCommitType(badCommit.Type()))
badMetaCommit := types.NewStruct("Commit", map[string]types.Value{
"value": types.Number(9),
"parents1": types.NewSet(),
"meta": types.String("one"),
})
assert.False(IsCommitType(badMetaCommit.Type()))
}