import os.path
import fnmatch
import os
+import sys
# subtract 8 for the leading tabstop
fill_column = 74 - 8
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
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)
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)