/
config.go
127 lines (100 loc) · 3.2 KB
/
config.go
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
/*
Copyright 2018 Wilhelm Peter Püschel
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package main
import (
"encoding/json"
"flag"
"fmt"
"io/ioutil"
"log"
"os"
"path/filepath"
)
// Provider contains all the necessary config settings of a git provider
type Provider struct {
Token string `json:"token"`
TokenName string `json:"token_name"`
HostBaseURL string `json:"host_base_url"`
User string `json:"user"`
Password string `json:"password"`
GroupName string `json:"group_name"`
CloneProtocol string `json:"clone_protocol"`
}
// Config contains all necessary config settings
type Config struct {
Provider map[string]Provider `json:"provider"`
repoName string
localdir string
configfile string
newrepo bool
list bool
listLong bool
private bool
del bool
}
func (c *Config) readFlags() error {
//var mandatoryFlags map[string]struct{}
// cmd line flags
flag.StringVar(&c.configfile, "c", fmt.Sprintf("%s/%s", os.Getenv("HOME"), ".gitrc.json"), "Config file")
flag.StringVar(&c.repoName, "n", "", "Repository name")
flag.BoolVar(&c.list, "l", false, "List remote repository names and last commit timestamp")
flag.BoolVar(&c.listLong, "L", false, "List remote repository names, cloning urls and last commit timestamp")
flag.BoolVar(&c.private, "P", false, "Create a private repository")
flag.BoolVar(&c.del, "D", false, "Delete a remote repository, has to be used with -n")
flag.BoolVar(&c.newrepo, "N", false, "Create a local and remote repo based on the current directory name")
flag.Parse()
return nil
}
func (c *Config) readFile(fname string) error {
// Read raw config file -> []byte
rawConfFile, err := ioutil.ReadFile(fname)
if err != nil {
log.Fatalf("Could not read config file %s: %s\n", fname, err)
return err
}
// Unmarshall json from rawConfFile into giteaconf
err = json.Unmarshal(rawConfFile, &c.Provider)
if err != nil {
log.Fatalf("Could not unmarshal json from %s: %s\n", fname, err)
return err
}
return nil
}
// NewConfig creates and returns a new config object
func NewConfig() (*Config, error) {
c := new(Config)
err := c.readFlags()
if err != nil {
return &Config{}, err
}
// Check if we have a config file
if _, err = os.Stat(c.configfile); err == nil {
err = c.readFile(c.configfile)
if err != nil {
return &Config{}, err
}
} else {
log.Fatalf("Could not read config file %s: %s", c.configfile, err)
return &Config{}, err
}
// if -N is set, we dont need a repo name and make the current directory name the reponame
if c.newrepo {
dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
if err != nil {
return &Config{}, err
}
_, c.repoName = filepath.Split(dir)
c.localdir = dir
}
return c, nil
}