@ -70,6 +70,10 @@ def should_show_log(upstream_url):
return True
def get_gclient_root ( ) :
return check_output ( [ ' gclient ' , ' root ' ] ) . strip ( )
def get_deps ( root ) :
""" Returns the path and the content of the DEPS file. """
deps_path = os . path . join ( root , ' DEPS ' )
@ -129,7 +133,8 @@ def calculate_roll(full_dir, dependency, gclient_dict, roll_to):
fetching the dependency via git .
"""
if dependency not in gclient_dict [ ' deps ' ] :
raise Error ( ' %s is not in the " deps " section of the DEPS file. ' )
raise Error (
' %s is not in the " deps " section of the DEPS file. ' % dependency )
head = None
if isinstance ( gclient_dict [ ' deps ' ] [ dependency ] , basestring ) :
@ -138,7 +143,7 @@ def calculate_roll(full_dir, dependency, gclient_dict, roll_to):
and ' url ' in gclient_dict [ ' deps ' ] [ dependency ] ) :
_ , _ , head = gclient_dict [ ' deps ' ] [ dependency ] [ ' url ' ] . partition ( ' @ ' )
else :
raise Error ( ' %s is not a valid git dependency. ' )
raise Error ( ' %s is not a valid git dependency. ' % dependency )
if not head :
raise Error ( ' %s is unpinned. ' % dependency )
@ -159,29 +164,21 @@ def gen_commit_msg(logs, cmdline, rolls, reviewers, bug):
return commit_msg
def get_full_dir ( root , dependency , is_relative ) :
""" Return the full path to the dependency. """
root_dir = root
if not is_relative :
root_dir = os . path . dirname ( root_dir )
return os . path . normpath ( os . path . join ( root_dir , dependency ) )
def finalize ( commit_msg , deps_path , deps_content , rolls , is_relative ) :
def finalize ( commit_msg , deps_path , deps_content , rolls , is_relative , root_dir ) :
""" Edits the DEPS file, commits it, then uploads a CL. """
print ( ' Commit message: ' )
print ( ' \n ' . join ( ' ' + i for i in commit_msg . splitlines ( ) ) )
with open ( deps_path , ' wb ' ) as f :
f . write ( deps_content )
root = os . path . dirname ( deps_path )
check_call ( [ ' git ' , ' add ' , ' DEPS ' ] , cwd = root )
check_call ( [ ' git ' , ' commit ' , ' --quiet ' , ' -m ' , commit_msg ] , cwd = root )
current_dir = os . path . dirname ( deps_path )
check_call ( [ ' git ' , ' add ' , ' DEPS ' ] , cwd = current_dir )
check_call ( [ ' git ' , ' commit ' , ' --quiet ' , ' -m ' , commit_msg ] , cwd = current_dir )
# Pull the dependency to the right revision. This is surprising to users
# otherwise.
for dependency , ( _head , roll_to ) in sorted ( rolls . iteritems ( ) ) :
full_dir = get_full_dir( root , dependency , is_relative )
full_dir = os. path . normpath ( os . path . join ( root_dir , dependency ) )
check_call ( [ ' git ' , ' checkout ' , ' --quiet ' , roll_to ] , cwd = full_dir )
@ -226,21 +223,24 @@ def main():
if not ' @ ' in r :
reviewers [ i ] = r + ' @chromium.org '
root = os . getcwd ( )
gclient_root = get_gclient_root ( )
current_dir = os . getcwd ( )
dependencies = sorted ( d . rstrip ( ' / ' ) . rstrip ( ' \\ ' ) for d in args . dep_path )
cmdline = ' roll-dep ' + ' ' . join ( dependencies ) + ' ' . join (
' --key ' + k for k in args . key )
try :
if not args . ignore_dirty_tree and not is_pristine ( root ) :
raise Error ( ' Ensure %s is clean first (no non-merged commits). ' % root )
if not args . ignore_dirty_tree and not is_pristine ( current_dir ) :
raise Error (
' Ensure %s is clean first (no non-merged commits). ' % current_dir )
# First gather all the information without modifying anything, except for a
# git fetch.
deps_path , deps_content = get_deps ( root )
deps_path , deps_content = get_deps ( current_dir )
gclient_dict = gclient_eval . Parse ( deps_content , True , True , deps_path )
is_relative = gclient_dict . get ( ' use_relative_paths ' , False )
root_dir = current_dir if is_relative else gclient_root
rolls = { }
for dependency in dependencies :
full_dir = get_full_dir( root , dependency , is_relative )
full_dir = os. path . normpath ( os . path . join ( root_dir , dependency ) )
if not os . path . isdir ( full_dir ) :
raise Error ( ' Directory not found: %s ( %s ) ' % ( dependency , full_dir ) )
head , roll_to = calculate_roll (
@ -256,7 +256,7 @@ def main():
logs = [ ]
for dependency , ( head , roll_to ) in sorted ( rolls . iteritems ( ) ) :
full_dir = get_full_dir( root , dependency , is_relative )
full_dir = os. path . normpath ( os . path . join ( root_dir , dependency ) )
log = generate_commit_message (
full_dir , dependency , head , roll_to , args . no_log , args . log_limit )
logs . append ( log )
@ -265,7 +265,7 @@ def main():
deps_content = gclient_eval . RenderDEPSFile ( gclient_dict )
commit_msg = gen_commit_msg ( logs , cmdline , rolls , reviewers , args . bug )
finalize ( commit_msg , deps_path , deps_content , rolls , is_relative )
finalize ( commit_msg , deps_path , deps_content , rolls , is_relative , root_dir )
except Error as e :
sys . stderr . write ( ' error: %s \n ' % e )
return 2 if isinstance ( e , AlreadyRolledError ) else 1