Correctly handle multine fields in Release/non-Release files. #266

This commit is contained in:
Andrey Smirnov
2015-06-26 03:07:33 +03:00
parent 767c7ca0db
commit d04f08c1cf
8 changed files with 50 additions and 42 deletions

View File

@@ -90,7 +90,7 @@ func (c *Changes) VerifyAndParse(acceptUnsigned, ignoreSignature bool, verifier
}
reader := NewControlFileReader(text)
c.Stanza, err = reader.ReadStanza()
c.Stanza, err = reader.ReadStanza(false)
if err != nil {
return err
}

View File

@@ -51,7 +51,7 @@ func GetControlFileFromDeb(packageFile string) (Stanza, error) {
if tarHeader.Name == "./control" || tarHeader.Name == "control" {
reader := NewControlFileReader(untar)
stanza, err := reader.ReadStanza()
stanza, err := reader.ReadStanza(false)
if err != nil {
return nil, err
}
@@ -91,7 +91,7 @@ func GetControlFileFromDsc(dscFile string, verifier utils.Verifier) (Stanza, err
}
reader := NewControlFileReader(text)
stanza, err := reader.ReadStanza()
stanza, err := reader.ReadStanza(false)
if err != nil {
return nil, err
}

View File

@@ -92,11 +92,33 @@ func (s Stanza) Copy() (result Stanza) {
return
}
// Write single field from Stanza to writer
func writeField(w *bufio.Writer, field, value string) (err error) {
_, multiline := multilineFields[field]
func isMultilineField(field string, isRelease bool) bool {
switch field {
case "Description":
return true
case "Files":
return true
case "Changes":
return true
case "Checksums-Sha1":
return true
case "Checksums-Sha256":
return true
case "Package-List":
return true
case "MD5Sum":
return isRelease
case "SHA1":
return isRelease
case "SHA256":
return isRelease
}
return false
}
if !multiline {
// Write single field from Stanza to writer
func writeField(w *bufio.Writer, field, value string, isRelease bool) (err error) {
if !isMultilineField(field, isRelease) {
_, err = w.WriteString(field + ": " + value + "\n")
} else {
if !strings.HasSuffix(value, "\n") {
@@ -126,7 +148,7 @@ func (s Stanza) WriteTo(w *bufio.Writer, isSource, isRelease bool) error {
value, ok := s[field]
if ok {
delete(s, field)
err := writeField(w, field, value)
err := writeField(w, field, value, isRelease)
if err != nil {
return err
}
@@ -134,7 +156,7 @@ func (s Stanza) WriteTo(w *bufio.Writer, isSource, isRelease bool) error {
}
for field, value := range s {
err := writeField(w, field, value)
err := writeField(w, field, value, isRelease)
if err != nil {
return err
}
@@ -148,20 +170,6 @@ var (
ErrMalformedStanza = errors.New("malformed stanza syntax")
)
var multilineFields = make(map[string]bool)
func init() {
multilineFields["Description"] = true
multilineFields["Files"] = true
multilineFields["Changes"] = true
multilineFields["Checksums-Sha1"] = true
multilineFields["Checksums-Sha256"] = true
multilineFields["Package-List"] = true
multilineFields["SHA256"] = true
multilineFields["SHA1"] = true
multilineFields["MD5Sum"] = true
}
func canonicalCase(field string) string {
upper := strings.ToUpper(field)
switch upper {
@@ -202,7 +210,7 @@ func NewControlFileReader(r io.Reader) *ControlFileReader {
}
// ReadStanza reeads one stanza from control file
func (c *ControlFileReader) ReadStanza() (Stanza, error) {
func (c *ControlFileReader) ReadStanza(isRelease bool) (Stanza, error) {
stanza := make(Stanza, 32)
lastField := ""
lastFieldMultiline := false
@@ -230,7 +238,7 @@ func (c *ControlFileReader) ReadStanza() (Stanza, error) {
return nil, ErrMalformedStanza
}
lastField = canonicalCase(parts[0])
_, lastFieldMultiline = multilineFields[lastField]
lastFieldMultiline = isMultilineField(lastField, isRelease)
if lastFieldMultiline {
stanza[lastField] = parts[1]
if parts[1] != "" {

View File

@@ -84,13 +84,13 @@ func (s *ControlFileSuite) SetUpTest(c *C) {
func (s *ControlFileSuite) TestReadStanza(c *C) {
r := NewControlFileReader(s.reader)
stanza1, err := r.ReadStanza()
stanza1, err := r.ReadStanza(false)
c.Assert(err, IsNil)
stanza2, err := r.ReadStanza()
stanza2, err := r.ReadStanza(false)
c.Assert(err, IsNil)
stanza3, err := r.ReadStanza()
stanza3, err := r.ReadStanza(false)
c.Assert(err, IsNil)
c.Assert(stanza3, IsNil)
@@ -103,7 +103,7 @@ func (s *ControlFileSuite) TestReadStanza(c *C) {
func (s *ControlFileSuite) TestReadWriteStanza(c *C) {
r := NewControlFileReader(s.reader)
stanza, err := r.ReadStanza()
stanza, err := r.ReadStanza(false)
c.Assert(err, IsNil)
buf := &bytes.Buffer{}
@@ -116,7 +116,7 @@ func (s *ControlFileSuite) TestReadWriteStanza(c *C) {
str := buf.String()
r = NewControlFileReader(buf)
stanza2, err := r.ReadStanza()
stanza2, err := r.ReadStanza(false)
c.Assert(err, IsNil)
c.Assert(stanza2, DeepEquals, stanza)
@@ -140,7 +140,7 @@ func (s *ControlFileSuite) BenchmarkReadStanza(c *C) {
reader := bytes.NewBufferString(controlFile)
r := NewControlFileReader(reader)
for {
s, e := r.ReadStanza()
s, e := r.ReadStanza(false)
if s == nil && e == nil {
break
}

View File

@@ -477,10 +477,10 @@ func (p *Package) Stanza() (result Stanza) {
result["MD5sum"] = f.Checksums.MD5
}
if f.Checksums.SHA1 != "" {
result["SHA1"] = " " + f.Checksums.SHA1
result["SHA1"] = f.Checksums.SHA1
}
if f.Checksums.SHA256 != "" {
result["SHA256"] = " " + f.Checksums.SHA256
result["SHA256"] = f.Checksums.SHA256
}
result["Size"] = fmt.Sprintf("%d", f.Checksums.Size)
}

View File

@@ -22,7 +22,7 @@ func (s *PackageSuite) SetUpTest(c *C) {
s.stanza = packageStanza.Copy()
buf := bytes.NewBufferString(sourcePackageMeta)
s.sourceStanza, _ = NewControlFileReader(buf).ReadStanza()
s.sourceStanza, _ = NewControlFileReader(buf).ReadStanza(false)
}
func (s *PackageSuite) TestNewFromPara(c *C) {
@@ -43,7 +43,7 @@ func (s *PackageSuite) TestNewFromPara(c *C) {
}
func (s *PackageSuite) TestNewUdebFromPara(c *C) {
stanza, _ := NewControlFileReader(bytes.NewBufferString(udebPackageMeta)).ReadStanza()
stanza, _ := NewControlFileReader(bytes.NewBufferString(udebPackageMeta)).ReadStanza(false)
p := NewUdebPackageFromControlFile(stanza)
c.Check(p.IsSource, Equals, false)
@@ -152,7 +152,7 @@ func (s *PackageSuite) TestGetField(c *C) {
p4, _ := NewSourcePackageFromControlFile(s.sourceStanza.Copy())
stanza5, _ := NewControlFileReader(bytes.NewBufferString(udebPackageMeta)).ReadStanza()
stanza5, _ := NewControlFileReader(bytes.NewBufferString(udebPackageMeta)).ReadStanza(false)
p5 := NewUdebPackageFromControlFile(stanza5)
c.Check(p.GetField("$Source"), Equals, "alien-arena")

View File

@@ -305,7 +305,7 @@ func (s *PublishedRepoSuite) TestPublish(c *C) {
c.Assert(err, IsNil)
cfr := NewControlFileReader(rf)
st, err := cfr.ReadStanza()
st, err := cfr.ReadStanza(true)
c.Assert(err, IsNil)
c.Check(st["Origin"], Equals, "ppa squeeze")
@@ -318,13 +318,13 @@ func (s *PublishedRepoSuite) TestPublish(c *C) {
cfr = NewControlFileReader(pf)
for i := 0; i < 3; i++ {
st, err = cfr.ReadStanza()
st, err = cfr.ReadStanza(false)
c.Assert(err, IsNil)
c.Check(st["Filename"], Equals, "pool/main/a/alien-arena/alien-arena-common_7.40-2_i386.deb")
}
st, err = cfr.ReadStanza()
st, err = cfr.ReadStanza(false)
c.Assert(err, IsNil)
c.Assert(st, IsNil)
@@ -332,7 +332,7 @@ func (s *PublishedRepoSuite) TestPublish(c *C) {
c.Assert(err, IsNil)
cfr = NewControlFileReader(drf)
st, err = cfr.ReadStanza()
st, err = cfr.ReadStanza(true)
c.Assert(err, IsNil)
c.Check(st["Archive"], Equals, "squeeze")

View File

@@ -304,7 +304,7 @@ ok:
defer release.Close()
sreader := NewControlFileReader(release)
stanza, err := sreader.ReadStanza()
stanza, err := sreader.ReadStanza(true)
if err != nil {
return err
}
@@ -443,7 +443,7 @@ func (repo *RemoteRepo) DownloadPackageIndexes(progress aptly.Progress, d aptly.
sreader := NewControlFileReader(packagesReader)
for {
stanza, err := sreader.ReadStanza()
stanza, err := sreader.ReadStanza(false)
if err != nil {
return err
}