**/{Contents/Home,Home,}bin/java -> /Contents/Home/bin/java
(dir string, goos string)
| 251 | |
| 252 | // **/{Contents/Home,Home,}bin/java -> <dir>/Contents/Home/bin/java |
| 253 | func normalizePathToBinJava(dir string, goos string) error { |
| 254 | dir = filepath.Clean(dir) |
| 255 | if _, err := os.Stat(expectedJavaPath(dir, goos)); os.IsNotExist(err) { |
| 256 | java := "java" |
| 257 | if goos == "windows" { |
| 258 | java = "java.exe" |
| 259 | } |
| 260 | var javaPath string |
| 261 | for it := fileiter.New(dir, fileiter.BreadthFirst()); it.Next(); { |
| 262 | if err := it.Err(); err != nil { |
| 263 | return err |
| 264 | } |
| 265 | if !it.IsDir() && filepath.Base(it.Dir()) == "bin" && it.Name() == java { |
| 266 | javaPath = filepath.Join(it.Dir(), it.Name()) |
| 267 | break |
| 268 | } |
| 269 | } |
| 270 | if javaPath != "" { |
| 271 | log.Debugf("Found %s", javaPath) |
| 272 | tmp := dir + "~" |
| 273 | javaPath = strings.Replace(javaPath, dir, tmp, 1) |
| 274 | log.Debugf("Moving %s to %s", dir, tmp) |
| 275 | if err := os.Rename(dir, tmp); err != nil { |
| 276 | return err |
| 277 | } |
| 278 | defer func() { |
| 279 | log.Debugf("Removing %s", tmp) |
| 280 | os.RemoveAll(tmp) |
| 281 | }() |
| 282 | homeDir := filepath.Dir(filepath.Dir(javaPath)) |
| 283 | var src, dst string |
| 284 | if goos == "darwin" { |
| 285 | if filepath.Base(homeDir) == "Home" { |
| 286 | src = filepath.Dir(homeDir) |
| 287 | dst = filepath.Join(dir, "Contents") |
| 288 | } else { |
| 289 | src = homeDir |
| 290 | dst = filepath.Join(dir, "Contents", "Home") |
| 291 | } |
| 292 | } else { |
| 293 | src = homeDir |
| 294 | dst = dir |
| 295 | } |
| 296 | log.Debugf("Moving %s to %s", src, dst) |
| 297 | if err := os.MkdirAll(filepath.Dir(dst), 0755); err != nil { |
| 298 | return err |
| 299 | } |
| 300 | if err = os.Rename(src, dst); err != nil { |
| 301 | return err |
| 302 | } |
| 303 | } |
| 304 | return assertJavaDistribution(dir, goos) |
| 305 | } |
| 306 | return nil |
| 307 | } |
| 308 | |
| 309 | func expectedJavaPath(dir string, goos string) string { |
| 310 | var osSpecificSubDir = "" |