| // 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 |
| } |