Hello community,
here is the log from the commit of package golang-github-kr-pretty for
openSUSE:Factory checked in at 2017-03-24 02:15:48
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/golang-github-kr-pretty (Old)
and /work/SRC/openSUSE:Factory/.golang-github-kr-pretty.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "golang-github-kr-pretty"
Fri Mar 24 02:15:48 2017 rev:3 rq:477175 version:0.0.0+git20160823.cfb55aa
Changes:
--------
---
/work/SRC/openSUSE:Factory/golang-github-kr-pretty/golang-github-kr-pretty.changes
2016-04-06 11:51:58.000000000 +0200
+++
/work/SRC/openSUSE:Factory/.golang-github-kr-pretty.new/golang-github-kr-pretty.changes
2017-03-24 02:15:49.413567011 +0100
@@ -1,0 +2,19 @@
+Thu Dec 08 13:30:08 UTC 2016 - [email protected]
+
+- Update to version 0.0.0+git20160823.cfb55aa:
+ * Run 'gofmt -w -s' on sources
+ * Add Sprint
+ * diff unexported struct fields
+ * Remove unused code (#29)
+ * add new Printfer interface
+ * add trailing newline in Fdiff after each item
+ * add new Logfer interface
+ * diff all map key types
+ * Fix passthrough handling (#37). (#38)
+
+-------------------------------------------------------------------
+Thu Dec 8 13:09:39 UTC 2016 - [email protected]
+
+- Refactoring based on new packaging proposal
+
+-------------------------------------------------------------------
Old:
----
pretty-0.0.0+git20150520.e6ac2fc.tar.xz
New:
----
pretty-0.0.0+git20160823.cfb55aa.tar.xz
rpmlintrc
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ golang-github-kr-pretty.spec ++++++
--- /var/tmp/diff_new_pack.MtpF0I/_old 2017-03-24 02:15:50.057475905 +0100
+++ /var/tmp/diff_new_pack.MtpF0I/_new 2017-03-24 02:15:50.061475338 +0100
@@ -1,8 +1,7 @@
#
-# spec file for package golang-github-kr-pretty
+# spec file for package golang
#
-# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany.
-# Copyright (c) 2011 Sascha Peilicke <[email protected]>
+# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -17,50 +16,57 @@
#
-Name: golang-github-kr-pretty
-Version: 0.0.0+git20150520.e6ac2fc
+%global provider github
+%global provider_tld com
+%global project kr
+%global repo pretty
+%global provider_prefix %{provider}.%{provider_tld}/%{project}/%{repo}
+%global import_path %{provider_prefix}
+
+Name: golang-%{provider}-%{project}-%{repo}
+Version: 0.0.0+git20160823.cfb55aa
Release: 0
Summary: Pretty printing for Go values
License: MIT
-Group: Development/Languages/Other
-Url: https://github.com/kr/pretty
-Source: pretty-%{version}.tar.xz
+Group: Development/Languages/Golang
+Url: https://%{provider_prefix}
+Source0: %{repo}-%{version}.tar.xz
+Source1: rpmlintrc
BuildRoot: %{_tmppath}/%{name}-%{version}-build
+
BuildRequires: golang-packaging
-BuildRequires: golang(github.com/kr/text)
BuildRequires: xz
-Provides: go-pretty.go = %{version}
-Obsoletes: go-pretty.go < %{version}
-Provides: go-pretty = %{version}
-Obsoletes: go-pretty < %{version}
+
+BuildRequires: golang(github.com/kr/text)
+Requires: golang(github.com/kr/text)
+
+%{go_nostrip}
%{go_provides}
%description
Package pretty provides pretty-printing for go values. This is useful during
-debugging, to avoid wrapping long output lines in the terminal.
-
-It provides a function, Formatter, that can be used with any function that
-accepts a format string.
-
-This package also provides a convenience wrapper for each function in package
-fmt that takes a format string.
+debugging, to avoid wrapping long output lines in the terminal. It provides a
+function, Formatter, that can be used with any function that accepts a format
+string. This package also provides a convenience wrapper for each function in
+package fmt that takes a format string.
%prep
-%setup -q -n pretty-%{version}
+%setup -q -n %{repo}-%{version}
%build
-%goprep github.com/kr/pretty
+%goprep %{import_path}
%gobuild ...
%install
%goinstall
+%gosrc
+%gofilelist
%check
-%gotest github.com/kr/pretty
+%gotest %{import_path}...
-%files
+%files -f file.lst
%defattr(-,root,root,-)
%doc Readme License
-%{go_contribdir}/*
%changelog
++++++ _service ++++++
--- /var/tmp/diff_new_pack.MtpF0I/_old 2017-03-24 02:15:50.097470246 +0100
+++ /var/tmp/diff_new_pack.MtpF0I/_new 2017-03-24 02:15:50.097470246 +0100
@@ -1,16 +1,17 @@
<services>
- <service name="tar_scm" mode="localonly">
- <param name="url">https://github.com/kr/pretty.git</param>
+ <service name="tar_scm" mode="disabled">
+ <param name="url">https://github.com/kr/pretty</param>
<param name="scm">git</param>
<param name="exclude">.git</param>
<param name="versionformat">0.0.0+git%cd.%h</param>
<param name="revision">master</param>
+ <param name="changesgenerate">enable</param>
</service>
- <service name="recompress" mode="localonly">
+ <service name="recompress" mode="disabled">
<param name="file">pretty-*.tar</param>
<param name="compression">xz</param>
</service>
- <service name="set_version" mode="localonly">
+ <service name="set_version" mode="disabled">
<param name="basename">pretty</param>
</service>
</services>
++++++ pretty-0.0.0+git20150520.e6ac2fc.tar.xz ->
pretty-0.0.0+git20160823.cfb55aa.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pretty-0.0.0+git20150520.e6ac2fc/diff.go
new/pretty-0.0.0+git20160823.cfb55aa/diff.go
--- old/pretty-0.0.0+git20150520.e6ac2fc/diff.go 2015-07-12
14:38:07.000000000 +0200
+++ new/pretty-0.0.0+git20160823.cfb55aa/diff.go 2016-08-23
19:07:15.000000000 +0200
@@ -8,43 +8,81 @@
type sbuf []string
-func (s *sbuf) Write(b []byte) (int, error) {
- *s = append(*s, string(b))
- return len(b), nil
+func (p *sbuf) Printf(format string, a ...interface{}) {
+ s := fmt.Sprintf(format, a...)
+ *p = append(*p, s)
}
// Diff returns a slice where each element describes
// a difference between a and b.
func Diff(a, b interface{}) (desc []string) {
- Fdiff((*sbuf)(&desc), a, b)
+ Pdiff((*sbuf)(&desc), a, b)
return desc
}
+// wprintfer calls Fprintf on w for each Printf call
+// with a trailing newline.
+type wprintfer struct{ w io.Writer }
+
+func (p *wprintfer) Printf(format string, a ...interface{}) {
+ fmt.Fprintf(p.w, format+"\n", a...)
+}
+
// Fdiff writes to w a description of the differences between a and b.
func Fdiff(w io.Writer, a, b interface{}) {
- diffWriter{w: w}.diff(reflect.ValueOf(a), reflect.ValueOf(b))
+ Pdiff(&wprintfer{w}, a, b)
+}
+
+type Printfer interface {
+ Printf(format string, a ...interface{})
+}
+
+// Pdiff prints to p a description of the differences between a and b.
+// It calls Printf once for each difference, with no trailing newline.
+// The standard library log.Logger is a Printfer.
+func Pdiff(p Printfer, a, b interface{}) {
+ diffPrinter{w: p}.diff(reflect.ValueOf(a), reflect.ValueOf(b))
+}
+
+type Logfer interface {
+ Logf(format string, a ...interface{})
}
-type diffWriter struct {
- w io.Writer
+// logprintfer calls Fprintf on w for each Printf call
+// with a trailing newline.
+type logprintfer struct{ l Logfer }
+
+func (p *logprintfer) Printf(format string, a ...interface{}) {
+ p.l.Logf(format, a...)
+}
+
+// Ldiff prints to l a description of the differences between a and b.
+// It calls Logf once for each difference, with no trailing newline.
+// The standard library testing.T and testing.B are Logfers.
+func Ldiff(l Logfer, a, b interface{}) {
+ Pdiff(&logprintfer{l}, a, b)
+}
+
+type diffPrinter struct {
+ w Printfer
l string // label
}
-func (w diffWriter) printf(f string, a ...interface{}) {
+func (w diffPrinter) printf(f string, a ...interface{}) {
var l string
if w.l != "" {
l = w.l + ": "
}
- fmt.Fprintf(w.w, l+f, a...)
+ w.w.Printf(l+f, a...)
}
-func (w diffWriter) diff(av, bv reflect.Value) {
+func (w diffPrinter) diff(av, bv reflect.Value) {
if !av.IsValid() && bv.IsValid() {
- w.printf("nil != %#v", bv.Interface())
+ w.printf("nil != %# v", formatter{v: bv, quote: true})
return
}
if av.IsValid() && !bv.IsValid() {
- w.printf("%#v != nil", av.Interface())
+ w.printf("%# v != nil", formatter{v: av, quote: true})
return
}
if !av.IsValid() && !bv.IsValid() {
@@ -58,34 +96,61 @@
return
}
- // numeric types, including bool
- if at.Kind() < reflect.Array {
- a, b := av.Interface(), bv.Interface()
- if a != b {
- w.printf("%#v != %#v", a, b)
+ switch kind := at.Kind(); kind {
+ case reflect.Bool:
+ if a, b := av.Bool(), bv.Bool(); a != b {
+ w.printf("%v != %v", a, b)
+ }
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32,
reflect.Int64:
+ if a, b := av.Int(), bv.Int(); a != b {
+ w.printf("%d != %d", a, b)
+ }
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32,
reflect.Uint64, reflect.Uintptr:
+ if a, b := av.Uint(), bv.Uint(); a != b {
+ w.printf("%d != %d", a, b)
+ }
+ case reflect.Float32, reflect.Float64:
+ if a, b := av.Float(), bv.Float(); a != b {
+ w.printf("%v != %v", a, b)
+ }
+ case reflect.Complex64, reflect.Complex128:
+ if a, b := av.Complex(), bv.Complex(); a != b {
+ w.printf("%v != %v", a, b)
+ }
+ case reflect.Array:
+ n := av.Len()
+ for i := 0; i < n; i++ {
+ w.relabel(fmt.Sprintf("[%d]", i)).diff(av.Index(i),
bv.Index(i))
}
- return
- }
-
- switch at.Kind() {
- case reflect.String:
- a, b := av.Interface(), bv.Interface()
- if a != b {
- w.printf("%q != %q", a, b)
+ case reflect.Chan, reflect.Func, reflect.UnsafePointer:
+ if a, b := av.Pointer(), bv.Pointer(); a != b {
+ w.printf("%#x != %#x", a, b)
+ }
+ case reflect.Interface:
+ w.diff(av.Elem(), bv.Elem())
+ case reflect.Map:
+ ak, both, bk := keyDiff(av.MapKeys(), bv.MapKeys())
+ for _, k := range ak {
+ w := w.relabel(fmt.Sprintf("[%#v]", k))
+ w.printf("%q != (missing)", av.MapIndex(k))
+ }
+ for _, k := range both {
+ w := w.relabel(fmt.Sprintf("[%#v]", k))
+ w.diff(av.MapIndex(k), bv.MapIndex(k))
+ }
+ for _, k := range bk {
+ w := w.relabel(fmt.Sprintf("[%#v]", k))
+ w.printf("(missing) != %q", bv.MapIndex(k))
}
case reflect.Ptr:
switch {
case av.IsNil() && !bv.IsNil():
- w.printf("nil != %v", bv.Interface())
+ w.printf("nil != %# v", formatter{v: bv, quote: true})
case !av.IsNil() && bv.IsNil():
- w.printf("%v != nil", av.Interface())
+ w.printf("%# v != nil", formatter{v: av, quote: true})
case !av.IsNil() && !bv.IsNil():
w.diff(av.Elem(), bv.Elem())
}
- case reflect.Struct:
- for i := 0; i < av.NumField(); i++ {
- w.relabel(at.Field(i).Name).diff(av.Field(i),
bv.Field(i))
- }
case reflect.Slice:
lenA := av.Len()
lenB := bv.Len()
@@ -96,30 +161,20 @@
for i := 0; i < lenA; i++ {
w.relabel(fmt.Sprintf("[%d]", i)).diff(av.Index(i),
bv.Index(i))
}
- case reflect.Map:
- ak, both, bk := keyDiff(av.MapKeys(), bv.MapKeys())
- for _, k := range ak {
- w := w.relabel(fmt.Sprintf("[%#v]", k.Interface()))
- w.printf("%q != (missing)", av.MapIndex(k))
- }
- for _, k := range both {
- w := w.relabel(fmt.Sprintf("[%#v]", k.Interface()))
- w.diff(av.MapIndex(k), bv.MapIndex(k))
+ case reflect.String:
+ if a, b := av.String(), bv.String(); a != b {
+ w.printf("%q != %q", a, b)
}
- for _, k := range bk {
- w := w.relabel(fmt.Sprintf("[%#v]", k.Interface()))
- w.printf("(missing) != %q", bv.MapIndex(k))
+ case reflect.Struct:
+ for i := 0; i < av.NumField(); i++ {
+ w.relabel(at.Field(i).Name).diff(av.Field(i),
bv.Field(i))
}
- case reflect.Interface:
- w.diff(reflect.ValueOf(av.Interface()),
reflect.ValueOf(bv.Interface()))
default:
- if !reflect.DeepEqual(av.Interface(), bv.Interface()) {
- w.printf("%# v != %# v", Formatter(av.Interface()),
Formatter(bv.Interface()))
- }
+ panic("unknown reflect Kind: " + kind.String())
}
}
-func (d diffWriter) relabel(name string) (d1 diffWriter) {
+func (d diffPrinter) relabel(name string) (d1 diffPrinter) {
d1 = d
if d.l != "" && name[0] != '[' {
d1.l += "."
@@ -128,11 +183,63 @@
return d1
}
+// keyEqual compares a and b for equality.
+// Both a and b must be valid map keys.
+func keyEqual(av, bv reflect.Value) bool {
+ if !av.IsValid() && !bv.IsValid() {
+ return true
+ }
+ if !av.IsValid() || !bv.IsValid() || av.Type() != bv.Type() {
+ return false
+ }
+ switch kind := av.Kind(); kind {
+ case reflect.Bool:
+ a, b := av.Bool(), bv.Bool()
+ return a == b
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32,
reflect.Int64:
+ a, b := av.Int(), bv.Int()
+ return a == b
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32,
reflect.Uint64, reflect.Uintptr:
+ a, b := av.Uint(), bv.Uint()
+ return a == b
+ case reflect.Float32, reflect.Float64:
+ a, b := av.Float(), bv.Float()
+ return a == b
+ case reflect.Complex64, reflect.Complex128:
+ a, b := av.Complex(), bv.Complex()
+ return a == b
+ case reflect.Array:
+ for i := 0; i < av.Len(); i++ {
+ if !keyEqual(av.Index(i), bv.Index(i)) {
+ return false
+ }
+ }
+ return true
+ case reflect.Chan, reflect.UnsafePointer, reflect.Ptr:
+ a, b := av.Pointer(), bv.Pointer()
+ return a == b
+ case reflect.Interface:
+ return keyEqual(av.Elem(), bv.Elem())
+ case reflect.String:
+ a, b := av.String(), bv.String()
+ return a == b
+ case reflect.Struct:
+ for i := 0; i < av.NumField(); i++ {
+ if !keyEqual(av.Field(i), bv.Field(i)) {
+ return false
+ }
+ }
+ return true
+ default:
+ panic("invalid map key type " + av.Type().String())
+ }
+}
+
func keyDiff(a, b []reflect.Value) (ak, both, bk []reflect.Value) {
for _, av := range a {
inBoth := false
for _, bv := range b {
- if reflect.DeepEqual(av.Interface(), bv.Interface()) {
+ if keyEqual(av, bv) {
inBoth = true
both = append(both, av)
break
@@ -145,7 +252,7 @@
for _, bv := range b {
inBoth := false
for _, av := range a {
- if reflect.DeepEqual(av.Interface(), bv.Interface()) {
+ if keyEqual(av, bv) {
inBoth = true
break
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pretty-0.0.0+git20150520.e6ac2fc/diff_test.go
new/pretty-0.0.0+git20160823.cfb55aa/diff_test.go
--- old/pretty-0.0.0+git20150520.e6ac2fc/diff_test.go 2015-07-12
14:38:07.000000000 +0200
+++ new/pretty-0.0.0+git20160823.cfb55aa/diff_test.go 2016-08-23
19:07:15.000000000 +0200
@@ -1,7 +1,18 @@
package pretty
import (
+ "bytes"
+ "fmt"
+ "log"
+ "reflect"
"testing"
+ "unsafe"
+)
+
+var (
+ _ Logfer = (*testing.T)(nil)
+ _ Logfer = (*testing.B)(nil)
+ _ Printfer = (*log.Logger)(nil)
)
type difftest struct {
@@ -17,6 +28,20 @@
C []int
}
+type (
+ N struct{ N int }
+ E interface{}
+)
+
+var (
+ c0 = make(chan int)
+ c1 = make(chan int)
+ f0 = func() {}
+ f1 = func() {}
+ i0 = 0
+ i1 = 1
+)
+
var diffs = []difftest{
{a: nil, b: nil},
{a: S{A: 1}, b: S{A: 1}},
@@ -28,12 +53,79 @@
{S{}, S{A: 1}, []string{`A: 0 != 1`}},
{new(S), &S{A: 1}, []string{`A: 0 != 1`}},
{S{S: new(S)}, S{S: &S{A: 1}}, []string{`S.A: 0 != 1`}},
- {S{}, S{I: 0}, []string{`I: nil != 0`}},
+ {S{}, S{I: 0}, []string{`I: nil != int(0)`}},
{S{I: 1}, S{I: "x"}, []string{`I: int != string`}},
{S{}, S{C: []int{1}}, []string{`C: []int[0] != []int[1]`}},
{S{C: []int{}}, S{C: []int{1}}, []string{`C: []int[0] != []int[1]`}},
{S{C: []int{1, 2, 3}}, S{C: []int{1, 2, 4}}, []string{`C[2]: 3 != 4`}},
- {S{}, S{A: 1, S: new(S)}, []string{`A: 0 != 1`, `S: nil != &{0 <nil>
<nil> []}`}},
+ {S{}, S{A: 1, S: new(S)}, []string{`A: 0 != 1`, `S: nil !=
&pretty.S{}`}},
+
+ // unexported fields of every reflect.Kind (both equal and unequal)
+ {struct{ x bool }{false}, struct{ x bool }{false}, nil},
+ {struct{ x bool }{false}, struct{ x bool }{true}, []string{`x: false !=
true`}},
+ {struct{ x int }{0}, struct{ x int }{0}, nil},
+ {struct{ x int }{0}, struct{ x int }{1}, []string{`x: 0 != 1`}},
+ {struct{ x int8 }{0}, struct{ x int8 }{0}, nil},
+ {struct{ x int8 }{0}, struct{ x int8 }{1}, []string{`x: 0 != 1`}},
+ {struct{ x int16 }{0}, struct{ x int16 }{0}, nil},
+ {struct{ x int16 }{0}, struct{ x int16 }{1}, []string{`x: 0 != 1`}},
+ {struct{ x int32 }{0}, struct{ x int32 }{0}, nil},
+ {struct{ x int32 }{0}, struct{ x int32 }{1}, []string{`x: 0 != 1`}},
+ {struct{ x int64 }{0}, struct{ x int64 }{0}, nil},
+ {struct{ x int64 }{0}, struct{ x int64 }{1}, []string{`x: 0 != 1`}},
+ {struct{ x uint }{0}, struct{ x uint }{0}, nil},
+ {struct{ x uint }{0}, struct{ x uint }{1}, []string{`x: 0 != 1`}},
+ {struct{ x uint8 }{0}, struct{ x uint8 }{0}, nil},
+ {struct{ x uint8 }{0}, struct{ x uint8 }{1}, []string{`x: 0 != 1`}},
+ {struct{ x uint16 }{0}, struct{ x uint16 }{0}, nil},
+ {struct{ x uint16 }{0}, struct{ x uint16 }{1}, []string{`x: 0 != 1`}},
+ {struct{ x uint32 }{0}, struct{ x uint32 }{0}, nil},
+ {struct{ x uint32 }{0}, struct{ x uint32 }{1}, []string{`x: 0 != 1`}},
+ {struct{ x uint64 }{0}, struct{ x uint64 }{0}, nil},
+ {struct{ x uint64 }{0}, struct{ x uint64 }{1}, []string{`x: 0 != 1`}},
+ {struct{ x uintptr }{0}, struct{ x uintptr }{0}, nil},
+ {struct{ x uintptr }{0}, struct{ x uintptr }{1}, []string{`x: 0 != 1`}},
+ {struct{ x float32 }{0}, struct{ x float32 }{0}, nil},
+ {struct{ x float32 }{0}, struct{ x float32 }{1}, []string{`x: 0 != 1`}},
+ {struct{ x float64 }{0}, struct{ x float64 }{0}, nil},
+ {struct{ x float64 }{0}, struct{ x float64 }{1}, []string{`x: 0 != 1`}},
+ {struct{ x complex64 }{0}, struct{ x complex64 }{0}, nil},
+ {struct{ x complex64 }{0}, struct{ x complex64 }{1}, []string{`x:
(0+0i) != (1+0i)`}},
+ {struct{ x complex128 }{0}, struct{ x complex128 }{0}, nil},
+ {struct{ x complex128 }{0}, struct{ x complex128 }{1}, []string{`x:
(0+0i) != (1+0i)`}},
+ {struct{ x [1]int }{[1]int{0}}, struct{ x [1]int }{[1]int{0}}, nil},
+ {struct{ x [1]int }{[1]int{0}}, struct{ x [1]int }{[1]int{1}},
[]string{`x[0]: 0 != 1`}},
+ {struct{ x chan int }{c0}, struct{ x chan int }{c0}, nil},
+ {struct{ x chan int }{c0}, struct{ x chan int }{c1},
[]string{fmt.Sprintf("x: %p != %p", c0, c1)}},
+ {struct{ x func() }{f0}, struct{ x func() }{f0}, nil},
+ {struct{ x func() }{f0}, struct{ x func() }{f1},
[]string{fmt.Sprintf("x: %p != %p", f0, f1)}},
+ {struct{ x interface{} }{0}, struct{ x interface{} }{0}, nil},
+ {struct{ x interface{} }{0}, struct{ x interface{} }{1}, []string{`x: 0
!= 1`}},
+ {struct{ x interface{} }{0}, struct{ x interface{} }{""}, []string{`x:
int != string`}},
+ {struct{ x interface{} }{0}, struct{ x interface{} }{nil}, []string{`x:
int(0) != nil`}},
+ {struct{ x interface{} }{nil}, struct{ x interface{} }{0}, []string{`x:
nil != int(0)`}},
+ {struct{ x map[int]int }{map[int]int{0: 0}}, struct{ x map[int]int
}{map[int]int{0: 0}}, nil},
+ {struct{ x map[int]int }{map[int]int{0: 0}}, struct{ x map[int]int
}{map[int]int{0: 1}}, []string{`x[0]: 0 != 1`}},
+ {struct{ x *int }{new(int)}, struct{ x *int }{new(int)}, nil},
+ {struct{ x *int }{&i0}, struct{ x *int }{&i1}, []string{`x: 0 != 1`}},
+ {struct{ x *int }{nil}, struct{ x *int }{&i0}, []string{`x: nil !=
&int(0)`}},
+ {struct{ x *int }{&i0}, struct{ x *int }{nil}, []string{`x: &int(0) !=
nil`}},
+ {struct{ x []int }{[]int{0}}, struct{ x []int }{[]int{0}}, nil},
+ {struct{ x []int }{[]int{0}}, struct{ x []int }{[]int{1}},
[]string{`x[0]: 0 != 1`}},
+ {struct{ x string }{"a"}, struct{ x string }{"a"}, nil},
+ {struct{ x string }{"a"}, struct{ x string }{"b"}, []string{`x: "a" !=
"b"`}},
+ {struct{ x N }{N{0}}, struct{ x N }{N{0}}, nil},
+ {struct{ x N }{N{0}}, struct{ x N }{N{1}}, []string{`x.N: 0 != 1`}},
+ {
+ struct{ x unsafe.Pointer }{unsafe.Pointer(uintptr(0))},
+ struct{ x unsafe.Pointer }{unsafe.Pointer(uintptr(0))},
+ nil,
+ },
+ {
+ struct{ x unsafe.Pointer }{unsafe.Pointer(uintptr(0))},
+ struct{ x unsafe.Pointer }{unsafe.Pointer(uintptr(1))},
+ []string{`x: 0x0 != 0x1`},
+ },
}
func TestDiff(t *testing.T) {
@@ -54,6 +146,53 @@
}
}
+func TestKeyEqual(t *testing.T) {
+ var emptyInterfaceZero interface{} = 0
+
+ cases := []interface{}{
+ new(bool),
+ new(int),
+ new(int8),
+ new(int16),
+ new(int32),
+ new(int64),
+ new(uint),
+ new(uint8),
+ new(uint16),
+ new(uint32),
+ new(uint64),
+ new(uintptr),
+ new(float32),
+ new(float64),
+ new(complex64),
+ new(complex128),
+ new([1]int),
+ new(chan int),
+ new(unsafe.Pointer),
+ new(interface{}),
+ &emptyInterfaceZero,
+ new(*int),
+ new(string),
+ new(struct{ int }),
+ }
+
+ for _, test := range cases {
+ rv := reflect.ValueOf(test).Elem()
+ if !keyEqual(rv, rv) {
+ t.Errorf("keyEqual(%s, %s) = false want true",
rv.Type(), rv.Type())
+ }
+ }
+}
+
+func TestFdiff(t *testing.T) {
+ var buf bytes.Buffer
+ Fdiff(&buf, 0, 1)
+ want := "0 != 1\n"
+ if got := buf.String(); got != want {
+ t.Errorf("Fdiff(0, 1) = %q want %q", got, want)
+ }
+}
+
func diffdiff(t *testing.T, got, exp []string) {
minus(t, "unexpected:", got, exp)
minus(t, "missing:", exp, got)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pretty-0.0.0+git20150520.e6ac2fc/formatter.go
new/pretty-0.0.0+git20160823.cfb55aa/formatter.go
--- old/pretty-0.0.0+git20150520.e6ac2fc/formatter.go 2015-07-12
14:38:07.000000000 +0200
+++ new/pretty-0.0.0+git20160823.cfb55aa/formatter.go 2016-08-23
19:07:15.000000000 +0200
@@ -10,12 +10,8 @@
"github.com/kr/text"
)
-const (
- limit = 50
-)
-
type formatter struct {
- x interface{}
+ v reflect.Value
force bool
quote bool
}
@@ -30,11 +26,11 @@
// format x according to the usual rules of package fmt.
// In particular, if x satisfies fmt.Formatter, then x.Format will be called.
func Formatter(x interface{}) (f fmt.Formatter) {
- return formatter{x: x, quote: true}
+ return formatter{v: reflect.ValueOf(x), quote: true}
}
func (fo formatter) String() string {
- return fmt.Sprint(fo.x) // unwrap it
+ return fmt.Sprint(fo.v.Interface()) // unwrap it
}
func (fo formatter) passThrough(f fmt.State, c rune) {
@@ -51,14 +47,14 @@
s += fmt.Sprintf(".%d", p)
}
s += string(c)
- fmt.Fprintf(f, s, fo.x)
+ fmt.Fprintf(f, s, fo.v.Interface())
}
func (fo formatter) Format(f fmt.State, c rune) {
if fo.force || c == 'v' && f.Flag('#') && f.Flag(' ') {
w := tabwriter.NewWriter(f, 4, 4, 1, ' ', 0)
p := &printer{tw: w, Writer: w, visited: make(map[visit]int)}
- p.printValue(reflect.ValueOf(fo.x), true, fo.quote)
+ p.printValue(fo.v, true, fo.quote)
w.Flush()
return
}
@@ -319,11 +315,6 @@
io.WriteString(p, s)
}
-func tryDeepEqual(a, b interface{}) bool {
- defer func() { recover() }()
- return reflect.DeepEqual(a, b)
-}
-
func writeByte(w io.Writer, b byte) {
w.Write([]byte{b})
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pretty-0.0.0+git20150520.e6ac2fc/formatter_test.go
new/pretty-0.0.0+git20160823.cfb55aa/formatter_test.go
--- old/pretty-0.0.0+git20150520.e6ac2fc/formatter_test.go 2015-07-12
14:38:07.000000000 +0200
+++ new/pretty-0.0.0+git20160823.cfb55aa/formatter_test.go 2016-08-23
19:07:15.000000000 +0200
@@ -13,6 +13,11 @@
s string
}
+type passtest struct {
+ v interface{}
+ f, s string
+}
+
type LongStructTypeName struct {
longFieldName interface{}
otherLongFieldName interface{}
@@ -33,8 +38,30 @@
fmt.Fprintf(s, "F(%d)", int(f))
}
+type Stringer struct { i int }
+
+func (s *Stringer) String() string { return "foo" }
+
var long = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
+var passthrough = []passtest{
+ {1, "%d", "1"},
+ {"a", "%s", "a"},
+ {&Stringer{}, "%s", "foo"},
+}
+
+func TestPassthrough(t *testing.T) {
+ for _, tt := range passthrough {
+ s := fmt.Sprintf(tt.f, Formatter(tt.v))
+ if tt.s != s {
+ t.Errorf("expected %q", tt.s)
+ t.Errorf("got %q", s)
+ t.Errorf("expraw\n%s", tt.s)
+ t.Errorf("gotraw\n%s", s)
+ }
+ }
+}
+
var gosyntax = []test{
{nil, `nil`},
{"", `""`},
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pretty-0.0.0+git20150520.e6ac2fc/pretty.go
new/pretty-0.0.0+git20160823.cfb55aa/pretty.go
--- old/pretty-0.0.0+git20150520.e6ac2fc/pretty.go 2015-07-12
14:38:07.000000000 +0200
+++ new/pretty-0.0.0+git20160823.cfb55aa/pretty.go 2016-08-23
19:07:15.000000000 +0200
@@ -11,6 +11,7 @@
"fmt"
"io"
"log"
+ "reflect"
)
// Errorf is a convenience wrapper for fmt.Errorf.
@@ -81,6 +82,15 @@
return fmt.Println(wrap(a, true)...)
}
+// Sprint is a convenience wrapper for fmt.Sprintf.
+//
+// Calling Sprint(x, y) is equivalent to
+// fmt.Sprint(Formatter(x), Formatter(y)), but each operand is
+// formatted with "%# v".
+func Sprint(a ...interface{}) string {
+ return fmt.Sprint(wrap(a, true)...)
+}
+
// Sprintf is a convenience wrapper for fmt.Sprintf.
//
// Calling Sprintf(f, x, y) is equivalent to
@@ -92,7 +102,7 @@
func wrap(a []interface{}, force bool) []interface{} {
w := make([]interface{}, len(a))
for i, x := range a {
- w[i] = formatter{x: x, force: force}
+ w[i] = formatter{v: reflect.ValueOf(x), force: force}
}
return w
}
++++++ rpmlintrc ++++++
# We are preventing the stripping to keep backtraces intact
addFilter("unstripped-binary-or-object")
# Golang doesn't support dynamic linking yet in a proper way
addFilter("statically-linked-binary")
# We are aware of that but shorter names are not possible
addFilter("filename-too-long-for-joliet")