in cmd/gazelle/fix-update.go [88:195]
func (ucr *updateConfigurer) CheckFlags(fs *flag.FlagSet, c *config.Config) error {
uc := getUpdateConfig(c)
var ok bool
uc.emit, ok = modeFromName[ucr.mode]
if !ok {
return fmt.Errorf("unrecognized emit mode: %q", ucr.mode)
}
if uc.patchPath != "" && ucr.mode != "diff" {
return fmt.Errorf("-patch set but -mode is %s, not diff", ucr.mode)
}
if uc.patchPath != "" && !filepath.IsAbs(uc.patchPath) {
uc.patchPath = filepath.Join(c.WorkDir, uc.patchPath)
}
dirs := fs.Args()
if len(dirs) == 0 {
dirs = []string{"."}
}
uc.dirs = make([]string, len(dirs))
for i, arg := range dirs {
dir := arg
if !filepath.IsAbs(dir) {
dir = filepath.Join(c.WorkDir, dir)
}
dir, err := filepath.EvalSymlinks(dir)
if err != nil {
return fmt.Errorf("%s: failed to resolve symlinks: %v", arg, err)
}
if !isDescendingDir(dir, c.RepoRoot) {
return fmt.Errorf("%s: not a subdirectory of repo root %s", arg, c.RepoRoot)
}
uc.dirs[i] = dir
}
if ucr.recursive && c.IndexLibraries {
uc.walkMode = walk.VisitAllUpdateSubdirsMode
} else if c.IndexLibraries {
uc.walkMode = walk.VisitAllUpdateDirsMode
} else if ucr.recursive {
uc.walkMode = walk.UpdateSubdirsMode
} else {
uc.walkMode = walk.UpdateDirsMode
}
// Load the repo configuration file (WORKSPACE by default) to find out
// names and prefixes of other go_repositories. This affects external
// dependency resolution for Go.
// TODO(jayconrod): Go-specific code should be moved to language/go.
if ucr.repoConfigPath == "" {
ucr.repoConfigPath = wspace.FindWORKSPACEFile(c.RepoRoot)
}
repoConfigFile, err := rule.LoadWorkspaceFile(ucr.repoConfigPath, "")
if err != nil && !os.IsNotExist(err) {
return err
} else if err == nil {
c.Repos, _, err = repo.ListRepositories(repoConfigFile)
if err != nil {
return err
}
}
for _, imp := range ucr.knownImports {
uc.repos = append(uc.repos, repo.Repo{
Name: label.ImportPathToBazelRepoName(imp),
GoPrefix: imp,
})
}
for _, r := range c.Repos {
if r.Kind() == "go_repository" {
uc.repos = append(uc.repos, repo.Repo{
Name: r.Name(),
GoPrefix: r.AttrString("importpath"),
})
}
}
// If the repo configuration file is not WORKSPACE, also load WORKSPACE
// and any declared macro files so we can apply fixes.
workspacePath := wspace.FindWORKSPACEFile(c.RepoRoot)
var workspace *rule.File
if ucr.repoConfigPath == workspacePath {
workspace = repoConfigFile
} else {
workspace, err = rule.LoadWorkspaceFile(workspacePath, "")
if err != nil && !os.IsNotExist(err) {
return err
}
}
if workspace != nil {
c.RepoName = findWorkspaceName(workspace)
_, repoFileMap, err := repo.ListRepositories(workspace)
if err != nil {
return err
}
seen := make(map[*rule.File]bool)
for _, f := range repoFileMap {
if !seen[f] {
uc.workspaceFiles = append(uc.workspaceFiles, f)
seen[f] = true
}
}
sort.Slice(uc.workspaceFiles, func(i, j int) bool {
return uc.workspaceFiles[i].Path < uc.workspaceFiles[j].Path
})
}
return nil
}