github.com/hwaf/hwaf@v0.0.0-20140814122253-5465f73b20f1/cmd_pkg_create.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "os" 6 "os/user" 7 "path/filepath" 8 "strings" 9 "text/template" 10 11 "github.com/gonuts/commander" 12 "github.com/gonuts/flag" 13 ) 14 15 func hwaf_make_cmd_pkg_create() *commander.Command { 16 cmd := &commander.Command{ 17 Run: hwaf_run_cmd_pkg_create, 18 UsageLine: "create [options] <pkg-full-path>", 19 Short: "create a new package in the current workarea", 20 Long: ` 21 create creates a new package in the current workarea. 22 23 ex: 24 $ hwaf pkg create MyPath/MyPackage 25 $ hwaf pkg create -script=yml MyPath/MyPackage 26 $ hwaf pkg create -script=py MyPath/MyPackage 27 `, 28 Flag: *flag.NewFlagSet("hwaf-pkg-create", flag.ExitOnError), 29 } 30 cmd.Flag.Bool("v", false, "enable verbose output") 31 cmd.Flag.String("script", "yml", "type of the hwaf script to use (yml|py)") 32 cmd.Flag.String("authors", "", "comma-separated list of authors for the new package") 33 return cmd 34 } 35 36 func hwaf_run_cmd_pkg_create(cmd *commander.Command, args []string) error { 37 var err error 38 n := "hwaf-pkg-" + cmd.Name() 39 pkgpath := "" 40 switch len(args) { 41 case 1: 42 pkgpath = args[0] 43 default: 44 return fmt.Errorf("%s: you need to give a package (full) path", n) 45 } 46 47 script := cmd.Flag.Lookup("script").Value.Get().(string) 48 switch script { 49 case "yml", "py": 50 // ok 51 default: 52 return fmt.Errorf("%s: script type is either 'yml' or 'py' (got: %q)", n, script) 53 } 54 55 verbose := cmd.Flag.Lookup("v").Value.Get().(bool) 56 authors := func() []string { 57 authors := cmd.Flag.Lookup("authors").Value.Get().(string) 58 out := make([]string, 0, 1) 59 for _, s := range strings.Split(authors, ",") { 60 s = strings.Trim(s, " ") 61 if s == "" { 62 continue 63 } 64 out = append(out, s) 65 } 66 return out 67 }() 68 69 if len(authors) == 0 { 70 usr, err := user.Current() 71 if err != nil { 72 return err 73 } 74 //fmt.Printf(">>>>> %v\n", usr) 75 usrname := usr.Name 76 if usrname == "" { 77 usrname = usr.Username 78 } 79 authors = []string{usrname} 80 } 81 82 if verbose { 83 fmt.Printf("%s: create package [%s]...\n", n, pkgpath) 84 } 85 86 cfg, err := g_ctx.LocalCfg() 87 if err != nil { 88 return err 89 } 90 91 pkgdir := "src" 92 if cfg.HasOption("hwaf-cfg", "pkgdir") { 93 pkgdir, err = cfg.String("hwaf-cfg", "pkgdir") 94 if err != nil { 95 return err 96 } 97 } 98 99 dir := filepath.Join(pkgdir, pkgpath) 100 if path_exists(dir) { 101 err = fmt.Errorf("%s: directory [%s] already exists on filesystem", n, dir) 102 if err != nil { 103 return err 104 } 105 } 106 107 err = os.MkdirAll(dir, 0755) 108 if err != nil { 109 return err 110 } 111 112 if g_ctx.PkgDb.HasPkg(dir) { 113 return fmt.Errorf("%s: a package with name [%s] already exists", n, dir) 114 } 115 116 pkgname := filepath.Base(pkgpath) 117 118 const w_txt = `# -*- python -*- 119 # automatically generated wscript 120 121 import waflib.Logs as msg 122 123 PACKAGE = { 124 'name': '{{.FullName}}', 125 'author': [{{.Authors | printlst }}], 126 } 127 128 def pkg_deps(ctx): 129 # put your package dependencies here. 130 # e.g.: 131 # ctx.use_pkg('AtlasPolicy') 132 return 133 134 def configure(ctx): 135 msg.debug('[configure] package name: '+PACKAGE['name']) 136 return 137 138 def build(ctx): 139 # build artifacts 140 # e.g.: 141 # ctx( 142 # features = 'atlas_component', 143 # name = '{{.Name}}', 144 # source = 'src/*.cxx src/components/*.cxx', 145 # use = ['lib1', 'lib2', 'ROOT', 'boost', ...], 146 # ) 147 # ctx( 148 # features = 'atlas_install_headers', 149 # name = '{{.Name}}-install-headers', 150 # ) 151 # ctx( 152 # features = 'atlas_install_python_modules', 153 # name = '{{.Name}}-install-py-modules', 154 # ) 155 # ctx( 156 # features = 'atlas_install_joboptions', 157 # name = '{{.Name}}-install-jobos', 158 # ) 159 return 160 ` 161 162 const h_txt = `# -*- yaml -*- 163 # automatically generated hscript 164 165 package: { 166 name: "{{.FullName}}", 167 authors: [{{.Authors | printlst}}], 168 169 ## dependencies of this package 170 deps: { 171 public: [ 172 ], 173 174 private: [ 175 ], 176 177 # specify runtime dependencies 178 # e.g: python modules for scripts installed by this package 179 # binaries used by scripts installed by this package 180 runtime: [ 181 ], 182 }, 183 } 184 185 options: {} 186 configure: {} 187 188 build: { 189 # build artifacts 190 # e.g.: 191 # {{.Name}}: { 192 # features: "atlas_component", 193 # source: "src/*.cxx src/components/*.cxx", 194 # use: ["lib1", "lib2", "ROOT", "boost", ...], 195 # } 196 } 197 198 ## EOF ## 199 ` 200 txt := h_txt 201 fname := "hscript.yml" 202 203 switch script { 204 case "yml": 205 txt = h_txt 206 fname = "hscript.yml" 207 case "py": 208 txt = w_txt 209 fname = "hscript.py" 210 } 211 212 // create generic structure... 213 for _, d := range []string{ 214 //"cmt", 215 pkgname, 216 "src", 217 } { 218 err = os.MkdirAll(filepath.Join(dir, d), 0755) 219 if err != nil { 220 return err 221 } 222 } 223 224 wscript, err := os.Create(filepath.Join(dir, fname)) 225 if err != nil { 226 return err 227 } 228 defer func(err *error) { 229 *err = wscript.Sync() 230 if *err != nil { 231 return 232 } 233 *err = wscript.Close() 234 }(&err) 235 236 /* fill the template */ 237 pkg := struct { 238 FullName string 239 Name string 240 Authors []string 241 }{ 242 FullName: pkgpath, 243 Name: pkgname, 244 Authors: authors, 245 } 246 tmpl := template.New(script).Funcs(template.FuncMap{ 247 "printlst": func(lst []string) string { 248 out := []string{} 249 for idx, s := range lst { 250 s = strings.Trim(s, " ") 251 if s == "" { 252 continue 253 } 254 comma := "," 255 if idx+1 == len(lst) { 256 comma = "" 257 } 258 out = append(out, fmt.Sprintf("%q%s", s, comma)) 259 } 260 return strings.Join(out, " ") 261 }, 262 }) 263 tmpl, err = tmpl.Parse(txt) 264 if err != nil { 265 return err 266 } 267 err = tmpl.Execute(wscript, &pkg) 268 if err != nil { 269 return err 270 } 271 272 err = g_ctx.PkgDb.Add("local", "", pkgdir, dir) 273 if err != nil { 274 return err 275 } 276 277 if verbose { 278 fmt.Printf("%s: create package [%s]... [ok]\n", n, pkgpath) 279 } 280 281 return err 282 } 283 284 // EOF