diff --git a/git/git.go b/git/git.go index 6513d24c..eac2198e 100644 --- a/git/git.go +++ b/git/git.go @@ -1,6 +1,8 @@ package git import ( + "bufio" + "bytes" "errors" "fmt" "sort" @@ -18,6 +20,7 @@ type Repo struct { Origin string Remotes []string Branches []Branch + Status gitm.NameStatus } type Branch struct { @@ -72,6 +75,10 @@ func GetRepo(dir string) (*Repo, error) { if err != nil { return nil, err } + status, err := getUnstagedStatus(repo) + if err != nil { + return nil, err + } branches := make([]Branch, len(bNames)) for i, b := range bNames { @@ -119,7 +126,33 @@ func GetRepo(dir string) (*Repo, error) { return nil, err } - return &Repo{Repository: *repo, Origin: origin[0], Remotes: remotes, Branches: branches}, nil + return &Repo{Repository: *repo, Origin: origin[0], Remotes: remotes, Branches: branches, Status: status}, nil +} + +func getUnstagedStatus(repo *gitm.Repository) (gitm.NameStatus, error) { + cmd := gitm.NewCommand("diff", "HEAD", "--name-status") + stdout, err := cmd.RunInDir(repo.Path()) + if err != nil { + return gitm.NameStatus{}, err + } + status := gitm.NameStatus{} + scanner := bufio.NewScanner(bytes.NewReader(stdout)) + for scanner.Scan() { + fields := strings.Fields(scanner.Text()) + if len(fields) < 2 { + continue + } + + switch fields[0][0] { + case 'A': + status.Added = append(status.Added, fields[1]) + case 'D': + status.Removed = append(status.Removed, fields[1]) + case 'M': + status.Modified = append(status.Modified, fields[1]) + } + } + return status, err } func FetchRepo(dir string) (*Repo, error) { diff --git a/ui/components/issuessection/issuessection.go b/ui/components/issuessection/issuessection.go index d8bd1477..d8b2508e 100644 --- a/ui/components/issuessection/issuessection.go +++ b/ui/components/issuessection/issuessection.go @@ -411,3 +411,20 @@ func (m Model) GetTotalCount() *int { func (m Model) IsLoading() bool { return m.Table.IsLoading() } + +func (m Model) GetPagerContent() string { + pagerContent := "" + if m.TotalCount > 0 { + pagerContent = fmt.Sprintf( + "%v %v • %v %v/%v • Fetched %v", + constants.WaitingIcon, + m.LastUpdated().Format("01/02 15:04:05"), + m.SingularForm, + m.Table.GetCurrItem()+1, + m.TotalCount, + len(m.Table.Rows), + ) + } + pager := m.Ctx.Styles.ListViewPort.PagerStyle.Render(pagerContent) + return pager +} diff --git a/ui/components/prssection/prssection.go b/ui/components/prssection/prssection.go index c34c0e4e..1a82ce25 100644 --- a/ui/components/prssection/prssection.go +++ b/ui/components/prssection/prssection.go @@ -499,3 +499,20 @@ func (m Model) GetTotalCount() *int { func (m Model) IsLoading() bool { return m.Table.IsLoading() } + +func (m Model) GetPagerContent() string { + pagerContent := "" + if m.TotalCount > 0 { + pagerContent = fmt.Sprintf( + "%v %v • %v %v/%v • Fetched %v", + constants.WaitingIcon, + m.LastUpdated().Format("01/02 15:04:05"), + m.SingularForm, + m.Table.GetCurrItem()+1, + m.TotalCount, + len(m.Table.Rows), + ) + } + pager := m.Ctx.Styles.ListViewPort.PagerStyle.Render(pagerContent) + return pager +} diff --git a/ui/components/reposection/reposection.go b/ui/components/reposection/reposection.go index 3c073032..f0cc97b1 100644 --- a/ui/components/reposection/reposection.go +++ b/ui/components/reposection/reposection.go @@ -1,6 +1,7 @@ package reposection import ( + "fmt" "slices" "strings" "time" @@ -537,3 +538,12 @@ func (m *Model) GetTotalCount() *int { return utils.IntPtr(len(m.Branches)) } + +func (m *Model) GetPagerContent() string { + s := lipgloss.NewStyle().Background(m.Ctx.Styles.ListViewPort.PagerStyle.GetBackground()) + mod := s.Foreground(lipgloss.Color("#e0af68")).Render(fmt.Sprintf(" %d", len(m.repo.Status.Modified))) + plus := s.Foreground(m.Ctx.Theme.SuccessText).Render(fmt.Sprintf(" %d", len(m.repo.Status.Added))) + minus := s.Foreground(m.Ctx.Theme.WarningText).Render(fmt.Sprintf(" %d", len(m.repo.Status.Removed))) + spacer := s.Render(" ") + return m.Ctx.Styles.ListViewPort.PagerStyle.Render(lipgloss.JoinHorizontal(lipgloss.Top, plus, spacer, minus, spacer, mod)) +} diff --git a/ui/components/section/section.go b/ui/components/section/section.go index 71647fad..1fd22131 100644 --- a/ui/components/section/section.go +++ b/ui/components/section/section.go @@ -330,23 +330,6 @@ func (m *BaseModel) IsLoading() bool { return m.Table.IsLoading() } -func (m *BaseModel) GetPagerContent() string { - pagerContent := "" - if m.TotalCount > 0 { - pagerContent = fmt.Sprintf( - "%v %v • %v %v/%v • Fetched %v", - constants.WaitingIcon, - m.LastUpdated().Format("01/02 15:04:05"), - m.SingularForm, - m.Table.GetCurrItem()+1, - m.TotalCount, - len(m.Table.Rows), - ) - } - pager := m.Ctx.Styles.ListViewPort.PagerStyle.Render(pagerContent) - return pager -} - func (m *BaseModel) GetPromptConfirmation() string { if m.IsPromptConfirmationShown { var prompt string