func Search(ctx *middleware.Context) { q := ctx.Query("q") if ctx.Query("auto_redirect") == "true" && (base.IsGoRepoPath(q) || base.IsGAERepoPath(q) || base.IsValidRemotePath(q)) { ctx.Redirect("/" + q) return } var ( results []*models.PkgInfo err error ) switch q { case "gorepos": results, err = models.GetGoRepos() case "gosubrepos": results, err = models.GetGoSubepos() case "gaesdk": results, err = models.GetGAERepos() default: results, err = models.SearchPkgInfo(100, q) } if err != nil { ctx.Flash.Error(err.Error(), true) } else { ctx.Data["Results"] = results } ctx.Data["Keyword"] = q ctx.HTML(200, SEARCH) }
func updatePkgRef(pid int64, refPath string) error { if base.IsGoRepoPath(refPath) || refPath == "C" || refPath[1] == '.' { return nil } ref := new(PkgRef) has, err := x.Where("import_path=?", refPath).Get(ref) if err != nil { return fmt.Errorf("get PkgRef: %v", err) } queryStr := "$" + com.ToStr(pid) + "|" if !has { if _, err = x.Insert(&PkgRef{ ImportPath: refPath, RefNum: 1, RefIDs: queryStr, }); err != nil { return fmt.Errorf("insert PkgRef: %v", err) } return nil } i := strings.Index(ref.RefIDs, queryStr) if i > -1 { return nil } ref.RefIDs += queryStr ref.RefNum++ _, err = x.Id(ref.ID).AllCols().Update(ref) return err }
func crawlDoc(importPath, etag string) (pdoc *Package, err error) { switch { case base.IsGoRepoPath(importPath): pdoc, err = getGolangDoc(importPath, etag) case base.IsValidRemotePath(importPath): pdoc, err = getStatic(importPath, etag) if err == ErrNoServiceMatch { pdoc, err = getDynamic(importPath, etag) } default: err = ErrInvalidRemotePath } if err != nil { return nil, err } // Render README. for name, content := range pdoc.Readme { p, err := httplib.Post("https://api.github.com/markdown/raw?"+setting.GitHubCredentials). Header("Content-Type", "text/plain").Body(content).Bytes() if err != nil { return nil, fmt.Errorf("error rendering README: %v", err) } pdoc.Readme[name] = p } return pdoc, nil }
func Search(ctx *middleware.Context) { q := ctx.Query("q") if ctx.Query("auto_redirect") == "true" && (base.IsGoRepoPath(q) || base.IsValidRemotePath(q)) { ctx.Redirect("/" + q) return } results, err := models.SearchPkgInfo(100, q) if err != nil { ctx.Flash.Error(err.Error(), true) } else { ctx.Data["Results"] = results } ctx.Data["Keyword"] = q ctx.HTML(200, SEARCH) }
// SavePkgInfo saves package information. func SavePkgInfo(pinfo *PkgInfo, updateRefs bool) (err error) { if len(pinfo.Synopsis) > 255 { pinfo.Synopsis = pinfo.Synopsis[:255] } pinfo.PkgVer = PACKAGE_VER switch { case pinfo.IsGaeRepo: pinfo.Priority = 70 case pinfo.IsGoSubrepo: pinfo.Priority = 80 case pinfo.IsGoRepo: pinfo.Priority = 99 } // When package is not created, there is no ID so check will certainly fail. var ignoreCheckRefs bool // Create or update package info itself. // Note(Unknwon): do this because we need ID field later. if pinfo.ID == 0 { ignoreCheckRefs = true pinfo.Views = 1 // First time created, check PkgRef. ref := new(PkgRef) has, err := x.Where("import_path=?", pinfo.ImportPath).Get(ref) if err != nil { return fmt.Errorf("get PkgRef: %v", err) } else if has { pinfo.RefNum = ref.RefNum pinfo.RefIDs = ref.RefIDs if _, err = x.Id(ref.ID).Delete(ref); err != nil { return fmt.Errorf("delete PkgRef: %v", err) } } _, err = x.Insert(pinfo) } else { _, err = x.Id(pinfo.ID).AllCols().Update(pinfo) } if err != nil { return fmt.Errorf("update package info: %v", err) } // Update package import references. // Note(Unknwon): I just don't see the value of who imports STD // when you don't even import and uses what objects. if updateRefs && !pinfo.IsGoRepo { var buf bytes.Buffer paths := strings.Split(pinfo.ImportPaths, "|") for i := range paths { if base.IsGoRepoPath(paths[i]) { continue } refID, err := updateRef(pinfo.ID, paths[i]) if err != nil { return fmt.Errorf("updateRef: %v", err) } else if refID == 0 { continue } buf.WriteString("$") buf.WriteString(com.ToStr(refID)) buf.WriteString("|") } pinfo.ImportIDs = buf.String() if !ignoreCheckRefs { // Check packages who import this is still importing. checkRefs(pinfo) } _, err = x.Id(pinfo.ID).AllCols().Update(pinfo) return err } return nil }