annotate hgext/git/gitlog.py @ 52644:e627cc25b6f3

pyupgrade: rewrite `yield` statements in a loop to `yield from` This is the `legacy` fixer in `pyupgrade`, with the `yield` statement yielding loop commented back in. This seems to help pytype in some cases, and hurt it in others. But that can be manually fixed later. Note that it's possibly buggy in that it aggressively changed `import-checker.py` to `yield from 'fcntl', 'grp', 'pwd', 'select', 'termios': # Unix only`, which is invalid syntax. Possibly it needed help from the token fixer that I've disabled locally (because that wants to make a bunch of unrelated changes). Just change those few places to yield from a list, to avoid having to constantly revert that.
author Matt Harbison <matt_harbison@yahoo.com>
date Sun, 05 Jan 2025 22:26:16 -0500
parents 5cc8deb96b48
children b61115f5d216
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
51859
f4733654f144 typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents: 51301
diff changeset
1 from __future__ import annotations
f4733654f144 typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents: 51301
diff changeset
2
52487
3daaa5195a30 typing: align the signatures of `repository.ifilestorage` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents: 52444
diff changeset
3 from typing import (
52617
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
4 Iterable,
52487
3daaa5195a30 typing: align the signatures of `repository.ifilestorage` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents: 52444
diff changeset
5 Iterator,
3daaa5195a30 typing: align the signatures of `repository.ifilestorage` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents: 52444
diff changeset
6 )
3daaa5195a30 typing: align the signatures of `repository.ifilestorage` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents: 52444
diff changeset
7
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
8 from mercurial.i18n import _
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
9
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45939
diff changeset
10 from mercurial.node import (
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45939
diff changeset
11 bin,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45939
diff changeset
12 hex,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45939
diff changeset
13 nullrev,
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46113
diff changeset
14 sha1nodeconstants,
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45939
diff changeset
15 )
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
16 from mercurial import (
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
17 ancestor,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
18 changelog as hgchangelog,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
19 dagop,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
20 encoding,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
21 error,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
22 manifest,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
23 pycompat,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
24 )
52489
ba8f03ad8906 filelog: subclass the new `repository.ifilestorage` Protocol class
Matt Harbison <matt_harbison@yahoo.com>
parents: 52487
diff changeset
25 from mercurial.interfaces import (
ba8f03ad8906 filelog: subclass the new `repository.ifilestorage` Protocol class
Matt Harbison <matt_harbison@yahoo.com>
parents: 52487
diff changeset
26 repository,
ba8f03ad8906 filelog: subclass the new `repository.ifilestorage` Protocol class
Matt Harbison <matt_harbison@yahoo.com>
parents: 52487
diff changeset
27 )
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
28 from mercurial.utils import stringutil
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
29 from . import (
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
30 gitutil,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
31 index,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
32 manifest as gitmanifest,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
33 )
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
34
44484
ec54b3d2af0b git: don't fail import when pygit2 is not install
Martin von Zweigbergk <martinvonz@google.com>
parents: 44481
diff changeset
35 pygit2 = gitutil.get_pygit2()
ec54b3d2af0b git: don't fail import when pygit2 is not install
Martin von Zweigbergk <martinvonz@google.com>
parents: 44481
diff changeset
36
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
37
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
38 class baselog: # revlog.revlog):
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
39 """Common implementations between changelog and manifestlog."""
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 def __init__(self, gr, db):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
42 self.gitrepo = gr
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
43 self._db = db
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
44
52487
3daaa5195a30 typing: align the signatures of `repository.ifilestorage` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents: 52444
diff changeset
45 def __len__(self) -> int:
52628
3865451a5fab git: cache the number of commits to speed up large repo operations
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52627
diff changeset
46 return int(self._db.execute('SELECT ncommits FROM cache').fetchone()[0])
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
47
52617
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
48 def files(self):
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
49 raise NotImplementedError
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
50
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
51 def storageinfo(
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
52 self,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
53 exclusivefiles=False,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
54 sharedfiles=False,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
55 revisionscount=False,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
56 trackedsize=False,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
57 storedsize=False,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
58 ):
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
59 raise NotImplementedError
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
60
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
61 def verifyintegrity(self, state) -> Iterable[repository.iverifyproblem]:
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
62 raise NotImplementedError
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
63
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
64 def revs(self, start=0, stop=None):
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
65 raise NotImplementedError
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
66
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
67 def addgroup(
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
68 self,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
69 deltas,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
70 linkmapper,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
71 transaction,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
72 addrevisioncb=None,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
73 duplicaterevisioncb=None,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
74 ):
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
75 raise NotImplementedError
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
76
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
77 def commonancestorsheads(self, node1, node2):
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
78 raise NotImplementedError
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
79
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
80 def descendants(self, revs):
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
81 raise NotImplementedError
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
82
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
83 def heads(self, start=None, stop=None):
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
84 raise NotImplementedError
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
85
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
86 def children(self, node):
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
87 raise NotImplementedError
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
88
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
89 def emitrevisions(
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
90 self,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
91 nodes,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
92 nodesorder=None,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
93 revisiondata=False,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
94 assumehaveparentrevisions=False,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
95 ):
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
96 raise NotImplementedError
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
97
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
98 def getstrippoint(self, minlink):
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
99 raise NotImplementedError
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
100
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
101 def iscensored(self, rev):
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
102 raise NotImplementedError
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
103
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
104 def parentrevs(self, rev):
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
105 raise NotImplementedError
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
106
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
107 def rawdata(self, node):
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
108 raise NotImplementedError
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
109
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
110 def revision(self, node):
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
111 raise NotImplementedError
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
112
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
113 def size(self, rev):
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
114 raise NotImplementedError
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
115
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
116 def strip(self, minlink, transaction):
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
117 raise NotImplementedError
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
118
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
119 def addrevision(
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
120 self,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
121 revisiondata,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
122 transaction,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
123 linkrev,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
124 p1,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
125 p2,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
126 node=None,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
127 flags=0,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
128 cachedelta=None,
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
129 ):
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
130 raise NotImplementedError
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
131
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
132 def censorrevision(self, tr, node, tombstone=b''):
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
133 raise NotImplementedError
a26c5da900ff git: add stubs for filelog methods
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52489
diff changeset
134
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
135 def rev(self, n):
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46795
diff changeset
136 if n == sha1nodeconstants.nullid:
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
137 return -1
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
138 t = self._db.execute(
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
139 'SELECT rev FROM changelog WHERE node = ?', (gitutil.togitnode(n),)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
140 ).fetchone()
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
141 if t is None:
52629
7d2fc79a3e5a git: consistify & fix LookupError messages
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52628
diff changeset
142 raise error.LookupError(n, b'00changelog.i', _(b'no node'))
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
143 return t[0]
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
144
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
145 def node(self, r):
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45939
diff changeset
146 if r == nullrev:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46795
diff changeset
147 return sha1nodeconstants.nullid
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
148 t = self._db.execute(
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
149 'SELECT node FROM changelog WHERE rev = ?', (r,)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
150 ).fetchone()
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
151 if t is None:
52629
7d2fc79a3e5a git: consistify & fix LookupError messages
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52628
diff changeset
152 raise error.LookupError(r, b'00changelog.i', _(b'no rev'))
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45939
diff changeset
153 return bin(t[0])
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
154
52624
cdbfe5e7592e git: handle octopus merges
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52618
diff changeset
155 def synthetic(self, n):
cdbfe5e7592e git: handle octopus merges
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52618
diff changeset
156 """Map any node to a non-synthetic node.
cdbfe5e7592e git: handle octopus merges
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52618
diff changeset
157
cdbfe5e7592e git: handle octopus merges
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52618
diff changeset
158 Indexing may have created synthetic nodes to handle octopus merges.
cdbfe5e7592e git: handle octopus merges
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52618
diff changeset
159 Certain operations on these made up nodes need to actually happen on
cdbfe5e7592e git: handle octopus merges
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52618
diff changeset
160 the real octopus merge commit. Given any node, this function
cdbfe5e7592e git: handle octopus merges
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52618
diff changeset
161 returns the real commit hash. One can think of this as hg-to-git
cdbfe5e7592e git: handle octopus merges
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52618
diff changeset
162 commit hash translation that always works."""
cdbfe5e7592e git: handle octopus merges
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52618
diff changeset
163 t = self._db.execute(
cdbfe5e7592e git: handle octopus merges
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52618
diff changeset
164 'SELECT synthetic FROM changelog WHERE node = ?',
cdbfe5e7592e git: handle octopus merges
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52618
diff changeset
165 (gitutil.togitnode(n),),
cdbfe5e7592e git: handle octopus merges
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52618
diff changeset
166 ).fetchone()
cdbfe5e7592e git: handle octopus merges
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52618
diff changeset
167 if t is None or t[0] is None:
cdbfe5e7592e git: handle octopus merges
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52618
diff changeset
168 return n
cdbfe5e7592e git: handle octopus merges
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52618
diff changeset
169 return bin(t[0])
cdbfe5e7592e git: handle octopus merges
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52618
diff changeset
170
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
171 def hasnode(self, n):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
172 t = self._db.execute(
47050
ce24a00fe7f0 git: pass the correct type to the sqlite3 query for baselog.hasnode()
Matt Harbison <matt_harbison@yahoo.com>
parents: 47049
diff changeset
173 'SELECT node FROM changelog WHERE node = ?',
52633
86920d1f7632 git: hexdump node when passing it to sqlite in baselog.hasnode
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52632
diff changeset
174 (gitutil.togitnode(n),),
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
175 ).fetchone()
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
176 return t is not None
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
177
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
178
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
179 class baselogindex:
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
180 def __init__(self, log):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
181 self._log = log
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
182
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
183 def has_node(self, n):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
184 return self._log.rev(n) != -1
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
185
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
186 def __len__(self):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
187 return len(self._log)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
188
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
189 def __getitem__(self, idx):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
190 p1rev, p2rev = self._log.parentrevs(idx)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
191 # TODO: it's messy that the index leaks so far out of the
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
192 # storage layer that we have to implement things like reading
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
193 # this raw tuple, which exposes revlog internals.
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
194 return (
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
195 # Pretend offset is just the index, since we don't really care.
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
196 idx,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
197 # Same with lengths
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
198 idx, # length
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
199 idx, # rawsize
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
200 -1, # delta base
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
201 idx, # linkrev TODO is this right?
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
202 p1rev,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
203 p2rev,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
204 self._log.node(idx),
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
205 )
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
206
52618
143063a94085 git: implement baselogindex.{rev,get_rev}
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52617
diff changeset
207 def rev(self, node):
143063a94085 git: implement baselogindex.{rev,get_rev}
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52617
diff changeset
208 return self._log.rev(node)
143063a94085 git: implement baselogindex.{rev,get_rev}
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52617
diff changeset
209
143063a94085 git: implement baselogindex.{rev,get_rev}
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52617
diff changeset
210 def get_rev(self, node):
143063a94085 git: implement baselogindex.{rev,get_rev}
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52617
diff changeset
211 return self._log.get_rev(node)
143063a94085 git: implement baselogindex.{rev,get_rev}
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52617
diff changeset
212
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
213
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
214 # TODO: an interface for the changelog type?
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
215 class changelog(baselog):
45414
66a10bd1b8db git: restore basic functionality after b3040b6739ce
Augie Fackler <raf@durin42.com>
parents: 45413
diff changeset
216 # TODO: this appears to be an enumerated type, and should probably
66a10bd1b8db git: restore basic functionality after b3040b6739ce
Augie Fackler <raf@durin42.com>
parents: 45413
diff changeset
217 # be part of the public changelog interface
66a10bd1b8db git: restore basic functionality after b3040b6739ce
Augie Fackler <raf@durin42.com>
parents: 45413
diff changeset
218 _copiesstorage = b'extra'
66a10bd1b8db git: restore basic functionality after b3040b6739ce
Augie Fackler <raf@durin42.com>
parents: 45413
diff changeset
219
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
220 def __contains__(self, rev):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
221 try:
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
222 self.node(rev)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
223 return True
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
224 except error.LookupError:
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
225 return False
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
226
44481
8b5f5d8ad783 gitlog: implement __iter__ on changelog
Augie Fackler <raf@durin42.com>
parents: 44480
diff changeset
227 def __iter__(self):
49284
d44e3c45f0e4 py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents: 48946
diff changeset
228 return iter(range(len(self)))
44481
8b5f5d8ad783 gitlog: implement __iter__ on changelog
Augie Fackler <raf@durin42.com>
parents: 44480
diff changeset
229
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
230 @property
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
231 def filteredrevs(self):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
232 # TODO: we should probably add a refs/hg/ namespace for hidden
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
233 # heads etc, but that's an idea for later.
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
234 return set()
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
235
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
236 @property
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
237 def index(self):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
238 return baselogindex(self)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
239
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
240 @property
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
241 def nodemap(self):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
242 r = {
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45939
diff changeset
243 bin(v[0]): v[1]
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
244 for v in self._db.execute('SELECT node, rev FROM changelog')
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
245 }
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46795
diff changeset
246 r[sha1nodeconstants.nullid] = nullrev
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
247 return r
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
248
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
249 def tip(self):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
250 t = self._db.execute(
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
251 'SELECT node FROM changelog ORDER BY rev DESC LIMIT 1'
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
252 ).fetchone()
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
253 if t:
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45939
diff changeset
254 return bin(t[0])
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46795
diff changeset
255 return sha1nodeconstants.nullid
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
256
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
257 def revs(self, start=0, stop=None):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
258 if stop is None:
47049
2a77c817d451 git: use the correct type for stopping changelog.revs()
Matt Harbison <matt_harbison@yahoo.com>
parents: 47048
diff changeset
259 stop = self.tiprev()
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
260 t = self._db.execute(
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
261 'SELECT rev FROM changelog '
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
262 'WHERE rev >= ? AND rev <= ? '
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
263 'ORDER BY REV ASC',
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
264 (start, stop),
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
265 )
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
266 return (int(r[0]) for r in t)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
267
45925
6aacc39501f7 gitlog: add tiprev() function
Augie Fackler <raf@durin42.com>
parents: 45521
diff changeset
268 def tiprev(self):
6aacc39501f7 gitlog: add tiprev() function
Augie Fackler <raf@durin42.com>
parents: 45521
diff changeset
269 t = self._db.execute(
45939
66f6ca2b7aee cleanup: fix a few recent black formatting violations
Matt Harbison <matt_harbison@yahoo.com>
parents: 45925
diff changeset
270 'SELECT rev FROM changelog ' 'ORDER BY REV DESC ' 'LIMIT 1'
47046
497cedcb6504 git: make changelog.tiprev() return int instead of tuple (issue6510)
Matt Harbison <matt_harbison@yahoo.com>
parents: 47045
diff changeset
271 ).fetchone()
497cedcb6504 git: make changelog.tiprev() return int instead of tuple (issue6510)
Matt Harbison <matt_harbison@yahoo.com>
parents: 47045
diff changeset
272
497cedcb6504 git: make changelog.tiprev() return int instead of tuple (issue6510)
Matt Harbison <matt_harbison@yahoo.com>
parents: 47045
diff changeset
273 if t is not None:
497cedcb6504 git: make changelog.tiprev() return int instead of tuple (issue6510)
Matt Harbison <matt_harbison@yahoo.com>
parents: 47045
diff changeset
274 return t[0]
497cedcb6504 git: make changelog.tiprev() return int instead of tuple (issue6510)
Matt Harbison <matt_harbison@yahoo.com>
parents: 47045
diff changeset
275 return -1
45925
6aacc39501f7 gitlog: add tiprev() function
Augie Fackler <raf@durin42.com>
parents: 45521
diff changeset
276
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
277 def _partialmatch(self, id):
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46795
diff changeset
278 if sha1nodeconstants.wdirhex.startswith(id):
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
279 raise error.WdirUnsupported
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
280 candidates = [
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45939
diff changeset
281 bin(x[0])
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
282 for x in self._db.execute(
47045
846920d89476 git: fix partial node matching
Matt Harbison <matt_harbison@yahoo.com>
parents: 46795
diff changeset
283 'SELECT node FROM changelog WHERE node LIKE ?',
846920d89476 git: fix partial node matching
Matt Harbison <matt_harbison@yahoo.com>
parents: 46795
diff changeset
284 (pycompat.sysstr(id + b'%'),),
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
285 )
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
286 ]
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46795
diff changeset
287 if sha1nodeconstants.nullhex.startswith(id):
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46795
diff changeset
288 candidates.append(sha1nodeconstants.nullid)
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
289 if len(candidates) > 1:
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
290 raise error.AmbiguousPrefixLookupError(
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
291 id, b'00changelog.i', _(b'ambiguous identifier')
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
292 )
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
293 if candidates:
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
294 return candidates[0]
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
295 return None
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
296
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
297 def flags(self, rev):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
298 return 0
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
299
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
300 def shortest(self, node, minlength=1):
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45939
diff changeset
301 nodehex = hex(node)
49284
d44e3c45f0e4 py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents: 48946
diff changeset
302 for attempt in range(minlength, len(nodehex) + 1):
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
303 candidate = nodehex[:attempt]
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
304 matches = int(
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
305 self._db.execute(
52632
d7368933f4b0 git: switch changelog.shortest from LIKE to GLOB to speed up matching
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52629
diff changeset
306 'SELECT COUNT(*) FROM changelog WHERE node GLOB ?',
d7368933f4b0 git: switch changelog.shortest from LIKE to GLOB to speed up matching
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52629
diff changeset
307 (pycompat.sysstr(candidate + b'*'),),
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
308 ).fetchone()[0]
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 if matches == 1:
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
311 return candidate
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
312 return nodehex
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
313
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
314 def headrevs(self, revs=None):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
315 realheads = [
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
316 int(x[0])
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
317 for x in self._db.execute(
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
318 'SELECT rev FROM changelog '
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
319 'INNER JOIN heads ON changelog.node = heads.node'
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
320 )
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 if revs:
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
323 return sorted([r for r in revs if r in realheads])
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
324 return sorted(realheads)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
325
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
326 def changelogrevision(self, nodeorrev):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
327 # Ensure we have a node id
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
328 if isinstance(nodeorrev, int):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
329 n = self.node(nodeorrev)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
330 else:
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
331 n = nodeorrev
47052
f8fa7ec53517 git: initialize `extra` to have at least the branch name for nullid
Matt Harbison <matt_harbison@yahoo.com>
parents: 47050
diff changeset
332 extra = {b'branch': b'default'}
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
333 # handle looking up nullid
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46795
diff changeset
334 if n == sha1nodeconstants.nullid:
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46795
diff changeset
335 return hgchangelog._changelogrevision(
47057
7431f5ab0d2a branching: merge stable into default
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47012 47052
diff changeset
336 extra=extra, manifest=sha1nodeconstants.nullid
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46795
diff changeset
337 )
52624
cdbfe5e7592e git: handle octopus merges
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52618
diff changeset
338 n = self.synthetic(n)
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
339 hn = gitutil.togitnode(n)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
340 # We've got a real commit!
52627
4dadaf300fe0 git: index changed files on-demand
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52624
diff changeset
341 index._index_repo_commit(self.gitrepo, self._db, hn, commit=True)
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
342 files = [
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
343 r[0]
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
344 for r in self._db.execute(
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
345 'SELECT filename FROM changedfiles '
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
346 'WHERE node = ? and filenode != ?',
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
347 (hn, gitutil.nullgit),
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
348 )
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
349 ]
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
350 filesremoved = [
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
351 r[0]
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
352 for r in self._db.execute(
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
353 'SELECT filename FROM changedfiles '
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
354 'WHERE node = ? and filenode = ?',
47048
03c73fc6f89a git: use the proper filenode for deleted files in changelog.changelogrevision
Matt Harbison <matt_harbison@yahoo.com>
parents: 47046
diff changeset
355 (hn, gitutil.nullgit),
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
356 )
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
357 ]
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
358 c = self.gitrepo[hn]
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
359 return hgchangelog._changelogrevision(
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
360 manifest=n, # pretend manifest the same as the commit node
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
361 user=b'%s <%s>'
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
362 % (c.author.name.encode('utf8'), c.author.email.encode('utf8')),
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
363 date=(c.author.time, -c.author.offset * 60),
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
364 files=files,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
365 # TODO filesadded in the index
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
366 filesremoved=filesremoved,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
367 description=c.message.encode('utf8'),
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
368 # TODO do we want to handle extra? how?
47052
f8fa7ec53517 git: initialize `extra` to have at least the branch name for nullid
Matt Harbison <matt_harbison@yahoo.com>
parents: 47050
diff changeset
369 extra=extra,
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
370 )
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
371
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
372 def ancestors(self, revs, stoprev=0, inclusive=False):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
373 revs = list(revs)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
374 tip = self.rev(self.tip())
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
375 for r in revs:
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
376 if r > tip:
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
377 raise IndexError(b'Invalid rev %r' % r)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
378 return ancestor.lazyancestors(
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
379 self.parentrevs, revs, stoprev=stoprev, inclusive=inclusive
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
380 )
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
381
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
382 # Cleanup opportunity: this is *identical* to the revlog.py version
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
383 def descendants(self, revs):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
384 return dagop.descendantrevs(revs, self.revs, self.parentrevs)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
385
44845
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
386 def incrementalmissingrevs(self, common=None):
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
387 """Return an object that can be used to incrementally compute the
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
388 revision numbers of the ancestors of arbitrary sets that are not
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
389 ancestors of common. This is an ancestor.incrementalmissingancestors
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
390 object.
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
391
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
392 'common' is a list of revision numbers. If common is not supplied, uses
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
393 nullrev.
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
394 """
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
395 if common is None:
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45939
diff changeset
396 common = [nullrev]
44845
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
397
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
398 return ancestor.incrementalmissingancestors(self.parentrevs, common)
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
399
49386
1e12ea7d8435 git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents: 49288
diff changeset
400 def findmissingrevs(self, common=None, heads=None):
1e12ea7d8435 git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents: 49288
diff changeset
401 """Return the revision numbers of the ancestors of heads that
1e12ea7d8435 git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents: 49288
diff changeset
402 are not ancestors of common.
1e12ea7d8435 git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents: 49288
diff changeset
403
1e12ea7d8435 git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents: 49288
diff changeset
404 More specifically, return a list of revision numbers corresponding to
1e12ea7d8435 git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents: 49288
diff changeset
405 nodes N such that every N satisfies the following constraints:
1e12ea7d8435 git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents: 49288
diff changeset
406
1e12ea7d8435 git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents: 49288
diff changeset
407 1. N is an ancestor of some node in 'heads'
1e12ea7d8435 git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents: 49288
diff changeset
408 2. N is not an ancestor of any node in 'common'
1e12ea7d8435 git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents: 49288
diff changeset
409
1e12ea7d8435 git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents: 49288
diff changeset
410 The list is sorted by revision number, meaning it is
1e12ea7d8435 git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents: 49288
diff changeset
411 topologically sorted.
1e12ea7d8435 git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents: 49288
diff changeset
412
1e12ea7d8435 git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents: 49288
diff changeset
413 'heads' and 'common' are both lists of revision numbers. If heads is
1e12ea7d8435 git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents: 49288
diff changeset
414 not supplied, uses all of the revlog's heads. If common is not
1e12ea7d8435 git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents: 49288
diff changeset
415 supplied, uses nullid."""
1e12ea7d8435 git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents: 49288
diff changeset
416 if common is None:
1e12ea7d8435 git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents: 49288
diff changeset
417 common = [nullrev]
1e12ea7d8435 git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents: 49288
diff changeset
418 if heads is None:
1e12ea7d8435 git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents: 49288
diff changeset
419 heads = self.headrevs()
1e12ea7d8435 git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents: 49288
diff changeset
420
1e12ea7d8435 git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents: 49288
diff changeset
421 inc = self.incrementalmissingrevs(common=common)
1e12ea7d8435 git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents: 49288
diff changeset
422 return inc.missingancestors(heads)
1e12ea7d8435 git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents: 49288
diff changeset
423
44845
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
424 def findmissing(self, common=None, heads=None):
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
425 """Return the ancestors of heads that are not ancestors of common.
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
426
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
427 More specifically, return a list of nodes N such that every N
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
428 satisfies the following constraints:
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
429
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
430 1. N is an ancestor of some node in 'heads'
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
431 2. N is not an ancestor of any node in 'common'
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
432
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
433 The list is sorted by revision number, meaning it is
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
434 topologically sorted.
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
435
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
436 'heads' and 'common' are both lists of node IDs. If heads is
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
437 not supplied, uses all of the revlog's heads. If common is not
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
438 supplied, uses nullid."""
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
439 if common is None:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46795
diff changeset
440 common = [sha1nodeconstants.nullid]
44845
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
441 if heads is None:
51301
d91b55371d6f git-hgext: adjust to the lack of `changelog.heads` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49386
diff changeset
442 heads = [self.node(r) for r in self.headrevs()]
44845
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
443
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
444 common = [self.rev(n) for n in common]
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
445 heads = [self.rev(n) for n in heads]
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
446
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
447 inc = self.incrementalmissingrevs(common=common)
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
448 return [self.node(r) for r in inc.missingancestors(heads)]
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
449
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
450 def children(self, node):
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
451 """find the children of a given node"""
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
452 c = []
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
453 p = self.rev(node)
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
454 for r in self.revs(start=p + 1):
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45939
diff changeset
455 prevs = [pr for pr in self.parentrevs(r) if pr != nullrev]
44845
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
456 if prevs:
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
457 for pr in prevs:
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
458 if pr == p:
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
459 c.append(self.node(r))
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45939
diff changeset
460 elif p == nullrev:
44845
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
461 c.append(self.node(r))
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
462 return c
3e09d22a0bf5 git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents: 44844
diff changeset
463
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
464 def reachableroots(self, minroot, heads, roots, includepath=False):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
465 return dagop._reachablerootspure(
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
466 self.parentrevs, minroot, roots, heads, includepath
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
467 )
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
468
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
469 # Cleanup opportunity: this is *identical* to the revlog.py version
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
470 def isancestor(self, a, b):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
471 a, b = self.rev(a), self.rev(b)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
472 return self.isancestorrev(a, b)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
473
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
474 # Cleanup opportunity: this is *identical* to the revlog.py version
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
475 def isancestorrev(self, a, b):
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45939
diff changeset
476 if a == nullrev:
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
477 return True
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
478 elif a == b:
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
479 return True
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
480 elif a > b:
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
481 return False
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
482 return bool(self.reachableroots(a, [b], [a], includepath=False))
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
483
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
484 def parentrevs(self, rev):
52624
cdbfe5e7592e git: handle octopus merges
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52618
diff changeset
485 assert rev >= 0, rev
cdbfe5e7592e git: handle octopus merges
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52618
diff changeset
486 t = self._db.execute(
cdbfe5e7592e git: handle octopus merges
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52618
diff changeset
487 'SELECT p1, p2 FROM changelog WHERE rev = ?', (rev,)
cdbfe5e7592e git: handle octopus merges
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52618
diff changeset
488 ).fetchone()
cdbfe5e7592e git: handle octopus merges
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52618
diff changeset
489 if t is None:
cdbfe5e7592e git: handle octopus merges
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52618
diff changeset
490 raise error.LookupError(rev, b'00changelog.i', _(b'no rev'))
cdbfe5e7592e git: handle octopus merges
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52618
diff changeset
491 return self.rev(bin(t[0])), self.rev(bin(t[1]))
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
492
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
493 # Private method is used at least by the tags code.
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
494 _uncheckedparentrevs = parentrevs
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
495
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
496 def commonancestorsheads(self, a, b):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
497 # TODO the revlog verson of this has a C path, so we probably
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
498 # need to optimize this...
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
499 a, b = self.rev(a), self.rev(b)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
500 return [
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
501 self.node(n)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
502 for n in ancestor.commonancestorsheads(self.parentrevs, a, b)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
503 ]
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
504
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
505 def branchinfo(self, rev):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
506 """Git doesn't do named branches, so just put everything on default."""
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
507 return b'default', False
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
508
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
509 def delayupdate(self, tr):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
510 # TODO: I think we can elide this because we're just dropping
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
511 # an object in the git repo?
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
512 pass
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
513
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
514 def add(
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
515 self,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
516 manifest,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
517 files,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
518 desc,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
519 transaction,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
520 p1,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
521 p2,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
522 user,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
523 date=None,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
524 extra=None,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
525 p1copies=None,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
526 p2copies=None,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
527 filesadded=None,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
528 filesremoved=None,
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
529 ):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
530 parents = []
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
531 hp1, hp2 = gitutil.togitnode(p1), gitutil.togitnode(p2)
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46795
diff changeset
532 if p1 != sha1nodeconstants.nullid:
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
533 parents.append(hp1)
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46795
diff changeset
534 if p2 and p2 != sha1nodeconstants.nullid:
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
535 parents.append(hp2)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
536 assert date is not None
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
537 timestamp, tz = date
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
538 sig = pygit2.Signature(
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
539 encoding.unifromlocal(stringutil.person(user)),
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
540 encoding.unifromlocal(stringutil.email(user)),
45521
e7587430ca23 git: also convert timezone to int (issue6359)
Augie Fackler <augie@google.com>
parents: 45414
diff changeset
541 int(timestamp),
45413
8ddbb75bad09 git: convert tz offset to int (issue6359)
Augie Fackler <raf@durin42.com>
parents: 44951
diff changeset
542 -int(tz // 60),
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
543 )
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
544 oid = self.gitrepo.create_commit(
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
545 None, sig, sig, desc, gitutil.togitnode(manifest), parents
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
546 )
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
547 # Set up an internal reference to force the commit into the
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
548 # changelog. Hypothetically, we could even use this refs/hg/
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
549 # namespace to allow for anonymous heads on git repos, which
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
550 # would be neat.
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
551 self.gitrepo.references.create(
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
552 'refs/hg/internal/latest-commit', oid, force=True
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
553 )
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
554 # Reindex now to pick up changes. We omit the progress
44951
83e41b73d115 git: add debug logging when there's a mismatch in the cached heads list
Augie Fackler <augie@google.com>
parents: 44845
diff changeset
555 # and log callbacks because this will be very quick.
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
556 index._index_repo(self.gitrepo, self._db)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
557 return oid.raw
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
558
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
559
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
560 class manifestlog(baselog):
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46113
diff changeset
561 nodeconstants = sha1nodeconstants
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46113
diff changeset
562
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
563 def __getitem__(self, node):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
564 return self.get(b'', node)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
565
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
566 def get(self, relpath, node):
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46795
diff changeset
567 if node == sha1nodeconstants.nullid:
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
568 # TODO: this should almost certainly be a memgittreemanifestctx
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
569 return manifest.memtreemanifestctx(self, relpath)
52624
cdbfe5e7592e git: handle octopus merges
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52618
diff changeset
570 node = self.synthetic(node)
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
571 commit = self.gitrepo[gitutil.togitnode(node)]
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
572 t = commit.tree
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
573 if relpath:
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
574 parts = relpath.split(b'/')
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
575 for p in parts:
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
576 te = t[p]
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
577 t = self.gitrepo[te.id]
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
578 return gitmanifest.gittreemanifestctx(self.gitrepo, t)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
579
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
580
52489
ba8f03ad8906 filelog: subclass the new `repository.ifilestorage` Protocol class
Matt Harbison <matt_harbison@yahoo.com>
parents: 52487
diff changeset
581 class filelog(baselog, repository.ifilestorage):
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
582 def __init__(self, gr, db, path):
52643
5cc8deb96b48 pyupgrade: modernize calls to superclass methods
Matt Harbison <matt_harbison@yahoo.com>
parents: 52633
diff changeset
583 super().__init__(gr, db)
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
584 assert isinstance(path, bytes)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
585 self.path = path
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46795
diff changeset
586 self.nullid = sha1nodeconstants.nullid
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
587
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
588 def read(self, node):
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46795
diff changeset
589 if node == sha1nodeconstants.nullid:
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
590 return b''
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
591 return self.gitrepo[gitutil.togitnode(node)].data
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
592
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
593 def lookup(self, node):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
594 if len(node) not in (20, 40):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
595 node = int(node)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
596 if isinstance(node, int):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
597 assert False, b'todo revnums for nodes'
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
598 if len(node) == 40:
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45939
diff changeset
599 node = bin(node)
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
600 hnode = gitutil.togitnode(node)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
601 if hnode in self.gitrepo:
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
602 return node
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
603 raise error.LookupError(self.path, node, _(b'no match found'))
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
604
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
605 def cmp(self, node, text):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
606 """Returns True if text is different than content at `node`."""
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
607 return self.read(node) != text
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
608
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
609 def add(self, text, meta, transaction, link, p1=None, p2=None):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
610 assert not meta # Should we even try to handle this?
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
611 return self.gitrepo.create_blob(text).raw
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
612
52487
3daaa5195a30 typing: align the signatures of `repository.ifilestorage` overrides
Matt Harbison <matt_harbison@yahoo.com>
parents: 52444
diff changeset
613 def __iter__(self) -> Iterator[int]:
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
614 for clrev in self._db.execute(
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
615 '''
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
616 SELECT rev FROM changelog
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
617 INNER JOIN changedfiles ON changelog.node = changedfiles.node
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
618 WHERE changedfiles.filename = ? AND changedfiles.filenode != ?
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
619 ''',
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
620 (pycompat.fsdecode(self.path), gitutil.nullgit),
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
621 ):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
622 yield clrev[0]
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
623
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
624 def linkrev(self, fr):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
625 return fr
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
626
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
627 def rev(self, node):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
628 row = self._db.execute(
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
629 '''
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
630 SELECT rev FROM changelog
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
631 INNER JOIN changedfiles ON changelog.node = changedfiles.node
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
632 WHERE changedfiles.filename = ? AND changedfiles.filenode = ?''',
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
633 (pycompat.fsdecode(self.path), gitutil.togitnode(node)),
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
634 ).fetchone()
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
635 if row is None:
52629
7d2fc79a3e5a git: consistify & fix LookupError messages
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 52628
diff changeset
636 raise error.LookupError(self.path, node, _(b'no node'))
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
637 return int(row[0])
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
638
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
639 def node(self, rev):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
640 maybe = self._db.execute(
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
641 '''SELECT filenode FROM changedfiles
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
642 INNER JOIN changelog ON changelog.node = changedfiles.node
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
643 WHERE changelog.rev = ? AND filename = ?
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
644 ''',
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
645 (rev, pycompat.fsdecode(self.path)),
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
646 ).fetchone()
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
647 if maybe is None:
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
648 raise IndexError('gitlog %r out of range %d' % (self.path, rev))
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45939
diff changeset
649 return bin(maybe[0])
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
650
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
651 def parents(self, node):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
652 gn = gitutil.togitnode(node)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
653 gp = pycompat.fsdecode(self.path)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
654 ps = []
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
655 for p in self._db.execute(
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
656 '''SELECT p1filenode, p2filenode FROM changedfiles
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
657 WHERE filenode = ? AND filename = ?
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
658 ''',
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
659 (gn, gp),
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
660 ).fetchone():
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
661 if p is None:
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
662 commit = self._db.execute(
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
663 "SELECT node FROM changedfiles "
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
664 "WHERE filenode = ? AND filename = ?",
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
665 (gn, gp),
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
666 ).fetchone()[0]
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
667 # This filelog is missing some data. Build the
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
668 # filelog, then recurse (which will always find data).
49288
ef5f5f1cbd90 py3: constant-fold some `pycompat.ispy3`
Manuel Jacob <me@manueljacob.de>
parents: 49284
diff changeset
669 commit = commit.decode('ascii')
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
670 index.fill_in_filelog(self.gitrepo, self._db, commit, gp, gn)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
671 return self.parents(node)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
672 else:
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45939
diff changeset
673 ps.append(bin(p))
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
674 return ps
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
675
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
676 def renamed(self, node):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
677 # TODO: renames/copies
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
678 return False