Things on this page are fragmentary and immature notes/thoughts of the author. Please read with your own judgement!
from io import BytesIO
from dulwich.repo import Repo
from dulwich import porcelain!git clone git@github.com:dclong/docker-jupyterlab.gitrepo = Repo("docker-jupyterlab")
repo<Repo at 'docker-jupyterlab'>Get Remote Refs¶
def get_remote_refs(repo, remote: str = "origin") -> dict[bytes, bytes]:
url = repo.get_config().get(("remote", remote), "url").decode("utf-8")
return porcelain.ls_remote(url).refsrefs = get_remote_refs(repo)
refs{b'HEAD': b'3fd2fda841cfa38dca944ace6ea544ba47ca2d08',
b'refs/heads/blog': b'33677e39dd482eae41f4862b994369ba48c6c728',
b'refs/heads/dev': b'3fd2fda841cfa38dca944ace6ea544ba47ca2d08',
b'refs/heads/main': b'a0e5876fe50a4f74a3bd28adbd83e9b15aa94d54',
b'refs/pull/1/head': b'94f6e167b4faf4b1eb0275031af4bb24bcee4828',
b'refs/pull/10/head': b'6d857e81c4b785cf438a5a79a0d7733e1f927593',
b'refs/pull/11/head': b'5961d174b7a981e0d982798b45dd310d1735cc6c',
b'refs/pull/12/head': b'5961d174b7a981e0d982798b45dd310d1735cc6c',
b'refs/pull/13/head': b'ecfe6690da9b9d12bf98fac471b07f64e3835054',
b'refs/pull/14/head': b'b5734e5e6169572e71c5f4ab06c611e942c01e58',
b'refs/pull/16/head': b'a59a061ce3ca8aedcda98a9c642ecba2fc9ff238',
b'refs/pull/17/head': b'bdfda13d5db64d17e2792629f8b6afbda9a8c51b',
b'refs/pull/18/head': b'5f38fd10c0a8773c2f1d3499a700c2d68eb3002b',
b'refs/pull/19/head': b'6e40657d7e6a2040678a354157ff09f25db48218',
b'refs/pull/2/head': b'e591109d88c7f29e0ce5b26c6a3cd3d524be8126',
b'refs/pull/20/head': b'b10a45e87710379a3357c1c012389386dcdf2754',
b'refs/pull/21/head': b'397595d9006f5b07f73ca72f9edc599847d4e5f7',
b'refs/pull/22/head': b'e6a69a2e7480849cf9563a875a3a0201f5edb8d4',
b'refs/pull/23/head': b'4cc54aae32bc04f1121a45c28af864a5c4ad15c0',
b'refs/pull/24/head': b'4cc54aae32bc04f1121a45c28af864a5c4ad15c0',
b'refs/pull/25/head': b'95171b7a40269979bbfdb006c192550f1409f386',
b'refs/pull/26/head': b'a1fc699bf0e39d74fd4685313781f7afa07c06ce',
b'refs/pull/27/head': b'fcfd015a5d8bce666d6886b0f0ffd993d0f03326',
b'refs/pull/28/head': b'fcfd015a5d8bce666d6886b0f0ffd993d0f03326',
b'refs/pull/29/head': b'584cf0f3eb7799fe8a35761d4dce03c5ca536a8d',
b'refs/pull/3/head': b'd3dd7f50b43c15be962cb9d1577c8a9eeee07c0f',
b'refs/pull/30/head': b'3cb8c966acb9dc772b4809af0b8a8ae315fc4b32',
b'refs/pull/31/head': b'10be6969fecfbad62df9678510a38c3b7897188b',
b'refs/pull/32/head': b'85127dad6699a893a6f3d48c3ad10b6139ecae45',
b'refs/pull/33/head': b'ebf02701aad41e44f5dc15284c66db1210823868',
b'refs/pull/34/head': b'd3d5d0618de9b00b2e1d45bc3a96ce95fa4be353',
b'refs/pull/35/head': b'dbd6accfdd6cfbc12b50b252cdfc342b0cf57218',
b'refs/pull/36/head': b'789a2b4a36235a1bebac13004ce319d0691095f5',
b'refs/pull/37/head': b'91d07fbf430c07fd66b397c8126f6ef189f48d66',
b'refs/pull/38/head': b'61afe32284e3b8e7b3565f3a65fe7c0d8acf8fb8',
b'refs/pull/39/head': b'f274ce0c2ae00a6083d48b26a44910e220c58865',
b'refs/pull/4/head': b'f1d996b18f6a87ca6abea7ad372155753084c660',
b'refs/pull/40/head': b'2a37da5c9137e2bfd81a8a102d37bd5ccd09401d',
b'refs/pull/41/head': b'eec0ada5da3a582ccd67cf027f7741f47b068dd7',
b'refs/pull/42/head': b'72ccc48c2a5c4bb554a8ef4edf54ad1b4f7d58b7',
b'refs/pull/43/head': b'e3b259a768c167b3d92d6edde4f4997791ecf5b4',
b'refs/pull/44/head': b'ab926644f62c84856c663c287adff49dca0f0491',
b'refs/pull/45/head': b'9b1d773f7a7f90972af36068e13d3098385ddf9a',
b'refs/pull/46/head': b'a310762922db798c55cf4ce879e47ca41b49671f',
b'refs/pull/47/head': b'a2f62e28fa9473fa2ad844d2be488bb171021e00',
b'refs/pull/48/head': b'efcc2c8f83a4bfe53732e3a2bdb69a11f58a3eaf',
b'refs/pull/49/head': b'b53427d93fedad8148779f1ae39a1d8fb3b92b60',
b'refs/pull/5/head': b'e24ae60c722bbdb0227498835a81d6366a54ed1d',
b'refs/pull/50/head': b'0d70f4d85880cc4952ccbd1201f3029c57eb37b3',
b'refs/pull/51/head': b'e4aa9687221bb10b6074b7f0935f8886b78f7d14',
b'refs/pull/52/head': b'6abee68778e30fc78bae57c42b13b0218fa383e8',
b'refs/pull/53/head': b'e9d76f78d90d79daa697290bf7f92fafdc263ff1',
b'refs/pull/54/head': b'e9d76f78d90d79daa697290bf7f92fafdc263ff1',
b'refs/pull/55/head': b'c5a64f1e4b07b67ac85d9df8de51669acb020eb9',
b'refs/pull/56/head': b'f6e0dd5fb1b97be82845df74cc55db62ab580cad',
b'refs/pull/57/head': b'f6e0dd5fb1b97be82845df74cc55db62ab580cad',
b'refs/pull/58/head': b'6a6f786ae6d7d4763edb3719000ae685b1840294',
b'refs/pull/59/head': b'6a6f786ae6d7d4763edb3719000ae685b1840294',
b'refs/pull/60/head': b'038c2c7cf9982678693b6e868c42e00ec5487452',
b'refs/pull/61/head': b'038c2c7cf9982678693b6e868c42e00ec5487452',
b'refs/pull/62/head': b'678fdaf11cf1d16f3e5f2b9ba0855eac26d4b114',
b'refs/pull/63/head': b'678fdaf11cf1d16f3e5f2b9ba0855eac26d4b114',
b'refs/pull/64/head': b'd45e0df918205afceeaf99b4a42fae8747495e7d',
b'refs/pull/65/head': b'd45e0df918205afceeaf99b4a42fae8747495e7d',
b'refs/pull/66/head': b'09f6cf7d1073c1cc30c44c574d5dfda8f650e35b',
b'refs/pull/67/head': b'4336993b6060fafc13f9ade48e4176f75d316a81',
b'refs/pull/68/head': b'7fb1698dc663095e2ef24b88da84af58feb7fcce',
b'refs/pull/69/head': b'071cf580311f7fa19ebff8002f591f064444d711',
b'refs/pull/70/head': b'071cf580311f7fa19ebff8002f591f064444d711',
b'refs/pull/71/head': b'777db90eccb1d524da132c5fb7e7d02e76530cab',
b'refs/pull/72/head': b'3d0d013b392714a16ec808c12af56226e05a5075',
b'refs/pull/73/head': b'6e33326a01d6bfe8c75e9c44dda5c0134b85f3cb',
b'refs/pull/74/head': b'6e33326a01d6bfe8c75e9c44dda5c0134b85f3cb',
b'refs/pull/75/head': b'404a7e242bb0dfb4d69ec6e60e2cc897fce93183',
b'refs/pull/76/head': b'404a7e242bb0dfb4d69ec6e60e2cc897fce93183',
b'refs/pull/77/head': b'2a35ff8bec1615df4c846fef13de407343f29bdd',
b'refs/pull/78/head': b'2a35ff8bec1615df4c846fef13de407343f29bdd',
b'refs/pull/79/head': b'c8df9e80c76803a85e16a3def4c5b28150483e10',
b'refs/pull/80/head': b'1d661747183bd94387baf3e94a82230875bbacb4',
b'refs/pull/81/head': b'1d661747183bd94387baf3e94a82230875bbacb4',
b'refs/pull/82/head': b'f1e8c89a645b6da2b7af36a2a84b85a67d822e68',
b'refs/pull/83/head': b'3fd2fda841cfa38dca944ace6ea544ba47ca2d08',
b'refs/pull/84/head': b'5055862a8ffb926c3517fe65ce55fafddd1f5b7a',
b'refs/pull/85/head': b'6d39f0435419c03fd41261ff77b0f48c69bbbcbc',
b'refs/pull/86/head': b'76aa244ab4fd92e09124a020e5e74d09bf3643fa',
b'refs/pull/87/head': b'fc0ec8a32cbeaf6f295285b0e2f7b4ab711ef6a3',
b'refs/pull/88/head': b'db89a8203b621c6d1da45aceac7d3fd2610727a2',
b'refs/pull/89/head': b'11c29b319e6830880f9c551658022db613fe33ae',
b'refs/pull/9/head': b'dd576059a8f7da6aab7b0f2c0a2dfda8babf1d01',
b'refs/pull/90/head': b'cc1542c677327c1d5d4d4ad103a14d3d6e5a317a',
b'refs/pull/91/head': b'ea5dd8040f8a9af0a64483ce3cdc221c65d8e5b5',
b'refs/pull/92/head': b'3fd2fda841cfa38dca944ace6ea544ba47ca2d08'}Get the Text/Bytes Diff Between 2 Commits¶
bio = BytesIO()porcelain.diff(
repo,
refs[b"refs/heads/blog"],
refs[b"refs/heads/dev"],
outstream=bio,
)bio.getbuffer().nbytes90471Get the Commit Diff Between 2 Commits¶
walker = repo.get_walker(
include=[refs[b"refs/heads/dev"]],
exclude=[refs[b"refs/heads/blog"]]
)
walker<dulwich.walk.Walker at 0x7f5181f53b10>next(iter(walker), None)<WalkEntry commit=3fd2fda841cfa38dca944ace6ea544ba47ca2d08, changes=[TreeChange(type='modify', old=TreeEntry(path=b'Dockerfile', mode=33188, sha=b'6f6bce635c55deca063172b4d741c9f377010da5'), new=TreeEntry(path=b'Dockerfile', mode=33188, sha=b'0d10fa605cf46220d57c91adc0e717851897fcf9'))]>