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)
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)
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'))
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)
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 )
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)
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)
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)