github.com/wtfutil/wtf@v0.43.0/modules/gerrit/widget.go (about) 1 package gerrit 2 3 import ( 4 "crypto/tls" 5 "fmt" 6 "net/http" 7 "regexp" 8 9 glb "github.com/andygrunwald/go-gerrit" 10 "github.com/rivo/tview" 11 "github.com/wtfutil/wtf/utils" 12 "github.com/wtfutil/wtf/view" 13 ) 14 15 type Widget struct { 16 view.TextWidget 17 18 gerrit *glb.Client 19 20 GerritProjects []*GerritProject 21 Idx int 22 23 selected int 24 settings *Settings 25 err error 26 } 27 28 var ( 29 GerritURLPattern = regexp.MustCompile(`^(http|https)://(.*)$`) 30 ) 31 32 func NewWidget(tviewApp *tview.Application, redrawChan chan bool, _ *tview.Pages, settings *Settings) *Widget { 33 widget := Widget{ 34 TextWidget: view.NewTextWidget(tviewApp, redrawChan, nil, settings.Common), 35 36 Idx: 0, 37 38 settings: settings, 39 } 40 41 widget.initializeKeyboardControls() 42 43 widget.unselect() 44 45 return &widget 46 } 47 48 /* -------------------- Exported Functions -------------------- */ 49 50 func (widget *Widget) Refresh() { 51 httpClient := &http.Client{ 52 Transport: &http.Transport{ 53 TLSClientConfig: &tls.Config{ 54 InsecureSkipVerify: !widget.settings.verifyServerCertificate, 55 }, 56 Proxy: http.ProxyFromEnvironment, 57 }, 58 } 59 60 gerritUrl := widget.settings.domain 61 submatches := GerritURLPattern.FindAllStringSubmatch(widget.settings.domain, -1) 62 63 if len(submatches) > 0 && len(submatches[0]) > 2 { 64 submatch := submatches[0] 65 gerritUrl = fmt.Sprintf( 66 "%s://%s:%s@%s", 67 submatch[1], 68 widget.settings.username, 69 widget.settings.password, 70 submatch[2], 71 ) 72 } 73 gerrit, err := glb.NewClient(gerritUrl, httpClient) 74 if err != nil { 75 widget.err = err 76 widget.gerrit = nil 77 widget.GerritProjects = nil 78 } else { 79 widget.err = nil 80 widget.gerrit = gerrit 81 widget.GerritProjects = widget.buildProjectCollection(widget.settings.projects) 82 for _, project := range widget.GerritProjects { 83 project.Refresh(widget.settings.username) 84 } 85 } 86 87 widget.display() 88 } 89 90 /* -------------------- Unexported Functions -------------------- */ 91 92 func (widget *Widget) nextProject() { 93 widget.Idx++ 94 widget.unselect() 95 if widget.Idx == len(widget.GerritProjects) { 96 widget.Idx = 0 97 } 98 99 widget.unselect() 100 } 101 102 func (widget *Widget) prevProject() { 103 widget.Idx-- 104 if widget.Idx < 0 { 105 widget.Idx = len(widget.GerritProjects) - 1 106 } 107 108 widget.unselect() 109 } 110 111 func (widget *Widget) nextReview() { 112 widget.selected++ 113 project := widget.GerritProjects[widget.Idx] 114 if widget.selected >= project.ReviewCount { 115 widget.selected = 0 116 } 117 118 widget.display() 119 } 120 121 func (widget *Widget) prevReview() { 122 widget.selected-- 123 project := widget.GerritProjects[widget.Idx] 124 if widget.selected < 0 { 125 widget.selected = project.ReviewCount - 1 126 } 127 128 widget.display() 129 } 130 131 func (widget *Widget) openReview() { 132 sel := widget.selected 133 project := widget.GerritProjects[widget.Idx] 134 if sel >= 0 && sel < project.ReviewCount { 135 change := glb.ChangeInfo{} 136 if sel < len(project.IncomingReviews) { 137 change = project.IncomingReviews[sel] 138 } else { 139 change = project.OutgoingReviews[sel-len(project.IncomingReviews)] 140 } 141 utils.OpenFile(fmt.Sprintf("%s/%s/%d", widget.settings.domain, "#/c", change.Number)) 142 } 143 } 144 145 func (widget *Widget) unselect() { 146 widget.selected = -1 147 widget.display() 148 } 149 150 func (widget *Widget) buildProjectCollection(projectData []interface{}) []*GerritProject { 151 gerritProjects := []*GerritProject{} 152 153 for _, name := range projectData { 154 project := NewGerritProject(name.(string), widget.gerrit) 155 gerritProjects = append(gerritProjects, project) 156 } 157 158 return gerritProjects 159 } 160 161 func (widget *Widget) currentGerritProject() *GerritProject { 162 if len(widget.GerritProjects) == 0 { 163 return nil 164 } 165 166 if widget.Idx < 0 || widget.Idx >= len(widget.GerritProjects) { 167 return nil 168 } 169 170 return widget.GerritProjects[widget.Idx] 171 }