package commands import ( "strings" "encoding/json" "github.com/spf13/cobra" "github.com/git-bug/git-bug/entities/bug" "github.com/git-bug/git-bug/entity" "github.com/git-bug/git-bug/commands/execenv" "github.com/git-bug/git-bug/query" ) type exportOptions struct { actorQuery []string authorQuery []string labelQuery []string noQuery []string participantQuery []string queryOptions []string statusQuery []string titleQuery []string sortBy string sortDirection string } func newExportCommand(env *execenv.Env) *cobra.Command { options := exportOptions{} cmd := &cobra.Command{ Use: "export [QUERY]", Short: "Export bugs as a series of operations.", Long: `Export bugs as a series of operations. The output format is NDJSON (Newline delimited JSON). You can pass an additional query to filter and order the list. This query can be expressed either with a simple query language, flags, a natural language full text search, or a combination of the aforementioned.`, Example: `See ls`, PreRunE: execenv.LoadBackend(env), PostRunE: execenv.CloseBackend(env, func(cmd *cobra.Command, args []string) error { return runExport(env, options, args) }), } flags := cmd.Flags() flags.SortFlags = false flags.StringSliceVarP(&options.statusQuery, "status", "s", nil, "Filter by status. Valid values are [open,closed]") flags.StringSliceVarP(&options.authorQuery, "author", "a", nil, "Filter by author") flags.StringSliceVarP(&options.participantQuery, "participant", "p", nil, "Filter by participant") flags.StringSliceVarP(&options.actorQuery, "actor", "A", nil, "Filter by actor") flags.StringSliceVarP(&options.labelQuery, "label", "l", nil, "Filter by label") flags.StringSliceVarP(&options.titleQuery, "title", "t", nil, "Filter by title") flags.StringSliceVarP(&options.noQuery, "no", "n", nil, "Filter by absence of something. Valid values are [label]") flags.StringVarP(&options.sortBy, "by", "b", "creation", "Sort the results by a characteristic. Valid values are [id,creation,edit]") flags.StringVarP(&options.sortDirection, "direction", "d", "asc", "Select the sorting direction. Valid values are [asc,desc]") return cmd } func runExport(env *execenv.Env, opts exportOptions, args []string) error { var q *query.Query var err error if len(args) >= 1 { q, err = query.Parse(strings.Join(args, " ")) if err != nil { return err } } else { q = query.NewQuery() } // FIXME we are throwing away opts! allIds, err := env.Backend.Bugs().Query(q) if err != nil { return err } out := json.NewEncoder(env.Out) for _, id := range allIds { b, err := env.Backend.Bugs().Resolve(id) if err != nil { return err } wrapper := struct { Id entity.Id `json:"id"` Operations []bug.Operation `json:"operations"` }{ Id: id, Operations: b.Snapshot().Operations, } err = out.Encode(wrapper) if err != nil { return err } } return nil }