| // Copyright 2017 The Go 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 base |
| |
| import ( |
| "flag" |
| |
| "cmd/go/internal/cfg" |
| "cmd/go/internal/fsys" |
| "cmd/internal/str" |
| ) |
| |
| // A StringsFlag is a command-line flag that interprets its argument |
| // as a space-separated list of possibly-quoted strings. |
| type StringsFlag []string |
| |
| func (v *StringsFlag) Set(s string) error { |
| var err error |
| *v, err = str.SplitQuotedFields(s) |
| if *v == nil { |
| *v = []string{} |
| } |
| return err |
| } |
| |
| func (v *StringsFlag) String() string { |
| return "<StringsFlag>" |
| } |
| |
| // explicitStringFlag is like a regular string flag, but it also tracks whether |
| // the string was set explicitly to a non-empty value. |
| type explicitStringFlag struct { |
| value *string |
| explicit *bool |
| } |
| |
| func (f explicitStringFlag) String() string { |
| if f.value == nil { |
| return "" |
| } |
| return *f.value |
| } |
| |
| func (f explicitStringFlag) Set(v string) error { |
| *f.value = v |
| if v != "" { |
| *f.explicit = true |
| } |
| return nil |
| } |
| |
| // AddBuildFlagsNX adds the -n and -x build flags to the flag set. |
| func AddBuildFlagsNX(flags *flag.FlagSet) { |
| flags.BoolVar(&cfg.BuildN, "n", false, "") |
| flags.BoolVar(&cfg.BuildX, "x", false, "") |
| } |
| |
| // AddModFlag adds the -mod build flag to the flag set. |
| func AddModFlag(flags *flag.FlagSet) { |
| flags.Var(explicitStringFlag{value: &cfg.BuildMod, explicit: &cfg.BuildModExplicit}, "mod", "") |
| } |
| |
| // AddWorkfileFlag adds the workfile flag to the flag set. It enables workspace |
| // mode for commands that support it by resetting the cfg.WorkFile variable |
| // to "" (equivalent to auto) rather than off. |
| func AddWorkfileFlag(flags *flag.FlagSet) { |
| flags.Var(explicitStringFlag{value: &cfg.WorkFile, explicit: &cfg.WorkFileExplicit}, "workfile", "") |
| } |
| |
| // AddModCommonFlags adds the module-related flags common to build commands |
| // and 'go mod' subcommands. |
| func AddModCommonFlags(flags *flag.FlagSet) { |
| flags.BoolVar(&cfg.ModCacheRW, "modcacherw", false, "") |
| flags.StringVar(&cfg.ModFile, "modfile", "", "") |
| flags.StringVar(&fsys.OverlayFile, "overlay", "", "") |
| } |