author | Augie Fackler <raf@durin42.com> |
Mon, 07 Sep 2020 16:27:12 -0400 | |
changeset 45430 | 6739ef7c5fcf |
parent 44992 | 83e41b73d115 |
child 45957 | 89a2afe31e82 |
permissions | -rw-r--r-- |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
1 |
"""grant Mercurial the ability to operate on Git repositories. (EXPERIMENTAL) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
2 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
3 |
This is currently super experimental. It probably will consume your |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
4 |
firstborn a la Rumpelstiltskin, etc. |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
5 |
""" |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
6 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
7 |
from __future__ import absolute_import |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
8 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
9 |
import os |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
10 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
11 |
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
|
12 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
13 |
from mercurial import ( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
14 |
commands, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
15 |
error, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
16 |
extensions, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
17 |
localrepo, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
18 |
pycompat, |
44992
83e41b73d115
git: add debug logging when there's a mismatch in the cached heads list
Augie Fackler <augie@google.com>
parents:
44628
diff
changeset
|
19 |
registrar, |
44627
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
20 |
scmutil, |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
21 |
store, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
22 |
util, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
23 |
) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
24 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
25 |
from . import ( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
26 |
dirstate, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
27 |
gitlog, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
28 |
gitutil, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
29 |
index, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
30 |
) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
31 |
|
44992
83e41b73d115
git: add debug logging when there's a mismatch in the cached heads list
Augie Fackler <augie@google.com>
parents:
44628
diff
changeset
|
32 |
configtable = {} |
83e41b73d115
git: add debug logging when there's a mismatch in the cached heads list
Augie Fackler <augie@google.com>
parents:
44628
diff
changeset
|
33 |
configitem = registrar.configitem(configtable) |
83e41b73d115
git: add debug logging when there's a mismatch in the cached heads list
Augie Fackler <augie@google.com>
parents:
44628
diff
changeset
|
34 |
# git.log-index-cache-miss: internal knob for testing |
83e41b73d115
git: add debug logging when there's a mismatch in the cached heads list
Augie Fackler <augie@google.com>
parents:
44628
diff
changeset
|
35 |
configitem( |
83e41b73d115
git: add debug logging when there's a mismatch in the cached heads list
Augie Fackler <augie@google.com>
parents:
44628
diff
changeset
|
36 |
b"git", b"log-index-cache-miss", default=False, |
83e41b73d115
git: add debug logging when there's a mismatch in the cached heads list
Augie Fackler <augie@google.com>
parents:
44628
diff
changeset
|
37 |
) |
83e41b73d115
git: add debug logging when there's a mismatch in the cached heads list
Augie Fackler <augie@google.com>
parents:
44628
diff
changeset
|
38 |
|
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
39 |
# TODO: extract an interface for this in core |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
40 |
class gitstore(object): # store.basicstore): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
41 |
def __init__(self, path, vfstype): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
42 |
self.vfs = vfstype(path) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
43 |
self.path = self.vfs.base |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
44 |
self.createmode = store._calcmode(self.vfs) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
45 |
# above lines should go away in favor of: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
46 |
# super(gitstore, self).__init__(path, vfstype) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
47 |
|
44496
ec54b3d2af0b
git: don't fail import when pygit2 is not install
Martin von Zweigbergk <martinvonz@google.com>
parents:
44489
diff
changeset
|
48 |
self.git = gitutil.get_pygit2().Repository( |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
49 |
os.path.normpath(os.path.join(path, b'..', b'.git')) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
50 |
) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
51 |
self._progress_factory = lambda *args, **kwargs: None |
44992
83e41b73d115
git: add debug logging when there's a mismatch in the cached heads list
Augie Fackler <augie@google.com>
parents:
44628
diff
changeset
|
52 |
self._logfn = lambda x: None |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
53 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
54 |
@util.propertycache |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
55 |
def _db(self): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
56 |
# We lazy-create the database because we want to thread a |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
57 |
# progress callback down to the indexing process if it's |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
58 |
# required, and we don't have a ui handle in makestore(). |
44992
83e41b73d115
git: add debug logging when there's a mismatch in the cached heads list
Augie Fackler <augie@google.com>
parents:
44628
diff
changeset
|
59 |
return index.get_index(self.git, self._logfn, self._progress_factory) |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
60 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
61 |
def join(self, f): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
62 |
"""Fake store.join method for git repositories. |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
63 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
64 |
For the most part, store.join is used for @storecache |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
65 |
decorators to invalidate caches when various files |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
66 |
change. We'll map the ones we care about, and ignore the rest. |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
67 |
""" |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
68 |
if f in (b'00changelog.i', b'00manifest.i'): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
69 |
# This is close enough: in order for the changelog cache |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
70 |
# to be invalidated, HEAD will have to change. |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
71 |
return os.path.join(self.path, b'HEAD') |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
72 |
elif f == b'lock': |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
73 |
# TODO: we probably want to map this to a git lock, I |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
74 |
# suspect index.lock. We should figure out what the |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
75 |
# most-alike file is in git-land. For now we're risking |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
76 |
# bad concurrency errors if another git client is used. |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
77 |
return os.path.join(self.path, b'hgit-bogus-lock') |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
78 |
elif f in (b'obsstore', b'phaseroots', b'narrowspec', b'bookmarks'): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
79 |
return os.path.join(self.path, b'..', b'.hg', f) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
80 |
raise NotImplementedError(b'Need to pick file for %s.' % f) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
81 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
82 |
def changelog(self, trypending): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
83 |
# TODO we don't have a plan for trypending in hg's git support yet |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
84 |
return gitlog.changelog(self.git, self._db) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
85 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
86 |
def manifestlog(self, repo, storenarrowmatch): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
87 |
# TODO handle storenarrowmatch and figure out if we need the repo arg |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
88 |
return gitlog.manifestlog(self.git, self._db) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
89 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
90 |
def invalidatecaches(self): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
91 |
pass |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
92 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
93 |
def write(self, tr=None): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
94 |
# normally this handles things like fncache writes, which we don't have |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
95 |
pass |
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 |
def _makestore(orig, requirements, storebasepath, vfstype): |
44505
02c47b74366c
git: key off `git` in .hg/requires rather than separate file
Augie Fackler <raf@durin42.com>
parents:
44496
diff
changeset
|
99 |
if b'git' in requirements: |
02c47b74366c
git: key off `git` in .hg/requires rather than separate file
Augie Fackler <raf@durin42.com>
parents:
44496
diff
changeset
|
100 |
if not os.path.exists(os.path.join(storebasepath, b'..', b'.git')): |
02c47b74366c
git: key off `git` in .hg/requires rather than separate file
Augie Fackler <raf@durin42.com>
parents:
44496
diff
changeset
|
101 |
raise error.Abort( |
02c47b74366c
git: key off `git` in .hg/requires rather than separate file
Augie Fackler <raf@durin42.com>
parents:
44496
diff
changeset
|
102 |
_( |
02c47b74366c
git: key off `git` in .hg/requires rather than separate file
Augie Fackler <raf@durin42.com>
parents:
44496
diff
changeset
|
103 |
b'repository specified git format in ' |
02c47b74366c
git: key off `git` in .hg/requires rather than separate file
Augie Fackler <raf@durin42.com>
parents:
44496
diff
changeset
|
104 |
b'.hg/requires but has no .git directory' |
02c47b74366c
git: key off `git` in .hg/requires rather than separate file
Augie Fackler <raf@durin42.com>
parents:
44496
diff
changeset
|
105 |
) |
44496
ec54b3d2af0b
git: don't fail import when pygit2 is not install
Martin von Zweigbergk <martinvonz@google.com>
parents:
44489
diff
changeset
|
106 |
) |
44505
02c47b74366c
git: key off `git` in .hg/requires rather than separate file
Augie Fackler <raf@durin42.com>
parents:
44496
diff
changeset
|
107 |
# Check for presence of pygit2 only here. The assumption is that we'll |
02c47b74366c
git: key off `git` in .hg/requires rather than separate file
Augie Fackler <raf@durin42.com>
parents:
44496
diff
changeset
|
108 |
# run this code iff we'll later need pygit2. |
02c47b74366c
git: key off `git` in .hg/requires rather than separate file
Augie Fackler <raf@durin42.com>
parents:
44496
diff
changeset
|
109 |
if gitutil.get_pygit2() is None: |
02c47b74366c
git: key off `git` in .hg/requires rather than separate file
Augie Fackler <raf@durin42.com>
parents:
44496
diff
changeset
|
110 |
raise error.Abort( |
02c47b74366c
git: key off `git` in .hg/requires rather than separate file
Augie Fackler <raf@durin42.com>
parents:
44496
diff
changeset
|
111 |
_( |
02c47b74366c
git: key off `git` in .hg/requires rather than separate file
Augie Fackler <raf@durin42.com>
parents:
44496
diff
changeset
|
112 |
b'the git extension requires the Python ' |
02c47b74366c
git: key off `git` in .hg/requires rather than separate file
Augie Fackler <raf@durin42.com>
parents:
44496
diff
changeset
|
113 |
b'pygit2 library to be installed' |
02c47b74366c
git: key off `git` in .hg/requires rather than separate file
Augie Fackler <raf@durin42.com>
parents:
44496
diff
changeset
|
114 |
) |
02c47b74366c
git: key off `git` in .hg/requires rather than separate file
Augie Fackler <raf@durin42.com>
parents:
44496
diff
changeset
|
115 |
) |
44496
ec54b3d2af0b
git: don't fail import when pygit2 is not install
Martin von Zweigbergk <martinvonz@google.com>
parents:
44489
diff
changeset
|
116 |
|
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
117 |
return gitstore(storebasepath, vfstype) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
118 |
return orig(requirements, storebasepath, vfstype) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
119 |
|
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 |
class gitfilestorage(object): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
122 |
def file(self, path): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
123 |
if path[0:1] == b'/': |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
124 |
path = path[1:] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
125 |
return gitlog.filelog(self.store.git, self.store._db, path) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
126 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
127 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
128 |
def _makefilestorage(orig, requirements, features, **kwargs): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
129 |
store = kwargs['store'] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
130 |
if isinstance(store, gitstore): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
131 |
return gitfilestorage |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
132 |
return orig(requirements, features, **kwargs) |
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 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
135 |
def _setupdothg(ui, path): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
136 |
dothg = os.path.join(path, b'.hg') |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
137 |
if os.path.exists(dothg): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
138 |
ui.warn(_(b'git repo already initialized for hg\n')) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
139 |
else: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
140 |
os.mkdir(os.path.join(path, b'.hg')) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
141 |
# TODO is it ok to extend .git/info/exclude like this? |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
142 |
with open( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
143 |
os.path.join(path, b'.git', b'info', b'exclude'), 'ab' |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
144 |
) as exclude: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
145 |
exclude.write(b'\n.hg\n') |
44505
02c47b74366c
git: key off `git` in .hg/requires rather than separate file
Augie Fackler <raf@durin42.com>
parents:
44496
diff
changeset
|
146 |
with open(os.path.join(dothg, b'requires'), 'wb') as f: |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
147 |
f.write(b'git\n') |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
148 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
149 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
150 |
_BMS_PREFIX = 'refs/heads/' |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
151 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
152 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
153 |
class gitbmstore(object): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
154 |
def __init__(self, gitrepo): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
155 |
self.gitrepo = gitrepo |
44628
7cab8dbd0497
git: implement basic bookmark activation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44627
diff
changeset
|
156 |
self._aclean = True |
7cab8dbd0497
git: implement basic bookmark activation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44627
diff
changeset
|
157 |
self._active = gitrepo.references['HEAD'] # git head, not mark |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
158 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
159 |
def __contains__(self, name): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
160 |
return ( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
161 |
_BMS_PREFIX + pycompat.fsdecode(name) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
162 |
) in self.gitrepo.references |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
163 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
164 |
def __iter__(self): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
165 |
for r in self.gitrepo.listall_references(): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
166 |
if r.startswith(_BMS_PREFIX): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
167 |
yield pycompat.fsencode(r[len(_BMS_PREFIX) :]) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
168 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
169 |
def __getitem__(self, k): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
170 |
return ( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
171 |
self.gitrepo.references[_BMS_PREFIX + pycompat.fsdecode(k)] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
172 |
.peel() |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
173 |
.id.raw |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
174 |
) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
175 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
176 |
def get(self, k, default=None): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
177 |
try: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
178 |
if k in self: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
179 |
return self[k] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
180 |
return default |
44496
ec54b3d2af0b
git: don't fail import when pygit2 is not install
Martin von Zweigbergk <martinvonz@google.com>
parents:
44489
diff
changeset
|
181 |
except gitutil.get_pygit2().InvalidSpecError: |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
182 |
return default |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
183 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
184 |
@property |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
185 |
def active(self): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
186 |
h = self.gitrepo.references['HEAD'] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
187 |
if not isinstance(h.target, str) or not h.target.startswith( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
188 |
_BMS_PREFIX |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
189 |
): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
190 |
return None |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
191 |
return pycompat.fsencode(h.target[len(_BMS_PREFIX) :]) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
192 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
193 |
@active.setter |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
194 |
def active(self, mark): |
44628
7cab8dbd0497
git: implement basic bookmark activation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44627
diff
changeset
|
195 |
githead = mark is not None and (_BMS_PREFIX + mark) or None |
7cab8dbd0497
git: implement basic bookmark activation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44627
diff
changeset
|
196 |
if githead is not None and githead not in self.gitrepo.references: |
7cab8dbd0497
git: implement basic bookmark activation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44627
diff
changeset
|
197 |
raise AssertionError(b'bookmark %s does not exist!' % mark) |
7cab8dbd0497
git: implement basic bookmark activation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44627
diff
changeset
|
198 |
|
7cab8dbd0497
git: implement basic bookmark activation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44627
diff
changeset
|
199 |
self._active = githead |
7cab8dbd0497
git: implement basic bookmark activation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44627
diff
changeset
|
200 |
self._aclean = False |
7cab8dbd0497
git: implement basic bookmark activation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44627
diff
changeset
|
201 |
|
7cab8dbd0497
git: implement basic bookmark activation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44627
diff
changeset
|
202 |
def _writeactive(self): |
7cab8dbd0497
git: implement basic bookmark activation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44627
diff
changeset
|
203 |
if self._aclean: |
7cab8dbd0497
git: implement basic bookmark activation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44627
diff
changeset
|
204 |
return |
7cab8dbd0497
git: implement basic bookmark activation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44627
diff
changeset
|
205 |
self.gitrepo.references.create('HEAD', self._active, True) |
7cab8dbd0497
git: implement basic bookmark activation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44627
diff
changeset
|
206 |
self._aclean = True |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
207 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
208 |
def names(self, node): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
209 |
r = [] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
210 |
for ref in self.gitrepo.listall_references(): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
211 |
if not ref.startswith(_BMS_PREFIX): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
212 |
continue |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
213 |
if self.gitrepo.references[ref].peel().id.raw != node: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
214 |
continue |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
215 |
r.append(pycompat.fsencode(ref[len(_BMS_PREFIX) :])) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
216 |
return r |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
217 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
218 |
# Cleanup opportunity: this is *identical* to core's bookmarks store. |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
219 |
def expandname(self, bname): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
220 |
if bname == b'.': |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
221 |
if self.active: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
222 |
return self.active |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
223 |
raise error.RepoLookupError(_(b"no active bookmark")) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
224 |
return bname |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
225 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
226 |
def applychanges(self, repo, tr, changes): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
227 |
"""Apply a list of changes to bookmarks |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
228 |
""" |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
229 |
# TODO: this should respect transactions, but that's going to |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
230 |
# require enlarging the gitbmstore to know how to do in-memory |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
231 |
# temporary writes and read those back prior to transaction |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
232 |
# finalization. |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
233 |
for name, node in changes: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
234 |
if node is None: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
235 |
self.gitrepo.references.delete( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
236 |
_BMS_PREFIX + pycompat.fsdecode(name) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
237 |
) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
238 |
else: |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
239 |
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
|
240 |
_BMS_PREFIX + pycompat.fsdecode(name), |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
241 |
gitutil.togitnode(node), |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
242 |
force=True, |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
243 |
) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
244 |
|
44627
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
245 |
def checkconflict(self, mark, force=False, target=None): |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
246 |
githead = _BMS_PREFIX + mark |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
247 |
cur = self.gitrepo.references['HEAD'] |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
248 |
if githead in self.gitrepo.references and not force: |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
249 |
if target: |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
250 |
if self.gitrepo.references[githead] == target and target == cur: |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
251 |
# re-activating a bookmark |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
252 |
return [] |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
253 |
# moving a bookmark - forward? |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
254 |
raise NotImplementedError |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
255 |
raise error.Abort( |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
256 |
_(b"bookmark '%s' already exists (use -f to force)") % mark |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
257 |
) |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
258 |
if len(mark) > 3 and not force: |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
259 |
try: |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
260 |
shadowhash = scmutil.isrevsymbol(self._repo, mark) |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
261 |
except error.LookupError: # ambiguous identifier |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
262 |
shadowhash = False |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
263 |
if shadowhash: |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
264 |
self._repo.ui.warn( |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
265 |
_( |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
266 |
b"bookmark %s matches a changeset hash\n" |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
267 |
b"(did you leave a -r out of an 'hg bookmark' " |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
268 |
b"command?)\n" |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
269 |
) |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
270 |
% mark |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
271 |
) |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
272 |
return [] |
bb3e05ca21ca
git: implement a basic checkconflict bookmark store method
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
44552
diff
changeset
|
273 |
|
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
274 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
275 |
def init(orig, ui, dest=b'.', **opts): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
276 |
if opts.get('git', False): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
277 |
path = os.path.abspath(dest) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
278 |
# TODO: walk up looking for the git repo |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
279 |
_setupdothg(ui, path) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
280 |
return 0 |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
281 |
return orig(ui, dest=dest, **opts) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
282 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
283 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
284 |
def reposetup(ui, repo): |
44552
a2b49606a837
hgit: make sure repository is local before checking for store type
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44505
diff
changeset
|
285 |
if repo.local() and isinstance(repo.store, gitstore): |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
286 |
orig = repo.__class__ |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
287 |
repo.store._progress_factory = repo.ui.makeprogress |
44992
83e41b73d115
git: add debug logging when there's a mismatch in the cached heads list
Augie Fackler <augie@google.com>
parents:
44628
diff
changeset
|
288 |
if ui.configbool(b'git', b'log-index-cache-miss'): |
83e41b73d115
git: add debug logging when there's a mismatch in the cached heads list
Augie Fackler <augie@google.com>
parents:
44628
diff
changeset
|
289 |
repo.store._logfn = repo.ui.warn |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
290 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
291 |
class gitlocalrepo(orig): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
292 |
def _makedirstate(self): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
293 |
# TODO narrow support here |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
294 |
return dirstate.gitdirstate( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
295 |
self.ui, self.vfs.base, self.store.git |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
296 |
) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
297 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
298 |
def commit(self, *args, **kwargs): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
299 |
ret = orig.commit(self, *args, **kwargs) |
45430
6739ef7c5fcf
git: correctly handle "nothing changed" commits
Augie Fackler <raf@durin42.com>
parents:
44992
diff
changeset
|
300 |
if ret is None: |
6739ef7c5fcf
git: correctly handle "nothing changed" commits
Augie Fackler <raf@durin42.com>
parents:
44992
diff
changeset
|
301 |
# there was nothing to commit, so we should skip |
6739ef7c5fcf
git: correctly handle "nothing changed" commits
Augie Fackler <raf@durin42.com>
parents:
44992
diff
changeset
|
302 |
# the index fixup logic we'd otherwise do. |
6739ef7c5fcf
git: correctly handle "nothing changed" commits
Augie Fackler <raf@durin42.com>
parents:
44992
diff
changeset
|
303 |
return None |
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
304 |
tid = self.store.git[gitutil.togitnode(ret)].tree.id |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
305 |
# DANGER! This will flush any writes staged to the |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
306 |
# index in Git, but we're sidestepping the index in a |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
307 |
# way that confuses git when we commit. Alas. |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
308 |
self.store.git.index.read_tree(tid) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
309 |
self.store.git.index.write() |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
310 |
return ret |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
311 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
312 |
@property |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
313 |
def _bookmarks(self): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
314 |
return gitbmstore(self.store.git) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
315 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
316 |
repo.__class__ = gitlocalrepo |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
317 |
return repo |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
318 |
|
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
319 |
|
44505
02c47b74366c
git: key off `git` in .hg/requires rather than separate file
Augie Fackler <raf@durin42.com>
parents:
44496
diff
changeset
|
320 |
def _featuresetup(ui, supported): |
02c47b74366c
git: key off `git` in .hg/requires rather than separate file
Augie Fackler <raf@durin42.com>
parents:
44496
diff
changeset
|
321 |
# don't die on seeing a repo with the git requirement |
02c47b74366c
git: key off `git` in .hg/requires rather than separate file
Augie Fackler <raf@durin42.com>
parents:
44496
diff
changeset
|
322 |
supported |= {b'git'} |
02c47b74366c
git: key off `git` in .hg/requires rather than separate file
Augie Fackler <raf@durin42.com>
parents:
44496
diff
changeset
|
323 |
|
02c47b74366c
git: key off `git` in .hg/requires rather than separate file
Augie Fackler <raf@durin42.com>
parents:
44496
diff
changeset
|
324 |
|
44489
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
325 |
def extsetup(ui): |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
326 |
extensions.wrapfunction(localrepo, b'makestore', _makestore) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
327 |
extensions.wrapfunction(localrepo, b'makefilestorage', _makefilestorage) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
328 |
# Inject --git flag for `hg init` |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
329 |
entry = extensions.wrapcommand(commands.table, b'init', init) |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
330 |
entry[1].extend( |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
331 |
[(b'', b'git', None, b'setup up a git repository instead of hg')] |
ad718271a9eb
git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
332 |
) |
44505
02c47b74366c
git: key off `git` in .hg/requires rather than separate file
Augie Fackler <raf@durin42.com>
parents:
44496
diff
changeset
|
333 |
localrepo.featuresetupfuncs.add(_featuresetup) |