def test_preserves_escaped_vars(self): local_scope = gclient_eval.Exec('\n'.join([ 'deps = {', ' "src/cipd/package": {', ' "packages": [', ' {', ' "package": "package/${{platform}}",', ' "version": "version:abcd",', ' },', ' ],', ' "dep_type": "cipd",', ' },', '}', ])) gclient_eval.SetCIPD(local_scope, 'src/cipd/package', 'package/${platform}', 'version:dcba') result = gclient_eval.RenderDEPSFile(local_scope) self.assertEqual( result, '\n'.join([ 'deps = {', ' "src/cipd/package": {', ' "packages": [', ' {', ' "package": "package/${{platform}}",', ' "version": "version:dcba",', ' },', ' ],', ' "dep_type": "cipd",', ' },', '}', ]))
def test_sets_var(self): local_scope = gclient_eval.Exec(_SAMPLE_DEPS_FILE, expand_vars=True) gclient_eval.SetVar(local_scope, 'dep_2_rev', 'c0ffee') result = gclient_eval.RenderDEPSFile(local_scope) self.assertEqual(result, _SAMPLE_DEPS_FILE.replace('1ced', 'c0ffee'))
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 testSetCIPD(self): local_scope = gclient_eval.Exec(_SAMPLE_DEPS_FILE) gclient_eval.SetCIPD(local_scope, 'src/cipd/package', 'another/cipd/package', '6.789') result = gclient_eval.RenderDEPSFile(local_scope) self.assertEqual(result, _SAMPLE_DEPS_FILE.replace('5678', '6.789'))
def test_gets_and_sets_cipd(self): local_scope = gclient_eval.Exec('\n'.join([ 'deps = {', ' "src/cipd/package": {', ' "packages": [', ' {', ' "package": "some/cipd/package",', ' "version": "deadbeef",', ' },', ' {', ' "package": "another/cipd/package",', ' "version": "version:5678",', ' },', ' ],', ' "condition": "checkout_android",', ' "dep_type": "cipd",', ' },', '}', ])) self.assertEqual( gclient_eval.GetCIPD( local_scope, 'src/cipd/package', 'some/cipd/package'), 'deadbeef') self.assertEqual( gclient_eval.GetCIPD( local_scope, 'src/cipd/package', 'another/cipd/package'), 'version:5678') gclient_eval.SetCIPD( local_scope, 'src/cipd/package', 'another/cipd/package', 'version:6789') gclient_eval.SetCIPD( local_scope, 'src/cipd/package', 'some/cipd/package', 'foobar') result = gclient_eval.RenderDEPSFile(local_scope) self.assertEqual(result, '\n'.join([ 'deps = {', ' "src/cipd/package": {', ' "packages": [', ' {', ' "package": "some/cipd/package",', ' "version": "foobar",', ' },', ' {', ' "package": "another/cipd/package",', ' "version": "version:6789",', ' },', ' ],', ' "condition": "checkout_android",', ' "dep_type": "cipd",', ' },', '}', ]))
def test_sets_var(self): local_scope = gclient_eval.Exec('\n'.join([ 'vars = {', ' "foo": "bar",', '}', ])) gclient_eval.SetVar(local_scope, 'foo', 'baz') result = gclient_eval.RenderDEPSFile(local_scope) self.assertEqual(result, '\n'.join([ 'vars = {', ' "foo": "baz",', '}', ]))
def test_set_preserves_formatting(self): local_scope = gclient_eval.Exec('\n'.join([ 'vars = {', ' # Comment with trailing space ', ' "foo": \'bar\',', '}', ])) gclient_eval.SetVar(local_scope, 'foo', 'baz') result = gclient_eval.RenderDEPSFile(local_scope) self.assertEqual(result, '\n'.join([ 'vars = {', ' # Comment with trailing space ', ' "foo": \'baz\',', '}', ]))
def test_gets_and_sets_var_non_string(self): local_scope = gclient_eval.Exec('\n'.join([ 'vars = {', ' "foo": True,', '}', ])) result = gclient_eval.GetVar(local_scope, 'foo') self.assertEqual(result, True) gclient_eval.SetVar(local_scope, 'foo', 'False') result = gclient_eval.RenderDEPSFile(local_scope) self.assertEqual(result, '\n'.join([ 'vars = {', ' "foo": False,', '}', ]))
def test_adds_var_twice(self): local_scope = gclient_eval.Exec('\n'.join([ 'vars = {', ' "foo": "bar",', '}', ])) gclient_eval.AddVar(local_scope, 'baz', 'lemur') gclient_eval.AddVar(local_scope, 'v8_revision', 'deadbeef') result = gclient_eval.RenderDEPSFile(local_scope) self.assertEqual(result, '\n'.join([ 'vars = {', ' "v8_revision": "deadbeef",', ' "baz": "lemur",', ' "foo": "bar",', '}', ]))
def test_gets_and_sets_var(self): local_scope = gclient_eval.Exec('\n'.join([ 'vars = {', ' "foo": "bar",', ' "quux": Str("quuz")', '}', ])) self.assertEqual(gclient_eval.GetVar(local_scope, 'foo'), "bar") self.assertEqual(gclient_eval.GetVar(local_scope, 'quux'), "quuz") gclient_eval.SetVar(local_scope, 'foo', 'baz') gclient_eval.SetVar(local_scope, 'quux', 'corge') result = gclient_eval.RenderDEPSFile(local_scope) self.assertEqual(result, '\n'.join([ 'vars = {', ' "foo": "baz",', ' "quux": Str("corge")', '}', ]))
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 assert_adds_var(self, before, after): local_scope = gclient_eval.Exec('\n'.join(before)) gclient_eval.AddVar(local_scope, 'baz', 'lemur') results = gclient_eval.RenderDEPSFile(local_scope) self.assertEqual(results, '\n'.join(after))
def test_gets_and_sets_cipd_vars(self): local_scope = gclient_eval.Exec('\n'.join([ 'vars = {', ' "cipd-rev": "git_revision:deadbeef",', ' "another-cipd-rev": "version:1.0.3",', '}', 'deps = {', ' "src/cipd/package": {', ' "packages": [', ' {', ' "package": "some/cipd/package",', ' "version": Var("cipd-rev"),', ' },', ' {', ' "package": "another/cipd/package",', ' "version": "{another-cipd-rev}",', ' },', ' ],', ' "condition": "checkout_android",', ' "dep_type": "cipd",', ' },', '}', ])) self.assertEqual( gclient_eval.GetCIPD(local_scope, 'src/cipd/package', 'some/cipd/package'), 'git_revision:deadbeef') self.assertEqual( gclient_eval.GetCIPD(local_scope, 'src/cipd/package', 'another/cipd/package'), 'version:1.0.3') gclient_eval.SetCIPD(local_scope, 'src/cipd/package', 'another/cipd/package', 'version:1.1.0') gclient_eval.SetCIPD(local_scope, 'src/cipd/package', 'some/cipd/package', 'git_revision:foobar') result = gclient_eval.RenderDEPSFile(local_scope) self.assertEqual( result, '\n'.join([ 'vars = {', ' "cipd-rev": "git_revision:foobar",', ' "another-cipd-rev": "version:1.1.0",', '}', 'deps = {', ' "src/cipd/package": {', ' "packages": [', ' {', ' "package": "some/cipd/package",', ' "version": Var("cipd-rev"),', ' },', ' {', ' "package": "another/cipd/package",', ' "version": "{another-cipd-rev}",', ' },', ' ],', ' "condition": "checkout_android",', ' "dep_type": "cipd",', ' },', '}', ]))
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))
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