Merge pull request #173 from hashicorp/jbardin/crlf

Remove CRLF line endings
This commit is contained in:
James Bardin 2017-05-04 15:02:34 -04:00 committed by GitHub
commit a4b07c25de
10 changed files with 155 additions and 52 deletions

View File

@ -4,7 +4,7 @@ clone_folder: c:\gopath\src\github.com\hashicorp\hcl
environment: environment:
GOPATH: c:\gopath GOPATH: c:\gopath
init: init:
- git config --global core.autocrlf true - git config --global core.autocrlf false
install: install:
- cmd: >- - cmd: >-
echo %Path% echo %Path%

View File

@ -9,7 +9,6 @@ import (
"github.com/davecgh/go-spew/spew" "github.com/davecgh/go-spew/spew"
"github.com/hashicorp/hcl/hcl/ast" "github.com/hashicorp/hcl/hcl/ast"
"github.com/hashicorp/hcl/testhelper"
) )
func TestDecode_interface(t *testing.T) { func TestDecode_interface(t *testing.T) {
@ -89,8 +88,7 @@ func TestDecode_interface(t *testing.T) {
{ {
"multiline_literal_with_hil.hcl", "multiline_literal_with_hil.hcl",
false, false,
map[string]interface{}{"multiline_literal_with_hil": testhelper.Unix2dos(`${hello map[string]interface{}{"multiline_literal_with_hil": "${hello\n world}"},
world}`)},
}, },
{ {
"multiline_no_marker.hcl", "multiline_no_marker.hcl",
@ -100,22 +98,22 @@ func TestDecode_interface(t *testing.T) {
{ {
"multiline.hcl", "multiline.hcl",
false, false,
map[string]interface{}{"foo": testhelper.Unix2dos("bar\nbaz\n")}, map[string]interface{}{"foo": "bar\nbaz\n"},
}, },
{ {
"multiline_indented.hcl", "multiline_indented.hcl",
false, false,
map[string]interface{}{"foo": testhelper.Unix2dos(" bar\n baz\n")}, map[string]interface{}{"foo": " bar\n baz\n"},
}, },
{ {
"multiline_no_hanging_indent.hcl", "multiline_no_hanging_indent.hcl",
false, false,
map[string]interface{}{"foo": testhelper.Unix2dos(" baz\n bar\n foo\n")}, map[string]interface{}{"foo": " baz\n bar\n foo\n"},
}, },
{ {
"multiline_no_eof.hcl", "multiline_no_eof.hcl",
false, false,
map[string]interface{}{"foo": testhelper.Unix2dos("bar\nbaz\n"), "key": "value"}, map[string]interface{}{"foo": "bar\nbaz\n", "key": "value"},
}, },
{ {
"multiline.json", "multiline.json",
@ -421,31 +419,32 @@ func TestDecode_interface(t *testing.T) {
} }
for _, tc := range cases { for _, tc := range cases {
t.Logf("Testing: %s", tc.File) t.Run(tc.File, func(t *testing.T) {
d, err := ioutil.ReadFile(filepath.Join(fixtureDir, tc.File)) d, err := ioutil.ReadFile(filepath.Join(fixtureDir, tc.File))
if err != nil { if err != nil {
t.Fatalf("err: %s", err) t.Fatalf("err: %s", err)
} }
var out interface{} var out interface{}
err = Decode(&out, string(d)) err = Decode(&out, string(d))
if (err != nil) != tc.Err { if (err != nil) != tc.Err {
t.Fatalf("Input: %s\n\nError: %s", tc.File, err) t.Fatalf("Input: %s\n\nError: %s", tc.File, err)
} }
if !reflect.DeepEqual(out, tc.Out) { if !reflect.DeepEqual(out, tc.Out) {
t.Fatalf("Input: %s. Actual, Expected.\n\n%#v\n\n%#v", tc.File, out, tc.Out) t.Fatalf("Input: %s. Actual, Expected.\n\n%#v\n\n%#v", tc.File, out, tc.Out)
} }
var v interface{} var v interface{}
err = Unmarshal(d, &v) err = Unmarshal(d, &v)
if (err != nil) != tc.Err { if (err != nil) != tc.Err {
t.Fatalf("Input: %s\n\nError: %s", tc.File, err) t.Fatalf("Input: %s\n\nError: %s", tc.File, err)
} }
if !reflect.DeepEqual(v, tc.Out) { if !reflect.DeepEqual(v, tc.Out) {
t.Fatalf("Input: %s. Actual, Expected.\n\n%#v\n\n%#v", tc.File, out, tc.Out) t.Fatalf("Input: %s. Actual, Expected.\n\n%#v\n\n%#v", tc.File, out, tc.Out)
} }
})
} }
} }

View File

@ -3,6 +3,7 @@
package parser package parser
import ( import (
"bytes"
"errors" "errors"
"fmt" "fmt"
"strings" "strings"
@ -36,6 +37,11 @@ func newParser(src []byte) *Parser {
// Parse returns the fully parsed source and returns the abstract syntax tree. // Parse returns the fully parsed source and returns the abstract syntax tree.
func Parse(src []byte) (*ast.File, error) { func Parse(src []byte) (*ast.File, error) {
// normalize all line endings
// since the scanner and output only work with "\n" line endings, we may
// end up with dangling "\r" characters in the parsed data.
src = bytes.Replace(src, []byte("\r\n"), []byte("\n"), -1)
p := newParser(src) p := newParser(src)
return p.Parse() return p.Parse()
} }

View File

@ -393,6 +393,7 @@ func TestCommentGroup(t *testing.T) {
groups int groups int
}{ }{
{"# Hello\n# World", 1}, {"# Hello\n# World", 1},
{"# Hello\r\n# Windows", 1},
} }
for _, tc := range cases { for _, tc := range cases {
@ -424,6 +425,10 @@ func TestParse(t *testing.T) {
"comment.hcl", "comment.hcl",
false, false,
}, },
{
"comment_crlf.hcl",
false,
},
{ {
"comment_lastline.hcl", "comment_lastline.hcl",
false, false,
@ -464,6 +469,10 @@ func TestParse(t *testing.T) {
"complex.hcl", "complex.hcl",
false, false,
}, },
{
"complex_crlf.hcl",
false,
},
{ {
"types.hcl", "types.hcl",
false, false,

View File

@ -1,15 +1,15 @@
// Foo // Foo
/* Bar */ /* Bar */
/* /*
/* /*
Baz Baz
*/ */
# Another # Another
# Multiple # Multiple
# Lines # Lines
foo = "bar" foo = "bar"

View File

@ -0,0 +1,15 @@
// Foo
/* Bar */
/*
/*
Baz
*/
# Another
# Multiple
# Lines
foo = "bar"

View File

@ -0,0 +1,42 @@
variable "foo" {
default = "bar"
description = "bar"
}
variable "groups" { }
provider "aws" {
access_key = "foo"
secret_key = "bar"
}
provider "do" {
api_key = "${var.foo}"
}
resource "aws_security_group" "firewall" {
count = 5
}
resource aws_instance "web" {
ami = "${var.foo}"
security_groups = [
"foo",
"${aws_security_group.firewall.foo}",
"${element(split(\",\", var.groups)}",
]
network_interface = {
device_index = 0
description = "Main network interface"
}
}
resource "aws_instance" "db" {
security_groups = "${aws_security_group.firewall.*.id}"
VPC = "foo"
depends_on = ["aws_instance.web"]
}
output "web_ip" {
value = "${aws_instance.web.private_ip}"
}

View File

@ -62,6 +62,5 @@ func Format(src []byte) ([]byte, error) {
// Add trailing newline to result // Add trailing newline to result
buf.WriteString("\n") buf.WriteString("\n")
return buf.Bytes(), nil return buf.Bytes(), nil
} }

View File

@ -1,8 +1,3 @@
// +build !windows
// TODO(jen20): These need fixing on Windows but printer is not used right now
// and red CI is making it harder to process other bugs, so ignore until
// we get around to fixing them.package printer
package printer package printer
import ( import (
@ -33,6 +28,7 @@ var data = []entry{
{"list.input", "list.golden"}, {"list.input", "list.golden"},
{"list_comment.input", "list_comment.golden"}, {"list_comment.input", "list_comment.golden"},
{"comment.input", "comment.golden"}, {"comment.input", "comment.golden"},
{"comment_crlf.input", "comment.golden"},
{"comment_aligned.input", "comment_aligned.golden"}, {"comment_aligned.input", "comment_aligned.golden"},
{"comment_array.input", "comment_array.golden"}, {"comment_array.input", "comment_array.golden"},
{"comment_end_file.input", "comment_end_file.golden"}, {"comment_end_file.input", "comment_end_file.golden"},
@ -109,8 +105,8 @@ func diff(aname, bname string, a, b []byte) error {
for i := 0; i < len(a) && i < len(b); i++ { for i := 0; i < len(a) && i < len(b); i++ {
ch := a[i] ch := a[i]
if ch != b[i] { if ch != b[i] {
fmt.Fprintf(&buf, "\n%s:%d:%d: %s", aname, line, i-offs+1, lineAt(a, offs)) fmt.Fprintf(&buf, "\n%s:%d:%d: %q", aname, line, i-offs+1, lineAt(a, offs))
fmt.Fprintf(&buf, "\n%s:%d:%d: %s", bname, line, i-offs+1, lineAt(b, offs)) fmt.Fprintf(&buf, "\n%s:%d:%d: %q", bname, line, i-offs+1, lineAt(b, offs))
fmt.Fprintf(&buf, "\n\n") fmt.Fprintf(&buf, "\n\n")
break break
} }

37
hcl/printer/testdata/comment_crlf.input vendored Normal file
View File

@ -0,0 +1,37 @@
// A standalone comment is a comment which is not attached to any kind of node
// This comes from Terraform, as a test
variable "foo" {
# Standalone comment should be still here
default = "bar"
description = "bar" # yooo
}
/* This is a multi line standalone
comment*/
// fatih arslan
/* This is a developer test
account and a multine comment */
developer = [ "fatih", "arslan"] // fatih arslan
# One line here
numbers = [1,2] // another line here
# Another comment
variable = {
description = "bar" # another yooo
foo {
# Nested standalone
bar = "fatih"
}
}
// lead comment
foo {
bar = "fatih" // line comment 2
} // line comment 3