annotate hgext/journal.py @ 46604:ad107ed7a4aa

ci: test real dependency installation for pip In the past, the pip smoke test inhibited actual dependency installation, but that fails in different environments for setuptools itself. Since it isn't what we actually want to test (which is pip install), allow this to call home, if HGTESTS_ALLOW_NETIO=1 is set in the environment. Differential Revision: https://phab.mercurial-scm.org/D9950
author Joerg Sonnenberger <joerg@bec.de>
date Thu, 04 Feb 2021 23:23:35 +0100
parents 59fa3890d40a
children d55b71393907
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
1 # journal.py
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
2 #
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
3 # Copyright 2014-2016 Facebook, Inc.
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
4 #
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
5 # This software may be used and distributed according to the terms of the
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
6 # GNU General Public License version 2 or any later version.
31600
809fa1d7eb99 journal: use lowercase for docstring title
Jun Wu <quark@fb.com>
parents: 31330
diff changeset
7 """track previous positions of bookmarks (EXPERIMENTAL)
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
8
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
9 This extension adds a new command: `hg journal`, which shows you where
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
10 bookmarks were previously located.
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
11
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
12 """
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
13
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
14 from __future__ import absolute_import
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
15
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
16 import collections
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
17 import errno
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
18 import os
29502
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
19 import weakref
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
20
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
21 from mercurial.i18n import _
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 43506
diff changeset
22 from mercurial.node import (
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 43506
diff changeset
23 bin,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 43506
diff changeset
24 hex,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 43506
diff changeset
25 nullid,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 43506
diff changeset
26 )
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
27
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
28 from mercurial import (
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
29 bookmarks,
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
30 cmdutil,
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
31 dispatch,
36666
d79d68bb9f7c py3: replace __str__ to __bytes__ in hgext/journal.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36653
diff changeset
32 encoding,
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
33 error,
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
34 extensions,
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
35 hg,
29502
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
36 localrepo,
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
37 lock,
35888
c8e2d6ed1f9e cmdutil: drop aliases for logcmdutil functions (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35462
diff changeset
38 logcmdutil,
35000
135edf120d76 py3: handle keyword arguments in hgext/journal.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33923
diff changeset
39 pycompat,
32337
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32291
diff changeset
40 registrar,
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
41 util,
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
42 )
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36668
diff changeset
43 from mercurial.utils import (
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36668
diff changeset
44 dateutil,
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
45 procutil,
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36668
diff changeset
46 stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36668
diff changeset
47 )
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
48
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
49 cmdtable = {}
32337
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32291
diff changeset
50 command = registrar.command(cmdtable)
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
51
29841
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29773
diff changeset
52 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
53 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
54 # be specifying the version(s) of Mercurial they are tested with, or
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
55 # leave the attribute unspecified.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
56 testedwith = b'ships-with-hg-core'
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
57
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
58 # storage format version; increment when the format changes
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
59 storageversion = 0
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
60
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
61 # namespaces
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
62 bookmarktype = b'bookmark'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
63 wdirparenttype = b'wdirparent'
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
64 # In a shared repository, what shared feature name is used
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
65 # to indicate this namespace is shared with the source?
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
66 sharednamespaces = {
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
67 bookmarktype: hg.sharedbookmarks,
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
68 }
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
69
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
70 # Journal recording, register hooks and storage object
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
71 def extsetup(ui):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
72 extensions.wrapfunction(dispatch, b'runcommand', runcommand)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
73 extensions.wrapfunction(bookmarks.bmstore, b'_write', recordbookmarks)
33384
bc1f373cf3f6 journal: use wrapfilecache instead of wrapfunction on func of filecache
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33383
diff changeset
74 extensions.wrapfilecache(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
75 localrepo.localrepository, b'dirstate', wrapdirstate
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
76 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
77 extensions.wrapfunction(hg, b'postshare', wrappostshare)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
78 extensions.wrapfunction(hg, b'copystore', unsharejournal)
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
79
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
80
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
81 def reposetup(ui, repo):
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
82 if repo.local():
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
83 repo.journal = journalstorage(repo)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
84 repo._wlockfreeprefix.add(b'namejournal')
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
85
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
86 dirstate, cached = localrepo.isfilecached(repo, b'dirstate')
33383
774beab915fe journal: execute setup procedures for already instantiated dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32375
diff changeset
87 if cached:
774beab915fe journal: execute setup procedures for already instantiated dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32375
diff changeset
88 # already instantiated dirstate isn't yet marked as
774beab915fe journal: execute setup procedures for already instantiated dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32375
diff changeset
89 # "journal"-ing, even though repo.dirstate() was already
774beab915fe journal: execute setup procedures for already instantiated dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32375
diff changeset
90 # wrapped by own wrapdirstate()
774beab915fe journal: execute setup procedures for already instantiated dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32375
diff changeset
91 _setupdirstate(repo, dirstate)
774beab915fe journal: execute setup procedures for already instantiated dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32375
diff changeset
92
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
93
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
94 def runcommand(orig, lui, repo, cmd, fullargs, *args):
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
95 """Track the command line options for recording in the journal"""
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
96 journalstorage.recordcommand(*fullargs)
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
97 return orig(lui, repo, cmd, fullargs, *args)
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
98
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
99
33383
774beab915fe journal: execute setup procedures for already instantiated dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32375
diff changeset
100 def _setupdirstate(repo, dirstate):
774beab915fe journal: execute setup procedures for already instantiated dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32375
diff changeset
101 dirstate.journalstorage = repo.journal
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
102 dirstate.addparentchangecallback(b'journal', recorddirstateparents)
33383
774beab915fe journal: execute setup procedures for already instantiated dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32375
diff changeset
103
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
104
29502
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
105 # hooks to record dirstate changes
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
106 def wrapdirstate(orig, repo):
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
107 """Make journal storage available to the dirstate object"""
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
108 dirstate = orig(repo)
43115
4aa72cdf616f py3: delete b'' prefix from safehasattr arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 43105
diff changeset
109 if util.safehasattr(repo, 'journal'):
33383
774beab915fe journal: execute setup procedures for already instantiated dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32375
diff changeset
110 _setupdirstate(repo, dirstate)
29502
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
111 return dirstate
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
112
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
113
29773
f2241c13d5a1 journal: use the dirstate parentchange callbacks
Mateusz Kwapich <mitrandir@fb.com>
parents: 29756
diff changeset
114 def recorddirstateparents(dirstate, old, new):
29502
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
115 """Records all dirstate parent changes in the journal."""
29773
f2241c13d5a1 journal: use the dirstate parentchange callbacks
Mateusz Kwapich <mitrandir@fb.com>
parents: 29756
diff changeset
116 old = list(old)
f2241c13d5a1 journal: use the dirstate parentchange callbacks
Mateusz Kwapich <mitrandir@fb.com>
parents: 29756
diff changeset
117 new = list(new)
43115
4aa72cdf616f py3: delete b'' prefix from safehasattr arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 43105
diff changeset
118 if util.safehasattr(dirstate, 'journalstorage'):
29773
f2241c13d5a1 journal: use the dirstate parentchange callbacks
Mateusz Kwapich <mitrandir@fb.com>
parents: 29756
diff changeset
119 # only record two hashes if there was a merge
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 43506
diff changeset
120 oldhashes = old[:1] if old[1] == nullid else old
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 43506
diff changeset
121 newhashes = new[:1] if new[1] == nullid else new
29773
f2241c13d5a1 journal: use the dirstate parentchange callbacks
Mateusz Kwapich <mitrandir@fb.com>
parents: 29756
diff changeset
122 dirstate.journalstorage.record(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
123 wdirparenttype, b'.', oldhashes, newhashes
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
124 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
125
29502
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
126
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
127 # hooks to record bookmark changes (both local and remote)
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
128 def recordbookmarks(orig, store, fp):
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
129 """Records all bookmark changes in the journal."""
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
130 repo = store._repo
43115
4aa72cdf616f py3: delete b'' prefix from safehasattr arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 43105
diff changeset
131 if util.safehasattr(repo, 'journal'):
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
132 oldmarks = bookmarks.bmstore(repo)
43105
649d3ac37a12 py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
133 for mark, value in pycompat.iteritems(store):
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 43506
diff changeset
134 oldvalue = oldmarks.get(mark, nullid)
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
135 if value != oldvalue:
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
136 repo.journal.record(bookmarktype, mark, oldvalue, value)
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
137 return orig(store, fp)
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
138
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
139
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
140 # shared repository support
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
141 def _readsharedfeatures(repo):
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
142 """A set of shared features for this repository"""
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
143 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
144 return set(repo.vfs.read(b'shared').splitlines())
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
145 except IOError as inst:
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
146 if inst.errno != errno.ENOENT:
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
147 raise
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
148 return set()
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
149
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
150
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
151 def _mergeentriesiter(*iterables, **kwargs):
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
152 """Given a set of sorted iterables, yield the next entry in merged order
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
153
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
154 Note that by default entries go from most recent to oldest.
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
155 """
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43115
diff changeset
156 order = kwargs.pop('order', max)
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
157 iterables = [iter(it) for it in iterables]
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
158 # this tracks still active iterables; iterables are deleted as they are
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
159 # exhausted, which is why this is a dictionary and why each entry also
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
160 # stores the key. Entries are mutable so we can store the next value each
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
161 # time.
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
162 iterable_map = {}
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
163 for key, it in enumerate(iterables):
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
164 try:
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
165 iterable_map[key] = [next(it), key, it]
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
166 except StopIteration:
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
167 # empty entry, can be ignored
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
168 pass
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
169
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
170 while iterable_map:
43104
74802979dd9d py3: define and use pycompat.itervalues()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
171 value, key, it = order(pycompat.itervalues(iterable_map))
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
172 yield value
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
173 try:
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
174 iterable_map[key][0] = next(it)
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
175 except StopIteration:
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
176 # this iterable is empty, remove it from consideration
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
177 del iterable_map[key]
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
178
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
179
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
180 def wrappostshare(orig, sourcerepo, destrepo, **kwargs):
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
181 """Mark this shared working copy as sharing journal information"""
29756
46d9a5bb2fb0 journal: take wlock for writting the 'shared' file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29679
diff changeset
182 with destrepo.wlock():
46d9a5bb2fb0 journal: take wlock for writting the 'shared' file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29679
diff changeset
183 orig(sourcerepo, destrepo, **kwargs)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
184 with destrepo.vfs(b'shared', b'a') as fp:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
185 fp.write(b'journal\n')
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
186
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
187
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
188 def unsharejournal(orig, ui, repo, repopath):
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
189 """Copy shared journal entries into this repo when unsharing"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
190 if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
191 repo.path == repopath
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
192 and repo.shared()
43115
4aa72cdf616f py3: delete b'' prefix from safehasattr arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 43105
diff changeset
193 and util.safehasattr(repo, 'journal')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
194 ):
36159
0fe7e39dc683 hg: move share._getsrcrepo into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35954
diff changeset
195 sharedrepo = hg.sharedreposource(repo)
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
196 sharedfeatures = _readsharedfeatures(repo)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
197 if sharedrepo and sharedfeatures > {b'journal'}:
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
198 # there is a shared repository and there are shared journal entries
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
199 # to copy. move shared date over from source to destination but
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
200 # move the local file first
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
201 if repo.vfs.exists(b'namejournal'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
202 journalpath = repo.vfs.join(b'namejournal')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
203 util.rename(journalpath, journalpath + b'.bak')
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
204 storage = repo.journal
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
205 local = storage._open(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
206 repo.vfs, filename=b'namejournal.bak', _newestfirst=False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
207 )
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
208 shared = (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
209 e
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
210 for e in storage._open(sharedrepo.vfs, _newestfirst=False)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
211 if sharednamespaces.get(e.namespace) in sharedfeatures
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
212 )
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
213 for entry in _mergeentriesiter(local, shared, order=min):
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
214 storage._write(repo.vfs, entry)
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
215
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
216 return orig(ui, repo, repopath)
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
217
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
218
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
219 class journalentry(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
220 collections.namedtuple(
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43115
diff changeset
221 'journalentry',
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43115
diff changeset
222 'timestamp user command namespace name oldhashes newhashes',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
223 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
224 ):
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
225 """Individual journal entry
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
226
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
227 * timestamp: a mercurial (time, timezone) tuple
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
228 * user: the username that ran the command
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
229 * namespace: the entry namespace, an opaque string
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
230 * name: the name of the changed item, opaque string with meaning in the
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
231 namespace
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
232 * command: the hg command that triggered this record
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
233 * oldhashes: a tuple of one or more binary hashes for the old location
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
234 * newhashes: a tuple of one or more binary hashes for the new location
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
235
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
236 Handles serialisation from and to the storage format. Fields are
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
237 separated by newlines, hashes are written out in hex separated by commas,
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
238 timestamp and timezone are separated by a space.
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
239
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
240 """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
241
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
242 @classmethod
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
243 def fromstorage(cls, line):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
244 (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
245 time,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
246 user,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
247 command,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
248 namespace,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
249 name,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
250 oldhashes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
251 newhashes,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
252 ) = line.split(b'\n')
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
253 timestamp, tz = time.split()
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
254 timestamp, tz = float(timestamp), int(tz)
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 43506
diff changeset
255 oldhashes = tuple(bin(hash) for hash in oldhashes.split(b','))
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 43506
diff changeset
256 newhashes = tuple(bin(hash) for hash in newhashes.split(b','))
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
257 return cls(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
258 (timestamp, tz),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
259 user,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
260 command,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
261 namespace,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
262 name,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
263 oldhashes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
264 newhashes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
265 )
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
266
36666
d79d68bb9f7c py3: replace __str__ to __bytes__ in hgext/journal.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36653
diff changeset
267 def __bytes__(self):
d79d68bb9f7c py3: replace __str__ to __bytes__ in hgext/journal.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36653
diff changeset
268 """bytes representation for storage"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
269 time = b' '.join(map(pycompat.bytestr, self.timestamp))
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 43506
diff changeset
270 oldhashes = b','.join([hex(hash) for hash in self.oldhashes])
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 43506
diff changeset
271 newhashes = b','.join([hex(hash) for hash in self.newhashes])
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
272 return b'\n'.join(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
273 (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
274 time,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
275 self.user,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
276 self.command,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
277 self.namespace,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
278 self.name,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
279 oldhashes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
280 newhashes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
281 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
282 )
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
283
36666
d79d68bb9f7c py3: replace __str__ to __bytes__ in hgext/journal.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36653
diff changeset
284 __str__ = encoding.strmethod(__bytes__)
d79d68bb9f7c py3: replace __str__ to __bytes__ in hgext/journal.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36653
diff changeset
285
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
286
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
287 class journalstorage(object):
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
288 """Storage for journal entries
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
289
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
290 Entries are divided over two files; one with entries that pertain to the
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
291 local working copy *only*, and one with entries that are shared across
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
292 multiple working copies when shared using the share extension.
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
293
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
294 Entries are stored with NUL bytes as separators. See the journalentry
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
295 class for the per-entry structure.
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
296
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
297 The file format starts with an integer version, delimited by a NUL.
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
298
29502
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
299 This storage uses a dedicated lock; this makes it easier to avoid issues
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
300 with adding entries that added when the regular wlock is unlocked (e.g.
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
301 the dirstate).
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
302
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
303 """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
304
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
305 _currentcommand = ()
29502
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
306 _lockref = None
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
307
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
308 def __init__(self, repo):
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
309 self.user = procutil.getuser()
29502
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
310 self.ui = repo.ui
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
311 self.vfs = repo.vfs
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
312
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
313 # is this working copy using a shared storage?
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
314 self.sharedfeatures = self.sharedvfs = None
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
315 if repo.shared():
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
316 features = _readsharedfeatures(repo)
36159
0fe7e39dc683 hg: move share._getsrcrepo into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35954
diff changeset
317 sharedrepo = hg.sharedreposource(repo)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
318 if sharedrepo is not None and b'journal' in features:
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
319 self.sharedvfs = sharedrepo.vfs
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
320 self.sharedfeatures = features
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
321
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
322 # track the current command for recording in journal entries
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
323 @property
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
324 def command(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
325 commandstr = b' '.join(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
326 map(procutil.shellquote, journalstorage._currentcommand)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
327 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
328 if b'\n' in commandstr:
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
329 # truncate multi-line commands
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
330 commandstr = commandstr.partition(b'\n')[0] + b' ...'
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
331 return commandstr
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
332
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
333 @classmethod
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
334 def recordcommand(cls, *fullargs):
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
335 """Set the current hg arguments, stored with recorded entries"""
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
336 # Set the current command on the class because we may have started
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
337 # with a non-local repo (cloning for example).
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
338 cls._currentcommand = fullargs
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
339
29928
e5a97ec6ebb8 journal: properly check for held lock (issue5349)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29870
diff changeset
340 def _currentlock(self, lockref):
e5a97ec6ebb8 journal: properly check for held lock (issue5349)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29870
diff changeset
341 """Returns the lock if it's held, or None if it's not.
e5a97ec6ebb8 journal: properly check for held lock (issue5349)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29870
diff changeset
342
e5a97ec6ebb8 journal: properly check for held lock (issue5349)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29870
diff changeset
343 (This is copied from the localrepo class)
e5a97ec6ebb8 journal: properly check for held lock (issue5349)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29870
diff changeset
344 """
e5a97ec6ebb8 journal: properly check for held lock (issue5349)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29870
diff changeset
345 if lockref is None:
e5a97ec6ebb8 journal: properly check for held lock (issue5349)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29870
diff changeset
346 return None
e5a97ec6ebb8 journal: properly check for held lock (issue5349)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29870
diff changeset
347 l = lockref()
e5a97ec6ebb8 journal: properly check for held lock (issue5349)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29870
diff changeset
348 if l is None or not l.held:
e5a97ec6ebb8 journal: properly check for held lock (issue5349)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29870
diff changeset
349 return None
e5a97ec6ebb8 journal: properly check for held lock (issue5349)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29870
diff changeset
350 return l
e5a97ec6ebb8 journal: properly check for held lock (issue5349)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29870
diff changeset
351
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
352 def jlock(self, vfs):
29502
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
353 """Create a lock for the journal file"""
29928
e5a97ec6ebb8 journal: properly check for held lock (issue5349)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29870
diff changeset
354 if self._currentlock(self._lockref) is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
355 raise error.Abort(_(b'journal lock does not support nesting'))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
356 desc = _(b'journal of %s') % vfs.base
29502
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
357 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
358 l = lock.lock(vfs, b'namejournal.lock', 0, desc=desc)
29502
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
359 except error.LockHeld as inst:
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
360 self.ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
361 _(b"waiting for lock on %s held by %r\n") % (desc, inst.locker)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
362 )
29502
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
363 # default to 600 seconds timeout
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
364 l = lock.lock(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
365 vfs,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
366 b'namejournal.lock',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
367 self.ui.configint(b"ui", b"timeout"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
368 desc=desc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
369 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
370 self.ui.warn(_(b"got lock after %s seconds\n") % l.delay)
29502
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
371 self._lockref = weakref.ref(l)
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
372 return l
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
373
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
374 def record(self, namespace, name, oldhashes, newhashes):
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
375 """Record a new journal entry
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
376
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
377 * namespace: an opaque string; this can be used to filter on the type
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
378 of recorded entries.
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
379 * name: the name defining this entry; for bookmarks, this is the
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
380 bookmark name. Can be filtered on when retrieving entries.
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
381 * oldhashes and newhashes: each a single binary hash, or a list of
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
382 binary hashes. These represent the old and new position of the named
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
383 item.
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
384
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
385 """
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
386 if not isinstance(oldhashes, list):
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
387 oldhashes = [oldhashes]
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
388 if not isinstance(newhashes, list):
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
389 newhashes = [newhashes]
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
390
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
391 entry = journalentry(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
392 dateutil.makedate(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
393 self.user,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
394 self.command,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
395 namespace,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
396 name,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
397 oldhashes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
398 newhashes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
399 )
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
400
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
401 vfs = self.vfs
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
402 if self.sharedvfs is not None:
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
403 # write to the shared repository if this feature is being
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
404 # shared between working copies.
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
405 if sharednamespaces.get(namespace) in self.sharedfeatures:
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
406 vfs = self.sharedvfs
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
407
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
408 self._write(vfs, entry)
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
409
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
410 def _write(self, vfs, entry):
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
411 with self.jlock(vfs):
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
412 # open file in amend mode to ensure it is created if missing
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
413 with vfs(b'namejournal', mode=b'a+b') as f:
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
414 f.seek(0, os.SEEK_SET)
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
415 # Read just enough bytes to get a version number (up to 2
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
416 # digits plus separator)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
417 version = f.read(3).partition(b'\0')[0]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
418 if version and version != b"%d" % storageversion:
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
419 # different version of the storage. Exit early (and not
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
420 # write anything) if this is not a version we can handle or
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
421 # the file is corrupt. In future, perhaps rotate the file
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
422 # instead?
29502
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
423 self.ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
424 _(b"unsupported journal file version '%s'\n") % version
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
425 )
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
426 return
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
427 if not version:
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
428 # empty file, write version first
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
429 f.write((b"%d" % storageversion) + b'\0')
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
430 f.seek(0, os.SEEK_END)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
431 f.write(bytes(entry) + b'\0')
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
432
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
433 def filtered(self, namespace=None, name=None):
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
434 """Yield all journal entries with the given namespace or name
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
435
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
436 Both the namespace and the name are optional; if neither is given all
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
437 entries in the journal are produced.
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
438
29504
7503d8874617 journal: add support for seaching by pattern
Martijn Pieters <mjpieters@fb.com>
parents: 29503
diff changeset
439 Matching supports regular expressions by using the `re:` prefix
7503d8874617 journal: add support for seaching by pattern
Martijn Pieters <mjpieters@fb.com>
parents: 29503
diff changeset
440 (use `literal:` to match names or namespaces that start with `re:`)
7503d8874617 journal: add support for seaching by pattern
Martijn Pieters <mjpieters@fb.com>
parents: 29503
diff changeset
441
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
442 """
29504
7503d8874617 journal: add support for seaching by pattern
Martijn Pieters <mjpieters@fb.com>
parents: 29503
diff changeset
443 if namespace is not None:
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36668
diff changeset
444 namespace = stringutil.stringmatcher(namespace)[-1]
29504
7503d8874617 journal: add support for seaching by pattern
Martijn Pieters <mjpieters@fb.com>
parents: 29503
diff changeset
445 if name is not None:
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36668
diff changeset
446 name = stringutil.stringmatcher(name)[-1]
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
447 for entry in self:
29504
7503d8874617 journal: add support for seaching by pattern
Martijn Pieters <mjpieters@fb.com>
parents: 29503
diff changeset
448 if namespace is not None and not namespace(entry.namespace):
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
449 continue
29504
7503d8874617 journal: add support for seaching by pattern
Martijn Pieters <mjpieters@fb.com>
parents: 29503
diff changeset
450 if name is not None and not name(entry.name):
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
451 continue
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
452 yield entry
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
453
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
454 def __iter__(self):
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
455 """Iterate over the storage
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
456
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
457 Yields journalentry instances for each contained journal record.
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
458
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
459 """
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
460 local = self._open(self.vfs)
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
461
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
462 if self.sharedvfs is None:
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
463 return local
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
464
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
465 # iterate over both local and shared entries, but only those
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
466 # shared entries that are among the currently shared features
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
467 shared = (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
468 e
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
469 for e in self._open(self.sharedvfs)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
470 if sharednamespaces.get(e.namespace) in self.sharedfeatures
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
471 )
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
472 return _mergeentriesiter(local, shared)
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
473
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
474 def _open(self, vfs, filename=b'namejournal', _newestfirst=True):
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
475 if not vfs.exists(filename):
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
476 return
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
477
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
478 with vfs(filename) as f:
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
479 raw = f.read()
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
480
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
481 lines = raw.split(b'\0')
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
482 version = lines and lines[0]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
483 if version != b"%d" % storageversion:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
484 version = version or _(b'not available')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
485 raise error.Abort(_(b"unknown journal file version '%s'") % version)
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
486
29503
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
487 # Skip the first line, it's a version number. Normally we iterate over
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
488 # these in reverse order to list newest first; only when copying across
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
489 # a shared storage do we forgo reversing.
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
490 lines = lines[1:]
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
491 if _newestfirst:
0103b673d6ca journal: add share extension support
Martijn Pieters <mjpieters@fb.com>
parents: 29502
diff changeset
492 lines = reversed(lines)
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
493 for line in lines:
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
494 if not line:
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
495 continue
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
496 yield journalentry.fromstorage(line)
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
497
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
498
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
499 # journal reading
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
500 # log options that don't make sense for journal
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
501 _ignoreopts = (b'no-merges', b'graph')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
502
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
503
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
504 @command(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
505 b'journal',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
506 [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
507 (b'', b'all', None, b'show history for all names'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
508 (b'c', b'commits', None, b'show commit metadata'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
509 ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
510 + [opt for opt in cmdutil.logopts if opt[1] not in _ignoreopts],
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
511 b'[OPTION]... [BOOKMARKNAME]',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
512 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
513 )
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
514 def journal(ui, repo, *args, **opts):
29502
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
515 """show the previous position of bookmarks and the working copy
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
516
29502
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
517 The journal is used to see the previous commits that bookmarks and the
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
518 working copy pointed to. By default the previous locations for the working
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
519 copy. Passing a bookmark name will show all the previous positions of
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
520 that bookmark. Use the --all switch to show previous locations for all
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
521 bookmarks and the working copy; each line will then include the bookmark
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
522 name, or '.' for the working copy, as well.
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
523
29504
7503d8874617 journal: add support for seaching by pattern
Martijn Pieters <mjpieters@fb.com>
parents: 29503
diff changeset
524 If `name` starts with `re:`, the remainder of the name is treated as
7503d8874617 journal: add support for seaching by pattern
Martijn Pieters <mjpieters@fb.com>
parents: 29503
diff changeset
525 a regular expression. To match a name that actually starts with `re:`,
7503d8874617 journal: add support for seaching by pattern
Martijn Pieters <mjpieters@fb.com>
parents: 29503
diff changeset
526 use the prefix `literal:`.
7503d8874617 journal: add support for seaching by pattern
Martijn Pieters <mjpieters@fb.com>
parents: 29503
diff changeset
527
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
528 By default hg journal only shows the commit hash and the command that was
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
529 running at that time. -v/--verbose will show the prior hash, the user, and
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
530 the time at which it happened.
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
531
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
532 Use -c/--commits to output log information on each commit hash; at this
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
533 point you can use the usual `--patch`, `--git`, `--stat` and `--template`
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
534 switches to alter the log output for these.
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
535
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
536 `hg journal -T json` can be used to produce machine readable output.
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
537
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
538 """
35000
135edf120d76 py3: handle keyword arguments in hgext/journal.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33923
diff changeset
539 opts = pycompat.byteskwargs(opts)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
540 name = b'.'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
541 if opts.get(b'all'):
29502
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
542 if args:
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
543 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
544 _(b"You can't combine --all and filtering on a name")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
545 )
29502
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
546 name = None
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
547 if args:
29502
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
548 name = args[0]
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
549
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
550 fm = ui.formatter(b'journal', opts)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
551
39702
a7b91509776d journal: inline formatted nodes and date into expression
Yuya Nishihara <yuya@tcha.org>
parents: 39701
diff changeset
552 def formatnodes(nodes):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
553 return fm.formatlist(map(fm.hexfunc, nodes), name=b'node', sep=b',')
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
554
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
555 if opts.get(b"template") != b"json":
29502
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
556 if name is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
557 displayname = _(b'the working copy and bookmarks')
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
558 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
559 displayname = b"'%s'" % name
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
560 ui.status(_(b"previous locations of %s:\n") % displayname)
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
561
35888
c8e2d6ed1f9e cmdutil: drop aliases for logcmdutil functions (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35462
diff changeset
562 limit = logcmdutil.getlimit(opts)
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
563 entry = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
564 ui.pager(b'journal')
29502
8361131b4768 journal: add dirstate tracking
Martijn Pieters <mjpieters@fb.com>
parents: 29443
diff changeset
565 for count, entry in enumerate(repo.journal.filtered(name=name)):
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
566 if count == limit:
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
567 break
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
568
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
569 fm.startitem()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
570 fm.condwrite(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
571 ui.verbose, b'oldnodes', b'%s -> ', formatnodes(entry.oldhashes)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
572 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
573 fm.write(b'newnodes', b'%s', formatnodes(entry.newhashes))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
574 fm.condwrite(ui.verbose, b'user', b' %-8s', entry.user)
29504
7503d8874617 journal: add support for seaching by pattern
Martijn Pieters <mjpieters@fb.com>
parents: 29503
diff changeset
575 fm.condwrite(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
576 opts.get(b'all') or name.startswith(b're:'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
577 b'name',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
578 b' %-8s',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
579 entry.name,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
580 )
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
581
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
582 fm.condwrite(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
583 ui.verbose,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
584 b'date',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
585 b' %s',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
586 fm.formatdate(entry.timestamp, b'%Y-%m-%d %H:%M %1%2'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
587 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
588 fm.write(b'command', b' %s\n', entry.command)
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
589
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
590 if opts.get(b"commits"):
39704
aa647457df14 journal: use changesetformatter to properly nest list of commits in JSON
Yuya Nishihara <yuya@tcha.org>
parents: 39703
diff changeset
591 if fm.isplain():
aa647457df14 journal: use changesetformatter to properly nest list of commits in JSON
Yuya Nishihara <yuya@tcha.org>
parents: 39703
diff changeset
592 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
aa647457df14 journal: use changesetformatter to properly nest list of commits in JSON
Yuya Nishihara <yuya@tcha.org>
parents: 39703
diff changeset
593 else:
aa647457df14 journal: use changesetformatter to properly nest list of commits in JSON
Yuya Nishihara <yuya@tcha.org>
parents: 39703
diff changeset
594 displayer = logcmdutil.changesetformatter(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
595 ui, repo, fm.nested(b'changesets'), diffopts=opts
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41834
diff changeset
596 )
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
597 for hash in entry.newhashes:
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
598 try:
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
599 ctx = repo[hash]
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
600 displayer.show(ctx)
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
601 except error.RepoLookupError as e:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
602 fm.plain(b"%s\n\n" % pycompat.bytestr(e))
29443
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
603 displayer.close()
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
604
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
605 fm.end()
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
606
cf092a3d202a journal: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
607 if entry is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
608 ui.status(_(b"no recorded locations\n"))