mirror of
https://github.com/onyx-and-iris/ignr.git
synced 2025-08-07 11:41:52 +00:00
Compare commits
6 Commits
5b389aa9dc
...
a6fb3c69c7
Author | SHA1 | Date | |
---|---|---|---|
a6fb3c69c7 | |||
cf93198462 | |||
e1875fb894 | |||
e1b879f54c | |||
f51302a945 | |||
11fe797f3f |
4
.gitignore
vendored
4
.gitignore
vendored
@ -1,4 +1,4 @@
|
|||||||
# Generated by ignr-cli: github.com/onyx-and-iris/ignr-cli
|
# Generated by ignr: github.com/onyx-and-iris/ignr
|
||||||
|
|
||||||
## Go ##
|
## Go ##
|
||||||
# If you prefer the allow list template instead of the deny list, see community template:
|
# If you prefer the allow list template instead of the deny list, see community template:
|
||||||
@ -36,4 +36,4 @@ go.work.sum
|
|||||||
# .idea/
|
# .idea/
|
||||||
# .vscode/
|
# .vscode/
|
||||||
|
|
||||||
# End of ignr-cli
|
# End of ignr
|
||||||
|
@ -20,9 +20,10 @@ go install github.com/onyx-and-iris/ignr@latest
|
|||||||
|
|
||||||
- --token/-t: GitHub authentication token
|
- --token/-t: GitHub authentication token
|
||||||
- note, this tool can be used **without** authenticating but rate limiting will be stricter.
|
- note, this tool can be used **without** authenticating but rate limiting will be stricter.
|
||||||
- --height/-H: Height of the selection prompt (default 20)
|
- --height/-H: Height of the selection prompt (default 10)
|
||||||
- --filter/-f: Type of filter to apply to the list of templates (default startswith)
|
- --filter/-f: Type of filter to apply to the list of templates (default startswith)
|
||||||
- may be one of (startswith, contains)
|
- may be one of (startswith, contains)
|
||||||
|
- --start-search/-s: Start the prompt in search mode (default false)
|
||||||
|
|
||||||
*environment variables*
|
*environment variables*
|
||||||
|
|
||||||
@ -30,8 +31,9 @@ go install github.com/onyx-and-iris/ignr@latest
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
export IGNR_TOKEN=<API Token>
|
export IGNR_TOKEN=<API Token>
|
||||||
export IGNR_HEIGHT=20
|
export IGNR_HEIGHT=10
|
||||||
export IGNR_FILTER=startswith
|
export IGNR_FILTER=startswith
|
||||||
|
export IGNR_START_SEARCH=false
|
||||||
```
|
```
|
||||||
|
|
||||||
## Commands
|
## Commands
|
||||||
@ -44,7 +46,7 @@ Trigger the selection prompt.
|
|||||||
ignr new
|
ignr new
|
||||||
```
|
```
|
||||||
|
|
||||||
The prompt filter can be activated by pressing `/`:
|
Search mode can be activated by pressing `/`:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
@ -2,13 +2,11 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/spf13/viper"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// filterFunc returns a function that filters templates based on the specified filter type.
|
// filterFunc returns a function that filters templates based on the specified filter type.
|
||||||
func filterFunc(templates []string) func(input string, index int) bool {
|
func filterFunc(templates []string, filterType string) func(input string, index int) bool {
|
||||||
switch viper.GetString("filter") {
|
switch filterType {
|
||||||
case "contains":
|
case "contains":
|
||||||
return func(input string, index int) bool {
|
return func(input string, index int) bool {
|
||||||
return strings.Contains(strings.ToLower(templates[index]), strings.ToLower(input))
|
return strings.Contains(strings.ToLower(templates[index]), strings.ToLower(input))
|
||||||
|
2
go.mod
2
go.mod
@ -1,4 +1,4 @@
|
|||||||
module github.com/onyx-and-iris/ignr-cli
|
module github.com/onyx-and-iris/ignr
|
||||||
|
|
||||||
go 1.24.3
|
go 1.24.3
|
||||||
|
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 10 KiB |
11
main.go
11
main.go
@ -18,9 +18,9 @@ var version string // Version of the CLI, set during build time
|
|||||||
|
|
||||||
// rootCmd represents the base command when called without any subcommands.
|
// rootCmd represents the base command when called without any subcommands.
|
||||||
var rootCmd = &cobra.Command{
|
var rootCmd = &cobra.Command{
|
||||||
Use: "ignr-cli",
|
Use: "ignr",
|
||||||
Short: "A command-line interface for generating .gitignore files",
|
Short: "A command-line interface for generating .gitignore files",
|
||||||
Long: `ignr-cli is a command-line interface for generating .gitignore files.
|
Long: `ignr is a command-line interface for generating .gitignore files.
|
||||||
It allows users to easily create and manage .gitignore files for various programming languages and frameworks.
|
It allows users to easily create and manage .gitignore files for various programming languages and frameworks.
|
||||||
You may also list available templates and generate .gitignore files based on those templates.`,
|
You may also list available templates and generate .gitignore files based on those templates.`,
|
||||||
SilenceUsage: true,
|
SilenceUsage: true,
|
||||||
@ -43,7 +43,7 @@ You may also list available templates and generate .gitignore files based on tho
|
|||||||
}
|
}
|
||||||
version = strings.Split(info.Main.Version, "-")[0]
|
version = strings.Split(info.Main.Version, "-")[0]
|
||||||
}
|
}
|
||||||
fmt.Printf("ignr-cli version: %s\n", version)
|
fmt.Printf("ignr version: %s\n", version)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,17 +54,20 @@ You may also list available templates and generate .gitignore files based on tho
|
|||||||
// init initialises the root command and its flags.
|
// init initialises the root command and its flags.
|
||||||
func init() {
|
func init() {
|
||||||
rootCmd.PersistentFlags().StringP("token", "t", "", "GitHub authentication token")
|
rootCmd.PersistentFlags().StringP("token", "t", "", "GitHub authentication token")
|
||||||
rootCmd.PersistentFlags().IntP("height", "H", 20, "Height of the selection prompt")
|
rootCmd.PersistentFlags().IntP("height", "H", 10, "Height of the selection prompt")
|
||||||
rootCmd.PersistentFlags().
|
rootCmd.PersistentFlags().
|
||||||
StringP("filter", "f", "startswith", "Type of filter to apply to the list of templates (e.g., 'startswith', 'contains')")
|
StringP("filter", "f", "startswith", "Type of filter to apply to the list of templates (e.g., 'startswith', 'contains')")
|
||||||
|
rootCmd.PersistentFlags().BoolP("start-search", "s", false, "Start the prompt in search mode")
|
||||||
|
|
||||||
rootCmd.Flags().BoolP("version", "v", false, "Print the version of the CLI")
|
rootCmd.Flags().BoolP("version", "v", false, "Print the version of the CLI")
|
||||||
|
|
||||||
|
viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_"))
|
||||||
viper.SetEnvPrefix("IGNR")
|
viper.SetEnvPrefix("IGNR")
|
||||||
viper.AutomaticEnv()
|
viper.AutomaticEnv()
|
||||||
viper.BindPFlag("token", rootCmd.PersistentFlags().Lookup("token"))
|
viper.BindPFlag("token", rootCmd.PersistentFlags().Lookup("token"))
|
||||||
viper.BindPFlag("height", rootCmd.PersistentFlags().Lookup("height"))
|
viper.BindPFlag("height", rootCmd.PersistentFlags().Lookup("height"))
|
||||||
viper.BindPFlag("filter", rootCmd.PersistentFlags().Lookup("filter"))
|
viper.BindPFlag("filter", rootCmd.PersistentFlags().Lookup("filter"))
|
||||||
|
viper.BindPFlag("start-search", rootCmd.PersistentFlags().Lookup("start-search"))
|
||||||
}
|
}
|
||||||
|
|
||||||
// main is the entry point of the application.
|
// main is the entry point of the application.
|
||||||
|
33
new.go
33
new.go
@ -29,11 +29,21 @@ func init() {
|
|||||||
rootCmd.AddCommand(newCmd)
|
rootCmd.AddCommand(newCmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type promptConfig struct {
|
||||||
|
Height int
|
||||||
|
StartSearch bool
|
||||||
|
FilterType string
|
||||||
|
}
|
||||||
|
|
||||||
// runNewCommand is the handler for the 'new' command.
|
// runNewCommand is the handler for the 'new' command.
|
||||||
// It retrieves the selected .gitignore template from GitHub and writes it to the .gitignore file.
|
// It retrieves the selected .gitignore template from GitHub and writes it to the .gitignore file.
|
||||||
func runNewCommand(cmd *cobra.Command, _ []string) error {
|
func runNewCommand(cmd *cobra.Command, _ []string) error {
|
||||||
height := viper.GetInt("height")
|
pc := promptConfig{
|
||||||
if height <= 0 {
|
Height: viper.GetInt("height"),
|
||||||
|
StartSearch: viper.GetBool("start-search"),
|
||||||
|
FilterType: viper.GetString("filter"),
|
||||||
|
}
|
||||||
|
if pc.Height <= 0 {
|
||||||
return errors.New("height must be a positive integer")
|
return errors.New("height must be a positive integer")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,7 +52,7 @@ func runNewCommand(cmd *cobra.Command, _ []string) error {
|
|||||||
return errors.New("failed to get GitHub client from context")
|
return errors.New("failed to get GitHub client from context")
|
||||||
}
|
}
|
||||||
|
|
||||||
content, err := runPrompt(client, height)
|
content, err := runPrompt(client, &pc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error running selection prompt: %w", err)
|
return fmt.Errorf("error running selection prompt: %w", err)
|
||||||
}
|
}
|
||||||
@ -61,7 +71,7 @@ func runNewCommand(cmd *cobra.Command, _ []string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// runPrompt is a helper function to run the selection prompt for .gitignore templates.
|
// runPrompt is a helper function to run the selection prompt for .gitignore templates.
|
||||||
func runPrompt(client *github.Client, height int) (*github.Gitignore, error) {
|
func runPrompt(client *github.Client, pc *promptConfig) (*github.Gitignore, error) {
|
||||||
templates, _, err := client.Gitignores.List(context.Background())
|
templates, _, err := client.Gitignores.List(context.Background())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error retrieving gitignore template list: %w", err)
|
return nil, fmt.Errorf("error retrieving gitignore template list: %w", err)
|
||||||
@ -75,11 +85,12 @@ func runPrompt(client *github.Client, height int) (*github.Gitignore, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
prompt := promptui.Select{
|
prompt := promptui.Select{
|
||||||
Label: "Select a .gitignore template",
|
Label: "Select a .gitignore template",
|
||||||
Items: templates,
|
Items: templates,
|
||||||
Templates: selectTemplates,
|
Templates: selectTemplates,
|
||||||
Size: height,
|
Size: pc.Height,
|
||||||
Searcher: filterFunc(templates),
|
Searcher: filterFunc(templates, pc.FilterType),
|
||||||
|
StartInSearchMode: pc.StartSearch,
|
||||||
}
|
}
|
||||||
|
|
||||||
i, _, err := prompt.Run()
|
i, _, err := prompt.Run()
|
||||||
@ -97,7 +108,7 @@ func runPrompt(client *github.Client, height int) (*github.Gitignore, error) {
|
|||||||
|
|
||||||
// commitGitignore writes the content of the selected gitignore template to the .gitignore file.
|
// commitGitignore writes the content of the selected gitignore template to the .gitignore file.
|
||||||
func commitGitignore(content *github.Gitignore, w io.Writer) error {
|
func commitGitignore(content *github.Gitignore, w io.Writer) error {
|
||||||
if _, err := fmt.Fprintf(w, "# Generated by ignr-cli: github.com/onyx-and-iris/ignr-cli\n\n## %s ##\n", content.GetName()); err != nil {
|
if _, err := fmt.Fprintf(w, "# Generated by ignr: github.com/onyx-and-iris/ignr\n\n## %s ##\n", content.GetName()); err != nil {
|
||||||
return fmt.Errorf("error writing header to file '%s': %w", gitignoreFileName, err)
|
return fmt.Errorf("error writing header to file '%s': %w", gitignoreFileName, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,7 +116,7 @@ func commitGitignore(content *github.Gitignore, w io.Writer) error {
|
|||||||
return fmt.Errorf("error writing to file '%s': %w", gitignoreFileName, err)
|
return fmt.Errorf("error writing to file '%s': %w", gitignoreFileName, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := fmt.Fprintf(w, "\n# End of ignr-cli\n"); err != nil {
|
if _, err := fmt.Fprintf(w, "\n# End of ignr\n"); err != nil {
|
||||||
return fmt.Errorf("error writing footer to file '%s': %w", gitignoreFileName, err)
|
return fmt.Errorf("error writing footer to file '%s': %w", gitignoreFileName, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user