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))
Beispiel #2
0
 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'))
Beispiel #6
0
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))