summary refs log tree commit diff
path: root/maintainers/scripts
diff options
context:
space:
mode:
authorJan Tojnar <jtojnar@gmail.com>2020-09-19 16:44:17 +0200
committerJan Tojnar <jtojnar@gmail.com>2020-09-20 20:11:46 +0200
commit4a161ddb3bdfab0b09597456bd541cbbe6c84b07 (patch)
tree79c5beedaeceb87910316b55f76910396800b0ab /maintainers/scripts
parent01b9d5371c5ce1f8d622ff00bd67c9defb656c79 (diff)
downloadnixpkgs-4a161ddb3bdfab0b09597456bd541cbbe6c84b07.tar
nixpkgs-4a161ddb3bdfab0b09597456bd541cbbe6c84b07.tar.gz
nixpkgs-4a161ddb3bdfab0b09597456bd541cbbe6c84b07.tar.bz2
nixpkgs-4a161ddb3bdfab0b09597456bd541cbbe6c84b07.tar.lz
nixpkgs-4a161ddb3bdfab0b09597456bd541cbbe6c84b07.tar.xz
nixpkgs-4a161ddb3bdfab0b09597456bd541cbbe6c84b07.tar.zst
nixpkgs-4a161ddb3bdfab0b09597456bd541cbbe6c84b07.zip
maintainers/scripts/update.nix: support auto-committing by passing attrPath
Instead of having the updateScript support returning JSON object,
it should be sufficient to specify attrPath in passthru.updateScript.
It is much easier to use.

The former is now considered experimental.
Diffstat (limited to 'maintainers/scripts')
-rwxr-xr-xmaintainers/scripts/update.nix2
-rw-r--r--maintainers/scripts/update.py29
2 files changed, 27 insertions, 4 deletions
diff --git a/maintainers/scripts/update.nix b/maintainers/scripts/update.nix
index e11e2450bd0..3d6f3500f5c 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 51a19164a17..bca554a5d82 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)