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

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