From 741e472a71c27e70e336669b417d88e5d56adef4 Mon Sep 17 00:00:00 2001 From: Adam Cooper Date: Sat, 11 Mar 2023 20:53:33 +0100 Subject: [PATCH] =?UTF-8?q?Clean=20up=20=F0=9F=A7=B9=20(#24)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix tabs * Package updates * Fix selecting repos * Table column width * More settings * Casing * Latest go * Latest Actions --------- Co-authored-by: adam --- .github/workflows/build.yml | 7 ++- .github/workflows/release.yml | 3 +- go.mod | 23 +++++----- go.sum | 23 ++++++++++ main.go | 2 +- models/organisationModel.go | 31 ++++++------- models/repositoryModel.go | 20 ++++++--- structs/organizationQuery.go | 9 ++++ structs/repositorySetting.go | 76 ++++++++++++++++++++++---------- {utils => structs}/yesNo.go | 2 +- {utils => structs}/yesNo_test.go | 3 +- 11 files changed, 135 insertions(+), 64 deletions(-) rename {utils => structs}/yesNo.go (82%) rename {utils => structs}/yesNo_test.go (90%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 44eab91..898aa14 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,15 +13,18 @@ jobs: os: [ubuntu-latest, windows-latest, macos-latest] runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v3 - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.18 + go-version: '1.20' - name: Build run: go build -v ./... + - name: golangci-lint + uses: golangci/golangci-lint-action@v3 + - name: Test run: go test -v ./... diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 52a0173..c2a15d0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,10 +18,9 @@ jobs: goos: windows steps: - uses: actions/checkout@v3 - - uses: wangyoucao577/go-release-action@v1.33 + - uses: wangyoucao577/go-release-action@v1 with: github_token: ${{ secrets.GITHUB_TOKEN }} goos: ${{ matrix.goos }} goarch: ${{ matrix.goarch }} - goversion: "1.18" extra_files: LICENSE README.md \ No newline at end of file diff --git a/go.mod b/go.mod index 6bb3690..aa12efa 100644 --- a/go.mod +++ b/go.mod @@ -1,18 +1,18 @@ module github.com/admcpr/hub-bub -go 1.19 +go 1.20 require ( github.com/charmbracelet/bubbles v0.15.0 - github.com/charmbracelet/bubbletea v0.23.1 + github.com/charmbracelet/bubbletea v0.23.2 github.com/charmbracelet/lipgloss v0.6.0 - github.com/cli/go-gh v1.0.0 - github.com/cli/shurcooL-graphql v0.0.2 + github.com/cli/go-gh v1.2.1 + github.com/cli/shurcooL-graphql v0.0.3 ) require ( github.com/atotto/clipboard v0.1.4 // indirect - github.com/aymanbagabas/go-osc52 v1.2.1 // indirect + github.com/aymanbagabas/go-osc52 v1.2.2 // indirect github.com/cli/safeexec v1.0.1 // indirect github.com/containerd/console v1.0.3 // indirect github.com/henvic/httpretty v0.1.0 // indirect @@ -24,13 +24,14 @@ require ( github.com/muesli/ansi v0.0.0-20221106050444-61f0cd9a192a // indirect github.com/muesli/cancelreader v0.2.2 // indirect github.com/muesli/reflow v0.3.0 // indirect - github.com/muesli/termenv v0.13.0 // indirect - github.com/rivo/uniseg v0.4.3 // indirect + github.com/muesli/termenv v0.14.0 // indirect + github.com/rivo/uniseg v0.4.4 // indirect github.com/sahilm/fuzzy v0.1.0 // indirect github.com/thlib/go-timezone-local v0.0.0-20210907160436-ef149e42d28e // indirect - golang.org/x/net v0.5.0 // indirect - golang.org/x/sys v0.4.0 // indirect - golang.org/x/term v0.4.0 // indirect - golang.org/x/text v0.6.0 // indirect + golang.org/x/net v0.8.0 // indirect + golang.org/x/sync v0.1.0 // indirect + golang.org/x/sys v0.6.0 // indirect + golang.org/x/term v0.6.0 // indirect + golang.org/x/text v0.8.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 54c9855..71217d4 100644 --- a/go.sum +++ b/go.sum @@ -4,19 +4,27 @@ github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn github.com/aymanbagabas/go-osc52 v1.0.3/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4= github.com/aymanbagabas/go-osc52 v1.2.1 h1:q2sWUyDcozPLcLabEMd+a+7Ea2DitxZVN9hTxab9L4E= github.com/aymanbagabas/go-osc52 v1.2.1/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4= +github.com/aymanbagabas/go-osc52 v1.2.2 h1:NT7wkhEhPTcKnBCdPi9djmyy9L3JOL4+3SsfJyqptCo= +github.com/aymanbagabas/go-osc52 v1.2.2/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4= github.com/charmbracelet/bubbles v0.15.0 h1:c5vZ3woHV5W2b8YZI1q7v4ZNQaPetfHuoHzx+56Z6TI= github.com/charmbracelet/bubbles v0.15.0/go.mod h1:Y7gSFbBzlMpUDR/XM9MhZI374Q+1p1kluf1uLl8iK74= github.com/charmbracelet/bubbletea v0.23.1 h1:CYdteX1wCiCzKNUlwm25ZHBIc1GXlYFyUIte8WPvhck= github.com/charmbracelet/bubbletea v0.23.1/go.mod h1:JAfGK/3/pPKHTnAS8JIE2u9f61BjWTQY57RbT25aMXU= +github.com/charmbracelet/bubbletea v0.23.2 h1:vuUJ9HJ7b/COy4I30e8xDVQ+VRDUEFykIjryPfgsdps= +github.com/charmbracelet/bubbletea v0.23.2/go.mod h1:FaP3WUivcTM0xOKNmhciz60M6I+weYLF76mr1JyI7sM= github.com/charmbracelet/harmonica v0.2.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao= github.com/charmbracelet/lipgloss v0.6.0 h1:1StyZB9vBSOyuZxQUcUwGr17JmojPNm87inij9N3wJY= github.com/charmbracelet/lipgloss v0.6.0/go.mod h1:tHh2wr34xcHjC2HCXIlGSG1jaDF0S0atAUvBMP6Ppuk= github.com/cli/go-gh v1.0.0 h1:zE1YUAUYqGXNZuICEBeOkIMJ5F50BS0ftvtoWGlsEFI= github.com/cli/go-gh v1.0.0/go.mod h1:bqxLdCoTZ73BuiPEJx4olcO/XKhVZaFDchFagYRBweE= +github.com/cli/go-gh v1.2.1 h1:xFrjejSsgPiwXFP6VYynKWwxLQcNJy3Twbu82ZDlR/o= +github.com/cli/go-gh v1.2.1/go.mod h1:Jxk8X+TCO4Ui/GarwY9tByWm/8zp4jJktzVZNlTW5VM= github.com/cli/safeexec v1.0.1 h1:e/C79PbXF4yYTN/wauC4tviMxEV13BwljGj0N9j+N00= github.com/cli/safeexec v1.0.1/go.mod h1:Z/D4tTN8Vs5gXYHDCbaM1S/anmEDnJb1iW0+EJ5zx3Q= github.com/cli/shurcooL-graphql v0.0.2 h1:rwP5/qQQ2fM0TzkUTwtt6E2LbIYf6R+39cUXTa04NYk= github.com/cli/shurcooL-graphql v0.0.2/go.mod h1:tlrLmw/n5Q/+4qSvosT+9/W5zc8ZMjnJeYBxSdb4nWA= +github.com/cli/shurcooL-graphql v0.0.3 h1:CtpPxyGDs136/+ZeyAfUKYmcQBjDlq5aqnrDCW5Ghh8= +github.com/cli/shurcooL-graphql v0.0.3/go.mod h1:tlrLmw/n5Q/+4qSvosT+9/W5zc8ZMjnJeYBxSdb4nWA= github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -53,11 +61,15 @@ github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKt github.com/muesli/termenv v0.11.1-0.20220204035834-5ac8409525e0/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs= github.com/muesli/termenv v0.13.0 h1:wK20DRpJdDX8b7Ek2QfhvqhRQFZ237RGRO0RQ/Iqdy0= github.com/muesli/termenv v0.13.0/go.mod h1:sP1+uffeLaEYpyOTb8pLCUctGcGLnoFjSn4YJK5e2bc= +github.com/muesli/termenv v0.14.0 h1:8x9NFfOe8lmIWK4pgy3IfVEy47f+ppe3tUqdPZG2Uy0= +github.com/muesli/termenv v0.14.0/go.mod h1:kG/pF1E7fh949Xhe156crRUrHNyK221IuGO7Ez60Uc8= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/sahilm/fuzzy v0.1.0 h1:FzWGaw2Opqyu+794ZQ9SYifWv2EIXpwP4q8dY1kDAwI= github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= @@ -73,8 +85,12 @@ golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220923203811-8be639271d50/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -88,20 +104,27 @@ golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.4.0 h1:O7UWfv5+A2qiuulQk30kVinPoMtoIPeVaKLEgLpVkvg= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= +golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/main.go b/main.go index 748f498..2a06c8e 100644 --- a/main.go +++ b/main.go @@ -12,7 +12,7 @@ func main() { models.MainModel = []tea.Model{&models.UserModel{}, &models.OrganisationModel{}} p := tea.NewProgram(models.MainModel[models.UserModelName]) - if err := p.Start(); err != nil { + if _, err := p.Run(); err != nil { fmt.Printf("Alas, there's been an error: %v", err) os.Exit(1) } diff --git a/models/organisationModel.go b/models/organisationModel.go index fe9766a..b6d0af6 100644 --- a/models/organisationModel.go +++ b/models/organisationModel.go @@ -34,7 +34,13 @@ func (m *OrganisationModel) getSelectedRepo() structs.RepositoryQuery { return m.RepoQuery.Organization.Repositories.Edges[m.repoList.Index()].Node } -func (m *OrganisationModel) init() { +func (m *OrganisationModel) init(width, height int) { + m.width = width + m.height = height + m.repoModel.width = m.panelWidth() + m.repoModel.height = m.height + m.loaded = true + m.repoList = list.New( []list.Item{}, list.NewDefaultDelegate(), @@ -51,18 +57,13 @@ func (m OrganisationModel) Init() tea.Cmd { func (m OrganisationModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { var cmd tea.Cmd + // var cmds []tea.Cmd switch msg := msg.(type) { case tea.WindowSizeMsg: - m.height = msg.Height - m.width = msg.Width - m.repoModel.width = m.panelWidth() - m.repoModel.height = m.height - if !m.loaded { - m.init() - m.loaded = true + m.init(msg.Width, msg.Height) } return m, nil @@ -81,13 +82,15 @@ func (m OrganisationModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { return m, nil case tea.KeyRight: m.repoModel.NextTab() + _, cmd = m.repoModel.Update(msg) case tea.KeyLeft: m.repoModel.PreviousTab() + _, cmd = m.repoModel.Update(msg) } - _, cmd = m.repoModel.Update(msg) } else { switch msg.Type { case tea.KeyDown, tea.KeyUp: + m.repoList, cmd = m.repoList.Update(msg) m.repoModel.SelectRepo(m.getSelectedRepo(), m.panelWidth(), m.height) case tea.KeyEnter: m.tabsHaveFocus = true @@ -95,18 +98,16 @@ func (m OrganisationModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case tea.KeyEsc: return MainModel[UserModelName], nil } - switch msg.String() { - case "ctrl+c", "q": - return m, tea.Quit - } - m.repoList, cmd = m.repoList.Update(msg) + } + switch msg.String() { + case "ctrl+c", "q": + return m, tea.Quit } } return m, cmd } -// View implements tea.Model func (m OrganisationModel) View() string { var repoList = appStyle.Width(m.panelWidth() - 4).Render(m.repoList.View()) var settings = appStyle.Width(m.panelWidth()).Render(m.repoModel.View()) diff --git a/models/repositoryModel.go b/models/repositoryModel.go index d776225..c6eb6d1 100644 --- a/models/repositoryModel.go +++ b/models/repositoryModel.go @@ -35,7 +35,6 @@ func (m *RepositoryModel) SelectRepo(RepositoryQuery structs.RepositoryQuery, wi m.width = width m.height = height - m.buildSettingsTable(m.repositorySettingsTabs[m.activeTab]) } func (m *RepositoryModel) NextTab() { @@ -61,18 +60,25 @@ func (m RepositoryModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { } func (m RepositoryModel) View() string { + if m.repositorySettingsTabs == nil || len(m.repositorySettingsTabs) == 0 { + return "" + } + + m.buildSettingsTable() + var tabs = m.RenderTabs() var settings = settingsStyle.Padding(0).Width(m.width - 6).Render(m.settingsTable.View()) return lipgloss.JoinVertical(lipgloss.Left, tabs, settings) } -func (m *RepositoryModel) buildSettingsTable(tabSettings structs.RepositorySettingsTab) { +func (m *RepositoryModel) buildSettingsTable() { + var activeSettings = m.repositorySettingsTabs[m.activeTab] - columns := []table.Column{{Title: "", Width: 20}, {Title: "", Width: 11}} + columns := []table.Column{{Title: "", Width: 40}, {Title: "", Width: 11}} - rows := make([]table.Row, len(tabSettings.Settings)) - for i, setting := range tabSettings.Settings { + rows := make([]table.Row, len(activeSettings.Settings)) + for i, setting := range activeSettings.Settings { rows[i] = table.Row{setting.Name, setting.Value} } @@ -107,9 +113,9 @@ func (m RepositoryModel) RenderTabs() string { } else if isLast && !isActive { border.BottomRight = "┤" } - // TODO: Calculate width of tabs correctly so they match m.width + if isLast { - style = style.Border(border).Width((m.width / len(Tabs)) - 4) + style = style.Border(border).Width((m.width / len(Tabs)) - 1) } else { style = style.Border(border).Width((m.width / len(Tabs)) - 3) } diff --git a/structs/organizationQuery.go b/structs/organizationQuery.go index 85e17b5..568d4a2 100644 --- a/structs/organizationQuery.go +++ b/structs/organizationQuery.go @@ -24,6 +24,7 @@ type RepositoryQuery struct { AutoMergeAllowed bool DeleteBranchOnMerge bool RebaseMergeAllowed bool + MergeCommitAllowed bool HasDiscussionsEnabled bool HasIssuesEnabled bool HasWikiEnabled bool @@ -46,6 +47,9 @@ type RepositoryQuery struct { VulnerabilityAlerts struct { TotalCount int } `graphql:"vulnerabilityAlerts"` + PullRequests struct { + TotalCount int + } `graphql:"pullRequests(states: OPEN)"` } type BranchProtectionRuleQuery struct { @@ -61,4 +65,9 @@ type BranchProtectionRuleQuery struct { RequiresLinearHistory bool RequiresStatusChecks bool RequiresStrictStatusChecks bool + RequiresDeployments bool + LockBranch bool + RestrictsPushes bool + RestrictsReviewDismissals bool + RequireLastPushApproval bool } diff --git a/structs/repositorySetting.go b/structs/repositorySetting.go index e09227c..87b1e25 100644 --- a/structs/repositorySetting.go +++ b/structs/repositorySetting.go @@ -2,8 +2,6 @@ package structs import ( "fmt" - - "github.com/admcpr/hub-bub/utils" ) type RepositorySetting struct { @@ -39,6 +37,7 @@ func BuildRepositorySettings(ornq RepositoryQuery) []RepositorySettingsTab { return append(respositorySettings, buildOverviewSettings(ornq), + buildPullRequestSettings(ornq), buildDefaultBranchSettings(ornq), buildSecuritySettings(ornq)) } @@ -47,37 +46,63 @@ func buildOverviewSettings(ornq RepositoryQuery) RepositorySettingsTab { var repositorySettings []RepositorySetting repositorySettings = append(repositorySettings, - NewRepositorySetting("Name", ornq.Name, "", "", true), - NewRepositorySetting("Url", ornq.Url, "", "", true), - NewRepositorySetting("Private?", utils.YesNo(ornq.IsPrivate), "", "", true), - NewRepositorySetting("Template?", utils.YesNo(ornq.IsTemplate), "", "", true), - NewRepositorySetting("Archived?", utils.YesNo(ornq.IsArchived), "", "", true), - NewRepositorySetting("Disabled?", utils.YesNo(ornq.IsDisabled), "", "", true), - NewRepositorySetting("Fork?", utils.YesNo(ornq.IsFork), "", "", true), - NewRepositorySetting("Last Updated?", fmt.Sprint(ornq.UpdatedAt), "", "", true), + NewRepositorySetting("Private", YesNo(ornq.IsPrivate), "", "", true), + NewRepositorySetting("Template", YesNo(ornq.IsTemplate), "", "", true), + NewRepositorySetting("Archived", YesNo(ornq.IsArchived), "", "", true), + NewRepositorySetting("Disabled", YesNo(ornq.IsDisabled), "", "", true), + NewRepositorySetting("Fork", YesNo(ornq.IsFork), "", "", true), + NewRepositorySetting("Last updated", ornq.UpdatedAt.Format("2006/01/02"), "", "", true), NewRepositorySetting("Stars", fmt.Sprint(ornq.StargazerCount), "", "", true), - NewRepositorySetting("Wiki?", utils.YesNo(ornq.HasWikiEnabled), "", "", true), - NewRepositorySetting("Issues?", utils.YesNo(ornq.HasIssuesEnabled), "", "", true), - NewRepositorySetting("Projects?", utils.YesNo(ornq.HasProjectsEnabled), "", "", true), - NewRepositorySetting("Discussions?", utils.YesNo(ornq.HasDiscussionsEnabled), "", "", true)) + NewRepositorySetting("Wiki", YesNo(ornq.HasWikiEnabled), "", "", true), + NewRepositorySetting("Issues", YesNo(ornq.HasIssuesEnabled), "", "", true), + NewRepositorySetting("Projects", YesNo(ornq.HasProjectsEnabled), "", "", true), + NewRepositorySetting("Discussions", YesNo(ornq.HasDiscussionsEnabled), "", "", true)) return NewRepositorySettingsTab("Overview", repositorySettings) } +func buildPullRequestSettings(ornq RepositoryQuery) RepositorySettingsTab { + var repositorySettings []RepositorySetting + + repositorySettings = append(repositorySettings, + NewRepositorySetting("Allow merge commits", YesNo(ornq.MergeCommitAllowed), "", "", true), + NewRepositorySetting("Allow squash merging", YesNo(ornq.SquashMergeAllowed), "", "", true), + NewRepositorySetting("Allow rebase merging", YesNo(ornq.RebaseMergeAllowed), "", "", true), + NewRepositorySetting("Allow auto-merge", YesNo(ornq.AutoMergeAllowed), "", "", true), + NewRepositorySetting("Automatically delete head branches", YesNo(ornq.DeleteBranchOnMerge), "", "", true), + NewRepositorySetting("Open pull requests", fmt.Sprint(ornq.PullRequests.TotalCount), "", "", true), + ) + + return NewRepositorySettingsTab("Pull Requests", repositorySettings) +} + func buildDefaultBranchSettings(ornq RepositoryQuery) RepositorySettingsTab { var repositorySettings []RepositorySetting + rule := ornq.DefaultBranchRef.BranchProtectionRule + repositorySettings = append(repositorySettings, NewRepositorySetting("Name", ornq.DefaultBranchRef.Name, "", "", true), - NewRepositorySetting("Requires Approving Reviews?", utils.YesNo(ornq.DefaultBranchRef.BranchProtectionRule.RequiresApprovingReviews), "", "", true), - NewRepositorySetting("Required Approving Review Count", fmt.Sprint(ornq.DefaultBranchRef.BranchProtectionRule.RequiredApprovingReviewCount), "", "", true), - NewRepositorySetting("Requires Code Owner Reviews?", utils.YesNo(ornq.DefaultBranchRef.BranchProtectionRule.RequiresCodeOwnerReviews), "", "", true), - NewRepositorySetting("Protected?", utils.YesNo(ornq.DefaultBranchRef.BranchProtectionRule.AllowsDeletions), "", "", true), - NewRepositorySetting("Dismisses Stale Reviews?", utils.YesNo(ornq.DefaultBranchRef.BranchProtectionRule.DismissesStaleReviews), "", "", true), - NewRepositorySetting("Admin Enforced?", utils.YesNo(ornq.DefaultBranchRef.BranchProtectionRule.IsAdminEnforced), "", "", true), - NewRepositorySetting("Requires Commit Signatures?", utils.YesNo(ornq.DefaultBranchRef.BranchProtectionRule.RequiresCommitSignatures), "", "", true), - NewRepositorySetting("Allow Force Pushes?", utils.YesNo(ornq.DefaultBranchRef.BranchProtectionRule.AllowsForcePushes), "", "", true), - NewRepositorySetting("Allow Deletions?", utils.YesNo(ornq.DefaultBranchRef.BranchProtectionRule.AllowsDeletions), "", "", true)) + NewRepositorySetting("Require approving reviews", YesNo(rule.RequiresApprovingReviews), "", "", true), + NewRepositorySetting("Number of approvals required", fmt.Sprint(rule.RequiredApprovingReviewCount), "", "", true), + NewRepositorySetting("Dismiss stale requests", YesNo(rule.DismissesStaleReviews), "", "", true), + NewRepositorySetting("Require review from Code Owners", YesNo(rule.RequiresCodeOwnerReviews), "", "", true), + NewRepositorySetting("Restrict who can dismiss pull request reviews", YesNo(rule.RestrictsReviewDismissals), "", "", true), + NewRepositorySetting("Require approval of the most recent reviewable push", YesNo(rule.RequireLastPushApproval), "", "", true), + // Allow specified actors to bypass required pull requests + + NewRepositorySetting("Require status checks to pass before merging", YesNo(rule.RequiresStatusChecks), "", "", true), + NewRepositorySetting("Require conversation resolution before merging", YesNo(rule.RequiresConversationResolution), "", "", true), + NewRepositorySetting("Requires signed commits", YesNo(rule.RequiresCommitSignatures), "", "", true), + NewRepositorySetting("Require linear history", YesNo(rule.RequiresLinearHistory), "", "", true), + NewRepositorySetting("Require deployments to succeed before merging", YesNo(rule.RequiresDeployments), "", "", true), + NewRepositorySetting("Lock branch", YesNo(rule.LockBranch), "", "", true), + NewRepositorySetting("Do not allow bypassing the above settings", YesNo(rule.IsAdminEnforced), "", "", true), + NewRepositorySetting("Restrict who can push to matching branches", YesNo(rule.RestrictsPushes), "", "", true), + + NewRepositorySetting("Allow force pushes", YesNo(rule.AllowsForcePushes), "", "", true), + NewRepositorySetting("Allow deletions", YesNo(rule.AllowsDeletions), "", "", true), + ) return NewRepositorySettingsTab("Default Branch", repositorySettings) } @@ -85,5 +110,10 @@ func buildDefaultBranchSettings(ornq RepositoryQuery) RepositorySettingsTab { func buildSecuritySettings(ornq RepositoryQuery) RepositorySettingsTab { var repositorySettings []RepositorySetting + repositorySettings = append(repositorySettings, + NewRepositorySetting("Vulnerability alerts enabled", YesNo(ornq.HasVulnerabilityAlertsEnabled), "", "", true), + NewRepositorySetting("Vulnerability alert count", fmt.Sprint(ornq.VulnerabilityAlerts.TotalCount), "", "", true), + ) + return NewRepositorySettingsTab("Security", repositorySettings) } diff --git a/utils/yesNo.go b/structs/yesNo.go similarity index 82% rename from utils/yesNo.go rename to structs/yesNo.go index a04fa07..faafe1b 100644 --- a/utils/yesNo.go +++ b/structs/yesNo.go @@ -1,4 +1,4 @@ -package utils +package structs func YesNo(b bool) string { if b { diff --git a/utils/yesNo_test.go b/structs/yesNo_test.go similarity index 90% rename from utils/yesNo_test.go rename to structs/yesNo_test.go index 84fde96..628c122 100644 --- a/utils/yesNo_test.go +++ b/structs/yesNo_test.go @@ -1,4 +1,4 @@ -package utils +package structs import ( "testing" @@ -13,7 +13,6 @@ func TestYesNo(t *testing.T) { args args want string }{ - // TODO: Add test cases. {"Yes", args{true}, "✔️"}, {"No", args{false}, "❌"}, }