[xbuild] Add property $(SkipCopyUnchangedFiles)
[mono.git] / scripts / commits-to-changelog.py
index fa2079fbfdd1ae9337973ef4fe9d14aee1127799..c95f230e7d5d74fcd08fb77a52386ca5acce0d09 100755 (executable)
@@ -6,6 +6,7 @@ import re
 import os.path
 import fnmatch
 import os
+import sys
 
 # subtract 8 for the leading tabstop
 fill_column = 74 - 8
@@ -15,7 +16,12 @@ path_to_root = None
 all_changelogs = {}
 
 def git (command, *args):
-    return subprocess.Popen (["git", command] + list (args), stdout = subprocess.PIPE).communicate () [0]
+    popen = subprocess.Popen (["git", command] + list (args), stdout = subprocess.PIPE)
+    output = popen.communicate () [0]
+    if popen.returncode != 0:
+        print >> sys.stderr, "Error: git failed"
+        exit (1)
+    return output
 
 def changelog_path (changelog):
     global path_to_root
@@ -144,7 +150,7 @@ def debug_print_commit (commit, raw_message, prefix, file_entries, changed_files
 def process_commit (commit):
     changed_files = map (lambda l: l.split () [2], git ("diff-tree", "--numstat", commit).splitlines () [1:])
     if len (filter (lambda f: re.search ("(^|/)Change[Ll]og$", f), changed_files)):
-        return
+        return None
     raw_message = git ("log", "-n1", "--format=%B", commit)
     # filter SVN migration message
     message = re.sub ("(^|\n)svn path=[^\n]+revision=\d+(?=$|\n)", "", raw_message)
@@ -241,17 +247,33 @@ def main ():
         global path_to_root
         path_to_root = options.root + "/"
 
-    for filename in git ("ls-tree", "-r", "--name-only", "HEAD").splitlines ():
+    # MonkeyWrench uses a shared git repo but sets BUILD_REVISION,
+    # if present we use it instead of HEAD
+    HEAD = "HEAD"
+    if 'BUILD_REVISION' in os.environ:
+        HEAD = os.environ['BUILD_REVISION']
+
+    #see if git supports %B in --format
+    output = git ("log", "-n1", "--format=%B", HEAD)
+    if output.startswith ("%B"):
+        print >> sys.stderr, "Error: git doesn't support %B in --format - install version 1.7.2 or newer"
+        exit (1)
+
+    for filename in git ("ls-tree", "-r", "--name-only", HEAD).splitlines ():
         if re.search ("(^|/)Change[Ll]og$", filename):
             (path, name) = os.path.split (filename)
             all_changelogs [path] = name
 
-    commits = git ("rev-list", "--no-merges", "HEAD", "^%s" % start_commit).splitlines ()
+    commits = git ("rev-list", "--no-merges", HEAD, "^%s" % start_commit).splitlines ()
 
     touched_changelogs = {}
     for commit in commits:
         entries = process_commit (commit)
+        if entries == None:
+            continue
         for (changelog, lines) in entries.items ():
+            if not os.path.exists (changelog_path (changelog)):
+                continue
             if changelog not in touched_changelogs:
                 touched_changelogs [changelog] = start_changelog (changelog)
             append_lines (touched_changelogs [changelog], lines)