github.com/fredbi/git-chglog@v0.0.0-20190706071416-d35c598eac81/cmd/git-chglog/kac_template_builder.go (about)

     1  package main
     2  
     3  import "fmt"
     4  
     5  type kacTemplateBuilderImpl struct{}
     6  
     7  // NewKACTemplateBuilder ...
     8  func NewKACTemplateBuilder() TemplateBuilder {
     9  	return &kacTemplateBuilderImpl{}
    10  }
    11  
    12  // Build ...
    13  func (t *kacTemplateBuilderImpl) Build(ans *Answer) (string, error) {
    14  	// unreleased
    15  	tpl := t.unreleased(ans.Style, ans.CommitMessageFormat)
    16  
    17  	// version start
    18  	tpl += "\n{{ range .Versions }}\n"
    19  
    20  	tpl += t.versionHeader(ans.Style)
    21  
    22  	// commits
    23  	tpl += t.commits(".CommitGroups", ans.CommitMessageFormat)
    24  
    25  	// revert
    26  	if ans.IncludeReverts {
    27  		tpl += t.reverts()
    28  	}
    29  
    30  	// merges
    31  	if ans.IncludeMerges {
    32  		tpl += t.merges(ans.Style)
    33  	}
    34  
    35  	// notes
    36  	tpl += t.notes()
    37  
    38  	// versions end
    39  	tpl += "\n{{ end -}}"
    40  
    41  	// footer (links)
    42  	tpl += t.footer(ans.Style)
    43  
    44  	return tpl, nil
    45  }
    46  
    47  func (t *kacTemplateBuilderImpl) unreleased(style, format string) string {
    48  	var (
    49  		id      = ""
    50  		title   = "Unreleased"
    51  		commits = t.commits(".Unreleased.CommitGroups", format)
    52  	)
    53  
    54  	switch style {
    55  	case styleGitHub, styleGitLab, styleBitbucket:
    56  		id = "<a name=\"unreleased\"></a>\n"
    57  		title = fmt.Sprintf("[%s]", title)
    58  	}
    59  
    60  	return fmt.Sprintf(`{{ if .Versions -}}
    61  %s## %s
    62  
    63  {{ if .Unreleased.CommitGroups -}}
    64  %s{{ end -}}
    65  {{ end -}}
    66  `, id, title, commits)
    67  }
    68  
    69  func (t *kacTemplateBuilderImpl) versionHeader(style string) string {
    70  	var (
    71  		id      = ""
    72  		tagName = "{{ .Tag.Name }}"
    73  		date    = "{{ datetime \"2006-01-02\" .Tag.Date }}"
    74  	)
    75  
    76  	switch style {
    77  	case styleGitHub, styleGitLab, styleBitbucket:
    78  		id = templateTagNameAnchor
    79  		tagName = "{{ if .Tag.Previous }}[{{ .Tag.Name }}]{{ else }}{{ .Tag.Name }}{{ end }}"
    80  	}
    81  
    82  	return fmt.Sprintf("%s## %s - %s\n", id, tagName, date)
    83  }
    84  
    85  func (t *kacTemplateBuilderImpl) commits(commitGroups, format string) string {
    86  	var (
    87  		body string
    88  	)
    89  
    90  	switch format {
    91  	case fmtSubject.display:
    92  		body = `{{ range .Commits -}}
    93  - {{ .Header }}
    94  {{ end }}`
    95  
    96  	default:
    97  		body = `### {{ .Title }}
    98  {{ range .Commits -}}
    99  - {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }}
   100  {{ end }}`
   101  	}
   102  
   103  	return fmt.Sprintf(`{{ range %s -}}
   104  %s
   105  {{ end -}}
   106  `, commitGroups, body)
   107  }
   108  
   109  func (t *kacTemplateBuilderImpl) reverts() string {
   110  	return `
   111  {{- if .RevertCommits -}}
   112  ### Reverts
   113  {{ range .RevertCommits -}}
   114  - {{ .Revert.Header }}
   115  {{ end }}
   116  {{ end -}}
   117  `
   118  }
   119  
   120  func (t *kacTemplateBuilderImpl) merges(style string) string {
   121  	var title string
   122  
   123  	switch style {
   124  	case styleGitHub, styleBitbucket:
   125  		title = "Pull Requests"
   126  	case styleGitLab:
   127  		title = "Merge Requests"
   128  	default:
   129  		title = "Merges"
   130  	}
   131  
   132  	return fmt.Sprintf(`
   133  {{- if .MergeCommits -}}
   134  ### %s
   135  {{ range .MergeCommits -}}
   136  - {{ .Header }}
   137  {{ end }}
   138  {{ end -}}
   139  `, title)
   140  }
   141  
   142  func (*kacTemplateBuilderImpl) notes() string {
   143  	return `
   144  {{- if .NoteGroups -}}
   145  {{ range .NoteGroups -}}
   146  ### {{ .Title }}
   147  {{ range .Notes }}
   148  {{ .Body }}
   149  {{ end }}
   150  {{ end -}}
   151  {{ end -}}`
   152  }
   153  
   154  func (*kacTemplateBuilderImpl) footer(style string) string {
   155  	switch style {
   156  	case styleGitHub, styleGitLab:
   157  		return `
   158  
   159  {{- if .Versions }}
   160  [Unreleased]: {{ .Info.RepositoryURL }}/compare/{{ $latest := index .Versions 0 }}{{ $latest.Tag.Name }}...HEAD
   161  {{ range .Versions -}}
   162  {{ if .Tag.Previous -}}
   163  [{{ .Tag.Name }}]: {{ $.Info.RepositoryURL }}/compare/{{ .Tag.Previous.Name }}...{{ .Tag.Name }}
   164  {{ end -}}
   165  {{ end -}}
   166  {{ end -}}`
   167  	case styleBitbucket:
   168  		return `
   169  
   170  {{- if .Versions }}
   171  [Unreleased]: {{ .Info.RepositoryURL }}/compare/HEAD..{{ $latest := index .Versions 0 }}{{ $latest.Tag.Name }}
   172  {{ range .Versions -}}
   173  {{ if .Tag.Previous -}}
   174  [{{ .Tag.Name }}]: {{ $.Info.RepositoryURL }}/compare/{{ .Tag.Name }}..{{ .Tag.Previous.Name }}
   175  {{ end -}}
   176  {{ end -}}
   177  {{ end -}}`
   178  	default:
   179  		return ""
   180  	}
   181  }