Skip to content

Commit 7d821a9

Browse files
committed
init
0 parents  commit 7d821a9

File tree

16 files changed

+1163
-0
lines changed

16 files changed

+1163
-0
lines changed

.editorconfig

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# http://editorconfig.org
2+
root = true
3+
4+
# Unix-style newlines with a newline ending every file
5+
[*]
6+
indent_style = space
7+
indent_size = 2
8+
charset = utf-8
9+
end_of_line = lf
10+
insert_final_newline = true
11+
trim_trailing_whitespace = true
12+
13+
# Tab indentation (no size specified)
14+
[Makefile]
15+
indent_style = tab
16+
17+
# Golang uses tabs by default
18+
[*.go]
19+
indent_style = tab

.gitignore

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
*.iml
2+
.idea/
3+
.ipr
4+
.iws
5+
*~
6+
~*
7+
*.diff
8+
*.patch
9+
*.bak
10+
.DS_Store
11+
Thumbs.db
12+
.project
13+
.*proj
14+
.svn/
15+
*.swp
16+
*.swo
17+
*.log
18+
*.sublime-project
19+
*.sublime-workspace
20+
.buildpath
21+
.settings
22+
vendor/
23+
giter

.goreleaser.yml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
builds:
2+
-
3+
main: ./main.go
4+
binary: giter
5+
ldflags: -s -w -X main.version={{.Version}}
6+
goos:
7+
- darwin
8+
- linux
9+
- windows
10+
- freebsd
11+
- netbsd
12+
- openbsd
13+
goarch:
14+
- amd64
15+
- 386
16+
changelog:
17+
sort: asc
18+
filters:
19+
exclude:
20+
- '^docs:'
21+
- '^test:'

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Giter - Git users manager
2+
======
3+
4+
> Giter is a git users manager.

cmd/add.go

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package cmd
2+
3+
import (
4+
"fmt"
5+
"github.com/jsmartx/giter/git"
6+
"github.com/jsmartx/giter/store"
7+
"github.com/jsmartx/giter/util"
8+
"github.com/urfave/cli"
9+
)
10+
11+
func getUser() *git.User {
12+
g, err := git.New(".")
13+
if err != nil {
14+
return git.GlobalUser()
15+
}
16+
return g.GetUser()
17+
}
18+
19+
func getHost() string {
20+
g, err := git.New(".")
21+
if err != nil {
22+
return "ssh://github.com"
23+
}
24+
urls, err := g.Remotes()
25+
if err != nil || len(urls) == 0 {
26+
return "ssh://github.com"
27+
}
28+
return fmt.Sprintf("%s://%s", urls[0].Scheme, urls[0].Host)
29+
}
30+
31+
func Add(c *cli.Context) error {
32+
u := getUser()
33+
nameCfg := &util.PromptConfig{
34+
Prompt: "user name: ",
35+
}
36+
emailCfg := &util.PromptConfig{
37+
Prompt: "user email: ",
38+
}
39+
urlCfg := &util.PromptConfig{
40+
Prompt: "git server: ",
41+
Default: getHost(),
42+
}
43+
if u != nil {
44+
nameCfg.Default = u.Name
45+
emailCfg.Default = u.Email
46+
}
47+
name := util.Prompt(nameCfg)
48+
email := util.Prompt(emailCfg)
49+
urlStr := util.Prompt(urlCfg)
50+
51+
url, err := util.ParseURL(urlStr)
52+
util.CheckError(err)
53+
54+
host, port := util.SplitHostPort(url.Host)
55+
user := &store.User{
56+
Name: name,
57+
Email: email,
58+
Scheme: url.Scheme,
59+
Host: host,
60+
Port: port,
61+
}
62+
options := &store.Options{}
63+
if user.IsSSH() {
64+
pvtPath, err := util.SysSSHConfig()
65+
if err == nil {
66+
fmt.Printf("There is a SSH key: %s\nYou can use this key or generate a new SSH key.\n", pvtPath)
67+
txt := util.Prompt(&util.PromptConfig{
68+
Prompt: fmt.Sprintf("Do you want to use '%s' [Y/n]? ", pvtPath),
69+
})
70+
if txt == "y" || txt == "Y" {
71+
options.KeyPath = pvtPath
72+
}
73+
}
74+
} else {
75+
pwd := util.Prompt(&util.PromptConfig{
76+
Prompt: "user password: ",
77+
Silent: true,
78+
})
79+
options.Password = pwd
80+
}
81+
s := store.New()
82+
return s.Add(user, options)
83+
}

cmd/delete.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package cmd
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"github.com/jsmartx/giter/store"
7+
"github.com/jsmartx/giter/util"
8+
"github.com/urfave/cli"
9+
"strconv"
10+
)
11+
12+
func Delete(c *cli.Context) error {
13+
name := c.Args().First()
14+
if name == "" {
15+
name = util.Prompt(&util.PromptConfig{
16+
Prompt: "user name: ",
17+
})
18+
}
19+
s := store.New()
20+
users := s.List(name, true)
21+
if len(users) == 0 {
22+
return errors.New("User not found!")
23+
}
24+
u := users[0]
25+
if len(users) > 1 {
26+
fmt.Printf("There are %d users:\n", len(users))
27+
for i, item := range users {
28+
fmt.Printf("%4d) %s\n", i+1, item.String())
29+
}
30+
str := util.Prompt(&util.PromptConfig{
31+
Prompt: "Enter number to select user: ",
32+
})
33+
i, err := strconv.Atoi(str)
34+
if err != nil {
35+
return err
36+
}
37+
if i < 1 || i > len(users) {
38+
return errors.New("Out of range")
39+
}
40+
u = users[i-1]
41+
}
42+
txt := util.Prompt(&util.PromptConfig{
43+
Prompt: fmt.Sprintf("Are you sure to delete '%s' [Y/n]? ", u.String()),
44+
})
45+
if txt != "y" && txt != "Y" {
46+
return nil
47+
}
48+
return s.Delete(u)
49+
}

cmd/list.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package cmd
2+
3+
import (
4+
"fmt"
5+
"github.com/jsmartx/giter/git"
6+
"github.com/jsmartx/giter/store"
7+
"github.com/urfave/cli"
8+
)
9+
10+
func List(c *cli.Context) error {
11+
g, err := git.New(".")
12+
var cur *git.User
13+
if err == nil {
14+
cur = g.GetUser()
15+
}
16+
filter := c.Args().First()
17+
s := store.New()
18+
users := s.List(filter, false)
19+
for _, u := range users {
20+
if cur != nil && cur.Name == u.Name && cur.Email == u.Email {
21+
fmt.Printf(" * %s\n", u.String())
22+
} else {
23+
fmt.Printf(" %s\n", u.String())
24+
}
25+
}
26+
return nil
27+
}

cmd/update.go

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package cmd
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"github.com/jsmartx/giter/store"
7+
"github.com/jsmartx/giter/util"
8+
"github.com/urfave/cli"
9+
"strconv"
10+
)
11+
12+
func Update(c *cli.Context) error {
13+
name := c.Args().First()
14+
if name == "" {
15+
name = util.Prompt(&util.PromptConfig{
16+
Prompt: "user name: ",
17+
})
18+
}
19+
s := store.New()
20+
users := s.List(name, true)
21+
if len(users) == 0 {
22+
return errors.New("User not found!")
23+
}
24+
u := users[0]
25+
if len(users) > 1 {
26+
fmt.Printf("There are %d users:\n", len(users))
27+
for i, item := range users {
28+
fmt.Printf("%4d) %s\n", i+1, item.String())
29+
}
30+
str := util.Prompt(&util.PromptConfig{
31+
Prompt: "Enter number to select user: ",
32+
})
33+
i, err := strconv.Atoi(str)
34+
if err != nil {
35+
return err
36+
}
37+
if i < 1 || i > len(users) {
38+
return errors.New("Out of range")
39+
}
40+
u = users[i-1]
41+
}
42+
email := util.Prompt(&util.PromptConfig{
43+
Prompt: "user email: ",
44+
Default: u.Email,
45+
})
46+
urlStr := util.Prompt(&util.PromptConfig{
47+
Prompt: "git server: ",
48+
Default: u.FullHost(),
49+
})
50+
51+
url, err := util.ParseURL(urlStr)
52+
util.CheckError(err)
53+
54+
host, port := util.SplitHostPort(url.Host)
55+
user := &store.User{
56+
Name: name,
57+
Email: email,
58+
Scheme: url.Scheme,
59+
Host: host,
60+
Port: port,
61+
}
62+
options := &store.Options{}
63+
if user.IsSSH() {
64+
if u.IsSSH() {
65+
txt := util.Prompt(&util.PromptConfig{
66+
Prompt: fmt.Sprintf("Regenerate the SSH key [Y/n]? "),
67+
})
68+
if txt != "y" && txt != "Y" {
69+
p, err := u.KeyPath()
70+
if err != nil {
71+
return err
72+
}
73+
options.KeyPath = p
74+
}
75+
}
76+
} else {
77+
if !u.IsSSH() {
78+
txt := util.Prompt(&util.PromptConfig{
79+
Prompt: fmt.Sprintf("Reset password [Y/n]? "),
80+
})
81+
if txt == "y" || txt == "Y" {
82+
pwd := util.Prompt(&util.PromptConfig{
83+
Prompt: "user password: ",
84+
Silent: true,
85+
})
86+
options.Password = pwd
87+
}
88+
} else {
89+
pwd := util.Prompt(&util.PromptConfig{
90+
Prompt: "user password: ",
91+
Silent: true,
92+
})
93+
options.Password = pwd
94+
}
95+
}
96+
return s.Update(u.Hash(), user, options)
97+
}

cmd/use.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package cmd
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"github.com/jsmartx/giter/git"
7+
"github.com/jsmartx/giter/ssh"
8+
"github.com/jsmartx/giter/store"
9+
"github.com/jsmartx/giter/util"
10+
"github.com/urfave/cli"
11+
"strconv"
12+
)
13+
14+
func Use(c *cli.Context) error {
15+
g, err := git.New(".")
16+
if err != nil {
17+
return err
18+
}
19+
name := c.Args().First()
20+
if name == "" {
21+
name = util.Prompt(&util.PromptConfig{
22+
Prompt: "user name: ",
23+
})
24+
}
25+
s := store.New()
26+
users := s.List(name, true)
27+
if len(users) == 0 {
28+
return errors.New("User not found!")
29+
}
30+
u := users[0]
31+
if len(users) > 1 {
32+
fmt.Printf("There are %d users:\n", len(users))
33+
for i, item := range users {
34+
fmt.Printf("%4d) %s\n", i+1, item.String())
35+
}
36+
str := util.Prompt(&util.PromptConfig{
37+
Prompt: "Enter number to select user: ",
38+
})
39+
i, err := strconv.Atoi(str)
40+
if err != nil {
41+
return err
42+
}
43+
if i < 1 || i > len(users) {
44+
return errors.New("Out of range")
45+
}
46+
u = users[i-1]
47+
}
48+
if u.IsSSH() {
49+
keyPath, err := u.KeyPath()
50+
if err != nil {
51+
fmt.Println(err)
52+
}
53+
s := ssh.New()
54+
err = s.SetHost(&ssh.Host{
55+
Key: u.Host,
56+
Hostname: u.Host,
57+
Port: u.Port,
58+
IdentityFile: keyPath,
59+
})
60+
if err != nil {
61+
fmt.Println(err)
62+
}
63+
}
64+
return g.SetUser(u.Name, u.Email)
65+
}

0 commit comments

Comments
 (0)