Ejemplo n.º 1
0
    def test_RevisionFileSaveLoad(self):
        # Tests that we can properly save and load a revision file.
        package = package_info.PackageInfo()
        package.AppendArchive(
            archive_info.ArchiveInfo(name='test_name', hash='hash_value'))

        revision = revision_info.RevisionInfo(self._packages)
        revision.SetRevisionNumber('123abc')
        package_targets = self._packages.GetPackageTargetsForPackage(
            TEST_SINGLE_PACKAGE_PACKAGE_TARGET)
        self.assertEqual(
            1, len(package_targets),
            "Invalid test data, single package package target requires 1 target"
        )

        revision.SetTargetRevision(TEST_SINGLE_PACKAGE_PACKAGE_TARGET,
                                   package_targets[0], package)

        with pynacl.working_directory.TemporaryWorkingDirectory() as work_dir:
            revision_file = os.path.join(work_dir, 'test_revision.json')
            revision.SaveRevisionFile(revision_file)

            new_revision = revision_info.RevisionInfo(self._packages,
                                                      revision_file)

        self.assertEqual(revision, new_revision)
Ejemplo n.º 2
0
    def test_AlteredRevisionFileFails(self):
        # Tests that an altered revision file will fail to load.
        package = package_info.PackageInfo()
        package.AppendArchive(
            archive_info.ArchiveInfo(name='test_name', hash='hash_value'))

        revision = revision_info.RevisionInfo(self._packages)
        revision.SetRevisionNumber('123abc')
        package_targets = self._packages.GetPackageTargetsForPackage(
            TEST_SINGLE_PACKAGE_PACKAGE_TARGET)
        for package_target in package_targets:
            revision.SetTargetRevision(TEST_SINGLE_PACKAGE_PACKAGE_TARGET,
                                       package_target, package)

        with pynacl.working_directory.TemporaryWorkingDirectory() as work_dir:
            revision_file = os.path.join(work_dir, 'altered_revision.json')
            revision.SaveRevisionFile(revision_file)

            # Alter the file directly and save it back out
            with open(revision_file, 'rt') as f:
                revision_json = json.load(f)
            revision_json[revision_info.FIELD_REVISION] = 'noise'
            with open(revision_file, 'wt') as f:
                json.dump(revision_json, f)

            new_revision = revision_info.RevisionInfo(self._packages)
            self.assertRaises(error.Error, new_revision.LoadRevisionFile,
                              revision_file)
Ejemplo n.º 3
0
    def test_RevisionFileSavesForMultiTargets(self):
        # Tests that a revision successfully saves a multi-package target package.
        package = package_info.PackageInfo()
        package.AppendArchive(
            archive_info.ArchiveInfo(name='test_name', hash='hash_value'))

        package_targets = self._packages.GetPackageTargetsForPackage(
            TEST_MULTI_PACKAGE_PACKAGE_TARGET)
        self.assertTrue(
            len(package_targets) > 0,
            'Invalid test data, multiple package targets expected')

        revision = revision_info.RevisionInfo(self._packages)
        revision.SetRevisionNumber('123abc')
        for package_target in package_targets:
            revision.SetTargetRevision(TEST_MULTI_PACKAGE_PACKAGE_TARGET,
                                       package_target, package)

        with pynacl.working_directory.TemporaryWorkingDirectory() as work_dir:
            revision_file = os.path.join(work_dir, 'complete_revision.json')
            revision.SaveRevisionFile(revision_file)

            new_revision = revision_info.RevisionInfo(self._packages,
                                                      revision_file)

        self.assertEqual(revision, new_revision)
    def test_RevisionTargetSamePackage(self):
        # Tests that all the targets must all be the same.
        package = package_info.PackageInfo()
        package.AppendArchive('test_name', 'hash_value')

        revision_desc = revision_info.RevisionInfo(self._packages)
        revision_desc.SetTargetRevision('test1', 'package_target', package)

        self.assertRaises(RuntimeError, revision_desc.SetTargetRevision,
                          'test2', 'package_target', package)
    def test_RevTargetSets(self):
        # Tests that we can properly set a target revision.
        package = package_info.PackageInfo()
        package.AppendArchive('test_name', 'hash_value')

        revision_desc = revision_info.RevisionInfo(self._packages)
        revision_desc.SetTargetRevision('test_package', 'package_target',
                                        package)

        self.assertEqual(package,
                         revision_desc.GetPackageInfo('package_target'))
Ejemplo n.º 6
0
def _DoSyncCmd(arguments):
  # TODO(dyen): remove this section eventually.
  # Before syncing, remove any old toolchain files temporarily.
  RemoveOldToolchainFiles(arguments.dest_dir)

  for package_target, package_name in arguments.package_target_packages:
    if arguments.sync__revision is None:
      # When the sync revision number is not specified, use the set
      # revision number found in the revision directory.
      revision_file = package_locations.GetRevisionFile(
          arguments.revisions_dir,
          package_name)
      revision_desc = revision_info.RevisionInfo(
          arguments.packages_desc,
          revision_file)
      package_desc = revision_desc.GetPackageInfo(package_target)
      revision_num = revision_desc.GetRevisionNumber()
    else:
      # When the sync revision number is specified, find the package to
      # download remotely using the revision.
      revision_num = arguments.sync__revision
      remote_package_key = package_locations.GetRemotePackageKey(
          arguments.packages_desc.IsSharedPackage(package_name),
          arguments.sync__revision,
          package_target,
          package_name)
      with pynacl.working_directory.TemporaryWorkingDirectory() as work_dir:
        temp_package_file = os.path.join(
            work_dir,
            os.path.basename(remote_package_key) + TEMP_SUFFIX)

        package_info.DownloadPackageInfoFiles(
            temp_package_file,
            remote_package_key,
            downloader=arguments.gsd_store.GetFile)

        package_desc = package_info.PackageInfo(temp_package_file)

    DownloadPackageArchives(
        arguments.tar_dir,
        package_target,
        package_name,
        package_desc,
        revision_num=revision_num)

  CleanTempFiles(arguments.tar_dir)

  if arguments.sync__extract:
    ExtractPackageTargets(
        arguments.package_target_packages,
        arguments.tar_dir,
        arguments.dest_dir,
        quiet=arguments.quiet)
Ejemplo n.º 7
0
def _DoSyncCmd(arguments):
  for package_target, package_name in arguments.package_target_packages:
    if arguments.sync__revision is None:
      # When the sync revision number is not specified, use the set
      # revision number found in the revision directory.
      revision_file = package_locations.GetRevisionFile(
          arguments.revisions_dir,
          package_name
      )
      revision_desc = revision_info.RevisionInfo(
          arguments.packages_desc,
          revision_file
      )
      package_desc = revision_desc.GetPackageInfo(package_target)
    else:
      # When the sync revision number is specified, find the package to
      # download remotely using the revision.
      remote_package_key = package_locations.GetRemotePackageKey(
          arguments.packages_desc.IsSharedPackage(package_name),
          arguments.sync__revision,
          package_target,
          package_name
      )
      temp_package_file = os.path.join(
          arguments.tar_dir,
          os.path.basename(remote_package_key) + TEMP_SUFFIX
      )
      pynacl.file_tools.MakeParentDirectoryIfAbsent(temp_package_file)
      url = arguments.gsd_store.GetFile(remote_package_key, temp_package_file)
      if url is None:
        raise IOError('Could not sync file: %s' % remote_package_key)

      package_desc = package_info.PackageInfo(temp_package_file)

    DownloadPackageArchives(
        arguments.gsd_store,
        arguments.tar_dir,
        package_target,
        package_name,
        package_desc
    )

  CleanTempFiles(arguments.tar_dir)

  if arguments.sync__extract:
    ExtractPackageTargets(
        arguments.package_target_packages,
        arguments.tar_dir,
        arguments.dest_dir
    )
Ejemplo n.º 8
0
def _DoSetRevisionCmd(arguments):
  package_name = arguments.setrevision__package
  revision_num = arguments.setrevision__revision

  revision_desc = revision_info.RevisionInfo(arguments.packages_desc)
  revision_desc.SetRevisionNumber(revision_num)

  custom_package_targets = GetPackageTargetPackages(package_name, [])
  if not custom_package_targets:
    package_targets = arguments.packages_desc.GetPackageTargetsForPackage(
        package_name)
  else:
    package_targets = [target[0] for target in custom_package_targets]
    first_target = custom_package_targets[0]
    package_name = first_target[1]

  with pynacl.working_directory.TemporaryWorkingDirectory() as work_dir:
    for package_target in package_targets:
      remote_package_key = package_locations.GetRemotePackageKey(
          arguments.packages_desc.IsSharedPackage(package_name),
          revision_num,
          package_target,
          package_name)

      temp_package_file = os.path.join(
          work_dir,
          os.path.basename(remote_package_key) + TEMP_SUFFIX)

      package_info.DownloadPackageInfoFiles(
          temp_package_file,
          remote_package_key,
          downloader=arguments.gsd_store.GetFile)

      package_desc = package_info.PackageInfo(temp_package_file)

      logging.info('Setting %s:%s to revision %s',
                   package_target, package_name, revision_num)
      revision_desc.SetTargetRevision(
          package_name,
          package_target,
          package_desc)

  revision_file = package_locations.GetRevisionFile(
      arguments.revisions_dir,
      package_name)
  pynacl.file_tools.MakeParentDirectoryIfAbsent(revision_file)
  revision_desc.SaveRevisionFile(revision_file)

  CleanTempFiles(arguments.revisions_dir)
Ejemplo n.º 9
0
def _DoGetRevisionCmd(arguments):
  package_name = arguments.getrevision__package

  custom_package_targets = GetPackageTargetPackages(package_name, [])
  if custom_package_targets:
    custom_target, package_name = custom_package_targets[0]

  revision_file = package_locations.GetRevisionFile(arguments.revisions_dir,
                                                    package_name)

  if not os.path.isfile(revision_file):
    raise NameError('No revision set for package: %s.' % package_name)

  revision_desc = revision_info.RevisionInfo(arguments.packages_desc,
                                             revision_file)
  print revision_desc.GetRevisionNumber()
    def test_RevisionFileRequiresRevisionNumber(self):
        # Tests that we can properly save and load a revision file.
        package = package_info.PackageInfo()
        package.AppendArchive('test_name', 'hash_value')

        revision = revision_info.RevisionInfo(self._packages)
        package_targets = self._packages.GetPackageTargetsForPackage(
            TEST_SINGLE_PACKAGE_PACKAGE_TARGET)
        for package_target in package_targets:
            revision.SetTargetRevision(TEST_SINGLE_PACKAGE_PACKAGE_TARGET,
                                       package_target, package)

        with pynacl.working_directory.TemporaryWorkingDirectory() as work_dir:
            revision_file = os.path.join(work_dir, 'test_revision.json')

            self.assertRaises(RuntimeError, revision.SaveRevisionFile,
                              revision_file)
    def test_RevisionFileMustSetAllTargets(self):
        # Tests that a revision file fails if not all package targets are set.
        package = package_info.PackageInfo()
        package.AppendArchive('test_name', 'hash_value')

        package_targets = self._packages.GetPackageTargetsForPackage(
            TEST_MULTI_PACKAGE_PACKAGE_TARGET)
        self.assertTrue(
            len(package_targets) > 0,
            'Invalid test data, multiple package targets expected')

        revision = revision_info.RevisionInfo(self._packages)
        revision.SetRevisionNumber(100)
        revision.SetTargetRevision(TEST_MULTI_PACKAGE_PACKAGE_TARGET,
                                   package_targets[0], package)

        with pynacl.working_directory.TemporaryWorkingDirectory() as work_dir:
            revision_file = os.path.join(work_dir, 'incomplete_revision.json')
            self.assertRaises(RuntimeError, revision.SaveRevisionFile,
                              revision_file)
Ejemplo n.º 12
0
def _DoSetRevisionCmd(arguments):
  package_name = arguments.setrevision__package
  revision_num = arguments.setrevision__revision

  revision_desc = revision_info.RevisionInfo(arguments.packages_desc)
  package_targets = arguments.packages_desc.GetPackageTargetsForPackage(
      package_name
  )

  for package_target in package_targets:
    remote_package_key = package_locations.GetRemotePackageKey(
        arguments.packages_desc.IsSharedPackage(package_name),
        revision_num,
        package_target,
        package_name
    )
    temp_package_file = os.path.join(
        arguments.revisions_dir,
        os.path.basename(remote_package_key) + TEMP_SUFFIX)
    pynacl.file_tools.MakeParentDirectoryIfAbsent(temp_package_file)
    url = arguments.gsd_store.GetFile(remote_package_key, temp_package_file)
    if url is None:
      raise IOError('Could not download package file: %s' % remote_package_key)

    package_desc = package_info.PackageInfo(temp_package_file)
    logging.info('Setting %s:%s to revision %s',
                 package_target, package_name, revision_num)
    revision_desc.SetTargetRevision(
        package_name,
        package_target,
        package_desc
    )

  revision_file = package_locations.GetRevisionFile(
      arguments.revisions_dir,
      package_name
  )
  pynacl.file_tools.MakeParentDirectoryIfAbsent(revision_file)
  revision_desc.SaveRevisionFile(revision_file)

  CleanTempFiles(arguments.revisions_dir)