blob: baa2642e755774bed276b4370f54bb4e9c7439dd [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
import (
"fmt"
"os"
"path/filepath"
"fuchsia.googlesource.com/jiri"
"fuchsia.googlesource.com/jiri/cmdline"
)
var cmdInit = &cmdline.Command{
Runner: cmdline.RunnerFunc(runInit),
Name: "init",
Short: "Create a new jiri root",
Long: `
The "init" command creates new jiri "root" - basically a [root]/.jiri_root
directory and template files.
Running "init" in existing jiri [root] is safe.
`,
ArgsName: "[directory]",
ArgsLong: `
If you provide a directory, the command is run inside it. If this directory
does not exists, it will be created.
`,
}
var (
cacheFlag string
sharedFlag bool
)
func init() {
cmdInit.Flags.StringVar(&cacheFlag, "cache", "", "Jiri cache directory")
cmdInit.Flags.BoolVar(&sharedFlag, "shared", false, "Use shared cache, which doesn't commit or push")
}
func runInit(env *cmdline.Env, args []string) error {
if len(args) > 1 {
return fmt.Errorf("wrong number of arguments")
}
var dir string
var err error
if len(args) == 1 {
dir, err = filepath.Abs(args[0])
if err != nil {
return err
}
if _, err := os.Stat(dir); err != nil {
if !os.IsNotExist(err) {
return err
}
if err := os.Mkdir(dir, 0755); err != nil {
return err
}
}
} else {
dir, err = os.Getwd()
if err != nil {
return err
}
}
d := filepath.Join(dir, jiri.RootMetaDir)
if _, err := os.Stat(d); err != nil {
if !os.IsNotExist(err) {
return err
}
if err := os.Mkdir(d, 0755); err != nil {
return err
}
}
if cacheFlag != "" {
cache, err := filepath.Abs(cacheFlag)
if err != nil {
return err
}
if _, err := os.Stat(cache); os.IsNotExist(err) {
if err := os.MkdirAll(cache, 0755); err != nil {
return err
}
}
}
config := jiri.Config{
CachePath: cacheFlag,
}
if cacheFlag != "" {
config.Shared = sharedFlag
}
configPath := filepath.Join(d, jiri.ConfigFile)
if err := config.Write(configPath); err != nil {
return err
}
// TODO(phosek): also create an empty manifest
return nil
}