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  }