1
+ package com .typesafe .packager
2
+ package rpm
3
+
4
+ import linux .{LinuxPackageMapping ,LinuxFileMetaData }
5
+ import sbt ._
6
+
7
+ case class RpmMetadata (
8
+ name : String ,
9
+ version : String ,
10
+ release : String ,
11
+ arch : String ,
12
+ vendor : String ,
13
+ os : String ) {
14
+ }
15
+
16
+
17
+ case class RpmDescription (
18
+ summary : Option [String ] = None ,
19
+ license : Option [String ] = None ,
20
+ distribution : Option [String ] = None ,
21
+ // vendor: Option[String] = None,
22
+ url : Option [String ] = None ,
23
+ group : Option [String ] = None ,
24
+ packager : Option [String ] = None ,
25
+ icon : Option [String ] = None
26
+ )
27
+
28
+ case class RpmDependencies (
29
+ provides : Seq [String ] = Seq .empty,
30
+ requirements : Seq [String ] = Seq .empty,
31
+ prereq : Seq [String ] = Seq .empty,
32
+ obsoletes : Seq [String ] = Seq .empty,
33
+ conflicts : Seq [String ] = Seq .empty) {
34
+ def contents : String = {
35
+ val sb = new StringBuilder
36
+ def appendSetting (prefix : String , values : Seq [String ]) =
37
+ values foreach (v => sb append (prefix + v + " \n " ))
38
+ appendSetting(" Provides: " , provides)
39
+ appendSetting(" Requires: " , requirements)
40
+ appendSetting(" PreReq: " , prereq)
41
+ appendSetting(" Obsoletes: " , obsoletes)
42
+ appendSetting(" Conflicts: " , conflicts)
43
+ sb.toString
44
+ }
45
+ }
46
+
47
+ case class RpmSpec (meta : RpmMetadata ,
48
+ desc : RpmDescription = RpmDescription (),
49
+ deps : RpmDependencies = RpmDependencies (),
50
+ mappings : Seq [LinuxPackageMapping ] = Seq .empty) {
51
+
52
+ private [this ] def makeFilesLine (target : String , meta : LinuxFileMetaData , isDir : Boolean ): String = {
53
+ val sb = new StringBuilder
54
+ meta.config.toLowerCase match {
55
+ case " false" => ()
56
+ case " true" => sb append " %config "
57
+ case x => sb append (" %config(" + x+ " ) " )
58
+ }
59
+ if (meta.docs) sb append " %doc "
60
+ if (isDir) sb append " %dir "
61
+ // TODO - map dirs...
62
+ sb append " %attr("
63
+ sb append meta.permissions
64
+ sb append ','
65
+ sb append meta.user
66
+ sb append ','
67
+ sb append meta.group
68
+ sb append " ) "
69
+ sb append target
70
+ sb append '\n '
71
+ sb.toString
72
+ }
73
+
74
+ private [this ] def fileSection : String = {
75
+ val sb = new StringBuilder
76
+ sb append " \n %files\n "
77
+ // TODO - default attribute string.
78
+ for {
79
+ mapping <- mappings
80
+ (file, dest) <- mapping.mappings
81
+ } sb append makeFilesLine(dest, mapping.fileData, file.isDirectory)
82
+ sb.toString
83
+ }
84
+
85
+ private [this ] def installSection (root : File ): String = {
86
+ val sb = new StringBuilder
87
+ sb append " \n "
88
+ sb append " %install\n "
89
+ sb append " if [ -e $RPM_BUILD_ROOT ]; "
90
+ sb append " then\n "
91
+ sb append " mv "
92
+ sb append root.getAbsolutePath
93
+ sb append " /* $RPM_BUILD_ROOT\n "
94
+ sb append " else\n "
95
+ sb append " mv "
96
+ sb append root.getAbsolutePath
97
+ sb append " $RPM_BUILD_ROOT\n "
98
+ sb append " fi\n "
99
+ sb.toString
100
+ }
101
+
102
+ // TODO - This is *very* tied to RPM helper, may belong *in* RpmHelper
103
+ def writeSpec (rpmRoot : File , tmpRoot : File ): String = {
104
+ val sb = new StringBuilder
105
+ sb append (" Name: %s\n " format meta.name)
106
+ sb append (" Version: %s\n " format meta.version)
107
+ sb append (" Release: %s\n " format meta.release)
108
+
109
+ desc.summary foreach { v => sb append (" Summary: %s\n " format v)}
110
+ desc.license foreach { v => sb append (" License: %s\n " format v)}
111
+ desc.distribution foreach { v => sb append (" Distribution: %s\n " format v)}
112
+ // TODO - Icon
113
+
114
+ sb append (" Vendor: %s\n " format meta.vendor)
115
+ desc.url foreach { v => sb append (" URL: %s\n " format v)}
116
+ desc.group foreach { v => sb append (" Group: %s\n " format v)}
117
+ desc.packager foreach { v => sb append (" Packager: %s\n " format v)}
118
+
119
+ sb append deps.contents
120
+
121
+ // TODO - autoprov + autoreq
122
+
123
+ sb append (" BuildRoot: %s\n\n " format rpmRoot.getAbsolutePath)
124
+
125
+ // write build as moving everything into RPM directory.
126
+ sb append installSection(tmpRoot)
127
+ // TODO - Allow symlinks
128
+ // TODO - Allow scriptlets for installation
129
+ // "%prep", "%pretrans", "%pre", "%post", "%preun", "%postun", "%posttrans", "%verifyscript", "%clean"
130
+ // Write file mappings
131
+ sb append fileSection
132
+ // TODO - Write triggers...
133
+ // TODO - Write changelog...
134
+
135
+ sb.toString
136
+ }
137
+ }
0 commit comments