github.com/abemedia/appcast@v0.4.0/integrations/yum/types.go (about)

     1  package yum
     2  
     3  import (
     4  	"encoding/xml"
     5  	"strconv"
     6  )
     7  
     8  type RepoMD struct {
     9  	XMLName  xml.Name `xml:"http://linux.duke.edu/metadata/repo repomd"`
    10  	Revision int      `xml:"revision,omitempty"`
    11  	Data     []Data   `xml:"data"`
    12  }
    13  
    14  type Data struct {
    15  	Type         string   `xml:"type,attr"`
    16  	Checksum     Checksum `xml:"checksum"`
    17  	OpenChecksum Checksum `xml:"open-checksum"`
    18  	Location     Location `xml:"location"`
    19  	Timestamp    int      `xml:"timestamp"`
    20  	Size         int      `xml:"size,omitempty"`
    21  	OpenSize     int      `xml:"open-size,omitempty"`
    22  }
    23  
    24  type Checksum struct {
    25  	Type  string `xml:"type,attr"`
    26  	PkgID string `xml:"pkgid,attr,omitempty"`
    27  	Value string `xml:",chardata"`
    28  }
    29  
    30  type Location struct {
    31  	HREF string `xml:"href,attr"`
    32  }
    33  
    34  type MetaData struct {
    35  	Package []Package `xml:"package"`
    36  }
    37  
    38  func (r *MetaData) MarshalXML(enc *xml.Encoder, _ xml.StartElement) error {
    39  	err := enc.EncodeToken(xml.StartElement{
    40  		Name: xml.Name{Local: "metadata"},
    41  		Attr: []xml.Attr{
    42  			{Name: xml.Name{Local: "xmlns"}, Value: "http://linux.duke.edu/metadata/common"},
    43  			{Name: xml.Name{Local: "xmlns:rpm"}, Value: "http://linux.duke.edu/metadata/rpm"},
    44  			{Name: xml.Name{Local: "packages"}, Value: strconv.Itoa(len(r.Package))},
    45  		},
    46  	})
    47  	if err != nil {
    48  		return err
    49  	}
    50  
    51  	err = enc.EncodeElement(r.Package, xml.StartElement{Name: xml.Name{Local: "package"}})
    52  	if err != nil {
    53  		return err
    54  	}
    55  
    56  	return enc.EncodeToken(xml.EndElement{Name: xml.Name{Local: "metadata"}})
    57  }
    58  
    59  type Package struct {
    60  	Type        string   `xml:"type,attr"`
    61  	Name        string   `xml:"name"`
    62  	Arch        string   `xml:"arch"`
    63  	Version     Version  `xml:"version"`
    64  	Checksum    Checksum `xml:"checksum"`
    65  	Summary     string   `xml:"summary"`
    66  	Description string   `xml:"description"`
    67  	Packager    string   `xml:"packager,omitempty"`
    68  	URL         string   `xml:"url,omitempty"`
    69  	Time        Time     `xml:"time"`
    70  	Size        Size     `xml:"size"`
    71  	Location    Location `xml:"location"`
    72  	Format      Format   `xml:"format"`
    73  }
    74  
    75  type Time struct {
    76  	File  int `xml:"file,attr"`
    77  	Build int `xml:"build,attr"`
    78  }
    79  
    80  type Format struct {
    81  	License     string      `xml:"rpm:license,omitempty"`
    82  	Vendor      string      `xml:"rpm:vendor,omitempty"`
    83  	Group       string      `xml:"rpm:group,omitempty"`
    84  	BuildHost   string      `xml:"rpm:buildhost,omitempty"`
    85  	SourceRPM   string      `xml:"rpm:sourcerpm,omitempty"`
    86  	HeaderRange HeaderRange `xml:"rpm:header-range"`
    87  	Provides    *Entries    `xml:"rpm:provides,omitempty"`
    88  	Obsoletes   *Entries    `xml:"rpm:obsoletes,omitempty"`
    89  	Requires    *Entries    `xml:"rpm:requires,omitempty"`
    90  	Conflicts   *Entries    `xml:"rpm:conflicts,omitempty"`
    91  	Files       []string    `xml:"file,omitempty"`
    92  }
    93  
    94  func (f *Format) UnmarshalXML(dec *xml.Decoder, start xml.StartElement) error {
    95  	type entries struct {
    96  		Entries []Entry `xml:"entry"`
    97  	}
    98  	var data struct {
    99  		License     string      `xml:"license"`
   100  		Vendor      string      `xml:"vendor"`
   101  		Group       string      `xml:"group"`
   102  		BuildHost   string      `xml:"buildhost"`
   103  		SourceRPM   string      `xml:"sourcerpm"`
   104  		HeaderRange HeaderRange `xml:"header-range"`
   105  		Provides    *entries    `xml:"provides"`
   106  		Obsoletes   *entries    `xml:"obsoletes"`
   107  		Requires    *entries    `xml:"requires"`
   108  		Conflicts   *entries    `xml:"conflicts"`
   109  		Files       []string    `xml:"file"`
   110  	}
   111  	if err := dec.DecodeElement(&data, &start); err != nil {
   112  		return err
   113  	}
   114  
   115  	*f = Format{
   116  		License:     data.License,
   117  		Vendor:      data.Vendor,
   118  		Group:       data.Group,
   119  		BuildHost:   data.BuildHost,
   120  		SourceRPM:   data.SourceRPM,
   121  		HeaderRange: data.HeaderRange,
   122  		Provides:    (*Entries)(data.Provides),
   123  		Obsoletes:   (*Entries)(data.Obsoletes),
   124  		Requires:    (*Entries)(data.Requires),
   125  		Conflicts:   (*Entries)(data.Conflicts),
   126  		Files:       data.Files,
   127  	}
   128  
   129  	return nil
   130  }
   131  
   132  type HeaderRange struct {
   133  	Start int `xml:"start,attr"`
   134  	End   int `xml:"end,attr"`
   135  }
   136  
   137  type Entries struct {
   138  	Entries []Entry `xml:"rpm:entry,omitempty"`
   139  }
   140  
   141  type Entry struct {
   142  	Name  string `xml:"name,attr"`
   143  	Flags string `xml:"flags,attr,omitempty"`
   144  	Epoch string `xml:"epoch,attr,omitempty"`
   145  	Ver   string `xml:"ver,attr,omitempty"`
   146  	Rel   string `xml:"rel,attr,omitempty"`
   147  	Pre   string `xml:"pre,attr,omitempty"`
   148  }
   149  
   150  type Size struct {
   151  	Package   int `xml:"package,attr"`
   152  	Installed int `xml:"installed,attr"`
   153  	Archive   int `xml:"archive,attr"`
   154  }
   155  
   156  type FileLists struct {
   157  	Packages string             `xml:"packages,attr"`
   158  	Package  []FileListsPackage `xml:"package"`
   159  }
   160  
   161  func (r *FileLists) MarshalXML(enc *xml.Encoder, _ xml.StartElement) error {
   162  	err := enc.EncodeToken(xml.StartElement{
   163  		Name: xml.Name{Local: "filelists"},
   164  		Attr: []xml.Attr{
   165  			{Name: xml.Name{Local: "xmlns"}, Value: "http://linux.duke.edu/metadata/filelists"},
   166  			{Name: xml.Name{Local: "packages"}, Value: strconv.Itoa(len(r.Package))},
   167  		},
   168  	})
   169  	if err != nil {
   170  		return err
   171  	}
   172  
   173  	err = enc.EncodeElement(r.Package, xml.StartElement{Name: xml.Name{Local: "package"}})
   174  	if err != nil {
   175  		return err
   176  	}
   177  
   178  	return enc.EncodeToken(xml.EndElement{Name: xml.Name{Local: "filelists"}})
   179  }
   180  
   181  type FileListsPackage struct {
   182  	Name    string  `xml:"name,attr"`
   183  	PkgID   string  `xml:"pkgid,attr"`
   184  	Arch    string  `xml:"arch,attr"`
   185  	Version Version `xml:"version"`
   186  	Files   []File  `xml:"file"`
   187  }
   188  
   189  type File struct {
   190  	Type string `xml:"type,attr,omitempty"`
   191  	Path string `xml:",chardata"`
   192  }
   193  
   194  type Version struct {
   195  	Ver   string `xml:"ver,attr"`
   196  	Rel   string `xml:"rel,attr"`
   197  	Epoch string `xml:"epoch,attr"`
   198  }
   199  
   200  type Other struct {
   201  	Package []OtherPackage `xml:"package"`
   202  }
   203  
   204  func (r *Other) MarshalXML(enc *xml.Encoder, _ xml.StartElement) error {
   205  	err := enc.EncodeToken(xml.StartElement{
   206  		Name: xml.Name{Local: "other"},
   207  		Attr: []xml.Attr{
   208  			{Name: xml.Name{Local: "xmlns"}, Value: "http://linux.duke.edu/metadata/other"},
   209  			{Name: xml.Name{Local: "packages"}, Value: strconv.Itoa(len(r.Package))},
   210  		},
   211  	})
   212  	if err != nil {
   213  		return err
   214  	}
   215  
   216  	err = enc.EncodeElement(r.Package, xml.StartElement{Name: xml.Name{Local: "package"}})
   217  	if err != nil {
   218  		return err
   219  	}
   220  
   221  	return enc.EncodeToken(xml.EndElement{Name: xml.Name{Local: "other"}})
   222  }
   223  
   224  type OtherPackage struct {
   225  	Name    string  `xml:"name,attr"`
   226  	PkgID   string  `xml:"pkgid,attr"`
   227  	Arch    string  `xml:"arch,attr"`
   228  	Version Version `xml:"version"`
   229  }