File: list.go

package info (click to toggle)
tea-cli 0.9.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,364 kB
  • sloc: makefile: 120; sh: 17
file content (132 lines) | stat: -rw-r--r-- 3,732 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// Copyright 2020 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.

package times

import (
	"fmt"
	"strings"
	"time"

	"code.gitea.io/tea/cmd/flags"
	"code.gitea.io/tea/modules/context"
	"code.gitea.io/tea/modules/print"
	"code.gitea.io/tea/modules/utils"

	"code.gitea.io/sdk/gitea"
	"github.com/araddon/dateparse"
	"github.com/urfave/cli/v2"
)

// NOTE: not using NewCsvFlag, as we don't want an alias & default value.
var timeFieldsFlag = &flags.CsvFlag{
	AvailableFields: print.TrackedTimeFields,
	StringFlag: cli.StringFlag{
		Name: "fields",
		Usage: fmt.Sprintf(`Comma-separated list of fields to print. Available values:
	%s
`, strings.Join(print.TrackedTimeFields, ",")),
	},
}

// CmdTrackedTimesList represents a sub command of times to list them
var CmdTrackedTimesList = cli.Command{
	Name:    "list",
	Aliases: []string{"ls"},
	Action:  RunTimesList,
	Usage:   "List tracked times on issues & pulls",
	Description: `List tracked times, across repos, or on a single repo or issue:
- given a username all times on a repo by that user are shown,
- given a issue index with '#' prefix, all times on that issue are listed,
- given --mine, your times are listed across all repositories.
Depending on your permissions on the repository, only your own tracked times might be listed.`,
	ArgsUsage: "[username | #issue]",

	Flags: append([]cli.Flag{
		&cli.StringFlag{
			Name:    "from",
			Aliases: []string{"f"},
			Usage:   "Show only times tracked after this date",
		},
		&cli.StringFlag{
			Name:    "until",
			Aliases: []string{"u"},
			Usage:   "Show only times tracked before this date",
		},
		&cli.BoolFlag{
			Name:    "total",
			Aliases: []string{"t"},
			Usage:   "Print the total duration at the end",
		},
		&cli.BoolFlag{
			Name:    "mine",
			Aliases: []string{"m"},
			Usage:   "Show all times tracked by you across all repositories (overrides command arguments)",
		},
		timeFieldsFlag,
	}, flags.AllDefaultFlags...),
}

// RunTimesList list repositories
func RunTimesList(cmd *cli.Context) error {
	ctx := context.InitCommand(cmd)
	ctx.Ensure(context.CtxRequirement{RemoteRepo: true})
	client := ctx.Login.Client()

	var times []*gitea.TrackedTime
	var err error
	var from, until time.Time
	var fields []string

	if ctx.IsSet("from") {
		from, err = dateparse.ParseLocal(ctx.String("from"))
		if err != nil {
			return err
		}
	}
	if ctx.IsSet("until") {
		until, err = dateparse.ParseLocal(ctx.String("until"))
		if err != nil {
			return err
		}
	}

	opts := gitea.ListTrackedTimesOptions{Since: from, Before: until}

	user := ctx.Args().First()
	if ctx.Bool("mine") {
		times, _, err = client.GetMyTrackedTimes()
		fields = []string{"created", "repo", "issue", "duration"}
	} else if user == "" {
		// get all tracked times on the repo
		times, _, err = client.ListRepoTrackedTimes(ctx.Owner, ctx.Repo, opts)
		fields = []string{"created", "issue", "user", "duration"}
	} else if strings.HasPrefix(user, "#") {
		// get all tracked times on the specified issue
		issue, err := utils.ArgToIndex(user)
		if err != nil {
			return err
		}
		times, _, err = client.ListIssueTrackedTimes(ctx.Owner, ctx.Repo, issue, opts)
		fields = []string{"created", "user", "duration"}
	} else {
		// get all tracked times by the specified user
		opts.User = user
		times, _, err = client.ListRepoTrackedTimes(ctx.Owner, ctx.Repo, opts)
		fields = []string{"created", "issue", "duration"}
	}

	if err != nil {
		return err
	}

	if ctx.IsSet("fields") {
		if fields, err = timeFieldsFlag.GetValues(cmd); err != nil {
			return err
		}
	}

	print.TrackedTimesList(times, ctx.Output, fields, ctx.Bool("total"))
	return nil
}