It goes into the repo or it gets the hose again.
This commit is contained in:
parent
96cadaf4df
commit
197e28024b
5 changed files with 143 additions and 21 deletions
|
|
@ -4,18 +4,19 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"flag"
|
"flag"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"fmt"
|
"strings"
|
||||||
"text/template"
|
"text/template"
|
||||||
|
|
||||||
"otremblay.com/jkl"
|
"otremblay.com/jkl"
|
||||||
)
|
)
|
||||||
|
|
||||||
type CreateCmd struct {
|
type CreateCmd struct {
|
||||||
args []string
|
args []string
|
||||||
project string
|
project string
|
||||||
file string
|
file string
|
||||||
issuetype string
|
issuetype string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -61,7 +62,16 @@ func (ccmd *CreateCmd) Create() error {
|
||||||
}
|
}
|
||||||
var iss *jkl.JiraIssue
|
var iss *jkl.JiraIssue
|
||||||
// TODO: Evil badbad don't do this.
|
// TODO: Evil badbad don't do this.
|
||||||
em := &jkl.EditMeta{Fields: cm.Projects[0].IssueTypes[0].Fields}
|
var isst = cm.Projects[0].IssueTypes[0].Fields
|
||||||
|
for _, v := range cm.Projects[0].IssueTypes {
|
||||||
|
if strings.ToLower(isstype) == strings.ToLower(v.Name) {
|
||||||
|
isst = v.Fields
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
em := &jkl.EditMeta{Fields: isst}
|
||||||
|
|
||||||
if ccmd.file != "" {
|
if ccmd.file != "" {
|
||||||
iss, err = GetIssueFromFile(ccmd.file, b, em)
|
iss, err = GetIssueFromFile(ccmd.file, b, em)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
|
@ -22,16 +21,21 @@ import (
|
||||||
// [System.get_env("EDITOR"), "nano", "vim", "vi"]
|
// [System.get_env("EDITOR"), "nano", "vim", "vi"]
|
||||||
// |> Enum.find(nil, fn (ed) -> System.find_executable(ed) != nil end)
|
// |> Enum.find(nil, fn (ed) -> System.find_executable(ed) != nil end)
|
||||||
// end
|
// end
|
||||||
var editors = []string{os.Getenv("EDITOR"), "nano", "vim", "vi"}
|
var editors = []string{"nano", "vim", "vi"}
|
||||||
|
|
||||||
// GetEditor returns the path to an editor, taking $EDITOR in account
|
// GetEditor returns the path to an editor, taking $EDITOR in account
|
||||||
func GetEditor() string {
|
func GetEditor() string {
|
||||||
|
if ed := os.Getenv("EDITOR"); ed != "" {
|
||||||
|
return ed
|
||||||
|
}
|
||||||
|
if ed := os.Getenv("VISUAL"); ed != "" {
|
||||||
|
return ed
|
||||||
|
}
|
||||||
for _, ed := range editors {
|
for _, ed := range editors {
|
||||||
if p, err := exec.LookPath(ed); err == nil {
|
if p, err := exec.LookPath(ed); err == nil {
|
||||||
return p
|
return p
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
log.Fatal("No editor available; use flags.")
|
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -105,7 +109,7 @@ func GetIssueFromFile(filename string, initial io.Reader, editMeta *jkl.EditMeta
|
||||||
var spacex = regexp.MustCompile(`\s`)
|
var spacex = regexp.MustCompile(`\s`)
|
||||||
|
|
||||||
func IssueFromReader(f io.Reader, editMeta *jkl.EditMeta) *jkl.JiraIssue {
|
func IssueFromReader(f io.Reader, editMeta *jkl.EditMeta) *jkl.JiraIssue {
|
||||||
iss := &jkl.JiraIssue{Fields: &jkl.Fields{}}
|
iss := &jkl.JiraIssue{Fields: &jkl.Fields{ExtraFields: map[string]interface{}{}}}
|
||||||
riss := reflect.ValueOf(iss).Elem()
|
riss := reflect.ValueOf(iss).Elem()
|
||||||
fieldsField := riss.FieldByName("Fields").Elem()
|
fieldsField := riss.FieldByName("Fields").Elem()
|
||||||
currentField := reflect.Value{}
|
currentField := reflect.Value{}
|
||||||
|
|
@ -157,6 +161,25 @@ func IssueFromReader(f io.Reader, editMeta *jkl.EditMeta) *jkl.JiraIssue {
|
||||||
}
|
}
|
||||||
} else if editMeta != nil {
|
} else if editMeta != nil {
|
||||||
// If it's not valid, throw it at the createmeta. It will probably end up in ExtraFields.
|
// If it's not valid, throw it at the createmeta. It will probably end up in ExtraFields.
|
||||||
|
val := strings.TrimSpace(strings.Join(parts[1:], ":"))
|
||||||
|
for fieldname, m := range editMeta.Fields {
|
||||||
|
var something interface{} = val
|
||||||
|
if strings.ToLower(m.Name) == strings.ToLower(potentialField) {
|
||||||
|
name := fieldname
|
||||||
|
for _, av := range m.AllowedValues {
|
||||||
|
if strings.ToLower(av.Name) == strings.ToLower(val) {
|
||||||
|
something = av
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if m.Schema.CustomId > 0 {
|
||||||
|
name = fmt.Sprintf("custom_%d", m.Schema.CustomId)
|
||||||
|
}
|
||||||
|
iss.Fields.ExtraFields[name] = something
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
if currentField.IsValid() {
|
if currentField.IsValid() {
|
||||||
|
|
@ -168,6 +191,8 @@ func IssueFromReader(f io.Reader, editMeta *jkl.EditMeta) *jkl.JiraIssue {
|
||||||
currentField.SetString(newvalue)
|
currentField.SetString(newvalue)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iss.EditMeta = editMeta
|
||||||
return iss
|
return iss
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,11 +19,11 @@ func (t *TaskCmd) Handle() error {
|
||||||
return t.Get(t.args[0])
|
return t.Get(t.args[0])
|
||||||
}
|
}
|
||||||
if c == 2 {
|
if c == 2 {
|
||||||
fmt.Println(t.args)
|
// fmt.Println(t.args)
|
||||||
err := t.Transition(t.args[0], t.args[1])
|
err := t.Transition(t.args[0], t.args[1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
//fmt.Println(err)
|
||||||
return t.Log(t.args[0], strings.Join(t.args[1:]," "))
|
return t.Log(t.args[0], strings.Join(t.args[1:], " "))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ErrTaskSubCommandNotFound
|
return ErrTaskSubCommandNotFound
|
||||||
|
|
@ -45,7 +45,7 @@ func (t *TaskCmd) Transition(taskKey, transition string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TaskCmd) Log(taskKey, time string) error {
|
func (t *TaskCmd) Log(taskKey, time string) error {
|
||||||
return jkl.LogWork(taskKey, time)
|
return jkl.LogWork(taskKey, time)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TaskCmd) Run() error {
|
func (t *TaskCmd) Run() error {
|
||||||
|
|
|
||||||
92
issue.go
92
issue.go
|
|
@ -38,9 +38,10 @@ func (it *IssueType) RangeFieldSpecs() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
type AllowedValue struct {
|
type AllowedValue struct {
|
||||||
Id string
|
Id string `json:"id"`
|
||||||
Self string
|
Self string `json:"self"`
|
||||||
Value string
|
Value string `json:"value"`
|
||||||
|
Name string `json:"name"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *AllowedValue) String() string {
|
func (a *AllowedValue) String() string {
|
||||||
|
|
@ -252,6 +253,91 @@ type JiraIssue struct {
|
||||||
|
|
||||||
var sprintRegexp = regexp.MustCompile(`name=([^,]+),`)
|
var sprintRegexp = regexp.MustCompile(`name=([^,]+),`)
|
||||||
|
|
||||||
|
func isEmptyValue(v reflect.Value) bool {
|
||||||
|
switch v.Kind() {
|
||||||
|
case reflect.Array, reflect.Map, reflect.Slice, reflect.String:
|
||||||
|
return v.Len() == 0
|
||||||
|
case reflect.Bool:
|
||||||
|
return !v.Bool()
|
||||||
|
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
||||||
|
return v.Int() == 0
|
||||||
|
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
||||||
|
return v.Uint() == 0
|
||||||
|
case reflect.Float32, reflect.Float64:
|
||||||
|
return v.Float() == 0
|
||||||
|
case reflect.Interface, reflect.Ptr:
|
||||||
|
return v.IsNil() || isEmptyValue(reflect.Indirect(v))
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *JiraIssue) MarshalJSON() ([]byte, error) {
|
||||||
|
fields := map[string]interface{}{}
|
||||||
|
vf := reflect.ValueOf(*(i.Fields))
|
||||||
|
if i.EditMeta != nil && i.EditMeta.Fields != nil {
|
||||||
|
for k, f := range i.EditMeta.Fields {
|
||||||
|
name := k
|
||||||
|
if f.Schema.CustomId > 0 {
|
||||||
|
name = fmt.Sprintf("custom_%d", f.Schema.CustomId)
|
||||||
|
}
|
||||||
|
if val, ok := i.Fields.ExtraFields[name]; ok && val != nil {
|
||||||
|
if f.Schema.Type == "array" {
|
||||||
|
fields[name] = []interface{}{val}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
fields[name] = val
|
||||||
|
} else if val == nil {
|
||||||
|
delete(fields, name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < vf.NumField(); i++ {
|
||||||
|
ft := vf.Type().Field(i)
|
||||||
|
fv := vf.Field(i)
|
||||||
|
|
||||||
|
if ft.Name != "ExtraFields" && (fv.CanSet() || fv.CanInterface() || fv.CanAddr()) && fv.IsValid() {
|
||||||
|
name := strings.ToLower(ft.Name)
|
||||||
|
if alias, ok := ft.Tag.Lookup("json"); ok {
|
||||||
|
if alias != "" {
|
||||||
|
name = strings.Split(alias, ",")[0]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
value := fv.Interface()
|
||||||
|
if value != nil {
|
||||||
|
fields[name] = value
|
||||||
|
|
||||||
|
} else {
|
||||||
|
delete(fields, name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println(fields)
|
||||||
|
for k, v := range fields {
|
||||||
|
v2 := reflect.ValueOf(v)
|
||||||
|
for {
|
||||||
|
if v2.Kind() != reflect.Ptr && v2.Kind() != reflect.Interface {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
v2 = v2.Elem()
|
||||||
|
}
|
||||||
|
if !v2.IsValid() || (v2.Kind() == reflect.Slice && v2.Len() == 0) {
|
||||||
|
delete(fields, k)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
em := i.EditMeta
|
||||||
|
i.EditMeta = nil
|
||||||
|
defer func() { i.EditMeta = em }()
|
||||||
|
type Alias JiraIssue
|
||||||
|
return json.Marshal(&struct {
|
||||||
|
*Alias
|
||||||
|
Fields map[string]interface{} `json:"fields,omitempty"`
|
||||||
|
}{
|
||||||
|
Fields: fields,
|
||||||
|
Alias: (*Alias)(i),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func (i *JiraIssue) UnmarshalJSON(b []byte) error {
|
func (i *JiraIssue) UnmarshalJSON(b []byte) error {
|
||||||
tmp := map[string]json.RawMessage{}
|
tmp := map[string]json.RawMessage{}
|
||||||
if len(b) == 0 {
|
if len(b) == 0 {
|
||||||
|
|
|
||||||
5
jkl.go
5
jkl.go
|
|
@ -34,6 +34,7 @@ func bootHttpClient() {
|
||||||
func Create(issue *JiraIssue) (*JiraIssue, error) {
|
func Create(issue *JiraIssue) (*JiraIssue, error) {
|
||||||
bootHttpClient()
|
bootHttpClient()
|
||||||
payload, err := formatPayload(issue)
|
payload, err := formatPayload(issue)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
@ -218,7 +219,7 @@ func DoTransition(taskKey string, transitionName string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
var t *Transition
|
var t *Transition
|
||||||
fmt.Println(iss.Transitions)
|
//fmt.Println(iss.Transitions)
|
||||||
for _, transition := range iss.Transitions {
|
for _, transition := range iss.Transitions {
|
||||||
if strings.ToLower(transition.Name) == strings.ToLower(transitionName) {
|
if strings.ToLower(transition.Name) == strings.ToLower(transitionName) {
|
||||||
t = transition
|
t = transition
|
||||||
|
|
@ -381,7 +382,7 @@ func serializePayload(i interface{}) (io.Reader, error) {
|
||||||
payload := bytes.NewBuffer(b)
|
payload := bytes.NewBuffer(b)
|
||||||
enc := json.NewEncoder(payload)
|
enc := json.NewEncoder(payload)
|
||||||
err := enc.Encode(i)
|
err := enc.Encode(i)
|
||||||
fmt.Println(payload.String())
|
//fmt.Println("payload: ", payload.String())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue