mirror of
https://github.com/aptly-dev/aptly.git
synced 2026-07-27 13:57:46 +00:00
Correctly handle multine fields in Release/non-Release files. #266
This commit is contained in:
+1
-1
@@ -90,7 +90,7 @@ func (c *Changes) VerifyAndParse(acceptUnsigned, ignoreSignature bool, verifier
|
|||||||
}
|
}
|
||||||
|
|
||||||
reader := NewControlFileReader(text)
|
reader := NewControlFileReader(text)
|
||||||
c.Stanza, err = reader.ReadStanza()
|
c.Stanza, err = reader.ReadStanza(false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -51,7 +51,7 @@ func GetControlFileFromDeb(packageFile string) (Stanza, error) {
|
|||||||
|
|
||||||
if tarHeader.Name == "./control" || tarHeader.Name == "control" {
|
if tarHeader.Name == "./control" || tarHeader.Name == "control" {
|
||||||
reader := NewControlFileReader(untar)
|
reader := NewControlFileReader(untar)
|
||||||
stanza, err := reader.ReadStanza()
|
stanza, err := reader.ReadStanza(false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -91,7 +91,7 @@ func GetControlFileFromDsc(dscFile string, verifier utils.Verifier) (Stanza, err
|
|||||||
}
|
}
|
||||||
|
|
||||||
reader := NewControlFileReader(text)
|
reader := NewControlFileReader(text)
|
||||||
stanza, err := reader.ReadStanza()
|
stanza, err := reader.ReadStanza(false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
+30
-22
@@ -92,11 +92,33 @@ func (s Stanza) Copy() (result Stanza) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write single field from Stanza to writer
|
func isMultilineField(field string, isRelease bool) bool {
|
||||||
func writeField(w *bufio.Writer, field, value string) (err error) {
|
switch field {
|
||||||
_, multiline := multilineFields[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")
|
_, err = w.WriteString(field + ": " + value + "\n")
|
||||||
} else {
|
} else {
|
||||||
if !strings.HasSuffix(value, "\n") {
|
if !strings.HasSuffix(value, "\n") {
|
||||||
@@ -126,7 +148,7 @@ func (s Stanza) WriteTo(w *bufio.Writer, isSource, isRelease bool) error {
|
|||||||
value, ok := s[field]
|
value, ok := s[field]
|
||||||
if ok {
|
if ok {
|
||||||
delete(s, field)
|
delete(s, field)
|
||||||
err := writeField(w, field, value)
|
err := writeField(w, field, value, isRelease)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -134,7 +156,7 @@ func (s Stanza) WriteTo(w *bufio.Writer, isSource, isRelease bool) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for field, value := range s {
|
for field, value := range s {
|
||||||
err := writeField(w, field, value)
|
err := writeField(w, field, value, isRelease)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -148,20 +170,6 @@ var (
|
|||||||
ErrMalformedStanza = errors.New("malformed stanza syntax")
|
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 {
|
func canonicalCase(field string) string {
|
||||||
upper := strings.ToUpper(field)
|
upper := strings.ToUpper(field)
|
||||||
switch upper {
|
switch upper {
|
||||||
@@ -202,7 +210,7 @@ func NewControlFileReader(r io.Reader) *ControlFileReader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ReadStanza reeads one stanza from control file
|
// 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)
|
stanza := make(Stanza, 32)
|
||||||
lastField := ""
|
lastField := ""
|
||||||
lastFieldMultiline := false
|
lastFieldMultiline := false
|
||||||
@@ -230,7 +238,7 @@ func (c *ControlFileReader) ReadStanza() (Stanza, error) {
|
|||||||
return nil, ErrMalformedStanza
|
return nil, ErrMalformedStanza
|
||||||
}
|
}
|
||||||
lastField = canonicalCase(parts[0])
|
lastField = canonicalCase(parts[0])
|
||||||
_, lastFieldMultiline = multilineFields[lastField]
|
lastFieldMultiline = isMultilineField(lastField, isRelease)
|
||||||
if lastFieldMultiline {
|
if lastFieldMultiline {
|
||||||
stanza[lastField] = parts[1]
|
stanza[lastField] = parts[1]
|
||||||
if parts[1] != "" {
|
if parts[1] != "" {
|
||||||
|
|||||||
+6
-6
@@ -84,13 +84,13 @@ func (s *ControlFileSuite) SetUpTest(c *C) {
|
|||||||
func (s *ControlFileSuite) TestReadStanza(c *C) {
|
func (s *ControlFileSuite) TestReadStanza(c *C) {
|
||||||
r := NewControlFileReader(s.reader)
|
r := NewControlFileReader(s.reader)
|
||||||
|
|
||||||
stanza1, err := r.ReadStanza()
|
stanza1, err := r.ReadStanza(false)
|
||||||
c.Assert(err, IsNil)
|
c.Assert(err, IsNil)
|
||||||
|
|
||||||
stanza2, err := r.ReadStanza()
|
stanza2, err := r.ReadStanza(false)
|
||||||
c.Assert(err, IsNil)
|
c.Assert(err, IsNil)
|
||||||
|
|
||||||
stanza3, err := r.ReadStanza()
|
stanza3, err := r.ReadStanza(false)
|
||||||
c.Assert(err, IsNil)
|
c.Assert(err, IsNil)
|
||||||
c.Assert(stanza3, IsNil)
|
c.Assert(stanza3, IsNil)
|
||||||
|
|
||||||
@@ -103,7 +103,7 @@ func (s *ControlFileSuite) TestReadStanza(c *C) {
|
|||||||
|
|
||||||
func (s *ControlFileSuite) TestReadWriteStanza(c *C) {
|
func (s *ControlFileSuite) TestReadWriteStanza(c *C) {
|
||||||
r := NewControlFileReader(s.reader)
|
r := NewControlFileReader(s.reader)
|
||||||
stanza, err := r.ReadStanza()
|
stanza, err := r.ReadStanza(false)
|
||||||
c.Assert(err, IsNil)
|
c.Assert(err, IsNil)
|
||||||
|
|
||||||
buf := &bytes.Buffer{}
|
buf := &bytes.Buffer{}
|
||||||
@@ -116,7 +116,7 @@ func (s *ControlFileSuite) TestReadWriteStanza(c *C) {
|
|||||||
str := buf.String()
|
str := buf.String()
|
||||||
|
|
||||||
r = NewControlFileReader(buf)
|
r = NewControlFileReader(buf)
|
||||||
stanza2, err := r.ReadStanza()
|
stanza2, err := r.ReadStanza(false)
|
||||||
c.Assert(err, IsNil)
|
c.Assert(err, IsNil)
|
||||||
|
|
||||||
c.Assert(stanza2, DeepEquals, stanza)
|
c.Assert(stanza2, DeepEquals, stanza)
|
||||||
@@ -140,7 +140,7 @@ func (s *ControlFileSuite) BenchmarkReadStanza(c *C) {
|
|||||||
reader := bytes.NewBufferString(controlFile)
|
reader := bytes.NewBufferString(controlFile)
|
||||||
r := NewControlFileReader(reader)
|
r := NewControlFileReader(reader)
|
||||||
for {
|
for {
|
||||||
s, e := r.ReadStanza()
|
s, e := r.ReadStanza(false)
|
||||||
if s == nil && e == nil {
|
if s == nil && e == nil {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -477,10 +477,10 @@ func (p *Package) Stanza() (result Stanza) {
|
|||||||
result["MD5sum"] = f.Checksums.MD5
|
result["MD5sum"] = f.Checksums.MD5
|
||||||
}
|
}
|
||||||
if f.Checksums.SHA1 != "" {
|
if f.Checksums.SHA1 != "" {
|
||||||
result["SHA1"] = " " + f.Checksums.SHA1
|
result["SHA1"] = f.Checksums.SHA1
|
||||||
}
|
}
|
||||||
if f.Checksums.SHA256 != "" {
|
if f.Checksums.SHA256 != "" {
|
||||||
result["SHA256"] = " " + f.Checksums.SHA256
|
result["SHA256"] = f.Checksums.SHA256
|
||||||
}
|
}
|
||||||
result["Size"] = fmt.Sprintf("%d", f.Checksums.Size)
|
result["Size"] = fmt.Sprintf("%d", f.Checksums.Size)
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -22,7 +22,7 @@ func (s *PackageSuite) SetUpTest(c *C) {
|
|||||||
s.stanza = packageStanza.Copy()
|
s.stanza = packageStanza.Copy()
|
||||||
|
|
||||||
buf := bytes.NewBufferString(sourcePackageMeta)
|
buf := bytes.NewBufferString(sourcePackageMeta)
|
||||||
s.sourceStanza, _ = NewControlFileReader(buf).ReadStanza()
|
s.sourceStanza, _ = NewControlFileReader(buf).ReadStanza(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *PackageSuite) TestNewFromPara(c *C) {
|
func (s *PackageSuite) TestNewFromPara(c *C) {
|
||||||
@@ -43,7 +43,7 @@ func (s *PackageSuite) TestNewFromPara(c *C) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *PackageSuite) TestNewUdebFromPara(c *C) {
|
func (s *PackageSuite) TestNewUdebFromPara(c *C) {
|
||||||
stanza, _ := NewControlFileReader(bytes.NewBufferString(udebPackageMeta)).ReadStanza()
|
stanza, _ := NewControlFileReader(bytes.NewBufferString(udebPackageMeta)).ReadStanza(false)
|
||||||
p := NewUdebPackageFromControlFile(stanza)
|
p := NewUdebPackageFromControlFile(stanza)
|
||||||
|
|
||||||
c.Check(p.IsSource, Equals, false)
|
c.Check(p.IsSource, Equals, false)
|
||||||
@@ -152,7 +152,7 @@ func (s *PackageSuite) TestGetField(c *C) {
|
|||||||
|
|
||||||
p4, _ := NewSourcePackageFromControlFile(s.sourceStanza.Copy())
|
p4, _ := NewSourcePackageFromControlFile(s.sourceStanza.Copy())
|
||||||
|
|
||||||
stanza5, _ := NewControlFileReader(bytes.NewBufferString(udebPackageMeta)).ReadStanza()
|
stanza5, _ := NewControlFileReader(bytes.NewBufferString(udebPackageMeta)).ReadStanza(false)
|
||||||
p5 := NewUdebPackageFromControlFile(stanza5)
|
p5 := NewUdebPackageFromControlFile(stanza5)
|
||||||
|
|
||||||
c.Check(p.GetField("$Source"), Equals, "alien-arena")
|
c.Check(p.GetField("$Source"), Equals, "alien-arena")
|
||||||
|
|||||||
+4
-4
@@ -305,7 +305,7 @@ func (s *PublishedRepoSuite) TestPublish(c *C) {
|
|||||||
c.Assert(err, IsNil)
|
c.Assert(err, IsNil)
|
||||||
|
|
||||||
cfr := NewControlFileReader(rf)
|
cfr := NewControlFileReader(rf)
|
||||||
st, err := cfr.ReadStanza()
|
st, err := cfr.ReadStanza(true)
|
||||||
c.Assert(err, IsNil)
|
c.Assert(err, IsNil)
|
||||||
|
|
||||||
c.Check(st["Origin"], Equals, "ppa squeeze")
|
c.Check(st["Origin"], Equals, "ppa squeeze")
|
||||||
@@ -318,13 +318,13 @@ func (s *PublishedRepoSuite) TestPublish(c *C) {
|
|||||||
cfr = NewControlFileReader(pf)
|
cfr = NewControlFileReader(pf)
|
||||||
|
|
||||||
for i := 0; i < 3; i++ {
|
for i := 0; i < 3; i++ {
|
||||||
st, err = cfr.ReadStanza()
|
st, err = cfr.ReadStanza(false)
|
||||||
c.Assert(err, IsNil)
|
c.Assert(err, IsNil)
|
||||||
|
|
||||||
c.Check(st["Filename"], Equals, "pool/main/a/alien-arena/alien-arena-common_7.40-2_i386.deb")
|
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(err, IsNil)
|
||||||
c.Assert(st, IsNil)
|
c.Assert(st, IsNil)
|
||||||
|
|
||||||
@@ -332,7 +332,7 @@ func (s *PublishedRepoSuite) TestPublish(c *C) {
|
|||||||
c.Assert(err, IsNil)
|
c.Assert(err, IsNil)
|
||||||
|
|
||||||
cfr = NewControlFileReader(drf)
|
cfr = NewControlFileReader(drf)
|
||||||
st, err = cfr.ReadStanza()
|
st, err = cfr.ReadStanza(true)
|
||||||
c.Assert(err, IsNil)
|
c.Assert(err, IsNil)
|
||||||
|
|
||||||
c.Check(st["Archive"], Equals, "squeeze")
|
c.Check(st["Archive"], Equals, "squeeze")
|
||||||
|
|||||||
+2
-2
@@ -304,7 +304,7 @@ ok:
|
|||||||
defer release.Close()
|
defer release.Close()
|
||||||
|
|
||||||
sreader := NewControlFileReader(release)
|
sreader := NewControlFileReader(release)
|
||||||
stanza, err := sreader.ReadStanza()
|
stanza, err := sreader.ReadStanza(true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -443,7 +443,7 @@ func (repo *RemoteRepo) DownloadPackageIndexes(progress aptly.Progress, d aptly.
|
|||||||
sreader := NewControlFileReader(packagesReader)
|
sreader := NewControlFileReader(packagesReader)
|
||||||
|
|
||||||
for {
|
for {
|
||||||
stanza, err := sreader.ReadStanza()
|
stanza, err := sreader.ReadStanza(false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user