Example #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])
Example #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']))
    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()))
Example #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)
Example #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'])
    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()))
Example #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')
 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()
    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())
Example #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))
Example #11
0
  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)
Example #12
0
  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()))
Example #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))
Example #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)
Example #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)
Example #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())
Example #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())
Example #18
0
  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())
Example #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())
Example #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())
Example #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'],
        })
Example #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])