def assert_gets_and_sets_revision(self, before, after, rev_before='deadbeef'): local_scope = gclient_eval.Exec('\n'.join(before)) result = gclient_eval.GetRevision(local_scope, 'src/dep') self.assertEqual(result, rev_before) gclient_eval.SetRevision(local_scope, 'src/dep', 'deadfeed') self.assertEqual('\n'.join(after), gclient_eval.RenderDEPSFile(local_scope))
def test_revision_implicitly_concatenated_strings(self): deps = [ 'deps = {', ' "src/dep": "https://example.com" + "/dep.git@" "deadbeef",', '}', ] with self.assertRaises(ValueError) as e: local_scope = gclient_eval.Exec('\n'.join(deps)) gclient_eval.SetRevision(local_scope, 'src/dep', 'deadfeed') self.assertEqual( 'Can\'t update value for src/dep. Multiline strings and implicitly ' 'concatenated strings are not supported.\n' 'Consider reformatting the DEPS file.', str(e.exception))
def testSetRevisionInVars(self): gclient_eval.SetRevision(self.local_scope, 'src/android/dep_2', 'c0ffee') result = gclient_eval.RenderDEPSFile(self.local_scope) self.assertEqual(result, _SAMPLE_DEPS_FILE.replace('1ced', 'c0ffee'))
def testSetRevisionInUrl(self): gclient_eval.SetRevision(self.local_scope, 'src/dep_3', '0ff1ce') result = gclient_eval.RenderDEPSFile(self.local_scope) self.assertEqual(result, _SAMPLE_DEPS_FILE.replace('5p1e5', '0ff1ce'))
def testSetRevision(self): gclient_eval.SetRevision(self.local_scope, 'src/dep', 'deadfeed') result = gclient_eval.RenderDEPSFile(self.local_scope) self.assertEqual(result, _SAMPLE_DEPS_FILE.replace('deadbeef', 'deadfeed'))
def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('--ignore-dirty-tree', action='store_true', help='Roll anyways, even if there is a diff.') parser.add_argument( '-r', '--reviewer', help='To specify multiple reviewers, use comma separated list, e.g. ' '-r joe,jane,john. Defaults to @chromium.org') parser.add_argument('-b', '--bug', help='Associate a bug number to the roll') # It is important that --no-log continues to work, as it is used by # internal -> external rollers. Please do not remove or break it. parser.add_argument( '--no-log', action='store_true', help='Do not include the short log in the commit message') parser.add_argument('--log-limit', type=int, default=100, help='Trim log after N commits (default: %(default)s)') parser.add_argument( '--roll-to', default='origin/master', help='Specify the new commit to roll to (default: %(default)s)') parser.add_argument('--key', action='append', default=[], help='Regex(es) for dependency in DEPS file') parser.add_argument('dep_path', nargs='+', help='Path(s) to dependency') args = parser.parse_args() if len(args.dep_path) > 1: if args.roll_to != 'origin/master': parser.error( 'Can\'t use multiple paths to roll simultaneously and --roll-to' ) if args.key: parser.error( 'Can\'t use multiple paths to roll simultaneously and --key') reviewers = None if args.reviewer: reviewers = args.reviewer.split(',') for i, r in enumerate(reviewers): if not '@' in r: reviewers[i] = r + '@chromium.org' 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(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(current_dir) gclient_dict = gclient_eval.Exec(deps_content, 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 = 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(full_dir, dependency, gclient_dict, args.roll_to) if roll_to == head: if len(dependencies) == 1: raise AlreadyRolledError('No revision to roll!') print('%s: Already at latest commit %s' % (dependency, roll_to)) else: print('%s: Rolling from %s to %s' % (dependency, head[:10], roll_to[:10])) rolls[dependency] = (head, roll_to) logs = [] for dependency, (head, roll_to) in sorted(rolls.iteritems()): 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) gclient_eval.SetRevision(gclient_dict, dependency, roll_to) 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, root_dir) except Error as e: sys.stderr.write('error: %s\n' % e) return 2 if isinstance(e, AlreadyRolledError) else 1 print('') if not reviewers: print( 'You forgot to pass -r, make sure to insert a [email protected] line' ) print('to the commit description before emailing.') print('') print('Run:') print(' git cl upload --send-mail') return 0
def assert_changes_revision(self, before, after): local_scope = gclient_eval.Exec('\n'.join(before)) gclient_eval.SetRevision(local_scope, 'src/dep', 'deadfeed') self.assertEqual('\n'.join(after), gclient_eval.RenderDEPSFile(local_scope))