func ParseFlags()

in internal/mode/webserver/webserver.go [119:199]


func ParseFlags() (*Options, error) {
	logDir := flag.String("log_dir", "", "log to this directory rather than stderr.")
	logRefresh := flag.Duration("log_refresh", 24*time.Hour, "if using --log_dir, start writing a new file this often.")
	listen := flag.String("listen", ":6070", "listen on this address.")
	indexDirFlag := flag.String("index", "", "set index directory to use (DEPRECATED: use -index_dir instead)")
	indexDirAliasFlag := flag.String("index_dir", "", "set index directory to use")
	html := flag.Bool("html", true, "enable HTML interface")
	enableRPC := flag.Bool("rpc", true, "enable go/net RPC")
	enableIndexserverProxy := flag.Bool("indexserver_proxy", false, "proxy requests with URLs matching the path /indexserver/ to <index>/indexserver.sock")
	enableLocalURLs := flag.Bool("print", false, "enable local result URLs")
	enablePprof := flag.Bool("pprof", false, "set to enable remote profiling.")
	hostCustomization := flag.String(
		"host_customization", "",
		"specify host customization, as HOST1=QUERY,HOST2=QUERY")
	templateDir := flag.String("template_dir", "", "set directory from which to load custom .html.tpl template files")
	dumpTemplates := flag.Bool("dump_templates", false, "dump templates into --template_dir and exit.")
	versionFlag := flag.Bool("version", false, "Print the version and exit")
	secretFilePath := flag.String("secret_path", "", "gitlab shared secret file path")

	flag.Parse()

	if *versionFlag {
		// Version flag will be handled by the Run function
		return &Options{
			PrintVersion: true,
		}, nil
	}

	if flag.NArg() == 0 && flag.NFlag() == 0 && len(os.Args) <= 2 {
		// If no arguments are provided, just return the help text
		flag.Usage()
		return nil, fmt.Errorf("help requested")
	}

	if *dumpTemplates {
		if *templateDir == "" {
			return nil, fmt.Errorf("must set --template_dir")
		}
		if err := writeTemplates(*templateDir); err != nil {
			return nil, err
		}
		// This is a special case where we want to exit early
		return nil, fmt.Errorf("dump_templates completed, exiting")
	}

	if *logDir != "" {
		if fi, err := os.Lstat(*logDir); err != nil || !fi.IsDir() {
			return nil, fmt.Errorf("%s is not a directory", *logDir)
		}
	}

	indexDir := *indexDirFlag
	if *indexDirAliasFlag != "" {
		indexDir = *indexDirAliasFlag
	} else if *indexDirFlag != "" {
		// Log deprecation warning only if user explicitly used -index
		slog.Warn("The -index flag is deprecated, please use -index_dir instead")
	}

	if err := os.MkdirAll(indexDir, 0o755); err != nil { // nolint:gosec
		return nil, err
	}

	if *secretFilePath != "" {
		slog.Info("secret_path provided. Doing nothing with it for now", "secret_path", *secretFilePath)
	}

	return &Options{
		LogDir:                 *logDir,
		LogRefresh:             *logRefresh,
		Listen:                 *listen,
		IndexDir:               indexDir,
		HTML:                   *html,
		EnableRPC:              *enableRPC,
		EnableIndexserverProxy: *enableIndexserverProxy,
		EnableLocalURLs:        *enableLocalURLs,
		EnablePprof:            *enablePprof,
		HostCustomization:      *hostCustomization,
		TemplateDir:            *templateDir,
	}, nil
}