コード例 #1
0
    def testOverride(self):
        """Verifies expected behavior of URL overrides."""
        write(
            '.gclient', 'solutions = [\n'
            '  { "name": "foo",\n'
            '    "url": "svn://example.com/foo",\n'
            '    "custom_deps": {\n'
            '      "foo/bar": "svn://example.com/override",\n'
            '      "foo/skip2": None,\n'
            '      "foo/new": "svn://example.com/new",\n'
            '    },\n'
            '  },]\n')
        write(
            os.path.join('foo', 'DEPS'), 'vars = {\n'
            '  "origin": "svn://example.com",\n'
            '}\n'
            'deps = {\n'
            '  "foo/skip": None,\n'
            '  "foo/bar": "{origin}/bar",\n'
            '  "foo/baz": "{origin}/baz",\n'
            '  "foo/skip2": "{origin}/skip2",\n'
            '  "foo/rel": "/rel",\n'
            '}')
        parser = gclient.OptionParser()
        options, _ = parser.parse_args(['--jobs', '1'])

        obj = gclient.GClient.LoadCurrentConfig(options)
        obj.RunOnDeps('None', [])

        sol = obj.dependencies[0]
        self.assertEqual([
            ('foo', 'svn://example.com/foo'),
            ('foo/bar', 'svn://example.com/override'),
            ('foo/baz', 'svn://example.com/baz'),
            ('foo/new', 'svn://example.com/new'),
            ('foo/rel', 'svn://example.com/rel'),
        ], self._get_processed())

        self.assertEqual(6, len(sol.dependencies))
        self.assertEqual([
            ('foo/bar', 'svn://example.com/override'),
            ('foo/baz', 'svn://example.com/baz'),
            ('foo/new', 'svn://example.com/new'),
            ('foo/rel', 'svn://example.com/rel'),
            ('foo/skip', None),
            ('foo/skip2', None),
        ], [(dep.name, dep.url) for dep in sol.dependencies])
コード例 #2
0
 def testFuzzyMatchUrlByURLNoGit(self):
     write(
         '.gclient', 'solutions = [\n'
         '  { "name": "foo", "url": "https://example.com/foo.git",\n'
         '    "deps_file" : ".DEPS.git",\n'
         '  },\n'
         ']')
     write(
         os.path.join('foo', 'DEPS'), 'deps = {\n'
         '  "bar": "https://example.com/bar.git@bar_version",\n'
         '}')
     options, _ = gclient.OptionParser().parse_args([])
     obj = gclient.GClient.LoadCurrentConfig(options)
     foo_sol = obj.dependencies[0]
     self.assertEqual(
         'https://example.com/foo',
         foo_sol.FuzzyMatchUrl(['https://example.com/foo', 'foo']))
コード例 #3
0
    def testRecursedepsOverride(self):
        """Verifies gclient respects the |recursedeps| var syntax.

    This is what we mean to check here:
    - |recursedeps| = [...] on 2 levels means we pull exactly 3 deps
      (up to /fizz, but not /fuzz)
    - pulling foo/bar with no recursion (in .gclient) is overriden by
      a later pull of foo/bar with recursion (in the dep tree)
    - pulling foo/tar with no recursion (in .gclient) is no recursively
      pulled (taz is left out)
    """
        write(
            '.gclient', 'solutions = [\n'
            '  { "name": "foo", "url": "svn://example.com/foo" },\n'
            '  { "name": "foo/bar", "url": "svn://example.com/bar" },\n'
            '  { "name": "foo/tar", "url": "svn://example.com/tar" },\n'
            ']')
        write(os.path.join('foo', 'DEPS'), 'deps = {\n'
              '  "bar": "/bar",\n'
              '}\n'
              'recursedeps = ["bar"]')
        write(os.path.join('bar', 'DEPS'), 'deps = {\n'
              '  "baz": "/baz",\n'
              '}\n'
              'recursedeps = ["baz"]')
        write(os.path.join('baz', 'DEPS'), 'deps = {\n'
              '  "fizz": "/fizz",\n'
              '}')
        write(os.path.join('fizz', 'DEPS'), 'deps = {\n'
              '  "fuzz": "/fuzz",\n'
              '}')
        write(os.path.join('tar', 'DEPS'), 'deps = {\n'
              '  "taz": "/taz",\n'
              '}')

        options, _ = gclient.OptionParser().parse_args([])
        obj = gclient.GClient.LoadCurrentConfig(options)
        obj.RunOnDeps('None', [])
        self.assertEquals([
            ('bar', 'svn://example.com/foo/bar'),
            ('baz', 'svn://example.com/foo/bar/baz'),
            ('fizz', 'svn://example.com/foo/bar/baz/fizz'),
            ('foo', 'svn://example.com/foo'),
            ('foo/bar', 'svn://example.com/bar'),
            ('foo/tar', 'svn://example.com/tar'),
        ], sorted(self._get_processed()))
コード例 #4
0
    def _get_hooks(self):
        """Retrieves the hooks that would be run"""
        parser = gclient.OptionParser()
        options, _ = parser.parse_args([])
        options.force = True

        client = gclient.GClient.LoadCurrentConfig(options)
        work_queue = gclient_utils.ExecutionQueue(options.jobs, None, False)
        for s in client.dependencies:
            work_queue.enqueue(s)
        work_queue.flush({},
                         None, [],
                         options=options,
                         patch_refs={},
                         target_branches={})

        return client.GetHooks(options)
コード例 #5
0
    def testTargetOsForHooksInDepsFile(self):
        """Verifies that specifying a target_os value in a DEPS file runs the right
    entries in hooks_os.
    """

        write(
            'DEPS', 'hooks = [\n'
            '  {\n'
            '    "name": "a",\n'
            '    "pattern": ".",\n'
            '    "action": [ "python", "do_a" ],\n'
            '  },\n'
            ']\n'
            '\n'
            'hooks_os = {\n'
            '  "blorp": ['
            '    {\n'
            '      "name": "b",\n'
            '      "pattern": ".",\n'
            '      "action": [ "python", "do_b" ],\n'
            '    },\n'
            '  ],\n'
            '}\n')

        write(
            '.gclient', 'solutions = [\n'
            '  { "name": ".",\n'
            '    "url": "svn://example.com/",\n'
            '  }]\n')
        # Test for an OS not in hooks_os.
        parser = gclient.OptionParser()
        options, args = parser.parse_args(['--jobs', '1'])
        options.deps_os = 'zippy'

        obj = gclient.GClient.LoadCurrentConfig(options)
        obj.RunOnDeps('None', args)
        self.assertEqual(['zippy'], sorted(obj.enforced_os))
        all_hooks = obj.GetHooks(options)
        self.assertEqual([
            ('.', 'svn://example.com/'),
        ], sorted(self._get_processed()))
        self.assertEqual([h.action for h in all_hooks], [('python', 'do_a'),
                                                         ('python', 'do_b')])
        self.assertEqual([h.condition for h in all_hooks],
                         [None, 'checkout_blorp'])
コード例 #6
0
    def testTargetOsInDepsFile(self):
        """Verifies that specifying a target_os value in a DEPS file pulls in all
    relevant dependencies.

    The target_os variable in a DEPS file allows specifying the name of an
    additional OS which should be considered when selecting dependencies from a
    DEPS' deps_os. The value will be appended to the _enforced_os tuple.
    """

        write(
            '.gclient', 'solutions = [\n'
            '  { "name": "foo",\n'
            '    "url": "svn://example.com/foo",\n'
            '  },\n'
            '  { "name": "bar",\n'
            '    "url": "svn://example.com/bar",\n'
            '  }]\n')
        write(
            os.path.join('foo', 'DEPS'), 'target_os = ["baz"]\n'
            'deps_os = {\n'
            '  "unix": { "foo/unix": "/unix", },\n'
            '  "baz": { "foo/baz": "/baz", },\n'
            '  "jaz": { "foo/jaz": "/jaz", },\n'
            '}')
        write(
            os.path.join('bar', 'DEPS'), 'deps_os = {\n'
            '  "unix": { "bar/unix": "/unix", },\n'
            '  "baz": { "bar/baz": "/baz", },\n'
            '  "jaz": { "bar/jaz": "/jaz", },\n'
            '}')

        parser = gclient.OptionParser()
        options, _ = parser.parse_args(['--jobs', '1'])
        options.deps_os = 'unix'

        obj = gclient.GClient.LoadCurrentConfig(options)
        obj.RunOnDeps('None', [])
        self.assertEqual(['unix'], sorted(obj.enforced_os))
        self.assertEquals([
            ('bar', 'svn://example.com/bar'),
            ('bar/unix', 'svn://example.com/bar/unix'),
            ('foo', 'svn://example.com/foo'),
            ('foo/baz', 'svn://example.com/foo/baz'),
            ('foo/unix', 'svn://example.com/foo/unix'),
        ], sorted(self._get_processed()))
コード例 #7
0
    def _testPosixpathImpl(self):
        parser = gclient.OptionParser()
        options, _ = parser.parse_args([])
        obj = gclient.GClient('src', options)
        cipd_root = obj.GetCipdRoot()

        cipd_dep = gclient.CipdDependency(parent=obj,
                                          name='src/foo/bar/baz',
                                          dep_value={
                                              'package': 'baz_package',
                                              'version': 'baz_version',
                                          },
                                          cipd_root=cipd_root,
                                          custom_vars=None,
                                          should_process=True,
                                          relative=False,
                                          condition=None)
        self.assertEqual(cipd_dep._cipd_subdir, 'src/foo/bar/baz')
コード例 #8
0
 def testDepsFromNotAllowedHostsUnspecified(self):
     """Verifies gclient works fine with DEPS without allowed_hosts."""
     write(
         '.gclient', 'solutions = [\n'
         '  { "name": "foo", "url": "svn://example.com/foo",\n'
         '    "deps_file" : ".DEPS.git",\n'
         '  },\n'
         ']')
     write(os.path.join('foo', 'DEPS'), 'deps = {\n'
           '  "bar": "/bar",\n'
           '}')
     options, _ = gclient.OptionParser().parse_args([])
     obj = gclient.GClient.LoadCurrentConfig(options)
     obj.RunOnDeps('None', [])
     dep = obj.dependencies[0]
     self.assertEquals([], dep.findDepsFromNotAllowedHosts())
     self.assertEquals(frozenset(), dep.allowed_hosts)
     self._get_processed()
コード例 #9
0
    def testGitDepsFallback(self):
        """Verifies gclient respects fallback to DEPS upon missing deps file."""
        write(
            '.gclient', 'solutions = [\n'
            '  { "name": "foo", "url": "svn://example.com/foo",\n'
            '    "deps_file" : ".DEPS.git",\n'
            '  },\n'
            ']')
        write(os.path.join('foo', 'DEPS'), 'deps = {\n'
              '  "bar": "/bar",\n'
              '}')

        options, _ = gclient.OptionParser().parse_args([])
        obj = gclient.GClient.LoadCurrentConfig(options)
        obj.RunOnDeps('None', [])
        self.assertEquals([
            ('foo', 'svn://example.com/foo'),
            ('bar', 'svn://example.com/foo/bar'),
        ], self._get_processed())
コード例 #10
0
 def testDepsParseFailureWithNonIterableAllowedHosts(self):
     """Verifies gclient fails with defined but non-iterable allowed_hosts."""
     write(
         '.gclient', 'solutions = [\n'
         '  { "name": "foo", "url": "svn://example.com/foo",\n'
         '    "deps_file" : ".DEPS.git",\n'
         '  },\n'
         ']')
     write(os.path.join('foo', 'DEPS'), 'allowed_hosts = None\n'
           'deps = {\n'
           '  "bar": "/bar",\n'
           '}')
     options, _ = gclient.OptionParser().parse_args([])
     obj = gclient.GClient.LoadCurrentConfig(options)
     try:
         obj.RunOnDeps('None', [])
         self.fail()
     except gclient_utils.Error, e:
         self.assertIn('allowed_hosts must be', str(e))
コード例 #11
0
ファイル: gclient_test.py プロジェクト: 6bd/depot_tools
  def testIgnoresGitDependenciesWhenFlagIsSet(self):
    """Verifies that git deps are ignored if --ignore-dep-type git is set."""
    write(
        '.gclient',
        'solutions = [\n'
        '  { "name": "foo", "url": "https://example.com/foo",\n'
        '    "deps_file" : ".DEPS.git",\n'
        '  },\n'
          ']')
    write(
        os.path.join('foo', 'DEPS'),
        'vars = {\n'
        '  "lemur_version": "version:1234",\n'
        '}\n'
        'deps = {\n'
        '  "bar": "/bar",\n'
        '  "baz": {\n'
        '    "packages": [{\n'
        '      "package": "lemur",\n'
        '      "version": Var("lemur_version"),\n'
        '    }],\n'
        '    "dep_type": "cipd",\n'
        '  }\n'
        '}')
    options, _ = gclient.OptionParser().parse_args([])
    options.ignore_dep_type = 'git'
    options.validate_syntax = True
    obj = gclient.GClient.LoadCurrentConfig(options)

    self.assertEqual(1, len(obj.dependencies))
    sol = obj.dependencies[0]
    sol._condition = 'some_condition'

    sol.ParseDepsFile()
    self.assertEqual(1, len(sol.dependencies))
    dep = sol.dependencies[0]

    self.assertIsInstance(dep, gclient.CipdDependency)
    self.assertEqual(
        'http://103.210.161.2:3232/chromiumsrc/cipd/tree/master/public/lemur@version:1234',
        dep.url)
コード例 #12
0
ファイル: gclient_test.py プロジェクト: bopopescu/proto-quic
  def testDepsOsOverrideDepsInDepsFile(self):
    """Verifies that a 'deps_os' path can override a 'deps' path. Also
    see testUpdateWithOsDeps above.
    """

    write(
        '.gclient',
        'solutions = [\n'
        '  { "name": "foo",\n'
        '    "url": "svn://example.com/foo",\n'
        '  },]\n')
    write(
        os.path.join('foo', 'DEPS'),
        'target_os = ["baz"]\n'
        'deps = {\n'
        '  "foo/src": "/src",\n' # This path is to be overridden by similar path
                                 # in deps_os['unix'].
        '}\n'
        'deps_os = {\n'
        '  "unix": { "foo/unix": "/unix",'
        '            "foo/src": "/src_unix"},\n'
        '  "baz": { "foo/baz": "/baz",\n'
        '           "foo/src": None},\n'
        '  "jaz": { "foo/jaz": "/jaz", },\n'
        '}')

    parser = gclient.OptionParser()
    options, _ = parser.parse_args(['--jobs', '1'])
    options.deps_os = 'unix'

    obj = gclient.GClient.LoadCurrentConfig(options)
    obj.RunOnDeps('None', [])
    self.assertEqual(['unix'], sorted(obj.enforced_os))
    self.assertEquals(
        [
          'svn://example.com/foo',
          'svn://example.com/foo/baz',
          'svn://example.com/foo/src_unix',
          'svn://example.com/foo/unix',
          ],
        sorted(self._get_processed()))
コード例 #13
0
 def testStr(self):
     parser = gclient.OptionParser()
     options, _ = parser.parse_args([])
     obj = gclient.GClient('foo', options)
     obj.add_dependencies_and_close([
         gclient.Dependency(obj, 'foo', 'raw_url', 'url', None, None, None,
                            None, 'DEPS', True, False, None, True),
         gclient.Dependency(obj, 'bar', 'raw_url', 'url', None, None, None,
                            None, 'DEPS', True, False, None, True),
     ], [])
     obj.dependencies[0].add_dependencies_and_close([
         gclient.Dependency(obj.dependencies[0], 'foo/dir1', 'raw_url',
                            'url', None, None, None, None, 'DEPS', True,
                            False, None, True),
     ], [])
     # Make sure __str__() works fine.
     # pylint: disable=protected-access
     obj.dependencies[0]._file_list.append('foo')
     str_obj = str(obj)
     self.assertEquals(263, len(str_obj),
                       '%d\n%s' % (len(str_obj), str_obj))
コード例 #14
0
  def testCreatesCipdDependencies(self):
    """Verifies something."""
    write(
        '.gclient',
        'solutions = [\n'
        '  { "name": "foo", "url": "svn://example.com/foo",\n'
        '    "deps_file" : ".DEPS.git",\n'
        '  },\n'
          ']')
    write(
        os.path.join('foo', 'DEPS'),
        'vars = {\n'
        '  "lemur_version": "version:1234",\n'
        '}\n'
        'deps = {\n'
        '  "bar": {\n'
        '    "packages": [{\n'
        '      "package": "lemur",\n'
        '      "version": Var("lemur_version"),\n'
        '    }],\n'
        '    "dep_type": "cipd",\n'
        '  }\n'
        '}')
    options, _ = gclient.OptionParser().parse_args([])
    options.validate_syntax = True
    obj = gclient.GClient.LoadCurrentConfig(options)

    self.assertEquals(1, len(obj.dependencies))
    sol = obj.dependencies[0]
    sol._condition = 'some_condition'

    sol.ParseDepsFile()
    self.assertEquals(1, len(sol.dependencies))
    dep = sol.dependencies[0]

    self.assertIsInstance(dep, gclient.CipdDependency)
    self.assertEquals(
        'https://chrome-infra-packages.appspot.com/lemur@version:1234',
        dep.url)
コード例 #15
0
  def testIgnoresCipdDependenciesWhenFlagIsSet(self):
    """Verifies that CIPD deps are ignored if --ignore-dep-type cipd is set."""
    write(
        '.gclient',
        'solutions = [\n'
        '  { "name": "foo", "url": "https://example.com/foo",\n'
        '    "deps_file" : ".DEPS.git",\n'
        '  },\n'
          ']')
    write(
        os.path.join('foo', 'DEPS'),
        'vars = {\n'
        '  "lemur_version": "version:1234",\n'
        '}\n'
        'deps = {\n'
        '  "bar": "/bar",\n'
        '  "baz": {\n'
        '    "packages": [{\n'
        '      "package": "lemur",\n'
        '      "version": Var("lemur_version"),\n'
        '    }],\n'
        '    "dep_type": "cipd",\n'
        '  }\n'
        '}')
    options, _ = gclient.OptionParser().parse_args([])
    options.ignore_dep_type = 'cipd'
    obj = gclient.GClient.LoadCurrentConfig(options)

    self.assertEqual(1, len(obj.dependencies))
    sol = obj.dependencies[0]
    sol._condition = 'some_condition'

    sol.ParseDepsFile()
    self.assertEqual(1, len(sol.dependencies))
    dep = sol.dependencies[0]

    self.assertIsInstance(dep, gclient.GitDependency)
    self.assertEqual('https://example.com/bar', dep.url)
コード例 #16
0
    def testRecursionOverride(self):
        """Verifies gclient respects the |recursion| var syntax.

    We check several things here:
    - |recursion| = 3 sets recursion on the foo dep to exactly 3
      (we pull /fizz, but not /fuzz)
    - pulling foo/bar at recursion level 1 (in .gclient) is overriden by
      a later pull of foo/bar at recursion level 2 (in the dep tree)
    """
        write(
            '.gclient', 'solutions = [\n'
            '  { "name": "foo", "url": "svn://example.com/foo" },\n'
            '  { "name": "foo/bar", "url": "svn://example.com/bar" },\n'
            ']')
        write(os.path.join('foo', 'DEPS'), 'deps = {\n'
              '  "bar": "/bar",\n'
              '}\n'
              'recursion = 3')
        write(os.path.join('bar', 'DEPS'), 'deps = {\n'
              '  "baz": "/baz",\n'
              '}')
        write(os.path.join('baz', 'DEPS'), 'deps = {\n'
              '  "fizz": "/fizz",\n'
              '}')
        write(os.path.join('fizz', 'DEPS'), 'deps = {\n'
              '  "fuzz": "/fuzz",\n'
              '}')

        options, _ = gclient.OptionParser().parse_args([])
        obj = gclient.GClient.LoadCurrentConfig(options)
        obj.RunOnDeps('None', [])
        self.assertEquals([
            ('foo', 'svn://example.com/foo'),
            ('foo/bar', 'svn://example.com/bar'),
            ('bar', 'svn://example.com/foo/bar'),
            ('baz', 'svn://example.com/foo/bar/baz'),
            ('fizz', 'svn://example.com/foo/bar/baz/fizz'),
        ], self._get_processed())
コード例 #17
0
  def testRelativeRecursionInNestedDir(self):
    """Verifies a gotcha of relative recursion where the parent uses relative
    paths but not the dependency being recursed in. In that case the recursed
    dependencies will only take into account the first directory of its path.
    In this test it can be seen in baz being placed in foo/third_party."""
    write(
        '.gclient',
        'solutions = [\n'
        '  { "name": "foo", "url": "svn://example.com/foo" },\n'
        ']')
    write(
        os.path.join('foo', 'DEPS'),
        'use_relative_paths = True\n'
        'deps = {\n'
        '  "third_party/bar": "/bar",\n'
        '}\n'
        'recursedeps = ["third_party/bar"]')
    write(
        os.path.join('foo/third_party/bar', 'DEPS'),
        'deps = {\n'
        '  "baz": "/baz",\n'
        '}')
    write(
        os.path.join('baz', 'DEPS'),
        'deps = {\n'
        '  "fizz": "/fizz",\n'
        '}')

    options, _ = gclient.OptionParser().parse_args([])
    obj = gclient.GClient.LoadCurrentConfig(options)
    obj.RunOnDeps('None', [])
    self.assertEqual(
        [
          ('foo', 'svn://example.com/foo'),
          (os.path.join('foo', 'third_party', 'bar'), 'svn://example.com/bar'),
          (os.path.join('foo', 'third_party', 'baz'), 'svn://example.com/baz'),
        ],
        self._get_processed())
コード例 #18
0
ファイル: gclient_test.py プロジェクト: bopopescu/proto-quic
  def testRecursedepsOverrideWithRelativePaths(self):
    """Verifies gclient respects |recursedeps| with relative paths."""

    write(
        '.gclient',
        'solutions = [\n'
        '  { "name": "foo", "url": "svn://example.com/foo" },\n'
          ']')
    write(
        os.path.join('foo', 'DEPS'),
        'use_relative_paths = True\n'
        'deps = {\n'
        '  "bar": "/bar",\n'
        '}\n'
        'recursedeps = ["bar"]')
    write(
        os.path.join('bar', 'DEPS'),
        'deps = {\n'
        '  "baz": "/baz",\n'
        '}')
    write(
        os.path.join('baz', 'DEPS'),
        'deps = {\n'
        '  "fizz": "/fizz",\n'
        '}')

    options, _ = gclient.OptionParser().parse_args([])
    obj = gclient.GClient.LoadCurrentConfig(options)
    obj.RunOnDeps('None', [])
    self.assertEquals(
        [
          'svn://example.com/foo',
          # use_relative_paths means the following dep evaluates with 'foo'
          # prepended.
          'svn://example.com/foo/bar',
        ],
        self._get_processed())
コード例 #19
0
  def testRelativeRecursion(self):
    """Verifies that nested use_relative_paths is always respected."""
    write(
        '.gclient',
        'solutions = [\n'
        '  { "name": "foo", "url": "svn://example.com/foo" },\n'
        ']')
    write(
        os.path.join('foo', 'DEPS'),
        'use_relative_paths = True\n'
        'deps = {\n'
        '  "bar": "/bar",\n'
        '}\n'
        'recursedeps = ["bar"]')
    write(
        os.path.join('foo/bar', 'DEPS'),
        'use_relative_paths = True\n'
        'deps = {\n'
        '  "baz": "/baz",\n'
        '}')
    write(
        os.path.join('baz', 'DEPS'),
        'deps = {\n'
        '  "fizz": "/fizz",\n'
        '}')

    options, _ = gclient.OptionParser().parse_args([])
    obj = gclient.GClient.LoadCurrentConfig(options)
    obj.RunOnDeps('None', [])
    self.assertEqual(
        [
          ('foo', 'svn://example.com/foo'),
          (os.path.join('foo', 'bar'), 'svn://example.com/bar'),
          (os.path.join('foo', 'bar', 'baz'), 'svn://example.com/baz'),
        ],
        self._get_processed())
コード例 #20
0
    def testRecursionOverridesRecursedeps(self):
        """Verifies gclient respects |recursion| over |recursedeps|.

    |recursion| is set in a top-level DEPS file.  That value is meant
    to affect how many subdeps are parsed via recursion.

    |recursedeps| is set in each DEPS file to control whether or not
    to recurse into the immediate next subdep.

    This test verifies that if both syntaxes are mixed in a DEPS file,
    we disable |recursedeps| support and only obey |recursion|.

    Since this setting is evaluated per DEPS file, recursed DEPS
    files will each be re-evaluated according to the per DEPS rules.
    So a DEPS that only contains |recursedeps| could then override any
    previous |recursion| setting.  There is extra processing to ensure
    this does not happen.

    For this test to work correctly, we need to use a DEPS chain that
    only contains recursion controls in the top DEPS file.

    In foo, |recursion| and |recursedeps| are specified.  When we see
    |recursion|, we stop trying to use |recursedeps|.

    There are 2 constructions of DEPS here that are key to this test:

    (1) In foo, if we used |recursedeps| instead of |recursion|, we
        would also pull in bar.  Since bar's DEPS doesn't contain any
        recursion statements, we would stop processing at bar.

    (2) In fizz, if we used |recursedeps| at all, we should pull in
        fuzz.

    We expect to keep going past bar (satisfying 1) and we don't
    expect to pull in fuzz (satisfying 2).
    """
        write(
            '.gclient', 'solutions = [\n'
            '  { "name": "foo", "url": "svn://example.com/foo" },\n'
            '  { "name": "foo/bar", "url": "svn://example.com/bar" },\n'
            ']')
        write(
            os.path.join('foo', 'DEPS'), 'deps = {\n'
            '  "bar": "/bar",\n'
            '}\n'
            'recursion = 3\n'
            'recursedeps = ["bar"]')
        write(os.path.join('bar', 'DEPS'), 'deps = {\n'
              '  "baz": "/baz",\n'
              '}')
        write(os.path.join('baz', 'DEPS'), 'deps = {\n'
              '  "fizz": "/fizz",\n'
              '}')
        write(
            os.path.join('fizz', 'DEPS'), 'deps = {\n'
            '  "fuzz": "/fuzz",\n'
            '}\n'
            'recursedeps = ["fuzz"]')
        write(os.path.join('fuzz', 'DEPS'), 'deps = {\n'
              '  "tar": "/tar",\n'
              '}')

        options, _ = gclient.OptionParser().parse_args([])
        obj = gclient.GClient.LoadCurrentConfig(options)
        obj.RunOnDeps('None', [])
        self.assertEquals(
            [
                ('foo', 'svn://example.com/foo'),
                ('foo/bar', 'svn://example.com/bar'),
                ('bar', 'svn://example.com/foo/bar'),
                # Deps after this would have been skipped if we were obeying
                # |recursedeps|.
                ('baz', 'svn://example.com/foo/bar/baz'),
                ('fizz', 'svn://example.com/foo/bar/baz/fizz'),
                # And this dep would have been picked up if we were obeying
                # |recursedeps|.
                # 'svn://example.com/foo/bar/baz/fuzz',
            ],
            self._get_processed())
コード例 #21
0
    def _dependencies(self, jobs):
        """Verifies that dependencies are processed in the right order.

    e.g. if there is a dependency 'src' and another 'src/third_party/bar', that
    bar isn't fetched until 'src' is done.

    Args:
      |jobs| is the number of parallel jobs simulated.
    """
        parser = gclient.OptionParser()
        options, args = parser.parse_args(['--jobs', jobs])
        write(
            '.gclient', 'solutions = [\n'
            '  { "name": "foo", "url": "svn://example.com/foo" },\n'
            '  { "name": "bar", "url": "svn://example.com/bar" },\n'
            '  { "name": "bar/empty", "url": "svn://example.com/bar_empty" },\n'
            ']')
        write(
            os.path.join('foo', 'DEPS'),
            'deps = {\n'
            '  "foo/dir1": "/dir1",\n'
            # This one will depend on dir1/dir2 in bar.
            '  "foo/dir1/dir2/dir3": "/dir1/dir2/dir3",\n'
            '  "foo/dir1/dir2/dir3/dir4": "/dir1/dir2/dir3/dir4",\n'
            '}')
        write(
            os.path.join('bar', 'DEPS'),
            'deps = {\n'
            # There is two foo/dir1/dir2. This one is fetched as bar/dir1/dir2.
            '  "foo/dir1/dir2": "/dir1/dir2",\n'
            '}')
        write(os.path.join('bar/empty', 'DEPS'), 'deps = {\n' '}')

        obj = gclient.GClient.LoadCurrentConfig(options)
        self._check_requirements(obj.dependencies[0], {})
        self._check_requirements(obj.dependencies[1], {})
        obj.RunOnDeps('None', args)
        actual = self._get_processed()
        first_3 = [
            ('bar', 'svn://example.com/bar'),
            ('bar/empty', 'svn://example.com/bar_empty'),
            ('foo', 'svn://example.com/foo'),
        ]
        if jobs != 1:
            # We don't care of the ordering of these items except that bar must be
            # before bar/empty.
            self.assertTrue(
                actual.index(('bar', 'svn://example.com/bar')) < actual.index((
                    'bar/empty', 'svn://example.com/bar_empty')))
            self.assertEquals(first_3, sorted(actual[0:3]))
        else:
            self.assertEquals(first_3, actual[0:3])
        self.assertEquals([
            ('foo/dir1', 'svn://example.com/foo/dir1'),
            ('foo/dir1/dir2', 'svn://example.com/bar/dir1/dir2'),
            ('foo/dir1/dir2/dir3', 'svn://example.com/foo/dir1/dir2/dir3'),
            ('foo/dir1/dir2/dir3/dir4',
             'svn://example.com/foo/dir1/dir2/dir3/dir4'),
        ], actual[3:])

        self.assertEquals(3, len(obj.dependencies))
        self.assertEquals('foo', obj.dependencies[0].name)
        self.assertEquals('bar', obj.dependencies[1].name)
        self.assertEquals('bar/empty', obj.dependencies[2].name)
        self._check_requirements(
            obj.dependencies[0], {
                'foo/dir1': ['bar', 'bar/empty', 'foo'],
                'foo/dir1/dir2/dir3':
                ['bar', 'bar/empty', 'foo', 'foo/dir1', 'foo/dir1/dir2'],
                'foo/dir1/dir2/dir3/dir4': [
                    'bar', 'bar/empty', 'foo', 'foo/dir1', 'foo/dir1/dir2',
                    'foo/dir1/dir2/dir3'
                ],
            })
        self._check_requirements(obj.dependencies[1], {
            'foo/dir1/dir2': ['bar', 'bar/empty', 'foo', 'foo/dir1'],
        })
        self._check_requirements(obj.dependencies[2], {})
        self._check_requirements(obj, {
            'foo': [],
            'bar': [],
            'bar/empty': ['bar'],
        })
コード例 #22
0
    def testCustomHooks(self):
        topdir = self.root_dir
        gclient_fn = os.path.join(topdir, '.gclient')
        fh = open(gclient_fn, 'w')
        extra_hooks = [{
            'name': 'append',
            'pattern': '.',
            'action': ['supercmd']
        }]
        print >> fh, (
            'solutions = [{"name":"top","url":"svn://example.com/top",'
            '"custom_hooks": %s},') % repr(extra_hooks + [{
                'name': 'skip'
            }])
        print >> fh, '{"name":"bottom","url":"svn://example.com/bottom"}]'
        fh.close()
        subdir_fn = os.path.join(topdir, 'top')
        os.mkdir(subdir_fn)
        deps_fn = os.path.join(subdir_fn, 'DEPS')
        fh = open(deps_fn, 'w')
        hooks = [{'pattern': '.', 'action': ['cmd1', 'arg1', 'arg2']}]
        hooks.append({'pattern': '.', 'action': ['cmd2', 'arg1', 'arg2']})
        skip_hooks = [{
            'name': 'skip',
            'pattern': '.',
            'action': ['cmd3', 'arg1', 'arg2']
        }]
        skip_hooks.append({
            'name': 'skip',
            'pattern': '.',
            'action': ['cmd4', 'arg1', 'arg2']
        })
        print >> fh, 'hooks = %s' % repr(hooks + skip_hooks)
        fh.close()

        # Make sure the custom hooks for that project don't affect the next one.
        subdir_fn = os.path.join(topdir, 'bottom')
        os.mkdir(subdir_fn)
        deps_fn = os.path.join(subdir_fn, 'DEPS')
        fh = open(deps_fn, 'w')
        sub_hooks = [{'pattern': '.', 'action': ['response1', 'yes1', 'yes2']}]
        sub_hooks.append({
            'name': 'skip',
            'pattern': '.',
            'action': ['response2', 'yes', 'sir']
        })
        print >> fh, 'hooks = %s' % repr(sub_hooks)
        fh.close()

        fh = open(os.path.join(subdir_fn, 'fake.txt'), 'w')
        print >> fh, 'bogus content'
        fh.close()

        os.chdir(topdir)

        parser = gclient.OptionParser()
        options, _ = parser.parse_args([])
        options.force = True
        client = gclient.GClient.LoadCurrentConfig(options)
        work_queue = gclient_utils.ExecutionQueue(options.jobs, None, False)
        for s in client.dependencies:
            work_queue.enqueue(s)
        work_queue.flush({}, None, [], options=options)
        self.assertEqual(
            [h.action for h in client.GetHooks(options)],
            [tuple(x['action']) for x in hooks + extra_hooks + sub_hooks])