diff --git a/doc/stdenv/stdenv.xml b/doc/stdenv/stdenv.xml index ccf5bb440d36..060dc80c9157 100644 --- a/doc/stdenv/stdenv.xml +++ b/doc/stdenv/stdenv.xml @@ -475,11 +475,12 @@ passthru.updateScript = writeScript "update-zoom-us" '' passthru.updateScript = [ ../../update.sh pname "--requested-release=unstable" ]; - Finally, the attribute can be an attribute set, listing the extra supported features among other things. + Finally, the attribute can be an attribute set, listing the attribute path and extra supported features in addition to command. passthru.updateScript = { command = [ ../../update.sh pname ]; - supportedFeatures = [ "commit" ]; + attrPath = pname; + supportedFeatures = [ … ]; }; @@ -488,9 +489,12 @@ passthru.updateScript = { + + maintainers/scripts/update.nix also supports automatically creating commits by running it with --argstr commit true but it requires either declaring the attrPath, or adding a commit to supportedFeatures and modifying the script accordingly. + Supported features - + commit diff --git a/maintainers/scripts/update.nix b/maintainers/scripts/update.nix index e11e2450bd0a..3d6f3500f5cf 100755 --- a/maintainers/scripts/update.nix +++ b/maintainers/scripts/update.nix @@ -143,8 +143,10 @@ let packageData = package: { name = package.name; pname = lib.getName package; + oldVersion = lib.getVersion package; updateScript = map builtins.toString (lib.toList (package.updateScript.command or package.updateScript)); supportedFeatures = package.updateScript.supportedFeatures or []; + attrPath = package.updateScript.attrPath or null; }; packagesJson = pkgs.writeText "packages.json" (builtins.toJSON (map packageData packages)); diff --git a/maintainers/scripts/update.py b/maintainers/scripts/update.py index 51a19164a17b..bca554a5d82b 100644 --- a/maintainers/scripts/update.py +++ b/maintainers/scripts/update.py @@ -72,8 +72,7 @@ def make_worktree() -> Generator[Tuple[str, str], None, None]: subprocess.run(['git', 'worktree', 'remove', '--force', target_directory]) subprocess.run(['git', 'branch', '-D', branch_name]) -async def commit_changes(merge_lock: asyncio.Lock, worktree: str, branch: str, update_info: str) -> None: - changes = json.loads(update_info) +async def commit_changes(name: str, merge_lock: asyncio.Lock, worktree: str, branch: str, changes: List[Dict]) -> None: for change in changes: # Git can only handle a single index operation at a time async with merge_lock: @@ -85,7 +84,29 @@ async def commit_changes(merge_lock: asyncio.Lock, worktree: str, branch: str, u async def merge_changes(merge_lock: asyncio.Lock, package: Dict, update_info: str, temp_dir: Optional[Tuple[str, str]]) -> None: if temp_dir is not None: worktree, branch = temp_dir - await commit_changes(merge_lock, worktree, branch, update_info) + + if 'commit' in package['supportedFeatures']: + changes = json.loads(update_info) + elif 'attrPath' in package: + attr_path = package['attrPath'] + obtain_new_version_process = await check_subprocess('nix-instantiate', '--expr', f'with import ./. {{}}; lib.getVersion {attr_path}', '--eval', '--strict', '--json', stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE, cwd=worktree) + new_version = json.loads((await obtain_new_version_process.stdout.read()).decode('utf-8')) + changed_files_process = await check_subprocess('git', 'diff', '--name-only', stdout=asyncio.subprocess.PIPE, cwd=worktree) + changed_files = (await changed_files_process.stdout.read()).splitlines() + if len(changed_files) > 0: + changes = [ + { + 'files': changed_files, + 'oldVersion': package['oldVersion'], + 'newVersion': new_version, + 'attrPath': attr_path, + } + ] + else: + changes = [] + + await commit_changes(package['name'], merge_lock, worktree, branch, changes) + eprint(f" - {package['name']}: DONE.") async def updater(temp_dir: Optional[Tuple[str, str]], merge_lock: asyncio.Lock, packages_to_update: asyncio.Queue[Optional[Dict]], keep_going: bool, commit: bool): @@ -95,7 +116,7 @@ async def updater(temp_dir: Optional[Tuple[str, str]], merge_lock: asyncio.Lock, # A sentinel received, we are done. return - if not ('commit' in package['supportedFeatures']): + if not ('commit' in package['supportedFeatures'] or 'attrPath' in package): temp_dir = None await run_update_script(merge_lock, temp_dir, package, keep_going) diff --git a/pkgs/desktops/gnome-3/update.nix b/pkgs/desktops/gnome-3/update.nix index 78cefdd0b0a7..5c3e5c247852 100644 --- a/pkgs/desktops/gnome-3/update.nix +++ b/pkgs/desktops/gnome-3/update.nix @@ -21,9 +21,9 @@ let version_policy="$3" PATH=${lib.makeBinPath [ common-updater-scripts python ]} latest_tag=$(python "${./find-latest-version.py}" "$package_name" "$version_policy" "stable" ${upperBoundFlag}) - update-source-version "$attr_path" "$latest_tag" --print-changes + update-source-version "$attr_path" "$latest_tag" ''; in { command = [ updateScript packageName attrPath versionPolicy ]; - supportedFeatures = [ "commit" ]; + inherit attrPath; }