Mercurial > public > mercurial-scm > hg-stable
annotate hgext/git/gitlog.py @ 52473:cdb45eb77efb
git: drop the zope `repository.ifilestorage` decoration on `gitlog.filelog`
The next logical step is to disable the conditional import of `zope` in the
`mercurial.interfaces.util` module, and just run with the no-op decorators.
But doing that then generates these pytype errors:
File "/mnt/c/Users/Matt/hg/hgext/git/gitlog.py", line 485, in read:
No attribute 'gitrepo' on filelog [attribute-error]
File "/mnt/c/Users/Matt/hg/hgext/git/gitlog.py", line 495, in lookup:
No attribute 'gitrepo' on filelog [attribute-error]
File "/mnt/c/Users/Matt/hg/hgext/git/gitlog.py", line 505, in add:
No attribute 'gitrepo' on filelog [attribute-error]
File "/mnt/c/Users/Matt/hg/hgext/git/gitlog.py", line 508, in __iter__:
No attribute '_db' on filelog [attribute-error]
File "/mnt/c/Users/Matt/hg/hgext/git/gitlog.py", line 522, in rev:
No attribute '_db' on filelog [attribute-error]
File "/mnt/c/Users/Matt/hg/hgext/git/gitlog.py", line 534, in node:
No attribute '_db' on filelog [attribute-error]
File "/mnt/c/Users/Matt/hg/hgext/git/gitlog.py", line 549, in parents:
No attribute '_db' on filelog [attribute-error]
File "/mnt/c/Users/Matt/hg/hgext/git/gitlog.py", line 556, in parents:
No attribute '_db' on filelog [attribute-error]
File "/mnt/c/Users/Matt/hg/hgext/git/gitlog.py", line 564, in parents:
No attribute 'gitrepo' on filelog [attribute-error]
File "/mnt/c/Users/Matt/hg/hgext/git/gitlog.py", line 564, in parents:
No attribute '_db' on filelog [attribute-error]
I'm not sure what exactly the issue is, but the pyi file that was being
generated up to this point has `filelog` typed as `Any` (because it had a
decorator, and pytype chokes on that), and `baselog` was typed as a class. So
it apparently can't see the `_db` and `gitrepo` attributes of the subclass,
because it doesn't think `filelog` is a class.
Leave the decorator commented out so it hits when searching for the remaining
zope things that need to be updated to Protocol.
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Sat, 07 Dec 2024 20:15:11 -0500 |
parents | f4733654f144 |
children | 3daaa5195a30 |
rev | line source |
---|---|
51901
f4733654f144
typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents:
51321
diff
changeset
|
1 from __future__ import annotations |
f4733654f144
typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents:
51321
diff
changeset
|
2 |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
3 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
|
4 |
46114
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45954
diff
changeset
|
5 from mercurial.node import ( |
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45954
diff
changeset
|
6 bin, |
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45954
diff
changeset
|
7 hex, |
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45954
diff
changeset
|
8 nullrev, |
46793
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46114
diff
changeset
|
9 sha1nodeconstants, |
46114
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45954
diff
changeset
|
10 ) |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
11 from mercurial import ( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
12 ancestor, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
13 changelog as hgchangelog, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
14 dagop, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
15 encoding, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
16 error, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
17 manifest, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
18 pycompat, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
19 ) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
20 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
|
21 from . import ( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
22 gitutil, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
23 index, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
24 manifest as gitmanifest, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
25 ) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
26 |
44496
ec54b3d2af0b
git: don't fail import when pygit2 is not install
Martin von Zweigbergk <martinvonz@google.com>
parents:
44493
diff
changeset
|
27 pygit2 = gitutil.get_pygit2() |
ec54b3d2af0b
git: don't fail import when pygit2 is not install
Martin von Zweigbergk <martinvonz@google.com>
parents:
44493
diff
changeset
|
28 |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
29 |
49037
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
30 class baselog: # revlog.revlog): |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
31 """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
|
32 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
33 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
|
34 self.gitrepo = gr |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
35 self._db = db |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
36 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
37 def __len__(self): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
38 return int( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
39 self._db.execute('SELECT COUNT(*) FROM changelog').fetchone()[0] |
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 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
42 def rev(self, n): |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46797
diff
changeset
|
43 if n == sha1nodeconstants.nullid: |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
44 return -1 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
45 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
|
46 '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
|
47 ).fetchone() |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
48 if t is None: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
49 raise error.LookupError(n, b'00changelog.i', _(b'no node %d')) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
50 return t[0] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
51 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
52 def node(self, r): |
46114
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45954
diff
changeset
|
53 if r == nullrev: |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46797
diff
changeset
|
54 return sha1nodeconstants.nullid |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
55 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
|
56 '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
|
57 ).fetchone() |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
58 if t is None: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
59 raise error.LookupError(r, b'00changelog.i', _(b'no node')) |
46114
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45954
diff
changeset
|
60 return bin(t[0]) |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
61 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
62 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
|
63 t = self._db.execute( |
47021
ce24a00fe7f0
git: pass the correct type to the sqlite3 query for baselog.hasnode()
Matt Harbison <matt_harbison@yahoo.com>
parents:
47020
diff
changeset
|
64 'SELECT node FROM changelog WHERE node = ?', |
ce24a00fe7f0
git: pass the correct type to the sqlite3 query for baselog.hasnode()
Matt Harbison <matt_harbison@yahoo.com>
parents:
47020
diff
changeset
|
65 (pycompat.sysstr(n),), |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
66 ).fetchone() |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
67 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
|
68 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
69 |
49037
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
70 class baselogindex: |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
71 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
|
72 self._log = log |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
73 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
74 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
|
75 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
|
76 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
77 def __len__(self): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
78 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
|
79 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
80 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
|
81 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
|
82 # 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
|
83 # 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
|
84 # 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
|
85 return ( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
86 # 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
|
87 idx, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
88 # Same with lengths |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
89 idx, # length |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
90 idx, # rawsize |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
91 -1, # delta base |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
92 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
|
93 p1rev, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
94 p2rev, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
95 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
|
96 ) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
97 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
98 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
99 # 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
|
100 class changelog(baselog): |
45427
66a10bd1b8db
git: restore basic functionality after b3040b6739ce
Augie Fackler <raf@durin42.com>
parents:
45426
diff
changeset
|
101 # TODO: this appears to be an enumerated type, and should probably |
66a10bd1b8db
git: restore basic functionality after b3040b6739ce
Augie Fackler <raf@durin42.com>
parents:
45426
diff
changeset
|
102 # be part of the public changelog interface |
66a10bd1b8db
git: restore basic functionality after b3040b6739ce
Augie Fackler <raf@durin42.com>
parents:
45426
diff
changeset
|
103 _copiesstorage = b'extra' |
66a10bd1b8db
git: restore basic functionality after b3040b6739ce
Augie Fackler <raf@durin42.com>
parents:
45426
diff
changeset
|
104 |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
105 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
|
106 try: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
107 self.node(rev) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
108 return True |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
109 except error.LookupError: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
110 return False |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
111 |
44493
8b5f5d8ad783
gitlog: implement __iter__ on changelog
Augie Fackler <raf@durin42.com>
parents:
44492
diff
changeset
|
112 def __iter__(self): |
49292
d44e3c45f0e4
py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents:
49037
diff
changeset
|
113 return iter(range(len(self))) |
44493
8b5f5d8ad783
gitlog: implement __iter__ on changelog
Augie Fackler <raf@durin42.com>
parents:
44492
diff
changeset
|
114 |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
115 @property |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
116 def filteredrevs(self): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
117 # 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
|
118 # 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
|
119 return set() |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
120 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
121 @property |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
122 def index(self): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
123 return baselogindex(self) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
124 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
125 @property |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
126 def nodemap(self): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
127 r = { |
46114
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45954
diff
changeset
|
128 bin(v[0]): v[1] |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
129 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
|
130 } |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46797
diff
changeset
|
131 r[sha1nodeconstants.nullid] = nullrev |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
132 return r |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
133 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
134 def tip(self): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
135 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
|
136 '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
|
137 ).fetchone() |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
138 if t: |
46114
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45954
diff
changeset
|
139 return bin(t[0]) |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46797
diff
changeset
|
140 return sha1nodeconstants.nullid |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
141 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
142 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
|
143 if stop is None: |
47020
2a77c817d451
git: use the correct type for stopping changelog.revs()
Matt Harbison <matt_harbison@yahoo.com>
parents:
47019
diff
changeset
|
144 stop = self.tiprev() |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
145 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
|
146 '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
|
147 '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
|
148 '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
|
149 (start, stop), |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
150 ) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
151 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
|
152 |
45940
6aacc39501f7
gitlog: add tiprev() function
Augie Fackler <raf@durin42.com>
parents:
45529
diff
changeset
|
153 def tiprev(self): |
6aacc39501f7
gitlog: add tiprev() function
Augie Fackler <raf@durin42.com>
parents:
45529
diff
changeset
|
154 t = self._db.execute( |
45954
66f6ca2b7aee
cleanup: fix a few recent black formatting violations
Matt Harbison <matt_harbison@yahoo.com>
parents:
45940
diff
changeset
|
155 'SELECT rev FROM changelog ' 'ORDER BY REV DESC ' 'LIMIT 1' |
47017
497cedcb6504
git: make changelog.tiprev() return int instead of tuple (issue6510)
Matt Harbison <matt_harbison@yahoo.com>
parents:
47016
diff
changeset
|
156 ).fetchone() |
497cedcb6504
git: make changelog.tiprev() return int instead of tuple (issue6510)
Matt Harbison <matt_harbison@yahoo.com>
parents:
47016
diff
changeset
|
157 |
497cedcb6504
git: make changelog.tiprev() return int instead of tuple (issue6510)
Matt Harbison <matt_harbison@yahoo.com>
parents:
47016
diff
changeset
|
158 if t is not None: |
497cedcb6504
git: make changelog.tiprev() return int instead of tuple (issue6510)
Matt Harbison <matt_harbison@yahoo.com>
parents:
47016
diff
changeset
|
159 return t[0] |
497cedcb6504
git: make changelog.tiprev() return int instead of tuple (issue6510)
Matt Harbison <matt_harbison@yahoo.com>
parents:
47016
diff
changeset
|
160 return -1 |
45940
6aacc39501f7
gitlog: add tiprev() function
Augie Fackler <raf@durin42.com>
parents:
45529
diff
changeset
|
161 |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
162 def _partialmatch(self, id): |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46797
diff
changeset
|
163 if sha1nodeconstants.wdirhex.startswith(id): |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
164 raise error.WdirUnsupported |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
165 candidates = [ |
46114
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45954
diff
changeset
|
166 bin(x[0]) |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
167 for x in self._db.execute( |
47016
846920d89476
git: fix partial node matching
Matt Harbison <matt_harbison@yahoo.com>
parents:
46797
diff
changeset
|
168 'SELECT node FROM changelog WHERE node LIKE ?', |
846920d89476
git: fix partial node matching
Matt Harbison <matt_harbison@yahoo.com>
parents:
46797
diff
changeset
|
169 (pycompat.sysstr(id + b'%'),), |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
170 ) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
171 ] |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46797
diff
changeset
|
172 if sha1nodeconstants.nullhex.startswith(id): |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46797
diff
changeset
|
173 candidates.append(sha1nodeconstants.nullid) |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
174 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
|
175 raise error.AmbiguousPrefixLookupError( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
176 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
|
177 ) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
178 if candidates: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
179 return candidates[0] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
180 return None |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
181 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
182 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
|
183 return 0 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
184 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
185 def shortest(self, node, minlength=1): |
46114
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45954
diff
changeset
|
186 nodehex = hex(node) |
49292
d44e3c45f0e4
py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents:
49037
diff
changeset
|
187 for attempt in range(minlength, len(nodehex) + 1): |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
188 candidate = nodehex[:attempt] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
189 matches = int( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
190 self._db.execute( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
191 'SELECT COUNT(*) FROM changelog WHERE node LIKE ?', |
44490
6d953b3fc2bd
git: make {shortest()} return shortest *unique* prefix
Martin von Zweigbergk <martinvonz@google.com>
parents:
44489
diff
changeset
|
192 (pycompat.sysstr(candidate + b'%'),), |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
193 ).fetchone()[0] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
194 ) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
195 if matches == 1: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
196 return candidate |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
197 return nodehex |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
198 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
199 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
|
200 realheads = [ |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
201 int(x[0]) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
202 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
|
203 '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
|
204 '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
|
205 ) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
206 ] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
207 if revs: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
208 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
|
209 return sorted(realheads) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
210 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
211 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
|
212 # 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
|
213 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
|
214 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
|
215 else: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
216 n = nodeorrev |
47023
f8fa7ec53517
git: initialize `extra` to have at least the branch name for nullid
Matt Harbison <matt_harbison@yahoo.com>
parents:
47021
diff
changeset
|
217 extra = {b'branch': b'default'} |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
218 # handle looking up nullid |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46797
diff
changeset
|
219 if n == sha1nodeconstants.nullid: |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46797
diff
changeset
|
220 return hgchangelog._changelogrevision( |
47084 | 221 extra=extra, manifest=sha1nodeconstants.nullid |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46797
diff
changeset
|
222 ) |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
223 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
|
224 # We've got a real commit! |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
225 files = [ |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
226 r[0] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
227 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
|
228 '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
|
229 '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
|
230 (hn, gitutil.nullgit), |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
231 ) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
232 ] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
233 filesremoved = [ |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
234 r[0] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
235 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
|
236 '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
|
237 'WHERE node = ? and filenode = ?', |
47019
03c73fc6f89a
git: use the proper filenode for deleted files in changelog.changelogrevision
Matt Harbison <matt_harbison@yahoo.com>
parents:
47017
diff
changeset
|
238 (hn, gitutil.nullgit), |
44489
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 ] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
241 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
|
242 return hgchangelog._changelogrevision( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
243 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
|
244 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
|
245 % (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
|
246 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
|
247 files=files, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
248 # 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
|
249 filesremoved=filesremoved, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
250 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
|
251 # TODO do we want to handle extra? how? |
47023
f8fa7ec53517
git: initialize `extra` to have at least the branch name for nullid
Matt Harbison <matt_harbison@yahoo.com>
parents:
47021
diff
changeset
|
252 extra=extra, |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
253 ) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
254 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
255 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
|
256 revs = list(revs) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
257 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
|
258 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
|
259 if r > tip: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
260 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
|
261 return ancestor.lazyancestors( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
262 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
|
263 ) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
264 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
265 # 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
|
266 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
|
267 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
|
268 |
44904
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
269 def incrementalmissingrevs(self, common=None): |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
270 """Return an object that can be used to incrementally compute the |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
271 revision numbers of the ancestors of arbitrary sets that are not |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
272 ancestors of common. This is an ancestor.incrementalmissingancestors |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
273 object. |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
274 |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
275 '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:
44903
diff
changeset
|
276 nullrev. |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
277 """ |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
278 if common is None: |
46114
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45954
diff
changeset
|
279 common = [nullrev] |
44904
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
280 |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
281 return ancestor.incrementalmissingancestors(self.parentrevs, common) |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
282 |
49382
1e12ea7d8435
git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents:
49296
diff
changeset
|
283 def findmissingrevs(self, common=None, heads=None): |
1e12ea7d8435
git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents:
49296
diff
changeset
|
284 """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:
49296
diff
changeset
|
285 are not ancestors of common. |
1e12ea7d8435
git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents:
49296
diff
changeset
|
286 |
1e12ea7d8435
git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents:
49296
diff
changeset
|
287 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:
49296
diff
changeset
|
288 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:
49296
diff
changeset
|
289 |
1e12ea7d8435
git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents:
49296
diff
changeset
|
290 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:
49296
diff
changeset
|
291 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:
49296
diff
changeset
|
292 |
1e12ea7d8435
git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents:
49296
diff
changeset
|
293 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:
49296
diff
changeset
|
294 topologically sorted. |
1e12ea7d8435
git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents:
49296
diff
changeset
|
295 |
1e12ea7d8435
git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents:
49296
diff
changeset
|
296 '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:
49296
diff
changeset
|
297 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:
49296
diff
changeset
|
298 supplied, uses nullid.""" |
1e12ea7d8435
git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents:
49296
diff
changeset
|
299 if common is None: |
1e12ea7d8435
git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents:
49296
diff
changeset
|
300 common = [nullrev] |
1e12ea7d8435
git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents:
49296
diff
changeset
|
301 if heads is None: |
1e12ea7d8435
git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents:
49296
diff
changeset
|
302 heads = self.headrevs() |
1e12ea7d8435
git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents:
49296
diff
changeset
|
303 |
1e12ea7d8435
git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents:
49296
diff
changeset
|
304 inc = self.incrementalmissingrevs(common=common) |
1e12ea7d8435
git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents:
49296
diff
changeset
|
305 return inc.missingancestors(heads) |
1e12ea7d8435
git: copy findmissingrevs() from revlog.py to gitlog.py (issue6472)
Anton Shestakov <av6@dwimlabs.net>
parents:
49296
diff
changeset
|
306 |
44904
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
307 def findmissing(self, common=None, heads=None): |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
308 """Return the ancestors of heads that are not ancestors of common. |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
309 |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
310 More specifically, return a list of nodes N such that every N |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
311 satisfies the following constraints: |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
312 |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
313 1. N is an ancestor of some node in 'heads' |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
314 2. N is not an ancestor of any node in 'common' |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
315 |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
316 The list is sorted by revision number, meaning it is |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
317 topologically sorted. |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
318 |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
319 'heads' and 'common' are both lists of node IDs. If heads is |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
320 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:
44903
diff
changeset
|
321 supplied, uses nullid.""" |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
322 if common is None: |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46797
diff
changeset
|
323 common = [sha1nodeconstants.nullid] |
44904
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
324 if heads is None: |
51321
d91b55371d6f
git-hgext: adjust to the lack of `changelog.heads` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49382
diff
changeset
|
325 heads = [self.node(r) for r in self.headrevs()] |
44904
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
326 |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
327 common = [self.rev(n) for n in common] |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
328 heads = [self.rev(n) for n in heads] |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
329 |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
330 inc = self.incrementalmissingrevs(common=common) |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
331 return [self.node(r) for r in inc.missingancestors(heads)] |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
332 |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
333 def children(self, node): |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
334 """find the children of a given node""" |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
335 c = [] |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
336 p = self.rev(node) |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
337 for r in self.revs(start=p + 1): |
46114
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45954
diff
changeset
|
338 prevs = [pr for pr in self.parentrevs(r) if pr != nullrev] |
44904
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
339 if prevs: |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
340 for pr in prevs: |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
341 if pr == p: |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
342 c.append(self.node(r)) |
46114
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45954
diff
changeset
|
343 elif p == nullrev: |
44904
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
344 c.append(self.node(r)) |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
345 return c |
3e09d22a0bf5
git: implement some changelog methods
Romain DEP. <rom1dep@gmail.com>
parents:
44903
diff
changeset
|
346 |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
347 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
|
348 return dagop._reachablerootspure( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
349 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
|
350 ) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
351 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
352 # 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
|
353 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
|
354 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
|
355 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
|
356 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
357 # 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
|
358 def isancestorrev(self, a, b): |
46114
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45954
diff
changeset
|
359 if a == nullrev: |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
360 return True |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
361 elif a == b: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
362 return True |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
363 elif a > b: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
364 return False |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
365 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
|
366 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
367 def parentrevs(self, rev): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
368 n = self.node(rev) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
369 hn = gitutil.togitnode(n) |
44903
8bfc6cc8e480
git: avoid looking-up parents for the null commit
Romain DEP. <rom1dep@gmail.com>
parents:
44496
diff
changeset
|
370 if hn != gitutil.nullgit: |
8bfc6cc8e480
git: avoid looking-up parents for the null commit
Romain DEP. <rom1dep@gmail.com>
parents:
44496
diff
changeset
|
371 c = self.gitrepo[hn] |
8bfc6cc8e480
git: avoid looking-up parents for the null commit
Romain DEP. <rom1dep@gmail.com>
parents:
44496
diff
changeset
|
372 else: |
46114
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45954
diff
changeset
|
373 return nullrev, nullrev |
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45954
diff
changeset
|
374 p1 = p2 = nullrev |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
375 if c.parents: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
376 p1 = self.rev(c.parents[0].id.raw) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
377 if len(c.parents) > 2: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
378 raise error.Abort(b'TODO octopus merge handling') |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
379 if len(c.parents) == 2: |
44492
f19491aae641
gitlog: fix embarassing bug that prevented log from showing correct parents
Augie Fackler <raf@durin42.com>
parents:
44490
diff
changeset
|
380 p2 = self.rev(c.parents[1].id.raw) |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
381 return p1, p2 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
382 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
383 # 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
|
384 _uncheckedparentrevs = parentrevs |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
385 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
386 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
|
387 # 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
|
388 # 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
|
389 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
|
390 return [ |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
391 self.node(n) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
392 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
|
393 ] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
394 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
395 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
|
396 """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
|
397 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
|
398 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
399 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
|
400 # 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
|
401 # 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
|
402 pass |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
403 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
404 def add( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
405 self, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
406 manifest, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
407 files, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
408 desc, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
409 transaction, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
410 p1, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
411 p2, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
412 user, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
413 date=None, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
414 extra=None, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
415 p1copies=None, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
416 p2copies=None, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
417 filesadded=None, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
418 filesremoved=None, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
419 ): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
420 parents = [] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
421 hp1, hp2 = gitutil.togitnode(p1), gitutil.togitnode(p2) |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46797
diff
changeset
|
422 if p1 != sha1nodeconstants.nullid: |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
423 parents.append(hp1) |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46797
diff
changeset
|
424 if p2 and p2 != sha1nodeconstants.nullid: |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
425 parents.append(hp2) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
426 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
|
427 timestamp, tz = date |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
428 sig = pygit2.Signature( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
429 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
|
430 encoding.unifromlocal(stringutil.email(user)), |
45529
e7587430ca23
git: also convert timezone to int (issue6359)
Augie Fackler <augie@google.com>
parents:
45427
diff
changeset
|
431 int(timestamp), |
45426
8ddbb75bad09
git: convert tz offset to int (issue6359)
Augie Fackler <raf@durin42.com>
parents:
44992
diff
changeset
|
432 -int(tz // 60), |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
433 ) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
434 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
|
435 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
|
436 ) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
437 # 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
|
438 # 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
|
439 # 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
|
440 # would be neat. |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
441 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
|
442 '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
|
443 ) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
444 # Reindex now to pick up changes. We omit the progress |
44992
83e41b73d115
git: add debug logging when there's a mismatch in the cached heads list
Augie Fackler <augie@google.com>
parents:
44904
diff
changeset
|
445 # and log callbacks because this will be very quick. |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
446 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
|
447 return oid.raw |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
448 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
449 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
450 class manifestlog(baselog): |
46793
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46114
diff
changeset
|
451 nodeconstants = sha1nodeconstants |
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46114
diff
changeset
|
452 |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
453 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
|
454 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
|
455 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
456 def get(self, relpath, node): |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46797
diff
changeset
|
457 if node == sha1nodeconstants.nullid: |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
458 # 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
|
459 return manifest.memtreemanifestctx(self, relpath) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
460 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
|
461 t = commit.tree |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
462 if relpath: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
463 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
|
464 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
|
465 te = t[p] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
466 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
|
467 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
|
468 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
469 |
52473
cdb45eb77efb
git: drop the zope `repository.ifilestorage` decoration on `gitlog.filelog`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51901
diff
changeset
|
470 # @interfaceutil.implementer(repository.ifilestorage) |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
471 class filelog(baselog): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
472 def __init__(self, gr, db, path): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
473 super(filelog, self).__init__(gr, db) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
474 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
|
475 self.path = path |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46797
diff
changeset
|
476 self.nullid = sha1nodeconstants.nullid |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
477 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
478 def read(self, node): |
47055
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46797
diff
changeset
|
479 if node == sha1nodeconstants.nullid: |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
480 return b'' |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
481 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
|
482 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
483 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
|
484 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
|
485 node = int(node) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
486 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
|
487 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
|
488 if len(node) == 40: |
46114
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45954
diff
changeset
|
489 node = bin(node) |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
490 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
|
491 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
|
492 return node |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
493 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
|
494 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
495 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
|
496 """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
|
497 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
|
498 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
499 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
|
500 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
|
501 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
|
502 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
503 def __iter__(self): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
504 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
|
505 ''' |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
506 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
|
507 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
|
508 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
|
509 ''', |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
510 (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
|
511 ): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
512 yield clrev[0] |
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 linkrev(self, fr): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
515 return fr |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
516 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
517 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
|
518 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
|
519 ''' |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
520 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
|
521 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
|
522 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
|
523 (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
|
524 ).fetchone() |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
525 if row is None: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
526 raise error.LookupError(self.path, node, _(b'no such node')) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
527 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
|
528 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
529 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
|
530 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
|
531 '''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
|
532 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
|
533 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
|
534 ''', |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
535 (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
|
536 ).fetchone() |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
537 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
|
538 raise IndexError('gitlog %r out of range %d' % (self.path, rev)) |
46114
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45954
diff
changeset
|
539 return bin(maybe[0]) |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
540 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
541 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
|
542 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
|
543 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
|
544 ps = [] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
545 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
|
546 '''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
|
547 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
|
548 ''', |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
549 (gn, gp), |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
550 ).fetchone(): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
551 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
|
552 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
|
553 "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
|
554 "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
|
555 (gn, gp), |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
556 ).fetchone()[0] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
557 # 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
|
558 # filelog, then recurse (which will always find data). |
49296
ef5f5f1cbd90
py3: constant-fold some `pycompat.ispy3`
Manuel Jacob <me@manueljacob.de>
parents:
49292
diff
changeset
|
559 commit = commit.decode('ascii') |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
560 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
|
561 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
|
562 else: |
46114
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45954
diff
changeset
|
563 ps.append(bin(p)) |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
564 return ps |
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 renamed(self, node): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
567 # TODO: renames/copies |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
568 return False |