{"library":"patch","title":"Python Patch","description":"The `patch` library (version 1.16) is a Python utility designed to parse and apply unified diffs. It functions both as a command-line tool and a library for programmatic use, enabling developers to integrate patch application into their Python applications. The project's last release was in 2016, indicating a low or inactive release cadence, with a fork (`patch-ng`) emerging due to the original project's limited maintenance.","language":"python","status":"maintenance","last_verified":"Fri May 15","install":{"commands":["pip install patch"],"cli":{"name":"patch","version":"sh: 1: patch: not found"}},"imports":["from patch import PatchSet","from patch import fromstring","from patch import fromfile"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import os\nimport tempfile\nfrom patch import fromstring, PatchSet\n\n# Create a dummy original file\noriginal_content = \"\"\"Line 1\nLine 2\nLine 3\n\"\"\"\nwith tempfile.NamedTemporaryFile(mode='w+', delete=False, suffix='.txt') as f_orig:\n    f_orig.write(original_content)\n    original_filepath = f_orig.name\n\n# Create a diff that adds a line and modifies another\ndiff_content = \"\"\"--- a/test.txt\t2023-01-01 00:00:00.000000000 +0000\n+++ b/test.txt\t2023-01-01 00:00:00.000000000 +0000\n@@ -1,3 +1,4 @@\n Line 1 modified\n+Line 1.5 added\n Line 2\n Line 3\n\"\"\"\n\n# Parse the diff\npatch_set = fromstring(diff_content)\n\n# Apply the patch to the original file\n# The library assumes the files are in the current working directory\n# or specified by path. Here, we'll patch a file named 'test.txt'\n# which we'll simulate by reading from original_filepath and applying to a new file.\n\ntarget_filename = os.path.basename(original_filepath)\n\n# To apply, the patch expects the target file to exist at a specific relative path.\n# We will simulate this by copying our temp file and then patching that copy.\n\npatched_content = None\nwith open(original_filepath, 'r') as f_read:\n    original_lines = f_read.readlines()\n\n# Manually apply the patch (as the library's apply() method typically writes to disk)\n# For a quickstart, it's easier to show the logic.\n\n# In a real scenario, you'd do: patch_set.apply(strip=0, root=os.path.dirname(original_filepath))\n# But it requires writing to the same filename specified in the diff.\n\n# Let's write the original content to a file that matches the diff's target name\nwith open(target_filename, 'w') as f_target:\n    f_target.write(original_content)\n\n# Now, apply the patch using the library's method\n# The apply method attempts to write back to the file system.\nsuccess = patch_set.apply(strip=0, root='.') # root is current dir where target_filename is\n\nif success:\n    with open(target_filename, 'r') as f_patched:\n        patched_content = f_patched.read()\n    print(\"Patch applied successfully.\")\n    print(\"Patched content:\\n\", patched_content)\nelse:\n    print(\"Failed to apply patch.\")\n\n# Cleanup temporary files\nos.remove(original_filepath)\nos.remove(target_filename)\n","lang":"python","description":"This quickstart demonstrates how to programmatically apply a unified diff to a file. It creates a temporary original file, defines a diff string, parses the diff using `fromstring`, and then applies it to a simulated target file. Note that the `apply` method modifies files on the filesystem.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-15","installed_version":"1.16","pypi_latest":"1.16","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":2.4,"avg_import_s":0.1,"wheel_type":"sdist"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"patch","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.09,"mem_mb":3.9,"disk_size":"19.2M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"patch","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":2,"import_time_s":0.06,"mem_mb":3.9,"disk_size":"20M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"patch","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.13,"mem_mb":4.4,"disk_size":"21.6M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"patch","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":2,"import_time_s":0.13,"mem_mb":4.4,"disk_size":"22M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"patch","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.11,"mem_mb":4.3,"disk_size":"11.6M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"patch","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":3,"import_time_s":0.11,"mem_mb":4.3,"disk_size":"12M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"patch","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.09,"mem_mb":4.3,"disk_size":"11.3M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"patch","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":2.7,"import_time_s":0.1,"mem_mb":4.3,"disk_size":"12M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"patch","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.08,"mem_mb":3.8,"disk_size":"18.8M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"patch","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":2.3,"import_time_s":0.08,"mem_mb":3.8,"disk_size":"19M"}]}}