def testSetVar(self): local_scope = gclient_eval.Exec(_SAMPLE_DEPS_FILE) 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 test_recursedeps_list(self): local_scope = gclient_eval.Exec( 'recursedeps = [["src/third_party/angle", "DEPS.chromium"]]', '<string>') self.assertEqual( {'recursedeps': [['src/third_party/angle', 'DEPS.chromium']]}, local_scope)
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 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_doesnt_override_undeclared_vars(self): with self.assertRaises(KeyError) as cm: gclient_eval.Exec('\n'.join([ 'vars = {', ' "foo": "bar",', '}', 'deps = {', ' "a_dep": "a{baz}b",', '}', ]), vars_override={'baz': 'lalala'}) self.assertIn('baz was used as a variable, but was not declared', str(cm.exception))
def test_var(self): local_scope = gclient_eval.Exec('\n'.join([ 'vars = {', ' "foo": "bar",', '}', 'deps = {', ' "a_dep": "a" + Var("foo") + "b",', '}', ])) self.assertEqual({ 'vars': collections.OrderedDict([('foo', 'bar')]), 'deps': collections.OrderedDict([('a_dep', 'abarb')]), }, 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 test_overrides_vars(self): local_scope = gclient_eval.Exec('\n'.join([ 'vars = {', ' "foo": "bar",', '}', 'deps = {', ' "a_dep": "a{foo}b",', '}', ]), vars_override={'foo': 'baz'}) self.assertEqual({ 'vars': collections.OrderedDict([('foo', 'bar')]), 'deps': collections.OrderedDict([('a_dep', 'abazb')]), }, local_scope)
def test_braces_var(self): local_scope = gclient_eval.Exec('\n'.join([ 'vars = {', ' "foo": "bar",', '}', 'deps = {', ' "a_dep": "a{foo}b",', '}', ]), expand_vars=True) self.assertEqual( { 'vars': collections.OrderedDict([('foo', 'bar')]), 'deps': collections.OrderedDict([('a_dep', 'abarb')]), }, local_scope)
def test_var(self): local_scope = gclient_eval.Exec('\n'.join([ 'vars = {', ' "foo": "bar",', ' "baz": Str("quux")', '}', 'deps = {', ' "a_dep": "a" + Var("foo") + "b" + Var("baz"),', '}', ])) Str = gclient_eval.ConstantString self.assertEqual({ 'vars': {'foo': 'bar', 'baz': Str('quux')}, 'deps': {'a_dep': 'abarbquux'}, }, local_scope)
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_overrides_vars(self): local_scope = gclient_eval.Exec('\n'.join([ 'vars = {', ' "foo": "bar",', ' "quux": Str("quuz")', '}', 'deps = {', ' "a_dep": "a{foo}b",', ' "b_dep": "c{quux}d",', '}', ]), vars_override={'foo': 'baz', 'quux': 'corge'}) Str = gclient_eval.ConstantString self.assertEqual({ 'vars': {'foo': 'bar', 'quux': Str('quuz')}, 'deps': {'a_dep': 'abazb', 'b_dep': 'ccorged'}, }, local_scope)
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_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_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_var(self): local_scope = {} global_scope = { 'Var': lambda var_name: '{%s}' % var_name, } gclient_eval.Exec( '\n'.join([ 'vars = {', ' "foo": "bar",', '}', 'deps = {', ' "a_dep": "a" + Var("foo") + "b",', '}', ]), global_scope, local_scope, '<string>') self.assertEqual( { 'vars': collections.OrderedDict([('foo', 'bar')]), 'deps': collections.OrderedDict([('a_dep', 'a{foo}b')]), }, local_scope)
def test_var(self): local_scope = {} global_scope = { 'Var': gclient.GClientKeywords.VarImpl({}, local_scope).Lookup, } gclient_eval.Exec( '\n'.join([ 'vars = {', ' "foo": "bar",', '}', 'deps = {', ' "a_dep": "a" + Var("foo") + "b",', '}', ]), global_scope, local_scope, '<string>') self.assertEqual( { 'vars': collections.OrderedDict([('foo', 'bar')]), 'deps': collections.OrderedDict([('a_dep', 'abarb')]), }, local_scope)
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 setUp(self): self.local_scope = gclient_eval.Exec(_SAMPLE_DEPS_FILE)
def test_empty_deps(self): local_scope = gclient_eval.Exec('deps = {}', '<string>') self.assertEqual({'deps': {}}, 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
def test_schema_wrong_type(self): with self.assertRaises(schema.SchemaError): gclient_eval.Exec('include_rules = {}', '<string>')
def test_schema_unknown_key(self): with self.assertRaises(schema.SchemaWrongKeyError): gclient_eval.Exec('foo = "bar"', {}, {}, '<string>')
def test_override(self): with self.assertRaises(ValueError) as cm: gclient_eval.Exec('a = "a"\na = "x"') self.assertIn('invalid assignment: overrides var \'a\'', str(cm.exception))
def test_multiple_assignment(self): with self.assertRaises(ValueError) as cm: gclient_eval.Exec('a, b, c = "a", "b", "c"') self.assertIn('invalid assignment: target should be a name', str(cm.exception))
def test_schema_wrong_type(self): with self.assertRaises(gclient_utils.Error): gclient_eval.Exec('include_rules = {}')
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_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))