# Copyright (c) 2018, Compiler Explorer Authors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
#     * Redistributions of source code must retain the above copyright notice,
#       this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above copyright
#       notice, this list of conditions and the following disclaimer in the
#       documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

import subprocess

html_escape_table = {
    "&": "&amp;",
    '"': "&quot;",
    "'": "&apos;",
    ">": "&gt;",
    "<": "&lt;",
}


def html_escape(text):
    return "".join(html_escape_table.get(c, c) for c in text)


def format_commit(url, commit):
    grouped_commit = commit.split(' * ')
    print(grouped_commit)
    return '    <div class="row commit-entry">\n' \
           '        <div class="col-sm-12">{}\n' \
           '            <a href="{}commit/{}" rel="noreferrer noopener" target="_blank">\n' \
           '                <sup><small class="glyphicon glyphicon-new-window opens-new-window" ' \
           'title="Opens in a new window"></small></sup>\n' \
           '            </a>\n' \
           '        </div>\n' \
           '    </div>\n'.format(html_escape(grouped_commit[1]), url, grouped_commit[0])


def get_commits(repo):
    coms = subprocess.check_output(['git', 'log', '--date=local', '--after="3 months ago"', '--grep=^* ', '--oneline'])
    with open('static/changelog.html', 'w') as f:
        f.write('<div class="commits-list">\n')
        for commit in coms.splitlines():
            f.write(format_commit(repo, commit))
        f.write('</div>\n')


if __name__ == '__main__':
    get_commits('https://github.com/mattgodbolt/compiler-explorer/')

@@ -1502,205 +1502,25 @@
 %0A%7D%0A%0A
-%0Adef html_escape(text):%0A    return %22%22.join(html_escape_table.get(c, c) for c in text)%0A%0A%0Adef format_commit(url, commit):%0A    grouped_commit = commit.split(' * ')%0A    print(grouped_commit)%0A    return
+commit_template =
  '  
@@ -1554,39 +1554,44 @@
 try%22%3E%5Cn' %5C%0A     
+   '
       
-'
+  
         %3Cdiv cla
@@ -1613,36 +1613,36 @@
 %7B%7D%5Cn' %5C%0A        
+'
    
-'
             %3Ca h
@@ -1637,16 +1637,19 @@
         
+   
 %3Ca href=
@@ -1710,36 +1710,36 @@
 %22%3E%5Cn' %5C%0A        
+'
    
-'
                 
@@ -1738,16 +1738,17 @@
         
+ 
 %3Csup%3E%3Csm
@@ -1819,19 +1819,16 @@
         
-   
 'title=%22
@@ -1870,36 +1870,39 @@
 p%3E%5Cn' %5C%0A        
+'
    
-'
+   
             %3C/a%3E
@@ -1906,32 +1906,38 @@
 /a%3E%5Cn' %5C%0A   
+     '
         
 '        %3C/d
@@ -1916,33 +1916,32 @@
        '        
-'
         %3C/div%3E%5Cn
@@ -1948,28 +1948,35 @@
 ' %5C%0A        
+'       
    
-'
     %3C/div%3E%5Cn
@@ -1980,72 +1980,468 @@
 %3E%5Cn'
-.format(html_escape(grouped_commit%5B1%5D), url, grouped_commit%5B0%5D)%0A
+%0A%0A%0Adef html_escape(text):%0A    return %22%22.join(html_escape_table.get(c, c) for c in text)%0A%0A%0Adef format_commit(url, commit):%0A    grouped_commit = commit.split(' * ')%0A    # --grep matches every line on the commit message, we ensure we don't get caught by it%0A    try:%0A        formatted_commit = commit_template.format(html_escape(grouped_commit%5B1%5D), url, grouped_commit%5B0%5D)%0A        print(grouped_commit)%0A        return formatted_commit%0A    except:%0A        return ''
 %0A%0Ade
@@ -2562,16 +2562,17 @@
 --grep=%5E
+%5C
 * ', '--

Fix changeloger.py for msgs with marks in lines >1