def run_main() -> int: try: # Read commit information: dd_sdk_ios_commit = DogfoodedCommit() # Resolve and read `dd-sdk-ios` dependencies: dd_sdk_package_path = '../..' os.system( f'swift package --package-path {dd_sdk_package_path} resolve') dd_sdk_ios_package = PackageResolvedFile( path=f'{dd_sdk_package_path}/Package.resolved') kronos_dependency = dd_sdk_ios_package.read_dependency( package_name='Kronos') plcrash_reporter_dependency = dd_sdk_ios_package.read_dependency( package_name='PLCrashReporter') if dd_sdk_ios_package.get_number_of_dependencies() > 2: raise Exception( '`dogfood.py` needs update as `dd-sdk-ios` has unrecognized dependencies' ) # Clone `datadog-ios` repository to temporary location and update its `Package.resolved` so it points # to the current `dd-sdk-ios` commit. After that, push changes to `datadog-ios` and create dogfooding PR. with TemporaryDirectory() as temp_dir: with remember_cwd(): repository = Repository.clone( ssh='[email protected]:DataDog/datadog-ios.git', repository_name='datadog-ios', temp_dir=temp_dir) repository.create_branch( f'dogfooding-{dd_sdk_ios_commit.hash_short}') package = PackageResolvedFile( path= 'Datadog.xcworkspace/xcshareddata/swiftpm/Package.resolved' ) # Update version of `dd-sdk-ios`: package.update_dependency(package_name='DatadogSDK', new_branch='dogfooding', new_revision=dd_sdk_ios_commit.hash, new_version=None) # Set version of `Kronos` to as it is resolved in `dd-sdk-ios`: package.update_dependency( package_name='Kronos', new_branch=kronos_dependency['branch'], new_revision=kronos_dependency['revision'], new_version=kronos_dependency['version'], ) # Set version of `PLCrashReporter` to as it is resolved in `dd-sdk-ios`: package.update_dependency( package_name='PLCrashReporter', new_branch=plcrash_reporter_dependency['branch'], new_revision=plcrash_reporter_dependency['revision'], new_version=plcrash_reporter_dependency['version'], ) package.save() # Push changes to `datadog-ios`: repository.commit( message= f'Dogfooding dd-sdk-ios commit: {dd_sdk_ios_commit.hash}\n\n' + f'Dogfooded commit message: {dd_sdk_ios_commit.message}', author=dd_sdk_ios_commit.author) repository.push() # Create PR: repository.create_pr( title= f'[Dogfooding] Upgrade dd-sdk-ios to {dd_sdk_ios_commit.hash_short}', description= '⚙️ This is an automated PR upgrading the version of \`dd-sdk-ios\` to ' + f'https://github.com/DataDog/dd-sdk-ios/commit/{dd_sdk_ios_commit.hash}' ) except Exception as error: print(f'❌ Dogfooding failed: {error}') return 1 return 0
def dogfood(dry_run: bool, repository_url: str, repository_name: str, repository_package_resolved_path: str) -> int: print(f'🐶 Dogfooding: {repository_name}...') # Read commit information: dd_sdk_ios_commit = DogfoodedCommit() # Resolve and read `dd-sdk-ios` dependencies: dd_sdk_package_path = '../..' os.system(f'swift package --package-path {dd_sdk_package_path} resolve') dd_sdk_ios_package = PackageResolvedFile( path=f'{dd_sdk_package_path}/Package.resolved') # Clone dependant repo to temporary location and update its `Package.resolved` so it points # to the current `dd-sdk-ios` commit. After that, push changes to dependant repo and create dogfooding PR. with TemporaryDirectory() as temp_dir: with remember_cwd(): repository = Repository.clone(ssh=repository_url, repository_name=repository_name, temp_dir=temp_dir) repository.create_branch( f'dogfooding-{dd_sdk_ios_commit.hash_short}') package = PackageResolvedFile( path=repository_package_resolved_path) # Update version of `dd-sdk-ios`: package.update_dependency(package_name='DatadogSDK', new_branch='dogfooding', new_revision=dd_sdk_ios_commit.hash, new_version=None) # Add or update `dd-sdk-ios` dependencies for dependency_name in dd_sdk_ios_package.read_dependency_names(): dependency = dd_sdk_ios_package.read_dependency( package_name=dependency_name) if package.has_dependency(package_name=dependency_name): package.update_dependency( package_name=dependency_name, new_branch=dependency['state']['branch'], new_revision=dependency['state']['revision'], new_version=dependency['state']['version'], ) else: package.add_dependency( package_name=dependency_name, repository_url=dependency['repositoryURL'], branch=dependency['state']['branch'], revision=dependency['state']['revision'], version=dependency['state']['version']) package.save() # Push changes to dependant repo: repository.commit( message= f'Dogfooding dd-sdk-ios commit: {dd_sdk_ios_commit.hash}\n\n' + f'Dogfooded commit message: {dd_sdk_ios_commit.message}', author=dd_sdk_ios_commit.author) if dry_run: package.print() else: repository.push() # Create PR: repository.create_pr( title= f'[Dogfooding] Upgrade dd-sdk-ios to {dd_sdk_ios_commit.hash_short}', description= '⚙️ This is an automated PR upgrading the version of \`dd-sdk-ios\` to ' + f'https://github.com/DataDog/dd-sdk-ios/commit/{dd_sdk_ios_commit.hash}' )