How to use LogLink method of vcs Package

Best Syzkaller code snippet using vcs.LogLink

main.go

Source:main.go Github

copy

Full Screen

...151type uiCrash struct {152 Manager string153 Time time.Time154 Maintainers string155 LogLink string156 ReportLink string157 ReproSyzLink string158 ReproCLink string159 *uiBuild160}161type uiCrashTable struct {162 Crashes []*uiCrash163 Caption string164 HasMaintainers bool165}166type uiJob struct {167 Type JobType168 Created time.Time169 BugLink string170 ExternalLink string171 User string172 Reporting string173 Namespace string174 Manager string175 BugTitle string176 BugID string177 KernelAlias string178 KernelCommit string179 PatchLink string180 Attempts int181 Started time.Time182 Finished time.Time183 Duration time.Duration184 CrashTitle string185 CrashLogLink string186 CrashReportLink string187 LogLink string188 ErrorLink string189 Commit *uiCommit // for conclusive bisection190 Commits []*uiCommit // for inconclusive bisection191 Crash *uiCrash192 Reported bool193}194// handleMain serves main page.195func handleMain(c context.Context, w http.ResponseWriter, r *http.Request) error {196 hdr, err := commonHeader(c, r, w, "")197 if err != nil {198 return err199 }200 accessLevel := accessLevel(c, r)201 managers, err := loadManagers(c, accessLevel, hdr.Namespace)202 if err != nil {203 return err204 }205 manager := r.FormValue("manager")206 groups, fixedCount, err := fetchNamespaceBugs(c, accessLevel, hdr.Namespace, manager)207 if err != nil {208 return err209 }210 fixedLink := fmt.Sprintf("/%v/fixed", hdr.Namespace)211 if manager != "" {212 fixedLink = fmt.Sprintf("%v?manager=%v", fixedLink, manager)213 }214 data := &uiMainPage{215 Header: hdr,216 Decommissioned: config.Namespaces[hdr.Namespace].Decommissioned,217 Now: timeNow(c),218 FixedCount: fixedCount,219 FixedLink: fixedLink,220 Groups: groups,221 Managers: managers,222 }223 return serveTemplate(w, "main.html", data)224}225func handleFixed(c context.Context, w http.ResponseWriter, r *http.Request) error {226 return handleTerminalBugList(c, w, r, &TerminalBug{227 Status: BugStatusFixed,228 Subpage: "/fixed",229 Caption: "fixed",230 ShowPatch: true,231 })232}233func handleInvalid(c context.Context, w http.ResponseWriter, r *http.Request) error {234 return handleTerminalBugList(c, w, r, &TerminalBug{235 Status: BugStatusInvalid,236 Subpage: "/invalid",237 Caption: "invalid",238 ShowPatch: false,239 })240}241type TerminalBug struct {242 Status int243 Subpage string244 Caption string245 ShowPatch bool246}247func handleTerminalBugList(c context.Context, w http.ResponseWriter, r *http.Request, typ *TerminalBug) error {248 accessLevel := accessLevel(c, r)249 hdr, err := commonHeader(c, r, w, "")250 if err != nil {251 return err252 }253 hdr.Subpage = typ.Subpage254 manager := r.FormValue("manager")255 bugs, err := fetchTerminalBugs(c, accessLevel, hdr.Namespace, manager, typ)256 if err != nil {257 return err258 }259 data := &uiTerminalPage{260 Header: hdr,261 Now: timeNow(c),262 Bugs: bugs,263 }264 return serveTemplate(w, "terminal.html", data)265}266func handleAdmin(c context.Context, w http.ResponseWriter, r *http.Request) error {267 accessLevel := accessLevel(c, r)268 if accessLevel != AccessAdmin {269 return ErrAccess270 }271 hdr, err := commonHeader(c, r, w, "")272 if err != nil {273 return err274 }275 managers, err := loadManagers(c, accessLevel, "")276 if err != nil {277 return err278 }279 errorLog, err := fetchErrorLogs(c)280 if err != nil {281 return err282 }283 jobs, err := loadRecentJobs(c)284 if err != nil {285 return err286 }287 data := &uiAdminPage{288 Header: hdr,289 Log: errorLog,290 Managers: managers,291 Jobs: &uiJobList{Jobs: jobs},292 }293 return serveTemplate(w, "admin.html", data)294}295// handleBug serves page about a single bug (which is passed in id argument).296func handleBug(c context.Context, w http.ResponseWriter, r *http.Request) error {297 bug, err := findBugByID(c, r)298 if err != nil {299 return ErrDontLog{err}300 }301 accessLevel := accessLevel(c, r)302 if err := checkAccessLevel(c, r, bug.sanitizeAccess(accessLevel)); err != nil {303 return err304 }305 hdr, err := commonHeader(c, r, w, bug.Namespace)306 if err != nil {307 return err308 }309 state, err := loadReportingState(c)310 if err != nil {311 return err312 }313 managers, err := managerList(c, bug.Namespace)314 if err != nil {315 return err316 }317 var dupOf *uiBugGroup318 if bug.DupOf != "" {319 dup := new(Bug)320 if err := db.Get(c, db.NewKey(c, "Bug", bug.DupOf, 0, nil), dup); err != nil {321 return err322 }323 if accessLevel >= dup.sanitizeAccess(accessLevel) {324 dupOf = &uiBugGroup{325 Now: timeNow(c),326 Caption: "Duplicate of",327 Bugs: []*uiBug{createUIBug(c, dup, state, managers)},328 }329 }330 }331 uiBug := createUIBug(c, bug, state, managers)332 crashes, sampleReport, err := loadCrashesForBug(c, bug)333 if err != nil {334 return err335 }336 crashesTable := &uiCrashTable{337 Crashes: crashes,338 Caption: fmt.Sprintf("Crashes (%d)", bug.NumCrashes),339 }340 for _, crash := range crashesTable.Crashes {341 if len(crash.Maintainers) != 0 {342 crashesTable.HasMaintainers = true343 break344 }345 }346 dups, err := loadDupsForBug(c, r, bug, state, managers)347 if err != nil {348 return err349 }350 similar, err := loadSimilarBugs(c, r, bug, state)351 if err != nil {352 return err353 }354 var bisectCause *uiJob355 if bug.BisectCause > BisectPending {356 bisectCause, err = getUIJob(c, bug, JobBisectCause)357 if err != nil {358 return err359 }360 }361 var bisectFix *uiJob362 if bug.BisectFix > BisectPending {363 bisectFix, err = getUIJob(c, bug, JobBisectFix)364 if err != nil {365 return err366 }367 }368 testPatchJobs, err := loadTestPatchJobs(c, bug)369 if err != nil {370 return err371 }372 data := &uiBugPage{373 Header: hdr,374 Now: timeNow(c),375 Bug: uiBug,376 BisectCause: bisectCause,377 BisectFix: bisectFix,378 DupOf: dupOf,379 Dups: dups,380 Similar: similar,381 SampleReport: sampleReport,382 Crashes: crashesTable,383 TestPatchJobs: &uiJobList{384 PerBug: true,385 Jobs: testPatchJobs,386 },387 }388 // bug.BisectFix is set to BisectNot in two cases :389 // - no fix bisections have been performed on the bug390 // - fix bisection was performed but resulted in a crash on HEAD391 if bug.BisectFix == BisectNot {392 fixBisections, err := loadFixBisectionsForBug(c, bug)393 if err != nil {394 return err395 }396 if len(fixBisections) != 0 {397 data.FixBisections = &uiCrashTable{398 Crashes: fixBisections,399 Caption: "Fix bisection attempts",400 }401 }402 }403 return serveTemplate(w, "bug.html", data)404}405func findBugByID(c context.Context, r *http.Request) (*Bug, error) {406 if id := r.FormValue("id"); id != "" {407 bug := new(Bug)408 bugKey := db.NewKey(c, "Bug", id, 0, nil)409 err := db.Get(c, bugKey, bug)410 return bug, err411 }412 if extID := r.FormValue("extid"); extID != "" {413 bug, _, err := findBugByReportingID(c, extID)414 return bug, err415 }416 return nil, fmt.Errorf("mandatory parameter id/extid is missing")417}418func getUIJob(c context.Context, bug *Bug, jobType JobType) (*uiJob, error) {419 job, crash, jobKey, _, err := loadBisectJob(c, bug, jobType)420 if err != nil {421 return nil, err422 }423 build, err := loadBuild(c, bug.Namespace, crash.BuildID)424 if err != nil {425 return nil, err426 }427 return makeUIJob(job, jobKey, bug, crash, build), nil428}429// handleText serves plain text blobs (crash logs, reports, reproducers, etc).430func handleTextImpl(c context.Context, w http.ResponseWriter, r *http.Request, tag string) error {431 var id int64432 if x := r.FormValue("x"); x != "" {433 xid, err := strconv.ParseUint(x, 16, 64)434 if err != nil || xid == 0 {435 return ErrDontLog{fmt.Errorf("failed to parse text id: %v", err)}436 }437 id = int64(xid)438 } else {439 // Old link support, don't remove.440 xid, err := strconv.ParseInt(r.FormValue("id"), 10, 64)441 if err != nil || xid == 0 {442 return ErrDontLog{fmt.Errorf("failed to parse text id: %v", err)}443 }444 id = xid445 }446 bug, crash, err := checkTextAccess(c, r, tag, id)447 if err != nil {448 return err449 }450 data, ns, err := getText(c, tag, id)451 if err != nil {452 if strings.Contains(err.Error(), "datastore: no such entity") {453 err = ErrDontLog{err}454 }455 return err456 }457 if err := checkAccessLevel(c, r, config.Namespaces[ns].AccessLevel); err != nil {458 return err459 }460 w.Header().Set("Content-Type", "text/plain; charset=utf-8")461 // Unfortunately filename does not work in chrome on linux due to:462 // https://bugs.chromium.org/p/chromium/issues/detail?id=608342463 w.Header().Set("Content-Disposition", "inline; filename="+textFilename(tag))464 augmentRepro(c, w, tag, bug, crash)465 w.Write(data)466 return nil467}468func augmentRepro(c context.Context, w http.ResponseWriter, tag string, bug *Bug, crash *Crash) {469 if tag == textReproSyz || tag == textReproC {470 // Users asked for the bug link in reproducers (in case you only saved the repro link).471 if bug != nil {472 prefix := "#"473 if tag == textReproC {474 prefix = "//"475 }476 fmt.Fprintf(w, "%v %v/bug?id=%v\n", prefix, appURL(c), bug.keyHash())477 }478 }479 if tag == textReproSyz {480 // Add link to documentation and repro opts for syzkaller reproducers.481 w.Write([]byte(syzReproPrefix))482 if crash != nil {483 fmt.Fprintf(w, "#%s\n", crash.ReproOpts)484 }485 }486}487func handleText(c context.Context, w http.ResponseWriter, r *http.Request) error {488 return handleTextImpl(c, w, r, r.FormValue("tag"))489}490func handleTextX(tag string) contextHandler {491 return func(c context.Context, w http.ResponseWriter, r *http.Request) error {492 return handleTextImpl(c, w, r, tag)493 }494}495func textFilename(tag string) string {496 switch tag {497 case textKernelConfig:498 return ".config"499 case textCrashLog:500 return "log.txt"501 case textCrashReport:502 return "report.txt"503 case textReproSyz:504 return "repro.syz"505 case textReproC:506 return "repro.c"507 case textPatch:508 return "patch.diff"509 case textLog:510 return "bisect.txt"511 case textError:512 return "error.txt"513 default:514 return "text.txt"515 }516}517func fetchNamespaceBugs(c context.Context, accessLevel AccessLevel,518 ns, manager string) ([]*uiBugGroup, int, error) {519 filter := func(query *db.Query) *db.Query {520 query = query.Filter("Namespace=", ns)521 if manager != "" {522 query = query.Filter("HappenedOn=", manager)523 }524 return query525 }526 bugs, _, err := loadAllBugs(c, filter)527 if err != nil {528 return nil, 0, err529 }530 state, err := loadReportingState(c)531 if err != nil {532 return nil, 0, err533 }534 managers, err := managerList(c, ns)535 if err != nil {536 return nil, 0, err537 }538 fixedCount := 0539 groups := make(map[int][]*uiBug)540 bugMap := make(map[string]*uiBug)541 var dups []*Bug542 for _, bug := range bugs {543 if bug.Status == BugStatusFixed {544 fixedCount++545 continue546 }547 if bug.Status == BugStatusInvalid {548 continue549 }550 if accessLevel < bug.sanitizeAccess(accessLevel) {551 continue552 }553 if bug.Status == BugStatusDup {554 dups = append(dups, bug)555 continue556 }557 uiBug := createUIBug(c, bug, state, managers)558 bugMap[bug.keyHash()] = uiBug559 id := uiBug.ReportingIndex560 if len(uiBug.Commits) != 0 {561 id = -1562 }563 groups[id] = append(groups[id], uiBug)564 }565 for _, dup := range dups {566 bug := bugMap[dup.DupOf]567 if bug == nil {568 continue // this can be an invalid bug which we filtered above569 }570 mergeUIBug(c, bug, dup)571 }572 cfg := config.Namespaces[ns]573 var uiGroups []*uiBugGroup574 for index, bugs := range groups {575 sort.Slice(bugs, func(i, j int) bool {576 if bugs[i].Namespace != bugs[j].Namespace {577 return bugs[i].Namespace < bugs[j].Namespace578 }579 if bugs[i].ClosedTime != bugs[j].ClosedTime {580 return bugs[i].ClosedTime.After(bugs[j].ClosedTime)581 }582 return bugs[i].ReportedTime.After(bugs[j].ReportedTime)583 })584 caption, fragment, showPatched := "", "", false585 switch index {586 case -1:587 caption, showPatched = "fix pending", true588 fragment = "pending"589 case len(cfg.Reporting) - 1:590 caption, showPatched = "open", false591 fragment = "open"592 default:593 reporting := &cfg.Reporting[index]594 caption, showPatched = reporting.DisplayTitle, false595 fragment = reporting.Name596 }597 uiGroups = append(uiGroups, &uiBugGroup{598 Now: timeNow(c),599 Caption: caption,600 Fragment: fragment,601 Namespace: ns,602 ShowPatched: showPatched,603 ShowIndex: index,604 Bugs: bugs,605 })606 }607 sort.Slice(uiGroups, func(i, j int) bool {608 return uiGroups[i].ShowIndex > uiGroups[j].ShowIndex609 })610 return uiGroups, fixedCount, nil611}612func fetchTerminalBugs(c context.Context, accessLevel AccessLevel,613 ns, manager string, typ *TerminalBug) (*uiBugGroup, error) {614 bugs, _, err := loadAllBugs(c, func(query *db.Query) *db.Query {615 query = query.Filter("Namespace=", ns).616 Filter("Status=", typ.Status)617 if manager != "" {618 query = query.Filter("HappenedOn=", manager)619 }620 return query621 })622 if err != nil {623 return nil, err624 }625 state, err := loadReportingState(c)626 if err != nil {627 return nil, err628 }629 managers, err := managerList(c, ns)630 if err != nil {631 return nil, err632 }633 res := &uiBugGroup{634 Now: timeNow(c),635 Caption: typ.Caption,636 ShowPatch: typ.ShowPatch,637 Namespace: ns,638 }639 for _, bug := range bugs {640 if accessLevel < bug.sanitizeAccess(accessLevel) {641 continue642 }643 res.Bugs = append(res.Bugs, createUIBug(c, bug, state, managers))644 }645 sort.Slice(res.Bugs, func(i, j int) bool {646 return res.Bugs[i].ClosedTime.After(res.Bugs[j].ClosedTime)647 })648 return res, nil649}650func loadDupsForBug(c context.Context, r *http.Request, bug *Bug, state *ReportingState, managers []string) (651 *uiBugGroup, error) {652 bugHash := bug.keyHash()653 var dups []*Bug654 _, err := db.NewQuery("Bug").655 Filter("Status=", BugStatusDup).656 Filter("DupOf=", bugHash).657 GetAll(c, &dups)658 if err != nil {659 return nil, err660 }661 var results []*uiBug662 accessLevel := accessLevel(c, r)663 for _, dup := range dups {664 if accessLevel < dup.sanitizeAccess(accessLevel) {665 continue666 }667 results = append(results, createUIBug(c, dup, state, managers))668 }669 group := &uiBugGroup{670 Now: timeNow(c),671 Caption: "duplicates",672 ShowPatched: true,673 ShowStatus: true,674 Bugs: results,675 }676 return group, nil677}678func loadSimilarBugs(c context.Context, r *http.Request, bug *Bug, state *ReportingState) (*uiBugGroup, error) {679 var similar []*Bug680 _, err := db.NewQuery("Bug").681 Filter("Title=", bug.Title).682 GetAll(c, &similar)683 if err != nil {684 return nil, err685 }686 managers := make(map[string][]string)687 var results []*uiBug688 accessLevel := accessLevel(c, r)689 domain := config.Namespaces[bug.Namespace].SimilarityDomain690 for _, similar := range similar {691 if accessLevel < similar.sanitizeAccess(accessLevel) {692 continue693 }694 if similar.Namespace == bug.Namespace && similar.Seq == bug.Seq {695 continue696 }697 if config.Namespaces[similar.Namespace].SimilarityDomain != domain {698 continue699 }700 if managers[similar.Namespace] == nil {701 mgrs, err := managerList(c, similar.Namespace)702 if err != nil {703 return nil, err704 }705 managers[similar.Namespace] = mgrs706 }707 results = append(results, createUIBug(c, similar, state, managers[similar.Namespace]))708 }709 group := &uiBugGroup{710 Now: timeNow(c),711 Caption: "similar bugs",712 ShowNamespace: true,713 ShowPatched: true,714 ShowStatus: true,715 Bugs: results,716 }717 return group, nil718}719func createUIBug(c context.Context, bug *Bug, state *ReportingState, managers []string) *uiBug {720 reportingIdx, status, link := 0, "", ""721 var reported time.Time722 var err error723 if bug.Status == BugStatusOpen {724 _, _, _, _, reportingIdx, status, link, err = needReport(c, "", state, bug)725 reported = bug.Reporting[reportingIdx].Reported726 if err != nil {727 status = err.Error()728 }729 if status == "" {730 status = "???"731 }732 } else {733 for i := range bug.Reporting {734 bugReporting := &bug.Reporting[i]735 if i == len(bug.Reporting)-1 ||736 bug.Status == BugStatusInvalid && !bugReporting.Closed.IsZero() &&737 bug.Reporting[i+1].Closed.IsZero() ||738 (bug.Status == BugStatusFixed || bug.Status == BugStatusDup) &&739 bugReporting.Closed.IsZero() {740 reportingIdx = i741 reported = bugReporting.Reported742 link = bugReporting.Link743 switch bug.Status {744 case BugStatusInvalid:745 status = "closed as invalid"746 if bugReporting.Auto {747 status = "auto-" + status748 }749 case BugStatusFixed:750 status = "fixed"751 case BugStatusDup:752 status = "closed as dup"753 default:754 status = fmt.Sprintf("unknown (%v)", bug.Status)755 }756 status = fmt.Sprintf("%v on %v", status, html.FormatTime(bug.Closed))757 break758 }759 }760 }761 creditEmail, err := email.AddAddrContext(ownEmail(c), bug.Reporting[reportingIdx].ID)762 if err != nil {763 log.Errorf(c, "failed to generate credit email: %v", err)764 }765 id := bug.keyHash()766 uiBug := &uiBug{767 Namespace: bug.Namespace,768 Title: bug.displayTitle(),769 BisectCauseDone: bug.BisectCause > BisectPending,770 BisectFixDone: bug.BisectFix > BisectPending,771 NumCrashes: bug.NumCrashes,772 FirstTime: bug.FirstTime,773 LastTime: bug.LastTime,774 ReportedTime: reported,775 ClosedTime: bug.Closed,776 ReproLevel: bug.ReproLevel,777 ReportingIndex: reportingIdx,778 Status: status,779 Link: bugLink(id),780 ExternalLink: link,781 CreditEmail: creditEmail,782 NumManagers: len(managers),783 }784 updateBugBadness(c, uiBug)785 if len(bug.Commits) != 0 {786 for i, com := range bug.Commits {787 cfg := config.Namespaces[bug.Namespace]788 info := bug.getCommitInfo(i)789 uiBug.Commits = append(uiBug.Commits, &uiCommit{790 Hash: info.Hash,791 Title: com,792 Link: vcs.CommitLink(cfg.Repos[0].URL, info.Hash),793 })794 }795 for _, mgr := range managers {796 found := false797 for _, mgr1 := range bug.PatchedOn {798 if mgr == mgr1 {799 found = true800 break801 }802 }803 if found {804 uiBug.PatchedOn = append(uiBug.PatchedOn, mgr)805 } else {806 uiBug.MissingOn = append(uiBug.MissingOn, mgr)807 }808 }809 sort.Strings(uiBug.PatchedOn)810 sort.Strings(uiBug.MissingOn)811 }812 return uiBug813}814func mergeUIBug(c context.Context, bug *uiBug, dup *Bug) {815 bug.NumCrashes += dup.NumCrashes816 bug.BisectCauseDone = bug.BisectCauseDone || dup.BisectCause > BisectPending817 bug.BisectFixDone = bug.BisectFixDone || dup.BisectFix > BisectPending818 if bug.LastTime.Before(dup.LastTime) {819 bug.LastTime = dup.LastTime820 }821 if bug.ReproLevel < dup.ReproLevel {822 bug.ReproLevel = dup.ReproLevel823 }824 updateBugBadness(c, bug)825}826func updateBugBadness(c context.Context, bug *uiBug) {827 bug.NumCrashesBad = bug.NumCrashes >= 10000 && timeNow(c).Sub(bug.LastTime) < 24*time.Hour828}829func loadCrashesForBug(c context.Context, bug *Bug) ([]*uiCrash, []byte, error) {830 bugKey := bug.key(c)831 // We can have more than maxCrashes crashes, if we have lots of reproducers.832 crashes, _, err := queryCrashesForBug(c, bugKey, 2*maxCrashes+200)833 if err != nil || len(crashes) == 0 {834 return nil, nil, err835 }836 builds := make(map[string]*Build)837 var results []*uiCrash838 for _, crash := range crashes {839 build := builds[crash.BuildID]840 if build == nil {841 build, err = loadBuild(c, bug.Namespace, crash.BuildID)842 if err != nil {843 return nil, nil, err844 }845 builds[crash.BuildID] = build846 }847 results = append(results, makeUICrash(crash, build))848 }849 sampleReport, _, err := getText(c, textCrashReport, crashes[0].Report)850 if err != nil {851 return nil, nil, err852 }853 return results, sampleReport, nil854}855func loadFixBisectionsForBug(c context.Context, bug *Bug) ([]*uiCrash, error) {856 bugKey := bug.key(c)857 jobs, _, err := queryJobsForBug(c, bugKey, JobBisectFix)858 if err != nil {859 return nil, err860 }861 var results []*uiCrash862 for _, job := range jobs {863 crash, err := queryCrashForJob(c, job, bugKey)864 if err != nil {865 return nil, err866 }867 if crash == nil {868 continue869 }870 build, err := loadBuild(c, bug.Namespace, job.BuildID)871 if err != nil {872 return nil, err873 }874 results = append(results, makeUICrash(crash, build))875 }876 return results, nil877}878func makeUICrash(crash *Crash, build *Build) *uiCrash {879 ui := &uiCrash{880 Manager: crash.Manager,881 Time: crash.Time,882 Maintainers: strings.Join(crash.Maintainers, ", "),883 LogLink: textLink(textCrashLog, crash.Log),884 ReportLink: textLink(textCrashReport, crash.Report),885 ReproSyzLink: textLink(textReproSyz, crash.ReproSyz),886 ReproCLink: textLink(textReproC, crash.ReproC),887 }888 if build != nil {889 ui.uiBuild = makeUIBuild(build)890 }891 return ui892}893func makeUIBuild(build *Build) *uiBuild {894 return &uiBuild{895 Time: build.Time,896 SyzkallerCommit: build.SyzkallerCommit,897 SyzkallerCommitLink: vcs.LogLink(vcs.SyzkallerRepo, build.SyzkallerCommit),898 SyzkallerCommitDate: build.SyzkallerCommitDate,899 KernelAlias: kernelRepoInfo(build).Alias,900 KernelCommit: build.KernelCommit,901 KernelCommitLink: vcs.LogLink(build.KernelRepo, build.KernelCommit),902 KernelCommitTitle: build.KernelCommitTitle,903 KernelCommitDate: build.KernelCommitDate,904 KernelConfigLink: textLink(textKernelConfig, build.KernelConfig),905 }906}907func loadManagers(c context.Context, accessLevel AccessLevel, ns string) ([]*uiManager, error) {908 now := timeNow(c)909 date := timeDate(now)910 managers, managerKeys, err := loadManagerList(c, accessLevel, ns)911 if err != nil {912 return nil, err913 }914 var buildKeys []*db.Key915 var statsKeys []*db.Key916 for i, mgr := range managers {917 if mgr.CurrentBuild != "" {918 buildKeys = append(buildKeys, buildKey(c, mgr.Namespace, mgr.CurrentBuild))919 }920 if timeDate(mgr.LastAlive) == date {921 statsKeys = append(statsKeys,922 db.NewKey(c, "ManagerStats", "", int64(date), managerKeys[i]))923 }924 }925 builds := make([]*Build, len(buildKeys))926 if err := db.GetMulti(c, buildKeys, builds); err != nil {927 return nil, err928 }929 uiBuilds := make(map[string]*uiBuild)930 for _, build := range builds {931 uiBuilds[build.Namespace+"|"+build.ID] = makeUIBuild(build)932 }933 stats := make([]*ManagerStats, len(statsKeys))934 if err := db.GetMulti(c, statsKeys, stats); err != nil {935 return nil, fmt.Errorf("fetching manager stats: %v", err)936 }937 var fullStats []*ManagerStats938 for _, mgr := range managers {939 if timeDate(mgr.LastAlive) != date {940 fullStats = append(fullStats, &ManagerStats{})941 continue942 }943 fullStats = append(fullStats, stats[0])944 stats = stats[1:]945 }946 var results []*uiManager947 for i, mgr := range managers {948 stats := fullStats[i]949 link := mgr.Link950 if accessLevel < AccessUser {951 link = ""952 }953 ui := &uiManager{954 Now: timeNow(c),955 Namespace: mgr.Namespace,956 Name: mgr.Name,957 Link: link,958 CoverLink: config.CoverPath + mgr.Name + ".html",959 CurrentBuild: uiBuilds[mgr.Namespace+"|"+mgr.CurrentBuild],960 FailedBuildBugLink: bugLink(mgr.FailedBuildBug),961 FailedSyzBuildBugLink: bugLink(mgr.FailedSyzBuildBug),962 LastActive: mgr.LastAlive,963 LastActiveBad: now.Sub(mgr.LastAlive) > 6*time.Hour,964 CurrentUpTime: mgr.CurrentUpTime,965 MaxCorpus: stats.MaxCorpus,966 MaxCover: stats.MaxCover,967 TotalFuzzingTime: stats.TotalFuzzingTime,968 TotalCrashes: stats.TotalCrashes,969 TotalExecs: stats.TotalExecs,970 TotalExecsBad: stats.TotalExecs == 0,971 }972 if config.Namespaces[mgr.Namespace].Decommissioned {973 // Don't show bold red highlight for decommissioned namespaces.974 ui.Link = ""975 ui.FailedBuildBugLink = ""976 ui.FailedSyzBuildBugLink = ""977 ui.CurrentUpTime = 0978 ui.LastActiveBad = false979 ui.TotalExecsBad = false980 }981 results = append(results, ui)982 }983 sort.Slice(results, func(i, j int) bool {984 if results[i].Namespace != results[j].Namespace {985 return results[i].Namespace < results[j].Namespace986 }987 return results[i].Name < results[j].Name988 })989 return results, nil990}991func loadManagerList(c context.Context, accessLevel AccessLevel, ns string) ([]*Manager, []*db.Key, error) {992 managers, keys, err := loadAllManagers(c, ns)993 if err != nil {994 return nil, nil, err995 }996 var filtered []*Manager997 var filteredKeys []*db.Key998 for i, mgr := range managers {999 cfg := config.Namespaces[mgr.Namespace]1000 if accessLevel < cfg.AccessLevel {1001 continue1002 }1003 if ns == "" && cfg.Decommissioned {1004 continue1005 }1006 filtered = append(filtered, mgr)1007 filteredKeys = append(filteredKeys, keys[i])1008 }1009 return filtered, filteredKeys, nil1010}1011func loadRecentJobs(c context.Context) ([]*uiJob, error) {1012 var jobs []*Job1013 keys, err := db.NewQuery("Job").1014 Order("-Created").1015 Limit(80).1016 GetAll(c, &jobs)1017 if err != nil {1018 return nil, err1019 }1020 var results []*uiJob1021 for i, job := range jobs {1022 results = append(results, makeUIJob(job, keys[i], nil, nil, nil))1023 }1024 return results, nil1025}1026func loadTestPatchJobs(c context.Context, bug *Bug) ([]*uiJob, error) {1027 bugKey := bug.key(c)1028 var jobs []*Job1029 keys, err := db.NewQuery("Job").1030 Ancestor(bugKey).1031 Filter("Type=", JobTestPatch).1032 Filter("Finished>=", time.Time{}).1033 Order("-Finished").1034 GetAll(c, &jobs)1035 if err != nil {1036 return nil, err1037 }1038 var results []*uiJob1039 for i, job := range jobs {1040 results = append(results, makeUIJob(job, keys[i], nil, nil, nil))1041 }1042 return results, nil1043}1044func makeUIJob(job *Job, jobKey *db.Key, bug *Bug, crash *Crash, build *Build) *uiJob {1045 ui := &uiJob{1046 Type: job.Type,1047 Created: job.Created,1048 BugLink: bugLink(jobKey.Parent().StringID()),1049 ExternalLink: job.Link,1050 User: job.User,1051 Reporting: job.Reporting,1052 Namespace: job.Namespace,1053 Manager: job.Manager,1054 BugTitle: job.BugTitle,1055 KernelAlias: kernelRepoInfoRaw(job.Namespace, job.KernelRepo, job.KernelBranch).Alias,1056 PatchLink: textLink(textPatch, job.Patch),1057 Attempts: job.Attempts,1058 Started: job.Started,1059 Finished: job.Finished,1060 CrashTitle: job.CrashTitle,1061 CrashLogLink: textLink(textCrashLog, job.CrashLog),1062 CrashReportLink: textLink(textCrashReport, job.CrashReport),1063 LogLink: textLink(textLog, job.Log),1064 ErrorLink: textLink(textError, job.Error),1065 Reported: job.Reported,1066 }1067 if !job.Finished.IsZero() {1068 ui.Duration = job.Finished.Sub(job.Started)1069 }1070 if job.Type == JobBisectCause || job.Type == JobBisectFix {1071 // We don't report these yet (or at all), see pollCompletedJobs.1072 if len(job.Commits) != 1 ||1073 bug != nil && (len(bug.Commits) != 0 || bug.Status != BugStatusOpen) {1074 ui.Reported = true1075 }1076 }1077 for _, com := range job.Commits {...

Full Screen

Full Screen

LogLink

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 mfs := mapfs.New(map[string]string{4 })5 zfs, err := zipfs.New(mfs, "test.zip")6 if err != nil {7 log.Fatal(err)8 }9 vcs := vfs.NewVCS(zfs)10 link, err := vcs.LogLink("/hello.txt", 0)11 if err != nil {12 fmt.Println(err)13 }14 fmt.Println(link)15}16import (17func main() {18 mfs := mapfs.New(map[string]string{19 })

Full Screen

Full Screen

LogLink

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 cfg, err := goconfig.LoadConfigFile("config.ini")4 if err != nil {5 log.Fatal(err)6 }7 vcs, err := cfg.GetValue("vcs", "vcs")8 if err != nil {9 log.Fatal(err)10 }11 fmt.Println(vcs)12}

Full Screen

Full Screen

LogLink

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 fmt.Println("Hello World!")4 log.Println("Hello World!")5 vcs.LogLink()6}7import (8func main() {9 fmt.Println("Hello World!")10 log.Println("Hello World!")11 vcs.LogLink()12}13import (14func main() {15 fmt.Println("Hello World!")16 log.Println("Hello World!")17 vcs.LogLink()18}19import (20func LogLink() {21 fmt.Println("Hello World!")22 log.Println("Hello World!")23}

Full Screen

Full Screen

LogLink

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 vcsObj = vcs.NewVCS()4 fmt.Println("Enter the path of the file:")5 fmt.Scanln(&path)6 absPath, _ := filepath.Abs(path)7 fmt.Println("The absolute path is:", absPath)8 vcsObj.LogLink(absPath)9}10import (11func main() {12 vcsObj = vcs.NewVCS()13 fmt.Println("Enter the path of the file:")14 fmt.Scanln(&path)15 absPath, _ := filepath.Abs(path)16 fmt.Println("The absolute path is:", absPath)17 vcsObj.GetFile(absPath)18}19import (20func main() {21 vcsObj = vcs.NewVCS()22 fmt.Println("Enter the path of the file:")23 fmt.Scanln(&path)24 absPath, _ := filepath.Abs(path)25 fmt.Println("The absolute path is:", absPath)26 vcsObj.GetFile(absPath)27}28import (29func main() {30 vcsObj = vcs.NewVCS()31 fmt.Println("Enter the path of the file:")32 fmt.Scanln(&path)33 absPath, _ := filepath.Abs(path)34 fmt.Println("The absolute path is:", absPath)35 vcsObj.GetFile(absPath)36}37import (

Full Screen

Full Screen

LogLink

Using AI Code Generation

copy

Full Screen

1func main() {2 vcs.LogLink("1.0.0", "2.0.0")3}4func main() {5 vcs.LogLink("1.0.0", "2.0.0")6}7func main() {8 vcs.LogLink("1.0.0", "2.0.0")9}10func main() {11 vcs.LogLink("1.0.0", "2.0.0")12}13func main() {14 vcs.LogLink("1.0.0", "2.0.0")15}16func main() {17 vcs.LogLink("1.0.0", "2.0.0")18}19func main() {20 vcs.LogLink("1.0.0", "2.0.0")21}22func main() {23 vcs.LogLink("1.0.0", "2.0.0")24}25func main() {26 vcs.LogLink("1.0.0", "2.0.0

Full Screen

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful