| 21 | } |
| 22 | |
| 23 | func link() error { |
| 24 | fs := flag.NewFlagSet("link", flag.ExitOnError) |
| 25 | name := fs.String("n", "", "name to link app as") |
| 26 | |
| 27 | err := fs.Parse(flag.Args()[1:]) |
| 28 | if err != nil { |
| 29 | return err |
| 30 | } |
| 31 | |
| 32 | var dir string |
| 33 | |
| 34 | if fs.NArg() == 0 { |
| 35 | dir, err = os.Getwd() |
| 36 | if err != nil { |
| 37 | return err |
| 38 | } |
| 39 | |
| 40 | } else { |
| 41 | dir, err = filepath.Abs(fs.Arg(0)) |
| 42 | if err != nil { |
| 43 | return err |
| 44 | } |
| 45 | |
| 46 | stat, err := os.Stat(dir) |
| 47 | if err != nil { |
| 48 | if os.IsNotExist(err) { |
| 49 | return fmt.Errorf("invalid directory: %s", dir) |
| 50 | } |
| 51 | |
| 52 | return err |
| 53 | } |
| 54 | |
| 55 | if !stat.IsDir() { |
| 56 | return fmt.Errorf("invalid directory: %s", dir) |
| 57 | } |
| 58 | } |
| 59 | |
| 60 | if *name == "" { |
| 61 | *name = strings.Replace(filepath.Base(dir), ".", "_", -1) |
| 62 | } |
| 63 | |
| 64 | dest, err := homedir.Expand(filepath.Join(*fDir, *name)) |
| 65 | if err != nil { |
| 66 | return err |
| 67 | } |
| 68 | |
| 69 | _, err = os.Stat(dest) |
| 70 | if err == nil { |
| 71 | dest, err := os.Readlink(dest) |
| 72 | if err == nil { |
| 73 | fmt.Printf("! App '%s' already exists, pointed at '%s'\n", *name, dest) |
| 74 | } else { |
| 75 | fmt.Printf("! App '%s' already exists'\n", *name) |
| 76 | } |
| 77 | return nil |
| 78 | } |
| 79 | |
| 80 | err = os.Symlink(dir, dest) |