b4nst/turbogit

View on GitHub
pkg/format/branch.go

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
package format

import (
    "errors"
    "path"
    "regexp"
    "strings"
    "unicode"
)

var (
    forbiddenChar = regexp.MustCompile(`(?m)[\x60\?\*~^:\\\[\]]|@{|\.{2}`)
    blank         = regexp.MustCompile(`\s+`)
    void          = []byte("")
    sep           = []byte("-")

    // A default type rewrite map
    DefaultTypeRewrite = map[string]string{
        "feature": "feat",
        "bug":     "fix",
        "task":    "feat",
        "story":   "feat",
    }
)

// TugBranch represents a turbogit branch
type TugBranch struct {
    // Branch type (e.g. 'feat', 'fix', 'user', etc...)
    Type string
    // Branch prefix (issue id, user name, etc...)
    Prefix string
    // Branch description
    Description string
}

// String builds a git-sanitized branch name.
func (tb TugBranch) String() string {
    raw := path.Join(tb.Type, tb.Prefix, strings.ToLower(tb.Description))
    return sanitizeBranch(raw)
}

// ParseBranch parses a given string into a TugBranch or return an error on bad format.
func ParseBranch(s string) (TugBranch, error) {
    split := strings.SplitN(s, "/", 3)
    if len(split) < 2 {
        return TugBranch{}, errors.New("Bad branch format")
    }
    tb := TugBranch{}
    tb.Type = split[0]

    if len(split) < 3 {
        tb.Description = split[1]
    } else {
        tb.Prefix = split[1]
        tb.Description = split[2]
    }
    // Desanitize description
    desc := []rune(strings.ReplaceAll(tb.Description, "-", " "))
    desc[0] = unicode.ToUpper(desc[0])
    tb.Description = string(desc)

    return tb, nil
}

// WithType returns a TugBranch with the given type 't' or it's correlation in the rewrite map if it exists.
func (tb TugBranch) WithType(t string, rewrite map[string]string) TugBranch {
    ts := strings.ToLower(t)
    if tr, ok := rewrite[ts]; ok {
        tb.Type = tr
    } else {
        tb.Type = ts
    }

    return tb
}

func sanitizeBranch(s string) string {
    sb := forbiddenChar.ReplaceAll([]byte(s), void)
    s = string(blank.ReplaceAll(sb, sep))
    return strings.Trim(s, "./")
}