Mercurial > public > mercurial-scm > hg
annotate hgext/git/manifest.py @ 52492:48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
This is the same procedure as 048c11993d6a, where we bounce around to the
various subclasses and steal their type hints to keep everything happy when the
interface is explicitly subclassed.
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Wed, 23 Oct 2024 15:56:48 -0400 |
parents | c855943e334b |
children | db6efd74cf14 |
rev | line source |
---|---|
51859
f4733654f144
typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents:
48946
diff
changeset
|
1 from __future__ import annotations |
f4733654f144
typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents:
48946
diff
changeset
|
2 |
52492
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
3 import typing |
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
4 |
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
5 from typing import ( |
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
6 Any, |
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
7 Iterator, |
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
8 Set, |
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
9 ) |
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
10 |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
11 from mercurial import ( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
12 match as matchmod, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
13 pathutil, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
14 pycompat, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
15 util, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
16 ) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
17 from mercurial.interfaces import ( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
18 repository, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
19 util as interfaceutil, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
20 ) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
21 from . import gitutil |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
22 |
52492
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
23 if typing.TYPE_CHECKING: |
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
24 from typing import ( |
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
25 ByteString, # TODO: change to Buffer for 3.14 |
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
26 ) |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
27 |
44484
ec54b3d2af0b
git: don't fail import when pygit2 is not install
Martin von Zweigbergk <martinvonz@google.com>
parents:
44479
diff
changeset
|
28 pygit2 = gitutil.get_pygit2() |
ec54b3d2af0b
git: don't fail import when pygit2 is not install
Martin von Zweigbergk <martinvonz@google.com>
parents:
44479
diff
changeset
|
29 |
ec54b3d2af0b
git: don't fail import when pygit2 is not install
Martin von Zweigbergk <martinvonz@google.com>
parents:
44479
diff
changeset
|
30 |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
31 @interfaceutil.implementer(repository.imanifestdict) |
48946
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
32 class gittreemanifest: |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
33 """Expose git trees (and optionally a builder's overlay) as a manifestdict. |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
34 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
35 Very similar to mercurial.manifest.treemanifest. |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
36 """ |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
37 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
38 def __init__(self, git_repo, root_tree, pending_changes): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
39 """Initializer. |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
40 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
41 Args: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
42 git_repo: The git_repo we're walking (required to look up child |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
43 trees). |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
44 root_tree: The root Git tree object for this manifest. |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
45 pending_changes: A dict in which pending changes will be |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
46 tracked. The enclosing memgittreemanifestctx will use this to |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
47 construct any required Tree objects in Git during it's |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
48 `write()` method. |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
49 """ |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
50 self._git_repo = git_repo |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
51 self._tree = root_tree |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
52 if pending_changes is None: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
53 pending_changes = {} |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
54 # dict of path: Optional[Tuple(node, flags)] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
55 self._pending_changes = pending_changes |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
56 |
52491
c855943e334b
git: fix `repository.imanifestdict` implementation flaws detected by pytype
Matt Harbison <matt_harbison@yahoo.com>
parents:
52481
diff
changeset
|
57 def _resolve_entry(self, path) -> tuple[bytes, bytes]: |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
58 """Given a path, load its node and flags, or raise KeyError if missing. |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
59 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
60 This takes into account any pending writes in the builder. |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
61 """ |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
62 upath = pycompat.fsdecode(path) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
63 ent = None |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
64 if path in self._pending_changes: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
65 val = self._pending_changes[path] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
66 if val is None: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
67 raise KeyError |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
68 return val |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
69 t = self._tree |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
70 comps = upath.split('/') |
44930
47ce28a78f4a
git: properly visit child tree objects when resolving a path
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44929
diff
changeset
|
71 te = self._tree |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
72 for comp in comps[:-1]: |
44930
47ce28a78f4a
git: properly visit child tree objects when resolving a path
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44929
diff
changeset
|
73 te = te[comp] |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
74 t = self._git_repo[te.id] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
75 ent = t[comps[-1]] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
76 if ent.filemode == pygit2.GIT_FILEMODE_BLOB: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
77 flags = b'' |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
78 elif ent.filemode == pygit2.GIT_FILEMODE_BLOB_EXECUTABLE: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
79 flags = b'x' |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
80 elif ent.filemode == pygit2.GIT_FILEMODE_LINK: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
81 flags = b'l' |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
82 else: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
83 raise ValueError('unsupported mode %s' % oct(ent.filemode)) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
84 return ent.id.raw, flags |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
85 |
52492
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
86 def __getitem__(self, path: bytes) -> bytes: |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
87 return self._resolve_entry(path)[0] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
88 |
52492
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
89 def find(self, path: bytes) -> tuple[bytes, bytes]: |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
90 return self._resolve_entry(path) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
91 |
52492
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
92 def __len__(self) -> int: |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
93 return len(list(self.walk(matchmod.always()))) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
94 |
52492
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
95 def __nonzero__(self) -> bool: |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
96 try: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
97 next(iter(self)) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
98 return True |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
99 except StopIteration: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
100 return False |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
101 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
102 __bool__ = __nonzero__ |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
103 |
52492
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
104 def __contains__(self, path: bytes) -> bool: |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
105 try: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
106 self._resolve_entry(path) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
107 return True |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
108 except KeyError: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
109 return False |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
110 |
52492
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
111 def iterkeys(self) -> Iterator[bytes]: |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
112 return self.walk(matchmod.always()) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
113 |
52492
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
114 def keys(self) -> list[bytes]: |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
115 return list(self.iterkeys()) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
116 |
52492
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
117 def __iter__(self) -> Iterator[bytes]: |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
118 return self.iterkeys() |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
119 |
52492
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
120 def __setitem__(self, path: bytes, node: bytes) -> None: |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
121 self._pending_changes[path] = node, self.flags(path) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
122 |
52492
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
123 def __delitem__(self, path: bytes) -> None: |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
124 # TODO: should probably KeyError for already-deleted files? |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
125 self._pending_changes[path] = None |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
126 |
52492
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
127 def filesnotin(self, other, match=None) -> Set[bytes]: |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
128 if match is not None: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
129 match = matchmod.badmatch(match, lambda path, msg: None) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
130 sm2 = set(other.walk(match)) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
131 return {f for f in self.walk(match) if f not in sm2} |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
132 return {f for f in self if f not in other} |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
133 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
134 @util.propertycache |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
135 def _dirs(self): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
136 return pathutil.dirs(self) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
137 |
52492
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
138 def hasdir(self, dir: bytes) -> bool: |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
139 return dir in self._dirs |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
140 |
52492
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
141 def diff( |
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
142 self, |
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
143 other: Any, # TODO: 'manifestdict' or (better) equivalent interface |
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
144 match: Any = lambda x: True, # TODO: Optional[matchmod.basematcher] = None, |
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
145 clean: bool = False, |
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
146 ) -> dict[ |
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
147 bytes, |
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
148 tuple[tuple[bytes | None, bytes], tuple[bytes | None, bytes]] | None, |
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
149 ]: |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45516
diff
changeset
|
150 """Finds changes between the current manifest and m2. |
44931
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
151 |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
152 The result is returned as a dict with filename as key and |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
153 values of the form ((n1,fl1),(n2,fl2)), where n1/n2 is the |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
154 nodeid in the current/other manifest and fl1/fl2 is the flag |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
155 in the current/other manifest. Where the file does not exist, |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
156 the nodeid will be None and the flags will be the empty |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
157 string. |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45516
diff
changeset
|
158 """ |
44931
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
159 result = {} |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
160 |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
161 def _iterativediff(t1, t2, subdir): |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
162 """compares two trees and appends new tree nodes to examine to |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
163 the stack""" |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
164 if t1 is None: |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
165 t1 = {} |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
166 if t2 is None: |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
167 t2 = {} |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
168 |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
169 for e1 in t1: |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
170 realname = subdir + pycompat.fsencode(e1.name) |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
171 |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
172 if e1.type == pygit2.GIT_OBJ_TREE: |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
173 try: |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
174 e2 = t2[e1.name] |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
175 if e2.type != pygit2.GIT_OBJ_TREE: |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
176 e2 = None |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
177 except KeyError: |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
178 e2 = None |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
179 |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
180 stack.append((realname + b'/', e1, e2)) |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
181 else: |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
182 n1, fl1 = self.find(realname) |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
183 |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
184 try: |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
185 e2 = t2[e1.name] |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
186 n2, fl2 = other.find(realname) |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
187 except KeyError: |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
188 e2 = None |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
189 n2, fl2 = (None, b'') |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
190 |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
191 if e2 is not None and e2.type == pygit2.GIT_OBJ_TREE: |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
192 stack.append((realname + b'/', None, e2)) |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
193 |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
194 if not match(realname): |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
195 continue |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
196 |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
197 if n1 != n2 or fl1 != fl2: |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
198 result[realname] = ((n1, fl1), (n2, fl2)) |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
199 elif clean: |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
200 result[realname] = None |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
201 |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
202 for e2 in t2: |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
203 if e2.name in t1: |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
204 continue |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
205 |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
206 realname = subdir + pycompat.fsencode(e2.name) |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
207 |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
208 if e2.type == pygit2.GIT_OBJ_TREE: |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
209 stack.append((realname + b'/', None, e2)) |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
210 elif match(realname): |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
211 n2, fl2 = other.find(realname) |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
212 result[realname] = ((None, b''), (n2, fl2)) |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
213 |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
214 stack = [] |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
215 _iterativediff(self._tree, other._tree, b'') |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
216 while stack: |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
217 subdir, t1, t2 = stack.pop() |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
218 # stack is populated in the function call |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
219 _iterativediff(t1, t2, subdir) |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
220 |
f294b4e14fd0
git: implement diff manifest method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44930
diff
changeset
|
221 return result |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
222 |
52492
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
223 def setflag(self, path: bytes, flag: bytes) -> None: |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
224 node, unused_flag = self._resolve_entry(path) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
225 self._pending_changes[path] = node, flag |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
226 |
52492
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
227 def get(self, path: bytes, default=None) -> bytes | None: |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
228 try: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
229 return self._resolve_entry(path)[0] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
230 except KeyError: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
231 return default |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
232 |
52492
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
233 def flags(self, path: bytes) -> bytes: |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
234 try: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
235 return self._resolve_entry(path)[1] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
236 except KeyError: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
237 return b'' |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
238 |
52492
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
239 def copy(self) -> 'gittreemanifest': |
45417
c8695439d7e3
git: actually copy treemanifest instances in .copy() (issue6398)
Augie Fackler <raf@durin42.com>
parents:
44931
diff
changeset
|
240 return gittreemanifest( |
c8695439d7e3
git: actually copy treemanifest instances in .copy() (issue6398)
Augie Fackler <raf@durin42.com>
parents:
44931
diff
changeset
|
241 self._git_repo, self._tree, dict(self._pending_changes) |
c8695439d7e3
git: actually copy treemanifest instances in .copy() (issue6398)
Augie Fackler <raf@durin42.com>
parents:
44931
diff
changeset
|
242 ) |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
243 |
52492
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
244 def items(self) -> Iterator[tuple[bytes, bytes]]: |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
245 for f in self: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
246 # TODO: build a proper iterator version of this |
52491
c855943e334b
git: fix `repository.imanifestdict` implementation flaws detected by pytype
Matt Harbison <matt_harbison@yahoo.com>
parents:
52481
diff
changeset
|
247 yield f, self[f] |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
248 |
52492
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
249 def iteritems(self) -> Iterator[tuple[bytes, bytes]]: |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
250 return self.items() |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
251 |
52492
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
252 def iterentries(self) -> Iterator[tuple[bytes, bytes, bytes]]: |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
253 for f in self: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
254 # TODO: build a proper iterator version of this |
52491
c855943e334b
git: fix `repository.imanifestdict` implementation flaws detected by pytype
Matt Harbison <matt_harbison@yahoo.com>
parents:
52481
diff
changeset
|
255 yield f, *self._resolve_entry(f) |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
256 |
52492
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
257 def text(self) -> ByteString: |
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
258 # TODO can this method move out of the manifest iface? |
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
259 raise NotImplementedError |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
260 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
261 def _walkonetree(self, tree, match, subdir): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
262 for te in tree: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
263 # TODO: can we prune dir walks with the matcher? |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
264 realname = subdir + pycompat.fsencode(te.name) |
44928
935c9f347bdb
git: correctly check for type of object when walking
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44843
diff
changeset
|
265 if te.type == pygit2.GIT_OBJ_TREE: |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
266 for inner in self._walkonetree( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
267 self._git_repo[te.id], match, realname + b'/' |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
268 ): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
269 yield inner |
44929
3679c88b7f4e
git: don't yield paths for directories when walking
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44928
diff
changeset
|
270 elif match(realname): |
3679c88b7f4e
git: don't yield paths for directories when walking
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44928
diff
changeset
|
271 yield pycompat.fsencode(realname) |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
272 |
52492
48cdbd4d5443
typing: align the signatures of `repository.imanifestdict` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
52491
diff
changeset
|
273 def walk(self, match: matchmod.basematcher) -> Iterator[bytes]: |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
274 # TODO: this is a very lazy way to merge in the pending |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
275 # changes. There is absolutely room for optimization here by |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
276 # being clever about walking over the sets... |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
277 baseline = set(self._walkonetree(self._tree, match, b'')) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
278 deleted = {p for p, v in self._pending_changes.items() if v is None} |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
279 pend = {p for p in self._pending_changes if match(p)} |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
280 return iter(sorted((baseline | pend) - deleted)) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
281 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
282 |
52477
d37d8dfe65bd
manifest: subclass the new `repository.imanifestrevisionstored` Protocol class
Matt Harbison <matt_harbison@yahoo.com>
parents:
52474
diff
changeset
|
283 class gittreemanifestctx(repository.imanifestrevisionstored): |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
284 def __init__(self, repo, gittree): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
285 self._repo = repo |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
286 self._tree = gittree |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
287 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
288 def read(self): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
289 return gittreemanifest(self._repo, self._tree, None) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
290 |
52474
048c11993d6a
typing: (mostly) align the signatures of `imanifestrevisionstored` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
51859
diff
changeset
|
291 def readfast(self, shallow: bool = False): |
44479
7518ea76eff4
git: add readfast() method to manifest
Augie Fackler <raf@durin42.com>
parents:
44477
diff
changeset
|
292 return self.read() |
7518ea76eff4
git: add readfast() method to manifest
Augie Fackler <raf@durin42.com>
parents:
44477
diff
changeset
|
293 |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
294 def copy(self): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
295 # NB: it's important that we return a memgittreemanifestctx |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
296 # because the caller expects a mutable manifest. |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
297 return memgittreemanifestctx(self._repo, self._tree) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
298 |
52474
048c11993d6a
typing: (mostly) align the signatures of `imanifestrevisionstored` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents:
51859
diff
changeset
|
299 def find(self, path: bytes) -> tuple[bytes, bytes]: |
52491
c855943e334b
git: fix `repository.imanifestdict` implementation flaws detected by pytype
Matt Harbison <matt_harbison@yahoo.com>
parents:
52481
diff
changeset
|
300 return self.read().find(path) |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
301 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
302 |
52481
22f97aa5e8b2
manifest: subclass the new `imanifestrevisionwritable` Protocol class
Matt Harbison <matt_harbison@yahoo.com>
parents:
52477
diff
changeset
|
303 class memgittreemanifestctx(repository.imanifestrevisionwritable): |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
304 def __init__(self, repo, tree): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
305 self._repo = repo |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
306 self._tree = tree |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
307 # dict of path: Optional[Tuple(node, flags)] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
308 self._pending_changes = {} |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
309 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
310 def read(self): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
311 return gittreemanifest(self._repo, self._tree, self._pending_changes) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
312 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
313 def copy(self): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
314 # TODO: if we have a builder in play, what should happen here? |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
315 # Maybe we can shuffle copy() into the immutable interface. |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
316 return memgittreemanifestctx(self._repo, self._tree) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
317 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
318 def write(self, transaction, link, p1, p2, added, removed, match=None): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
319 # We're not (for now, anyway) going to audit filenames, so we |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
320 # can ignore added and removed. |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
321 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
322 # TODO what does this match argument get used for? hopefully |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
323 # just narrow? |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
324 assert not match or isinstance(match, matchmod.alwaysmatcher) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
325 |
44625
e9e7156a8d6c
git: pass a list to pathutil.dirs to indicate that it is a manifest
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44484
diff
changeset
|
326 touched_dirs = pathutil.dirs(list(self._pending_changes)) |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
327 trees = { |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
328 b'': self._tree, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
329 } |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
330 # path: treebuilder |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
331 builders = { |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
332 b'': self._repo.TreeBuilder(self._tree), |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
333 } |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
334 # get a TreeBuilder for every tree in the touched_dirs set |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
335 for d in sorted(touched_dirs, key=lambda x: (len(x), x)): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
336 if d == b'': |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
337 # loaded root tree above |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
338 continue |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
339 comps = d.split(b'/') |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
340 full = b'' |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
341 for part in comps: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
342 parent = trees[full] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
343 try: |
45516
73a5aa5e1857
git: pass `id` attribute of `pygit2.Tree` object
Connor Sheehan <sheehan@mozilla.com>
parents:
45417
diff
changeset
|
344 parent_tree_id = parent[pycompat.fsdecode(part)].id |
73a5aa5e1857
git: pass `id` attribute of `pygit2.Tree` object
Connor Sheehan <sheehan@mozilla.com>
parents:
45417
diff
changeset
|
345 new = self._repo[parent_tree_id] |
44477
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
346 except KeyError: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
347 # new directory |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
348 new = None |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
349 full += b'/' + part |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
350 if new is not None: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
351 # existing directory |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
352 trees[full] = new |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
353 builders[full] = self._repo.TreeBuilder(new) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
354 else: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
355 # new directory, use an empty dict to easily |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
356 # generate KeyError as any nested new dirs get |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
357 # created. |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
358 trees[full] = {} |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
359 builders[full] = self._repo.TreeBuilder() |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
360 for f, info in self._pending_changes.items(): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
361 if b'/' not in f: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
362 dirname = b'' |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
363 basename = f |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
364 else: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
365 dirname, basename = f.rsplit(b'/', 1) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
366 dirname = b'/' + dirname |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
367 if info is None: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
368 builders[dirname].remove(pycompat.fsdecode(basename)) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
369 else: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
370 n, fl = info |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
371 mode = { |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
372 b'': pygit2.GIT_FILEMODE_BLOB, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
373 b'x': pygit2.GIT_FILEMODE_BLOB_EXECUTABLE, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
374 b'l': pygit2.GIT_FILEMODE_LINK, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
375 }[fl] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
376 builders[dirname].insert( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
377 pycompat.fsdecode(basename), gitutil.togitnode(n), mode |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
378 ) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
379 # This visits the buffered TreeBuilders in deepest-first |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
380 # order, bubbling up the edits. |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
381 for b in sorted(builders, key=len, reverse=True): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
382 if b == b'': |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
383 break |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
384 cb = builders[b] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
385 dn, bn = b.rsplit(b'/', 1) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
386 builders[dn].insert( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
387 pycompat.fsdecode(bn), cb.write(), pygit2.GIT_FILEMODE_TREE |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
388 ) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
389 return builders[b''].write().raw |