c.RepoTree = &repoTreeService{c} c.Search = &searchService{c} c.Units = &unitsService{c} c.Users = &usersService{c} c.Defs = &defsService{c} c.Markdown = &markdownService{c} c.BaseURL = &url.URL{Scheme: "https", Host: "sourcegraph.com", Path: "/api/"} c.UserAgent = userAgent return c } // Router is used to generate URLs for the Sourcegraph API. var Router = router.NewAPIRouter(nil) // ResetRouter clears and reconstructs the preinitialized API // router. It should be called after setting an router.ExtraConfig // func but only during init time. func ResetRouter() { Router = router.NewAPIRouter(nil) } // URL generates a URL for the given route, route variables, and // querystring options. Unless you explicitly set a Host, Scheme, // and/or Port on Router, the returned URL will contain only path and // querystring components (and will not be an absolute URL). func URL(route string, routeVars map[string]string, opt interface{}) (*url.URL, error) { rt := Router.Get(route) if rt == nil {
// ResetRouter clears and reconstructs the preinitialized API // router. It should be called after setting an router.ExtraConfig // func but only during init time. func ResetRouter() { Router = router.NewAPIRouter(nil) }
func (c *BuildDataListCmd) Execute(args []string) error { if c.URLs && c.Local { return fmt.Errorf("using --urls is incompatible with the build-data -l/--local option because local build data files do not have a URL") } if c.URLs { c.Long = true } dir := c.Args.Dir if dir == "" { dir = "." } bdfs, repoLabel, err := c.getFileSystem() if err != nil { return err } if GlobalOpt.Verbose { log.Printf("Listing build files for %s in dir %q", repoLabel, dir) } // Only used for constructing the URLs for remote build data. var repoRevSpec sourcegraph.RepoRevSpec if !c.Local { cl := NewAPIClientWithAuthIfPresent() rrepo, err := getRemoteRepo(cl) if err != nil { return err } repoRevSpec.RepoSpec = rrepo.RepoSpec() lrepo, err := openLocalRepo() if err != nil { return err } repoRevSpec.Rev = lrepo.CommitID repoRevSpec.CommitID = lrepo.CommitID } printFile := func(fi os.FileInfo) { if c.Type == "f" && !fi.Mode().IsRegular() { return } if c.Type == "d" && !fi.Mode().IsDir() { return } var suffix string if fi.IsDir() { suffix = string(filepath.Separator) } var urlStr string if c.URLs { spec := sourcegraph.BuildDataFileSpec{RepoRev: repoRevSpec, Path: filepath.Join(dir, fi.Name())} // TODO(sqs): use sourcegraph.Router when it is merged to go-sourcegraph master u, err := router.NewAPIRouter(nil).Get(router.RepoBuildDataEntry).URLPath(router.MapToArray(spec.RouteVars())...) if err != nil { log.Fatal(err) } // Strip leading "/" so that the URL is relative to the // endpoint URL even if the endpoint URL contains a path. urlStr = getEndpointURL().ResolveReference(&url.URL{Path: u.Path[1:]}).String() } if c.Long { var timeStr string if !fi.ModTime().IsZero() { timeStr = fi.ModTime().Format("Jan _2 15:04") } fmt.Printf("% 7d %12s %s%s %s\n", fi.Size(), timeStr, fi.Name(), suffix, urlStr) } else { fmt.Println(fi.Name() + suffix) } } var fis []os.FileInfo if c.Recursive { w := fs.WalkFS(dir, rwvfs.Walkable(bdfs)) for w.Step() { if err := w.Err(); err != nil { return err } printFile(treeFileInfo{w.Path(), w.Stat()}) } } else { fis, err = bdfs.ReadDir(dir) if err != nil { return err } for _, fi := range fis { printFile(fi) } } return nil }