annotate mercurial/localrepo.py @ 16030:308406677e9d stable

phases: allow phase name in phases.new-commit settings Before this commit only phase index where accepted
author Pierre-Yves David <pierre-yves.david@logilab.fr>
date Mon, 30 Jan 2012 17:46:15 +0100
parents 90f8b8dd0326
children b254f827b7a6 3f75fb837638
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1089
142b5d5ec9cc Break apart hg.py
mpm@selenic.com
parents: 1072
diff changeset
1 # localrepo.py - read/write repository class for mercurial
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
2 #
4635
63b9d2deed48 Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4633
diff changeset
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
4 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8210
diff changeset
5 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9954
diff changeset
6 # GNU General Public License version 2 or any later version.
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
7
6211
f89fd07fc51d Expand import * to allow Pyflakes to find problems
Joel Rosdahl <joel@rosdahl.net>
parents: 6210
diff changeset
8 from node import bin, hex, nullid, nullrev, short
3891
6b4127c7d52a Simplify i18n imports
Matt Mackall <mpm@selenic.com>
parents: 3877
diff changeset
9 from i18n import _
11368
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
10 import repo, changegroup, subrepo, discovery, pushkey
15418
cf729af26963 phases: basic I/O logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15403
diff changeset
11 import changelog, dirstate, filelog, manifest, context, bookmarks, phases
8390
beae42f3d93b drop unused imports
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8312
diff changeset
12 import lock, transaction, store, encoding
14902
96a72cbc6c29 localrepo: add set method to iterate over a given revset
Matt Mackall <mpm@selenic.com>
parents: 14870
diff changeset
13 import scmutil, util, extensions, hook, error, revset
10651
5f091fc1bab7 style: use consistent variable names (*mod) with imports which would shadow
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10547
diff changeset
14 import match as matchmod
5f091fc1bab7 style: use consistent variable names (*mod) with imports which would shadow
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10547
diff changeset
15 import merge as mergemod
5f091fc1bab7 style: use consistent variable names (*mod) with imports which would shadow
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10547
diff changeset
16 import tags as tagsmod
8109
496ae1ea4698 switch lock releasing in the core from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8108
diff changeset
17 from lock import release
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11301
diff changeset
18 import weakref, errno, os, time, inspect
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8244
diff changeset
19 propertycache = util.propertycache
14930
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
20 filecache = scmutil.filecache
8109
496ae1ea4698 switch lock releasing in the core from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8108
diff changeset
21
2612
ffb895f16925 add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2601
diff changeset
22 class localrepository(repo.repository):
13723
e615765fdcc7 wireproto: add known([id]) function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13720
diff changeset
23 capabilities = set(('lookup', 'changegroupsubset', 'branchmap', 'pushkey',
13741
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13723
diff changeset
24 'known', 'getbundle'))
14270
d6907a5674a2 revlog: support writing generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14232
diff changeset
25 supportedformats = set(('revlogv1', 'generaldelta'))
12687
34d8247a4595 store: encode first period or space in filenames (issue1713)
Adrian Buehlmann <adrian@cadifra.com>
parents: 12622
diff changeset
26 supported = supportedformats | set(('store', 'fncache', 'shared',
34d8247a4595 store: encode first period or space in filenames (issue1713)
Adrian Buehlmann <adrian@cadifra.com>
parents: 12622
diff changeset
27 'dotencode'))
2439
e8c4f3d3df8c extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2424
diff changeset
28
14363
82f3b0f3f0a5 localrepo, sshrepo: use Boolean create argument in __init__
Martin Geisler <mg@lazybytes.net>
parents: 14333
diff changeset
29 def __init__(self, baseui, path=None, create=False):
2612
ffb895f16925 add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2601
diff changeset
30 repo.repository.__init__(self)
15381
c519cd8f0169 backout dbdb777502dc (issue3077) (issue3071)
Matt Mackall <mpm@selenic.com>
parents: 15355
diff changeset
31 self.root = os.path.realpath(util.expandpath(path))
4170
7b5723c95a82 Save an absolute path in repo.path
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4168
diff changeset
32 self.path = os.path.join(self.root, ".hg")
3850
a4457828ca1a move code around
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3803
diff changeset
33 self.origroot = path
14220
21b8ce4d3331 rename path_auditor to pathauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14195
diff changeset
34 self.auditor = scmutil.pathauditor(self.root, self._checknested)
13970
d13913355390 move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13959
diff changeset
35 self.opener = scmutil.opener(self.path)
d13913355390 move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13959
diff changeset
36 self.wopener = scmutil.opener(self.root)
8797
9ed150d2fbd5 repo: set up ui and extensions earlier
Matt Mackall <mpm@selenic.com>
parents: 8796
diff changeset
37 self.baseui = baseui
9ed150d2fbd5 repo: set up ui and extensions earlier
Matt Mackall <mpm@selenic.com>
parents: 8796
diff changeset
38 self.ui = baseui.copy()
15454
5a7dde5adec8 phases: add a moveboundary function to move phases boundaries
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15420
diff changeset
39 self._dirtyphases = False
15922
23921c17299a phases: mechanism to allow extension to alter initial computation of phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15892
diff changeset
40 # A list of callback to shape the phase if no data were found.
23921c17299a phases: mechanism to allow extension to alter initial computation of phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15892
diff changeset
41 # Callback are in the form: func(repo, roots) --> processed root.
23921c17299a phases: mechanism to allow extension to alter initial computation of phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15892
diff changeset
42 # This list it to be filled by extension during repo setup
23921c17299a phases: mechanism to allow extension to alter initial computation of phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15892
diff changeset
43 self._phasedefaults = []
8797
9ed150d2fbd5 repo: set up ui and extensions earlier
Matt Mackall <mpm@selenic.com>
parents: 8796
diff changeset
44
9ed150d2fbd5 repo: set up ui and extensions earlier
Matt Mackall <mpm@selenic.com>
parents: 8796
diff changeset
45 try:
9ed150d2fbd5 repo: set up ui and extensions earlier
Matt Mackall <mpm@selenic.com>
parents: 8796
diff changeset
46 self.ui.readconfig(self.join("hgrc"), self.root)
9ed150d2fbd5 repo: set up ui and extensions earlier
Matt Mackall <mpm@selenic.com>
parents: 8796
diff changeset
47 extensions.loadall(self.ui)
9ed150d2fbd5 repo: set up ui and extensions earlier
Matt Mackall <mpm@selenic.com>
parents: 8796
diff changeset
48 except IOError:
9ed150d2fbd5 repo: set up ui and extensions earlier
Matt Mackall <mpm@selenic.com>
parents: 8796
diff changeset
49 pass
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
50
3035
4d0e0f149581 localrepo: move the repo creation code, fail if the repo exists
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3019
diff changeset
51 if not os.path.isdir(self.path):
4d0e0f149581 localrepo: move the repo creation code, fail if the repo exists
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3019
diff changeset
52 if create:
4d0e0f149581 localrepo: move the repo creation code, fail if the repo exists
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3019
diff changeset
53 if not os.path.exists(path):
11640
c3e8ab80ee90 init: create target directory recursively
Mads Kiilerich <mads@kiilerich.com>
parents: 11486
diff changeset
54 util.makedirs(path)
13795
43b5fe18ea6c set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13788
diff changeset
55 util.makedir(self.path, notindexed=True)
4166
c0271aba6abe small fixes for the parent patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4163
diff changeset
56 requirements = ["revlogv1"]
8797
9ed150d2fbd5 repo: set up ui and extensions earlier
Matt Mackall <mpm@selenic.com>
parents: 8796
diff changeset
57 if self.ui.configbool('format', 'usestore', True):
4163
fe41d9a186ab Allow disabling store format to work with absurdly long filenames
Matt Mackall <mpm@selenic.com>
parents: 4161
diff changeset
58 os.mkdir(os.path.join(self.path, "store"))
4166
c0271aba6abe small fixes for the parent patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4163
diff changeset
59 requirements.append("store")
8797
9ed150d2fbd5 repo: set up ui and extensions earlier
Matt Mackall <mpm@selenic.com>
parents: 8796
diff changeset
60 if self.ui.configbool('format', 'usefncache', True):
7234
ae70fe6143fc add format.usefncache config option (default is true)
Adrian Buehlmann <adrian@cadifra.com>
parents: 7233
diff changeset
61 requirements.append("fncache")
12687
34d8247a4595 store: encode first period or space in filenames (issue1713)
Adrian Buehlmann <adrian@cadifra.com>
parents: 12622
diff changeset
62 if self.ui.configbool('format', 'dotencode', True):
34d8247a4595 store: encode first period or space in filenames (issue1713)
Adrian Buehlmann <adrian@cadifra.com>
parents: 12622
diff changeset
63 requirements.append('dotencode')
4166
c0271aba6abe small fixes for the parent patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4163
diff changeset
64 # create an invalid changelog
14168
135e244776f0 prevent transient leaks of file handle by using new helper functions
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 14162
diff changeset
65 self.opener.append(
135e244776f0 prevent transient leaks of file handle by using new helper functions
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 14162
diff changeset
66 "00changelog.i",
4166
c0271aba6abe small fixes for the parent patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4163
diff changeset
67 '\0\0\0\2' # represents revlogv2
c0271aba6abe small fixes for the parent patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4163
diff changeset
68 ' dummy changelog to prevent using the old repo layout'
c0271aba6abe small fixes for the parent patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4163
diff changeset
69 )
14270
d6907a5674a2 revlog: support writing generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14232
diff changeset
70 if self.ui.configbool('format', 'generaldelta', False):
d6907a5674a2 revlog: support writing generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14232
diff changeset
71 requirements.append("generaldelta")
14905
207935cda6dc localrepo: make requirements attribute of newly-created repos contain a set
Andrew Pritchard <andrewp@fogcreek.com>
parents: 14904
diff changeset
72 requirements = set(requirements)
3035
4d0e0f149581 localrepo: move the repo creation code, fail if the repo exists
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3019
diff changeset
73 else:
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7633
diff changeset
74 raise error.RepoError(_("repository %s not found") % path)
3035
4d0e0f149581 localrepo: move the repo creation code, fail if the repo exists
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3019
diff changeset
75 elif create:
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7633
diff changeset
76 raise error.RepoError(_("repository %s already exists") % path)
3851
8f18e31c4441 add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3850
diff changeset
77 else:
8f18e31c4441 add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3850
diff changeset
78 try:
14482
58b36e9ea783 introduce new function scmutil.readrequires
Adrian Buehlmann <adrian@cadifra.com>
parents: 14434
diff changeset
79 requirements = scmutil.readrequires(self.opener, self.supported)
3851
8f18e31c4441 add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3850
diff changeset
80 except IOError, inst:
8f18e31c4441 add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3850
diff changeset
81 if inst.errno != errno.ENOENT:
8f18e31c4441 add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3850
diff changeset
82 raise
14482
58b36e9ea783 introduce new function scmutil.readrequires
Adrian Buehlmann <adrian@cadifra.com>
parents: 14434
diff changeset
83 requirements = set()
405
99470ae6b424 Check if repository exists
mpm@selenic.com
parents: 402
diff changeset
84
8799
87d1fd40f57e repo: add internal support for sharing store directories
Matt Mackall <mpm@selenic.com>
parents: 8797
diff changeset
85 self.sharedpath = self.path
87d1fd40f57e repo: add internal support for sharing store directories
Matt Mackall <mpm@selenic.com>
parents: 8797
diff changeset
86 try:
15381
c519cd8f0169 backout dbdb777502dc (issue3077) (issue3071)
Matt Mackall <mpm@selenic.com>
parents: 15355
diff changeset
87 s = os.path.realpath(self.opener.read("sharedpath").rstrip('\n'))
8799
87d1fd40f57e repo: add internal support for sharing store directories
Matt Mackall <mpm@selenic.com>
parents: 8797
diff changeset
88 if not os.path.exists(s):
87d1fd40f57e repo: add internal support for sharing store directories
Matt Mackall <mpm@selenic.com>
parents: 8797
diff changeset
89 raise error.RepoError(
8908
105343f9f744 Fix warning: Seen unexpected token "%"
Dongsheng Song <dongsheng.song@gmail.com>
parents: 8813
diff changeset
90 _('.hg/sharedpath points to nonexistent directory %s') % s)
8799
87d1fd40f57e repo: add internal support for sharing store directories
Matt Mackall <mpm@selenic.com>
parents: 8797
diff changeset
91 self.sharedpath = s
87d1fd40f57e repo: add internal support for sharing store directories
Matt Mackall <mpm@selenic.com>
parents: 8797
diff changeset
92 except IOError, inst:
87d1fd40f57e repo: add internal support for sharing store directories
Matt Mackall <mpm@selenic.com>
parents: 8797
diff changeset
93 if inst.errno != errno.ENOENT:
87d1fd40f57e repo: add internal support for sharing store directories
Matt Mackall <mpm@selenic.com>
parents: 8797
diff changeset
94 raise
87d1fd40f57e repo: add internal support for sharing store directories
Matt Mackall <mpm@selenic.com>
parents: 8797
diff changeset
95
13970
d13913355390 move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13959
diff changeset
96 self.store = store.store(requirements, self.sharedpath, scmutil.opener)
6840
80e51429cb9a introduce store classes
Adrian Buehlmann <adrian@cadifra.com>
parents: 6839
diff changeset
97 self.spath = self.store.path
80e51429cb9a introduce store classes
Adrian Buehlmann <adrian@cadifra.com>
parents: 6839
diff changeset
98 self.sopener = self.store.opener
80e51429cb9a introduce store classes
Adrian Buehlmann <adrian@cadifra.com>
parents: 6839
diff changeset
99 self.sjoin = self.store.join
80e51429cb9a introduce store classes
Adrian Buehlmann <adrian@cadifra.com>
parents: 6839
diff changeset
100 self.opener.createmode = self.store.createmode
12295
3388ab21d768 localrepo: factor out requirement application and write
Sune Foldager <cryo@cyanite.org>
parents: 12176
diff changeset
101 self._applyrequirements(requirements)
3388ab21d768 localrepo: factor out requirement application and write
Sune Foldager <cryo@cyanite.org>
parents: 12176
diff changeset
102 if create:
3388ab21d768 localrepo: factor out requirement application and write
Sune Foldager <cryo@cyanite.org>
parents: 12176
diff changeset
103 self._writerequirements()
3850
a4457828ca1a move code around
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3803
diff changeset
104
9146
5614a628d173 localrepo: rename in-memory tag cache instance attributes (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9145
diff changeset
105
13047
6c375e07d673 branch: operate on branch names in local string space where possible
Matt Mackall <mpm@selenic.com>
parents: 13037
diff changeset
106 self._branchcache = None
6121
7336aeff1a1d automatically update the branch cache when tip changes
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6120
diff changeset
107 self._branchcachetip = None
4004
c83c35f2f4e2 unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents: 4003
diff changeset
108 self.filterpats = {}
5966
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
109 self._datafilters = {}
4916
5c5d23d93447 Use a weakref for recursive transactions
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
110 self._transref = self._lockref = self._wlockref = None
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
111
14929
4bf9493e7b07 localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents: 14905
diff changeset
112 # A cache for various files under .hg/ that tracks file changes,
4bf9493e7b07 localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents: 14905
diff changeset
113 # (used by the filecache decorator)
4bf9493e7b07 localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents: 14905
diff changeset
114 #
4bf9493e7b07 localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents: 14905
diff changeset
115 # Maps a property name to its util.filecacheentry
4bf9493e7b07 localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents: 14905
diff changeset
116 self._filecache = {}
4bf9493e7b07 localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents: 14905
diff changeset
117
12295
3388ab21d768 localrepo: factor out requirement application and write
Sune Foldager <cryo@cyanite.org>
parents: 12176
diff changeset
118 def _applyrequirements(self, requirements):
3388ab21d768 localrepo: factor out requirement application and write
Sune Foldager <cryo@cyanite.org>
parents: 12176
diff changeset
119 self.requirements = requirements
14333
31a5973fcf96 revlog: get rid of defversion
Sune Foldager <cryo@cyanite.org>
parents: 14274
diff changeset
120 openerreqs = set(('revlogv1', 'generaldelta'))
31a5973fcf96 revlog: get rid of defversion
Sune Foldager <cryo@cyanite.org>
parents: 14274
diff changeset
121 self.sopener.options = dict((r, 1) for r in requirements
31a5973fcf96 revlog: get rid of defversion
Sune Foldager <cryo@cyanite.org>
parents: 14274
diff changeset
122 if r in openerreqs)
12295
3388ab21d768 localrepo: factor out requirement application and write
Sune Foldager <cryo@cyanite.org>
parents: 12176
diff changeset
123
3388ab21d768 localrepo: factor out requirement application and write
Sune Foldager <cryo@cyanite.org>
parents: 12176
diff changeset
124 def _writerequirements(self):
3388ab21d768 localrepo: factor out requirement application and write
Sune Foldager <cryo@cyanite.org>
parents: 12176
diff changeset
125 reqfile = self.opener("requires", "w")
3388ab21d768 localrepo: factor out requirement application and write
Sune Foldager <cryo@cyanite.org>
parents: 12176
diff changeset
126 for r in self.requirements:
3388ab21d768 localrepo: factor out requirement application and write
Sune Foldager <cryo@cyanite.org>
parents: 12176
diff changeset
127 reqfile.write("%s\n" % r)
3388ab21d768 localrepo: factor out requirement application and write
Sune Foldager <cryo@cyanite.org>
parents: 12176
diff changeset
128 reqfile.close()
3388ab21d768 localrepo: factor out requirement application and write
Sune Foldager <cryo@cyanite.org>
parents: 12176
diff changeset
129
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
130 def _checknested(self, path):
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
131 """Determine if path is a legal nested repository."""
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
132 if not path.startswith(self.root):
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
133 return False
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
134 subpath = path[len(self.root) + 1:]
15722
417127af3996 windows: use normalized path to check repository nesting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15604
diff changeset
135 normsubpath = util.pconvert(subpath)
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
136
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
137 # XXX: Checking against the current working copy is wrong in
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
138 # the sense that it can reject things like
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
139 #
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
140 # $ hg cat -r 10 sub/x.txt
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
141 #
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
142 # if sub/ is no longer a subrepository in the working copy
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
143 # parent revision.
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
144 #
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
145 # However, it can of course also allow things that would have
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
146 # been rejected before, such as the above cat command if sub/
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
147 # is a subrepository now, but was a normal directory before.
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
148 # The old path auditor would have rejected by mistake since it
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
149 # panics when it sees sub/.hg/.
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
150 #
12174
7bccd04292a2 localrepo: check nested repos against working directory
Martin Geisler <mg@lazybytes.net>
parents: 12166
diff changeset
151 # All in all, checking against the working copy seems sensible
7bccd04292a2 localrepo: check nested repos against working directory
Martin Geisler <mg@lazybytes.net>
parents: 12166
diff changeset
152 # since we want to prevent access to nested repositories on
7bccd04292a2 localrepo: check nested repos against working directory
Martin Geisler <mg@lazybytes.net>
parents: 12166
diff changeset
153 # the filesystem *now*.
7bccd04292a2 localrepo: check nested repos against working directory
Martin Geisler <mg@lazybytes.net>
parents: 12166
diff changeset
154 ctx = self[None]
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
155 parts = util.splitpath(subpath)
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
156 while parts:
15722
417127af3996 windows: use normalized path to check repository nesting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15604
diff changeset
157 prefix = '/'.join(parts)
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
158 if prefix in ctx.substate:
15722
417127af3996 windows: use normalized path to check repository nesting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15604
diff changeset
159 if prefix == normsubpath:
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
160 return True
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
161 else:
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
162 sub = ctx.sub(prefix)
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
163 return sub.checknested(subpath[len(prefix) + 1:])
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
164 else:
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
165 parts.pop()
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
166 return False
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
167
14933
f61a85b2affa localrepo: decorate _bookmarks/current with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14932
diff changeset
168 @filecache('bookmarks')
13355
cce2e7b77e36 bookmarks: move property methods into localrepo
Matt Mackall <mpm@selenic.com>
parents: 13341
diff changeset
169 def _bookmarks(self):
cce2e7b77e36 bookmarks: move property methods into localrepo
Matt Mackall <mpm@selenic.com>
parents: 13341
diff changeset
170 return bookmarks.read(self)
cce2e7b77e36 bookmarks: move property methods into localrepo
Matt Mackall <mpm@selenic.com>
parents: 13341
diff changeset
171
14933
f61a85b2affa localrepo: decorate _bookmarks/current with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14932
diff changeset
172 @filecache('bookmarks.current')
13355
cce2e7b77e36 bookmarks: move property methods into localrepo
Matt Mackall <mpm@selenic.com>
parents: 13341
diff changeset
173 def _bookmarkcurrent(self):
cce2e7b77e36 bookmarks: move property methods into localrepo
Matt Mackall <mpm@selenic.com>
parents: 13341
diff changeset
174 return bookmarks.readcurrent(self)
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
175
15237
7196ed7a1505 bookmarks: delegate writing to the repo just like reading
Augie Fackler <durin42@gmail.com>
parents: 15187
diff changeset
176 def _writebookmarks(self, marks):
7196ed7a1505 bookmarks: delegate writing to the repo just like reading
Augie Fackler <durin42@gmail.com>
parents: 15187
diff changeset
177 bookmarks.write(self)
7196ed7a1505 bookmarks: delegate writing to the repo just like reading
Augie Fackler <durin42@gmail.com>
parents: 15187
diff changeset
178
15987
b5f6a63b4ded localrepo: fix phaseroots filecache definition
Idan Kamara <idankk86@gmail.com>
parents: 15986
diff changeset
179 @filecache('phaseroots', True)
15418
cf729af26963 phases: basic I/O logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15403
diff changeset
180 def _phaseroots(self):
15454
5a7dde5adec8 phases: add a moveboundary function to move phases boundaries
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15420
diff changeset
181 self._dirtyphases = False
15456
abcaaf51d568 phases: handle unknown nodes in boundary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15455
diff changeset
182 phaseroots = phases.readroots(self)
abcaaf51d568 phases: handle unknown nodes in boundary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15455
diff changeset
183 phases.filterunknown(self, phaseroots)
abcaaf51d568 phases: handle unknown nodes in boundary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15455
diff changeset
184 return phaseroots
15418
cf729af26963 phases: basic I/O logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15403
diff changeset
185
15420
e80d0d3198f0 phases: add a cache allowing to know in which phase a changeset is
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15418
diff changeset
186 @propertycache
e80d0d3198f0 phases: add a cache allowing to know in which phase a changeset is
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15418
diff changeset
187 def _phaserev(self):
15818
57241845a4bb phases: store phase values in constant instead of using raw integer
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15735
diff changeset
188 cache = [phases.public] * len(self)
15420
e80d0d3198f0 phases: add a cache allowing to know in which phase a changeset is
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15418
diff changeset
189 for phase in phases.trackedphases:
e80d0d3198f0 phases: add a cache allowing to know in which phase a changeset is
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15418
diff changeset
190 roots = map(self.changelog.rev, self._phaseroots[phase])
e80d0d3198f0 phases: add a cache allowing to know in which phase a changeset is
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15418
diff changeset
191 if roots:
e80d0d3198f0 phases: add a cache allowing to know in which phase a changeset is
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15418
diff changeset
192 for rev in roots:
e80d0d3198f0 phases: add a cache allowing to know in which phase a changeset is
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15418
diff changeset
193 cache[rev] = phase
e80d0d3198f0 phases: add a cache allowing to know in which phase a changeset is
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15418
diff changeset
194 for rev in self.changelog.descendants(*roots):
e80d0d3198f0 phases: add a cache allowing to know in which phase a changeset is
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15418
diff changeset
195 cache[rev] = phase
e80d0d3198f0 phases: add a cache allowing to know in which phase a changeset is
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15418
diff changeset
196 return cache
e80d0d3198f0 phases: add a cache allowing to know in which phase a changeset is
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15418
diff changeset
197
14932
d3ac759a6d66 localrepo: decorate changelog() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14931
diff changeset
198 @filecache('00changelog.i', True)
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8244
diff changeset
199 def changelog(self):
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8244
diff changeset
200 c = changelog.changelog(self.sopener)
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8244
diff changeset
201 if 'HG_PENDING' in os.environ:
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8244
diff changeset
202 p = os.environ['HG_PENDING']
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8244
diff changeset
203 if p.startswith(self.root):
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8244
diff changeset
204 c.readpending('00changelog.i.a')
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8244
diff changeset
205 return c
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8244
diff changeset
206
14934
019fe0b0a7af localrepo: decorate manifest() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14933
diff changeset
207 @filecache('00manifest.i', True)
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8244
diff changeset
208 def manifest(self):
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8244
diff changeset
209 return manifest.manifest(self.sopener)
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8244
diff changeset
210
14930
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
211 @filecache('dirstate')
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8244
diff changeset
212 def dirstate(self):
13032
e41e2b79883d dirstate: warn on invalid parents rather than aborting
Matt Mackall <mpm@selenic.com>
parents: 13001
diff changeset
213 warned = [0]
e41e2b79883d dirstate: warn on invalid parents rather than aborting
Matt Mackall <mpm@selenic.com>
parents: 13001
diff changeset
214 def validate(node):
e41e2b79883d dirstate: warn on invalid parents rather than aborting
Matt Mackall <mpm@selenic.com>
parents: 13001
diff changeset
215 try:
14064
e4bfb9c337f3 remove unused imports and variables
Alexander Solovyov <alexander@solovyov.net>
parents: 14056
diff changeset
216 self.changelog.rev(node)
13032
e41e2b79883d dirstate: warn on invalid parents rather than aborting
Matt Mackall <mpm@selenic.com>
parents: 13001
diff changeset
217 return node
e41e2b79883d dirstate: warn on invalid parents rather than aborting
Matt Mackall <mpm@selenic.com>
parents: 13001
diff changeset
218 except error.LookupError:
e41e2b79883d dirstate: warn on invalid parents rather than aborting
Matt Mackall <mpm@selenic.com>
parents: 13001
diff changeset
219 if not warned[0]:
e41e2b79883d dirstate: warn on invalid parents rather than aborting
Matt Mackall <mpm@selenic.com>
parents: 13001
diff changeset
220 warned[0] = True
e41e2b79883d dirstate: warn on invalid parents rather than aborting
Matt Mackall <mpm@selenic.com>
parents: 13001
diff changeset
221 self.ui.warn(_("warning: ignoring unknown"
13037
9beac11b8c56 localrepo: move string formatting out of gettext call
Martin Geisler <mg@aragost.com>
parents: 13032
diff changeset
222 " working parent %s!\n") % short(node))
13032
e41e2b79883d dirstate: warn on invalid parents rather than aborting
Matt Mackall <mpm@selenic.com>
parents: 13001
diff changeset
223 return nullid
e41e2b79883d dirstate: warn on invalid parents rather than aborting
Matt Mackall <mpm@selenic.com>
parents: 13001
diff changeset
224
e41e2b79883d dirstate: warn on invalid parents rather than aborting
Matt Mackall <mpm@selenic.com>
parents: 13001
diff changeset
225 return dirstate.dirstate(self.opener, self.ui, self.root, validate)
2155
ff255b41b4aa support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2150
diff changeset
226
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
227 def __getitem__(self, changeid):
8527
f9a80054dd3c use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents: 8515
diff changeset
228 if changeid is None:
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
229 return context.workingctx(self)
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
230 return context.changectx(self, changeid)
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
231
9924
ea3acaae25bb localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9820
diff changeset
232 def __contains__(self, changeid):
ea3acaae25bb localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9820
diff changeset
233 try:
ea3acaae25bb localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9820
diff changeset
234 return bool(self.lookup(changeid))
ea3acaae25bb localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9820
diff changeset
235 except error.RepoLookupError:
ea3acaae25bb localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9820
diff changeset
236 return False
ea3acaae25bb localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9820
diff changeset
237
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
238 def __nonzero__(self):
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
239 return True
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
240
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
241 def __len__(self):
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
242 return len(self.changelog)
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
243
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
244 def __iter__(self):
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
245 for i in xrange(len(self)):
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
246 yield i
2155
ff255b41b4aa support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2150
diff changeset
247
15403
e27561eb4a76 localrepo: add revs helper method
Matt Mackall <mpm@selenic.com>
parents: 15381
diff changeset
248 def revs(self, expr, *args):
e27561eb4a76 localrepo: add revs helper method
Matt Mackall <mpm@selenic.com>
parents: 15381
diff changeset
249 '''Return a list of revisions matching the given revset'''
e27561eb4a76 localrepo: add revs helper method
Matt Mackall <mpm@selenic.com>
parents: 15381
diff changeset
250 expr = revset.formatspec(expr, *args)
e27561eb4a76 localrepo: add revs helper method
Matt Mackall <mpm@selenic.com>
parents: 15381
diff changeset
251 m = revset.match(None, expr)
e27561eb4a76 localrepo: add revs helper method
Matt Mackall <mpm@selenic.com>
parents: 15381
diff changeset
252 return [r for r in m(self, range(len(self)))]
e27561eb4a76 localrepo: add revs helper method
Matt Mackall <mpm@selenic.com>
parents: 15381
diff changeset
253
14902
96a72cbc6c29 localrepo: add set method to iterate over a given revset
Matt Mackall <mpm@selenic.com>
parents: 14870
diff changeset
254 def set(self, expr, *args):
96a72cbc6c29 localrepo: add set method to iterate over a given revset
Matt Mackall <mpm@selenic.com>
parents: 14870
diff changeset
255 '''
96a72cbc6c29 localrepo: add set method to iterate over a given revset
Matt Mackall <mpm@selenic.com>
parents: 14870
diff changeset
256 Yield a context for each matching revision, after doing arg
14904
ff2d907a5af8 localrepo: fix comment on set
Matt Mackall <mpm@selenic.com>
parents: 14902
diff changeset
257 replacement via revset.formatspec
14902
96a72cbc6c29 localrepo: add set method to iterate over a given revset
Matt Mackall <mpm@selenic.com>
parents: 14870
diff changeset
258 '''
15403
e27561eb4a76 localrepo: add revs helper method
Matt Mackall <mpm@selenic.com>
parents: 15381
diff changeset
259 for r in self.revs(expr, *args):
14902
96a72cbc6c29 localrepo: add set method to iterate over a given revset
Matt Mackall <mpm@selenic.com>
parents: 14870
diff changeset
260 yield self[r]
96a72cbc6c29 localrepo: add set method to iterate over a given revset
Matt Mackall <mpm@selenic.com>
parents: 14870
diff changeset
261
2673
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2661
diff changeset
262 def url(self):
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2661
diff changeset
263 return 'file:' + self.root
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2661
diff changeset
264
1718
c1996b84d4f5 make hook code nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1717
diff changeset
265 def hook(self, name, throw=False, **args):
4622
fff50306e6dd hooks: separate hook code into a separate module
Matt Mackall <mpm@selenic.com>
parents: 4619
diff changeset
266 return hook.hook(self.ui, self, name, throw, **args)
487
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
267
2601
00fc88b0b256 move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2581
diff changeset
268 tag_disallowed = ':\r\n'
00fc88b0b256 move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2581
diff changeset
269
8402
0ad521500424 tag: drop unused use_dirstate and parent from _tag()
Matt Mackall <mpm@selenic.com>
parents: 8401
diff changeset
270 def _tag(self, names, node, message, local, user, date, extra={}):
6321
55ba3bc5b8fd tag: allow multiple tags to be added or removed
John Coomes <john.coomes@sun.com>
parents: 6312
diff changeset
271 if isinstance(names, str):
55ba3bc5b8fd tag: allow multiple tags to be added or removed
John Coomes <john.coomes@sun.com>
parents: 6312
diff changeset
272 allchars = names
55ba3bc5b8fd tag: allow multiple tags to be added or removed
John Coomes <john.coomes@sun.com>
parents: 6312
diff changeset
273 names = (names,)
55ba3bc5b8fd tag: allow multiple tags to be added or removed
John Coomes <john.coomes@sun.com>
parents: 6312
diff changeset
274 else:
55ba3bc5b8fd tag: allow multiple tags to be added or removed
John Coomes <john.coomes@sun.com>
parents: 6312
diff changeset
275 allchars = ''.join(names)
4118
35b39097c3e6 Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents: 4070
diff changeset
276 for c in self.tag_disallowed:
6321
55ba3bc5b8fd tag: allow multiple tags to be added or removed
John Coomes <john.coomes@sun.com>
parents: 6312
diff changeset
277 if c in allchars:
4118
35b39097c3e6 Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents: 4070
diff changeset
278 raise util.Abort(_('%r cannot be used in a tag name') % c)
35b39097c3e6 Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents: 4070
diff changeset
279
11063
eb23c876c111 tag: warn users about tag/branch possible name conflicts
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11047
diff changeset
280 branches = self.branchmap()
6321
55ba3bc5b8fd tag: allow multiple tags to be added or removed
John Coomes <john.coomes@sun.com>
parents: 6312
diff changeset
281 for name in names:
55ba3bc5b8fd tag: allow multiple tags to be added or removed
John Coomes <john.coomes@sun.com>
parents: 6312
diff changeset
282 self.hook('pretag', throw=True, node=hex(node), tag=name,
55ba3bc5b8fd tag: allow multiple tags to be added or removed
John Coomes <john.coomes@sun.com>
parents: 6312
diff changeset
283 local=local)
11063
eb23c876c111 tag: warn users about tag/branch possible name conflicts
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11047
diff changeset
284 if name in branches:
eb23c876c111 tag: warn users about tag/branch possible name conflicts
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11047
diff changeset
285 self.ui.warn(_("warning: tag %s conflicts with existing"
eb23c876c111 tag: warn users about tag/branch possible name conflicts
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11047
diff changeset
286 " branch name\n") % name)
4118
35b39097c3e6 Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents: 4070
diff changeset
287
6321
55ba3bc5b8fd tag: allow multiple tags to be added or removed
John Coomes <john.coomes@sun.com>
parents: 6312
diff changeset
288 def writetags(fp, names, munge, prevtags):
5985
850494d62674 localrepo._tag: add a seek before writing the new tag
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5882
diff changeset
289 fp.seek(0, 2)
4932
f0c25ed40ec6 tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents: 4929
diff changeset
290 if prevtags and prevtags[-1] != '\n':
f0c25ed40ec6 tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents: 4929
diff changeset
291 fp.write('\n')
6321
55ba3bc5b8fd tag: allow multiple tags to be added or removed
John Coomes <john.coomes@sun.com>
parents: 6312
diff changeset
292 for name in names:
6671
938eddd76237 tag: record tag we're superseding, if any (issue 1102)
Matt Mackall <mpm@selenic.com>
parents: 6647
diff changeset
293 m = munge and munge(name) or name
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
294 if self._tagscache.tagtypes and name in self._tagscache.tagtypes:
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
295 old = self.tags().get(name, nullid)
6671
938eddd76237 tag: record tag we're superseding, if any (issue 1102)
Matt Mackall <mpm@selenic.com>
parents: 6647
diff changeset
296 fp.write('%s %s\n' % (hex(old), m))
938eddd76237 tag: record tag we're superseding, if any (issue 1102)
Matt Mackall <mpm@selenic.com>
parents: 6647
diff changeset
297 fp.write('%s %s\n' % (hex(node), m))
4932
f0c25ed40ec6 tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents: 4929
diff changeset
298 fp.close()
5081
ea7b982b6c08 Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4932
diff changeset
299
4932
f0c25ed40ec6 tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents: 4929
diff changeset
300 prevtags = ''
4118
35b39097c3e6 Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents: 4070
diff changeset
301 if local:
4932
f0c25ed40ec6 tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents: 4929
diff changeset
302 try:
f0c25ed40ec6 tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents: 4929
diff changeset
303 fp = self.opener('localtags', 'r+')
7875
553aa0cbeab6 cleanup: drop unused assignments
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7848
diff changeset
304 except IOError:
4932
f0c25ed40ec6 tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents: 4929
diff changeset
305 fp = self.opener('localtags', 'a')
f0c25ed40ec6 tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents: 4929
diff changeset
306 else:
f0c25ed40ec6 tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents: 4929
diff changeset
307 prevtags = fp.read()
f0c25ed40ec6 tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents: 4929
diff changeset
308
4118
35b39097c3e6 Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents: 4070
diff changeset
309 # local tags are stored in the current charset
6321
55ba3bc5b8fd tag: allow multiple tags to be added or removed
John Coomes <john.coomes@sun.com>
parents: 6312
diff changeset
310 writetags(fp, names, None, prevtags)
55ba3bc5b8fd tag: allow multiple tags to be added or removed
John Coomes <john.coomes@sun.com>
parents: 6312
diff changeset
311 for name in names:
55ba3bc5b8fd tag: allow multiple tags to be added or removed
John Coomes <john.coomes@sun.com>
parents: 6312
diff changeset
312 self.hook('tag', node=hex(node), tag=name, local=local)
4118
35b39097c3e6 Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents: 4070
diff changeset
313 return
35b39097c3e6 Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents: 4070
diff changeset
314
8402
0ad521500424 tag: drop unused use_dirstate and parent from _tag()
Matt Mackall <mpm@selenic.com>
parents: 8401
diff changeset
315 try:
0ad521500424 tag: drop unused use_dirstate and parent from _tag()
Matt Mackall <mpm@selenic.com>
parents: 8401
diff changeset
316 fp = self.wfile('.hgtags', 'rb+')
14646
001788ef4bbb localrepo: don't attempt to open .hgtags twice if the error isn't ENOENT
Idan Kamara <idankk86@gmail.com>
parents: 14603
diff changeset
317 except IOError, e:
001788ef4bbb localrepo: don't attempt to open .hgtags twice if the error isn't ENOENT
Idan Kamara <idankk86@gmail.com>
parents: 14603
diff changeset
318 if e.errno != errno.ENOENT:
001788ef4bbb localrepo: don't attempt to open .hgtags twice if the error isn't ENOENT
Idan Kamara <idankk86@gmail.com>
parents: 14603
diff changeset
319 raise
8402
0ad521500424 tag: drop unused use_dirstate and parent from _tag()
Matt Mackall <mpm@selenic.com>
parents: 8401
diff changeset
320 fp = self.wfile('.hgtags', 'ab')
4932
f0c25ed40ec6 tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents: 4929
diff changeset
321 else:
8402
0ad521500424 tag: drop unused use_dirstate and parent from _tag()
Matt Mackall <mpm@selenic.com>
parents: 8401
diff changeset
322 prevtags = fp.read()
4932
f0c25ed40ec6 tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents: 4929
diff changeset
323
4118
35b39097c3e6 Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents: 4070
diff changeset
324 # committed tags are stored in UTF-8
7948
de377b1a9a84 move encoding bits from util to encoding
Matt Mackall <mpm@selenic.com>
parents: 7930
diff changeset
325 writetags(fp, names, encoding.fromlocal, prevtags)
4932
f0c25ed40ec6 tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents: 4929
diff changeset
326
13400
14f3795a5ed7 explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13391
diff changeset
327 fp.close()
14f3795a5ed7 explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13391
diff changeset
328
15929
4091660dc130 tag: invalidate tag cache immediately after adding new tag (issue3210)
Mads Kiilerich <mads@kiilerich.com>
parents: 15922
diff changeset
329 self.invalidatecaches()
4091660dc130 tag: invalidate tag cache immediately after adding new tag (issue3210)
Mads Kiilerich <mads@kiilerich.com>
parents: 15922
diff changeset
330
8402
0ad521500424 tag: drop unused use_dirstate and parent from _tag()
Matt Mackall <mpm@selenic.com>
parents: 8401
diff changeset
331 if '.hgtags' not in self.dirstate:
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11301
diff changeset
332 self[None].add(['.hgtags'])
4118
35b39097c3e6 Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents: 4070
diff changeset
333
10651
5f091fc1bab7 style: use consistent variable names (*mod) with imports which would shadow
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10547
diff changeset
334 m = matchmod.exact(self.root, '', ['.hgtags'])
8706
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8705
diff changeset
335 tagnode = self.commit(message, user, date, extra=extra, match=m)
4118
35b39097c3e6 Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents: 4070
diff changeset
336
6321
55ba3bc5b8fd tag: allow multiple tags to be added or removed
John Coomes <john.coomes@sun.com>
parents: 6312
diff changeset
337 for name in names:
55ba3bc5b8fd tag: allow multiple tags to be added or removed
John Coomes <john.coomes@sun.com>
parents: 6312
diff changeset
338 self.hook('tag', node=hex(node), tag=name, local=local)
4118
35b39097c3e6 Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents: 4070
diff changeset
339
35b39097c3e6 Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents: 4070
diff changeset
340 return tagnode
35b39097c3e6 Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents: 4070
diff changeset
341
6321
55ba3bc5b8fd tag: allow multiple tags to be added or removed
John Coomes <john.coomes@sun.com>
parents: 6312
diff changeset
342 def tag(self, names, node, message, local, user, date):
55ba3bc5b8fd tag: allow multiple tags to be added or removed
John Coomes <john.coomes@sun.com>
parents: 6312
diff changeset
343 '''tag a revision with one or more symbolic names.
2601
00fc88b0b256 move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2581
diff changeset
344
6321
55ba3bc5b8fd tag: allow multiple tags to be added or removed
John Coomes <john.coomes@sun.com>
parents: 6312
diff changeset
345 names is a list of strings or, when adding a single tag, names may be a
55ba3bc5b8fd tag: allow multiple tags to be added or removed
John Coomes <john.coomes@sun.com>
parents: 6312
diff changeset
346 string.
6334
7016f7fb8fe3 tab/space cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6321
diff changeset
347
6321
55ba3bc5b8fd tag: allow multiple tags to be added or removed
John Coomes <john.coomes@sun.com>
parents: 6312
diff changeset
348 if local is True, the tags are stored in a per-repository file.
55ba3bc5b8fd tag: allow multiple tags to be added or removed
John Coomes <john.coomes@sun.com>
parents: 6312
diff changeset
349 otherwise, they are stored in the .hgtags file, and a new
2601
00fc88b0b256 move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2581
diff changeset
350 changeset is committed with the change.
00fc88b0b256 move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2581
diff changeset
351
00fc88b0b256 move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2581
diff changeset
352 keyword arguments:
00fc88b0b256 move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2581
diff changeset
353
6321
55ba3bc5b8fd tag: allow multiple tags to be added or removed
John Coomes <john.coomes@sun.com>
parents: 6312
diff changeset
354 local: whether to store tags in non-version-controlled file
2601
00fc88b0b256 move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2581
diff changeset
355 (default False)
00fc88b0b256 move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2581
diff changeset
356
00fc88b0b256 move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2581
diff changeset
357 message: commit message to use if committing
00fc88b0b256 move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2581
diff changeset
358
00fc88b0b256 move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2581
diff changeset
359 user: name of user to use if committing
00fc88b0b256 move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2581
diff changeset
360
00fc88b0b256 move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2581
diff changeset
361 date: date tuple to use if committing'''
00fc88b0b256 move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2581
diff changeset
362
13133
c1492615cdee tag: don't check .hgtags status if --local passed
Kevin Bullock <kbullock@ringworld.org>
parents: 13000
diff changeset
363 if not local:
c1492615cdee tag: don't check .hgtags status if --local passed
Kevin Bullock <kbullock@ringworld.org>
parents: 13000
diff changeset
364 for x in self.status()[:5]:
c1492615cdee tag: don't check .hgtags status if --local passed
Kevin Bullock <kbullock@ringworld.org>
parents: 13000
diff changeset
365 if '.hgtags' in x:
c1492615cdee tag: don't check .hgtags status if --local passed
Kevin Bullock <kbullock@ringworld.org>
parents: 13000
diff changeset
366 raise util.Abort(_('working copy of .hgtags is changed '
c1492615cdee tag: don't check .hgtags status if --local passed
Kevin Bullock <kbullock@ringworld.org>
parents: 13000
diff changeset
367 '(please commit .hgtags manually)'))
2601
00fc88b0b256 move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2581
diff changeset
368
7814
4421abf8c85d tag: force load of tag cache
Matt Mackall <mpm@selenic.com>
parents: 7803
diff changeset
369 self.tags() # instantiate the cache
6321
55ba3bc5b8fd tag: allow multiple tags to be added or removed
John Coomes <john.coomes@sun.com>
parents: 6312
diff changeset
370 self._tag(names, node, message, local, user, date)
2601
00fc88b0b256 move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2581
diff changeset
371
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
372 @propertycache
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
373 def _tagscache(self):
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
374 '''Returns a tagscache object that contains various tags related caches.'''
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
375
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
376 # This simplifies its cache management by having one decorated
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
377 # function (this one) and the rest simply fetch things from it.
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
378 class tagscache(object):
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
379 def __init__(self):
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
380 # These two define the set of tags for this repository. tags
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
381 # maps tag name to node; tagtypes maps tag name to 'global' or
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
382 # 'local'. (Global tags are defined by .hgtags across all
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
383 # heads, and local tags are defined in .hg/localtags.)
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
384 # They constitute the in-memory cache of tags.
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
385 self.tags = self.tagtypes = None
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
386
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
387 self.nodetagscache = self.tagslist = None
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
388
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
389 cache = tagscache()
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
390 cache.tags, cache.tagtypes = self._findtags()
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
391
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
392 return cache
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
393
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
394 def tags(self):
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
395 '''return a mapping of tag to node'''
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
396 return self._tagscache.tags
4210
caff92047e87 Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents: 4178
diff changeset
397
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
398 def _findtags(self):
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
399 '''Do the hard work of finding tags. Return a pair of dicts
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
400 (tags, tagtypes) where tags maps tag name to node, and tagtypes
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
401 maps tag name to a string like \'global\' or \'local\'.
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
402 Subclasses or extensions are free to add their own tags, but
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
403 should be aware that the returned dicts will be retained for the
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
404 duration of the localrepo object.'''
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
405
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
406 # XXX what tagtype should subclasses/extensions use? Currently
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
407 # mq and bookmarks add tags, but do not set the tagtype at all.
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
408 # Should each extension invent its own tag type? Should there
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
409 # be one tagtype for all such "virtual" tags? Or is the status
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
410 # quo fine?
4210
caff92047e87 Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents: 4178
diff changeset
411
9148
b7837f0ed9fe localrepo: factor updatetags() out of readtags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9147
diff changeset
412 alltags = {} # map tag name to (node, hist)
5657
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
413 tagtypes = {}
659
3662e3d6b690 Whitespace cleanup
Matt Mackall <mpm@selenic.com>
parents: 658
diff changeset
414
10651
5f091fc1bab7 style: use consistent variable names (*mod) with imports which would shadow
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10547
diff changeset
415 tagsmod.findglobaltags(self.ui, self, alltags, tagtypes)
5f091fc1bab7 style: use consistent variable names (*mod) with imports which would shadow
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10547
diff changeset
416 tagsmod.readlocaltags(self.ui, self, alltags, tagtypes)
5657
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
417
9152
4017291c4c48 tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents: 9151
diff changeset
418 # Build the return dicts. Have to re-encode tag names because
4017291c4c48 tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents: 9151
diff changeset
419 # the tags module always uses UTF-8 (in order not to lose info
4017291c4c48 tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents: 9151
diff changeset
420 # writing to the cache), but the rest of Mercurial wants them in
4017291c4c48 tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents: 9151
diff changeset
421 # local encoding.
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
422 tags = {}
9147
234a230cc33b localrepo: improve readability of _findtags(), readtags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9146
diff changeset
423 for (name, (node, hist)) in alltags.iteritems():
234a230cc33b localrepo: improve readability of _findtags(), readtags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9146
diff changeset
424 if node != nullid:
14499
a281981e2033 localrepo: ignore tags to unknown nodes (issue2750)
Idan Kamara <idankk86@gmail.com>
parents: 14498
diff changeset
425 try:
a281981e2033 localrepo: ignore tags to unknown nodes (issue2750)
Idan Kamara <idankk86@gmail.com>
parents: 14498
diff changeset
426 # ignore tags to unknown nodes
a281981e2033 localrepo: ignore tags to unknown nodes (issue2750)
Idan Kamara <idankk86@gmail.com>
parents: 14498
diff changeset
427 self.changelog.lookup(node)
a281981e2033 localrepo: ignore tags to unknown nodes (issue2750)
Idan Kamara <idankk86@gmail.com>
parents: 14498
diff changeset
428 tags[encoding.tolocal(name)] = node
a281981e2033 localrepo: ignore tags to unknown nodes (issue2750)
Idan Kamara <idankk86@gmail.com>
parents: 14498
diff changeset
429 except error.LookupError:
a281981e2033 localrepo: ignore tags to unknown nodes (issue2750)
Idan Kamara <idankk86@gmail.com>
parents: 14498
diff changeset
430 pass
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
431 tags['tip'] = self.changelog.tip()
9152
4017291c4c48 tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents: 9151
diff changeset
432 tagtypes = dict([(encoding.tolocal(name), value)
4017291c4c48 tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents: 9151
diff changeset
433 for (name, value) in tagtypes.iteritems()])
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
434 return (tags, tagtypes)
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
435
5657
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
436 def tagtype(self, tagname):
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
437 '''
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
438 return the type of the given tag. result can be:
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
439
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
440 'local' : a local tag
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
441 'global' : a global tag
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
442 None : tag does not exist
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
443 '''
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
444
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
445 return self._tagscache.tagtypes.get(tagname)
5657
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
446
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
447 def tagslist(self):
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
448 '''return a list of tags ordered by revision'''
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
449 if not self._tagscache.tagslist:
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
450 l = []
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
451 for t, n in self.tags().iteritems():
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
452 r = self.changelog.rev(n)
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
453 l.append((r, t, n))
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
454 self._tagscache.tagslist = [(t, n) for r, t, n in sorted(l)]
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
455
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
456 return self._tagscache.tagslist
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
457
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
458 def nodetags(self, node):
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
459 '''return the tags associated with a node'''
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
460 if not self._tagscache.nodetagscache:
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
461 nodetagscache = {}
7622
4dd7b28003d2 use dict.iteritems() rather than dict.items()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7599
diff changeset
462 for t, n in self.tags().iteritems():
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
463 nodetagscache.setdefault(n, []).append(t)
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
464 for tags in nodetagscache.itervalues():
11047
c7dbd6c4877a tags: return tags in sorted order
Eric Eisner <ede@mit.edu>
parents: 10970
diff changeset
465 tags.sort()
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
466 self._tagscache.nodetagscache = nodetagscache
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
467 return self._tagscache.nodetagscache.get(node, [])
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
468
13384
caa561759538 context: add method to return all bookmarks pointing to a node
David Soria Parra <dsp@php.net>
parents: 13365
diff changeset
469 def nodebookmarks(self, node):
caa561759538 context: add method to return all bookmarks pointing to a node
David Soria Parra <dsp@php.net>
parents: 13365
diff changeset
470 marks = []
caa561759538 context: add method to return all bookmarks pointing to a node
David Soria Parra <dsp@php.net>
parents: 13365
diff changeset
471 for bookmark, n in self._bookmarks.iteritems():
caa561759538 context: add method to return all bookmarks pointing to a node
David Soria Parra <dsp@php.net>
parents: 13365
diff changeset
472 if n == node:
caa561759538 context: add method to return all bookmarks pointing to a node
David Soria Parra <dsp@php.net>
parents: 13365
diff changeset
473 marks.append(bookmark)
caa561759538 context: add method to return all bookmarks pointing to a node
David Soria Parra <dsp@php.net>
parents: 13365
diff changeset
474 return sorted(marks)
caa561759538 context: add method to return all bookmarks pointing to a node
David Soria Parra <dsp@php.net>
parents: 13365
diff changeset
475
6120
f89878df40fe move the reading of branch.cache from _branchtags to branchtags
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6119
diff changeset
476 def _branchtags(self, partial, lrev):
7654
816b708f23af store all heads of a branch in the branch cache
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7644
diff changeset
477 # TODO: rename this function?
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
478 tiprev = len(self) - 1
3491
23cffef5d424 Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3473
diff changeset
479 if lrev != tiprev:
10770
fe39f0160c74 localrepo: change _updatebranchcache to use a context generator
Sune Foldager <cryo@cyanite.org>
parents: 10725
diff changeset
480 ctxgen = (self[r] for r in xrange(lrev + 1, tiprev + 1))
fe39f0160c74 localrepo: change _updatebranchcache to use a context generator
Sune Foldager <cryo@cyanite.org>
parents: 10725
diff changeset
481 self._updatebranchcache(partial, ctxgen)
3491
23cffef5d424 Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3473
diff changeset
482 self._writebranchcache(partial, self.changelog.tip(), tiprev)
23cffef5d424 Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3473
diff changeset
483
3826
b3b868113d24 fix encoding conversion of branch names when mq is loaded
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3803
diff changeset
484 return partial
b3b868113d24 fix encoding conversion of branch names when mq is loaded
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3803
diff changeset
485
12066
d01e28657429 localrepo: introduce method for explicit branch cache update
Georg Brandl <georg@python.org>
parents: 12035
diff changeset
486 def updatebranchcache(self):
9671
9471d9a900b4 transfer branchmap branch names over the wire in utf-8
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 9569
diff changeset
487 tip = self.changelog.tip()
9674
603b23c6967b localrepo/branchcache: kill unused localrepo.branchcache
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9673
diff changeset
488 if self._branchcache is not None and self._branchcachetip == tip:
15884
cc8287d51680 localrepo: remove spurious updatebranchcache return value
Mads Kiilerich <mads@kiilerich.com>
parents: 15837
diff changeset
489 return
9671
9471d9a900b4 transfer branchmap branch names over the wire in utf-8
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 9569
diff changeset
490
6121
7336aeff1a1d automatically update the branch cache when tip changes
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6120
diff changeset
491 oldtip = self._branchcachetip
7336aeff1a1d automatically update the branch cache when tip changes
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6120
diff changeset
492 self._branchcachetip = tip
7336aeff1a1d automatically update the branch cache when tip changes
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6120
diff changeset
493 if oldtip is None or oldtip not in self.changelog.nodemap:
7336aeff1a1d automatically update the branch cache when tip changes
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6120
diff changeset
494 partial, last, lrev = self._readbranchcache()
7336aeff1a1d automatically update the branch cache when tip changes
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6120
diff changeset
495 else:
7336aeff1a1d automatically update the branch cache when tip changes
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6120
diff changeset
496 lrev = self.changelog.rev(oldtip)
9674
603b23c6967b localrepo/branchcache: kill unused localrepo.branchcache
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9673
diff changeset
497 partial = self._branchcache
6121
7336aeff1a1d automatically update the branch cache when tip changes
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6120
diff changeset
498
6120
f89878df40fe move the reading of branch.cache from _branchtags to branchtags
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6119
diff changeset
499 self._branchtags(partial, lrev)
7654
816b708f23af store all heads of a branch in the branch cache
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7644
diff changeset
500 # this private cache holds all heads (not just tips)
9674
603b23c6967b localrepo/branchcache: kill unused localrepo.branchcache
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9673
diff changeset
501 self._branchcache = partial
3826
b3b868113d24 fix encoding conversion of branch names when mq is loaded
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3803
diff changeset
502
12066
d01e28657429 localrepo: introduce method for explicit branch cache update
Georg Brandl <georg@python.org>
parents: 12035
diff changeset
503 def branchmap(self):
d01e28657429 localrepo: introduce method for explicit branch cache update
Georg Brandl <georg@python.org>
parents: 12035
diff changeset
504 '''returns a dictionary {branch: [branchheads]}'''
d01e28657429 localrepo: introduce method for explicit branch cache update
Georg Brandl <georg@python.org>
parents: 12035
diff changeset
505 self.updatebranchcache()
9674
603b23c6967b localrepo/branchcache: kill unused localrepo.branchcache
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9673
diff changeset
506 return self._branchcache
7654
816b708f23af store all heads of a branch in the branch cache
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7644
diff changeset
507
816b708f23af store all heads of a branch in the branch cache
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7644
diff changeset
508 def branchtags(self):
816b708f23af store all heads of a branch in the branch cache
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7644
diff changeset
509 '''return a dict where branch names map to the tipmost head of
7656
6a24fb994701 branch closing: referencing open and closed branches/heads
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7655
diff changeset
510 the branch, open heads come before closed'''
6a24fb994701 branch closing: referencing open and closed branches/heads
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7655
diff changeset
511 bt = {}
9675
ee913987e4b0 localrepo/branchcache: remove lbranchmap(), convert users to use utf-8 names
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9674
diff changeset
512 for bn, heads in self.branchmap().iteritems():
10392
9be6c5900c07 localrepo: cleanup branch tip computation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10371
diff changeset
513 tip = heads[-1]
9be6c5900c07 localrepo: cleanup branch tip computation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10371
diff changeset
514 for h in reversed(heads):
7656
6a24fb994701 branch closing: referencing open and closed branches/heads
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7655
diff changeset
515 if 'close' not in self.changelog.read(h)[5]:
10392
9be6c5900c07 localrepo: cleanup branch tip computation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10371
diff changeset
516 tip = h
7656
6a24fb994701 branch closing: referencing open and closed branches/heads
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7655
diff changeset
517 break
10392
9be6c5900c07 localrepo: cleanup branch tip computation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10371
diff changeset
518 bt[bn] = tip
7656
6a24fb994701 branch closing: referencing open and closed branches/heads
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7655
diff changeset
519 return bt
6a24fb994701 branch closing: referencing open and closed branches/heads
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7655
diff changeset
520
3491
23cffef5d424 Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3473
diff changeset
521 def _readbranchcache(self):
23cffef5d424 Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3473
diff changeset
522 partial = {}
3417
028fff46a4ac Add branchtags function with cache
Matt Mackall <mpm@selenic.com>
parents: 3377
diff changeset
523 try:
13341
4e33ef68b1f8 remove pointless os.path.join calls when opening files in .hg/cache
Adrian Buehlmann <adrian@cadifra.com>
parents: 13327
diff changeset
524 f = self.opener("cache/branchheads")
3668
6f6696962986 don't use readline() to read branches.cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3664
diff changeset
525 lines = f.read().split('\n')
6f6696962986 don't use readline() to read branches.cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3664
diff changeset
526 f.close()
4415
1a63b44f90c9 branch.cache: silently ignore I/O and OS errors
Matt Mackall <mpm@selenic.com>
parents: 4329
diff changeset
527 except (IOError, OSError):
1a63b44f90c9 branch.cache: silently ignore I/O and OS errors
Matt Mackall <mpm@selenic.com>
parents: 4329
diff changeset
528 return {}, nullid, nullrev
1a63b44f90c9 branch.cache: silently ignore I/O and OS errors
Matt Mackall <mpm@selenic.com>
parents: 4329
diff changeset
529
1a63b44f90c9 branch.cache: silently ignore I/O and OS errors
Matt Mackall <mpm@selenic.com>
parents: 4329
diff changeset
530 try:
4167
4574a8cb080f Store empty (default) branch in branch cache, too.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4128
diff changeset
531 last, lrev = lines.pop(0).split(" ", 1)
3417
028fff46a4ac Add branchtags function with cache
Matt Mackall <mpm@selenic.com>
parents: 3377
diff changeset
532 last, lrev = bin(last), int(lrev)
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
533 if lrev >= len(self) or self[lrev].node() != last:
3761
9433bdcaa9ae Ignore all errors while parsing the branch cache.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3733
diff changeset
534 # invalidate the cache
6056
0ad2ffbf6b38 Print less scary warning when invalidating the branch cache.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6001
diff changeset
535 raise ValueError('invalidating branch cache (tip differs)')
3761
9433bdcaa9ae Ignore all errors while parsing the branch cache.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3733
diff changeset
536 for l in lines:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
537 if not l:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
538 continue
4167
4574a8cb080f Store empty (default) branch in branch cache, too.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4128
diff changeset
539 node, label = l.split(" ", 1)
13047
6c375e07d673 branch: operate on branch names in local string space where possible
Matt Mackall <mpm@selenic.com>
parents: 13037
diff changeset
540 label = encoding.tolocal(label.strip())
6c375e07d673 branch: operate on branch names in local string space where possible
Matt Mackall <mpm@selenic.com>
parents: 13037
diff changeset
541 partial.setdefault(label, []).append(bin(node))
7644
182b7114d35a error: move SignalInterrupt
Matt Mackall <mpm@selenic.com>
parents: 7641
diff changeset
542 except KeyboardInterrupt:
3761
9433bdcaa9ae Ignore all errors while parsing the branch cache.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3733
diff changeset
543 raise
9433bdcaa9ae Ignore all errors while parsing the branch cache.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3733
diff changeset
544 except Exception, inst:
9433bdcaa9ae Ignore all errors while parsing the branch cache.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3733
diff changeset
545 if self.ui.debugflag:
9433bdcaa9ae Ignore all errors while parsing the branch cache.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3733
diff changeset
546 self.ui.warn(str(inst), '\n')
9433bdcaa9ae Ignore all errors while parsing the branch cache.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3733
diff changeset
547 partial, last, lrev = {}, nullid, nullrev
3491
23cffef5d424 Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3473
diff changeset
548 return partial, last, lrev
3417
028fff46a4ac Add branchtags function with cache
Matt Mackall <mpm@selenic.com>
parents: 3377
diff changeset
549
3491
23cffef5d424 Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3473
diff changeset
550 def _writebranchcache(self, branches, tip, tiprev):
3452
fcf14d87e0a4 If we can't write the branch cache, fail quietly.
Matt Mackall <mpm@selenic.com>
parents: 3450
diff changeset
551 try:
13341
4e33ef68b1f8 remove pointless os.path.join calls when opening files in .hg/cache
Adrian Buehlmann <adrian@cadifra.com>
parents: 13327
diff changeset
552 f = self.opener("cache/branchheads", "w", atomictemp=True)
3491
23cffef5d424 Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3473
diff changeset
553 f.write("%s %s\n" % (hex(tip), tiprev))
7654
816b708f23af store all heads of a branch in the branch cache
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7644
diff changeset
554 for label, nodes in branches.iteritems():
816b708f23af store all heads of a branch in the branch cache
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7644
diff changeset
555 for node in nodes:
13047
6c375e07d673 branch: operate on branch names in local string space where possible
Matt Mackall <mpm@selenic.com>
parents: 13037
diff changeset
556 f.write("%s %s\n" % (hex(node), encoding.fromlocal(label)))
15057
774da7121fc9 atomictempfile: make close() consistent with other file-like objects.
Greg Ward <greg@gerg.ca>
parents: 14936
diff changeset
557 f.close()
4415
1a63b44f90c9 branch.cache: silently ignore I/O and OS errors
Matt Mackall <mpm@selenic.com>
parents: 4329
diff changeset
558 except (IOError, OSError):
3452
fcf14d87e0a4 If we can't write the branch cache, fail quietly.
Matt Mackall <mpm@selenic.com>
parents: 3450
diff changeset
559 pass
3417
028fff46a4ac Add branchtags function with cache
Matt Mackall <mpm@selenic.com>
parents: 3377
diff changeset
560
10770
fe39f0160c74 localrepo: change _updatebranchcache to use a context generator
Sune Foldager <cryo@cyanite.org>
parents: 10725
diff changeset
561 def _updatebranchcache(self, partial, ctxgen):
8954
e67e5b60e55f Branch heads should not include "heads" that are ancestors of other heads.
Brendan Cully <brendan@kublai.com>
parents: 8916
diff changeset
562 # collect new branch entries
e67e5b60e55f Branch heads should not include "heads" that are ancestors of other heads.
Brendan Cully <brendan@kublai.com>
parents: 8916
diff changeset
563 newbranches = {}
10770
fe39f0160c74 localrepo: change _updatebranchcache to use a context generator
Sune Foldager <cryo@cyanite.org>
parents: 10725
diff changeset
564 for c in ctxgen:
8954
e67e5b60e55f Branch heads should not include "heads" that are ancestors of other heads.
Brendan Cully <brendan@kublai.com>
parents: 8916
diff changeset
565 newbranches.setdefault(c.branch(), []).append(c.node())
e67e5b60e55f Branch heads should not include "heads" that are ancestors of other heads.
Brendan Cully <brendan@kublai.com>
parents: 8916
diff changeset
566 # if older branchheads are reachable from new ones, they aren't
e67e5b60e55f Branch heads should not include "heads" that are ancestors of other heads.
Brendan Cully <brendan@kublai.com>
parents: 8916
diff changeset
567 # really branchheads. Note checking parents is insufficient:
e67e5b60e55f Branch heads should not include "heads" that are ancestors of other heads.
Brendan Cully <brendan@kublai.com>
parents: 8916
diff changeset
568 # 1 (branch a) -> 2 (branch b) -> 3 (branch a)
e67e5b60e55f Branch heads should not include "heads" that are ancestors of other heads.
Brendan Cully <brendan@kublai.com>
parents: 8916
diff changeset
569 for branch, newnodes in newbranches.iteritems():
e67e5b60e55f Branch heads should not include "heads" that are ancestors of other heads.
Brendan Cully <brendan@kublai.com>
parents: 8916
diff changeset
570 bheads = partial.setdefault(branch, [])
e67e5b60e55f Branch heads should not include "heads" that are ancestors of other heads.
Brendan Cully <brendan@kublai.com>
parents: 8916
diff changeset
571 bheads.extend(newnodes)
10920
39c69b5dc258 localrepo: simplify _updatebranchcache slightly
Sune Foldager <cryo@cyanite.org>
parents: 10912
diff changeset
572 if len(bheads) <= 1:
8954
e67e5b60e55f Branch heads should not include "heads" that are ancestors of other heads.
Brendan Cully <brendan@kublai.com>
parents: 8916
diff changeset
573 continue
14056
bcfe78c3d15c branchcache: improve speed relative to the amount of heads
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 14048
diff changeset
574 bheads = sorted(bheads, key=lambda x: self[x].rev())
8954
e67e5b60e55f Branch heads should not include "heads" that are ancestors of other heads.
Brendan Cully <brendan@kublai.com>
parents: 8916
diff changeset
575 # starting from tip means fewer passes over reachable
e67e5b60e55f Branch heads should not include "heads" that are ancestors of other heads.
Brendan Cully <brendan@kublai.com>
parents: 8916
diff changeset
576 while newnodes:
e67e5b60e55f Branch heads should not include "heads" that are ancestors of other heads.
Brendan Cully <brendan@kublai.com>
parents: 8916
diff changeset
577 latest = newnodes.pop()
e67e5b60e55f Branch heads should not include "heads" that are ancestors of other heads.
Brendan Cully <brendan@kublai.com>
parents: 8916
diff changeset
578 if latest not in bheads:
e67e5b60e55f Branch heads should not include "heads" that are ancestors of other heads.
Brendan Cully <brendan@kublai.com>
parents: 8916
diff changeset
579 continue
14056
bcfe78c3d15c branchcache: improve speed relative to the amount of heads
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 14048
diff changeset
580 minbhrev = self[bheads[0]].node()
9120
d3b995dd4eab branch heads: optimise computation of branch head cache (issue1734)
Henrik Stuart <hg@hstuart.dk>
parents: 9093
diff changeset
581 reachable = self.changelog.reachable(latest, minbhrev)
10920
39c69b5dc258 localrepo: simplify _updatebranchcache slightly
Sune Foldager <cryo@cyanite.org>
parents: 10912
diff changeset
582 reachable.remove(latest)
14056
bcfe78c3d15c branchcache: improve speed relative to the amount of heads
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 14048
diff changeset
583 if reachable:
bcfe78c3d15c branchcache: improve speed relative to the amount of heads
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 14048
diff changeset
584 bheads = [b for b in bheads if b not in reachable]
8954
e67e5b60e55f Branch heads should not include "heads" that are ancestors of other heads.
Brendan Cully <brendan@kublai.com>
parents: 8916
diff changeset
585 partial[branch] = bheads
3491
23cffef5d424 Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3473
diff changeset
586
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
587 def lookup(self, key):
7377
374a6b3ac623 lookup: fast-paths for int and 'tip'
Matt Mackall <mpm@selenic.com>
parents: 7361
diff changeset
588 if isinstance(key, int):
374a6b3ac623 lookup: fast-paths for int and 'tip'
Matt Mackall <mpm@selenic.com>
parents: 7361
diff changeset
589 return self.changelog.node(key)
374a6b3ac623 lookup: fast-paths for int and 'tip'
Matt Mackall <mpm@selenic.com>
parents: 7361
diff changeset
590 elif key == '.':
13878
a8d13ee0ce68 misc: replace .parents()[0] with p1()
Matt Mackall <mpm@selenic.com>
parents: 13872
diff changeset
591 return self.dirstate.p1()
3801
bd7011246fab Add "null" pseudo-tag pointing to nullid
Brendan Cully <brendan@kublai.com>
parents: 3791
diff changeset
592 elif key == 'null':
bd7011246fab Add "null" pseudo-tag pointing to nullid
Brendan Cully <brendan@kublai.com>
parents: 3791
diff changeset
593 return nullid
7377
374a6b3ac623 lookup: fast-paths for int and 'tip'
Matt Mackall <mpm@selenic.com>
parents: 7361
diff changeset
594 elif key == 'tip':
374a6b3ac623 lookup: fast-paths for int and 'tip'
Matt Mackall <mpm@selenic.com>
parents: 7361
diff changeset
595 return self.changelog.tip()
3453
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3452
diff changeset
596 n = self.changelog._match(key)
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3452
diff changeset
597 if n:
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3452
diff changeset
598 return n
13363
999f616b09dc bookmarks: merge lookup into localrepo
Matt Mackall <mpm@selenic.com>
parents: 13360
diff changeset
599 if key in self._bookmarks:
999f616b09dc bookmarks: merge lookup into localrepo
Matt Mackall <mpm@selenic.com>
parents: 13360
diff changeset
600 return self._bookmarks[key]
3418
5436c8fe0ff5 Make lookup aware of branch labels
Matt Mackall <mpm@selenic.com>
parents: 3417
diff changeset
601 if key in self.tags():
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
602 return self.tags()[key]
3418
5436c8fe0ff5 Make lookup aware of branch labels
Matt Mackall <mpm@selenic.com>
parents: 3417
diff changeset
603 if key in self.branchtags():
5436c8fe0ff5 Make lookup aware of branch labels
Matt Mackall <mpm@selenic.com>
parents: 3417
diff changeset
604 return self.branchtags()[key]
3453
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3452
diff changeset
605 n = self.changelog._partialmatch(key)
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3452
diff changeset
606 if n:
dba3cadef789 Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents: 3452
diff changeset
607 return n
8639
1323dddf8078 lookup: check for dirstate damage on failure
Matt Mackall <mpm@selenic.com>
parents: 8567
diff changeset
608
1323dddf8078 lookup: check for dirstate damage on failure
Matt Mackall <mpm@selenic.com>
parents: 8567
diff changeset
609 # can't find key, check if it might have come from damaged dirstate
1323dddf8078 lookup: check for dirstate damage on failure
Matt Mackall <mpm@selenic.com>
parents: 8567
diff changeset
610 if key in self.dirstate.parents():
1323dddf8078 lookup: check for dirstate damage on failure
Matt Mackall <mpm@selenic.com>
parents: 8567
diff changeset
611 raise error.Abort(_("working directory has unknown parent '%s'!")
1323dddf8078 lookup: check for dirstate damage on failure
Matt Mackall <mpm@selenic.com>
parents: 8567
diff changeset
612 % short(key))
4916
5c5d23d93447 Use a weakref for recursive transactions
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
613 try:
5c5d23d93447 Use a weakref for recursive transactions
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
614 if len(key) == 20:
5c5d23d93447 Use a weakref for recursive transactions
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
615 key = hex(key)
14004
97ed99d1f419 eliminate various naked except clauses
Idan Kamara <idankk86@gmail.com>
parents: 13972
diff changeset
616 except TypeError:
4916
5c5d23d93447 Use a weakref for recursive transactions
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
617 pass
9423
1444a42f6052 Make distinct lookup error for localrepo.lookup
Matt Mackall <mpm@selenic.com>
parents: 9120
diff changeset
618 raise error.RepoLookupError(_("unknown revision '%s'") % key)
67
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
619
10960
ca739acf1a98 commands: add more robust support for 'hg log -b' (issue2078)
Steve Losh <steve@stevelosh.com>
parents: 10926
diff changeset
620 def lookupbranch(self, key, remote=None):
ca739acf1a98 commands: add more robust support for 'hg log -b' (issue2078)
Steve Losh <steve@stevelosh.com>
parents: 10926
diff changeset
621 repo = remote or self
ca739acf1a98 commands: add more robust support for 'hg log -b' (issue2078)
Steve Losh <steve@stevelosh.com>
parents: 10926
diff changeset
622 if key in repo.branchmap():
ca739acf1a98 commands: add more robust support for 'hg log -b' (issue2078)
Steve Losh <steve@stevelosh.com>
parents: 10926
diff changeset
623 return key
ca739acf1a98 commands: add more robust support for 'hg log -b' (issue2078)
Steve Losh <steve@stevelosh.com>
parents: 10926
diff changeset
624
ca739acf1a98 commands: add more robust support for 'hg log -b' (issue2078)
Steve Losh <steve@stevelosh.com>
parents: 10926
diff changeset
625 repo = (remote and remote.local()) and remote or self
ca739acf1a98 commands: add more robust support for 'hg log -b' (issue2078)
Steve Losh <steve@stevelosh.com>
parents: 10926
diff changeset
626 return repo[key].branch()
ca739acf1a98 commands: add more robust support for 'hg log -b' (issue2078)
Steve Losh <steve@stevelosh.com>
parents: 10926
diff changeset
627
13723
e615765fdcc7 wireproto: add known([id]) function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13720
diff changeset
628 def known(self, nodes):
e615765fdcc7 wireproto: add known([id]) function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13720
diff changeset
629 nm = self.changelog.nodemap
15889
816209eaf963 phases: make secret changeset undiscoverable in all case
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15888
diff changeset
630 result = []
816209eaf963 phases: make secret changeset undiscoverable in all case
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15888
diff changeset
631 for n in nodes:
816209eaf963 phases: make secret changeset undiscoverable in all case
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15888
diff changeset
632 r = nm.get(n)
816209eaf963 phases: make secret changeset undiscoverable in all case
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15888
diff changeset
633 resp = not (r is None or self._phaserev[r] >= phases.secret)
816209eaf963 phases: make secret changeset undiscoverable in all case
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15888
diff changeset
634 result.append(resp)
816209eaf963 phases: make secret changeset undiscoverable in all case
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15888
diff changeset
635 return result
13723
e615765fdcc7 wireproto: add known([id]) function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13720
diff changeset
636
926
b765e970c9ff Add a local() method to repository classes
mpm@selenic.com
parents: 923
diff changeset
637 def local(self):
14603
68a43fdd7d80 localrepo: local() returns self
Matt Mackall <mpm@selenic.com>
parents: 14549
diff changeset
638 return self
926
b765e970c9ff Add a local() method to repository classes
mpm@selenic.com
parents: 923
diff changeset
639
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
640 def join(self, f):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
641 return os.path.join(self.path, f)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
642
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
643 def wjoin(self, f):
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
644 return os.path.join(self.root, f)
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
645
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
646 def file(self, f):
1615
83238c1db6de Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1597
diff changeset
647 if f[0] == '/':
83238c1db6de Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1597
diff changeset
648 f = f[1:]
4258
b11a2fb59cf5 revlog: simplify revlog version handling
Matt Mackall <mpm@selenic.com>
parents: 4232
diff changeset
649 return filelog.filelog(self.sopener, f)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
650
6739
c9fbd6ec3489 context: avoid using None for working parent
Matt Mackall <mpm@selenic.com>
parents: 6736
diff changeset
651 def changectx(self, changeid):
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
652 return self[changeid]
3218
8d4855fd9d7b merge: use new working context object in update
Matt Mackall <mpm@selenic.com>
parents: 3164
diff changeset
653
3163
1605e336d229 Add localrepo.parents to get parent changectxs.
Matt Mackall <mpm@selenic.com>
parents: 3132
diff changeset
654 def parents(self, changeid=None):
6742
2d54e7c1e69d context: clean up parents()
Matt Mackall <mpm@selenic.com>
parents: 6740
diff changeset
655 '''get list of changectxs for parents of changeid'''
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
656 return self[changeid].parents()
3163
1605e336d229 Add localrepo.parents to get parent changectxs.
Matt Mackall <mpm@selenic.com>
parents: 3132
diff changeset
657
2564
55e592041076 Add context helper functions to localrepo
Matt Mackall <mpm@selenic.com>
parents: 2491
diff changeset
658 def filectx(self, path, changeid=None, fileid=None):
55e592041076 Add context helper functions to localrepo
Matt Mackall <mpm@selenic.com>
parents: 2491
diff changeset
659 """changeid can be a changeset revision, node, or tag.
55e592041076 Add context helper functions to localrepo
Matt Mackall <mpm@selenic.com>
parents: 2491
diff changeset
660 fileid can be a file revision or node."""
55e592041076 Add context helper functions to localrepo
Matt Mackall <mpm@selenic.com>
parents: 2491
diff changeset
661 return context.filectx(self, path, changeid, fileid)
55e592041076 Add context helper functions to localrepo
Matt Mackall <mpm@selenic.com>
parents: 2491
diff changeset
662
627
b6c42714d900 Add locate command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 624
diff changeset
663 def getcwd(self):
870
a82eae840447 Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents: 839
diff changeset
664 return self.dirstate.getcwd()
627
b6c42714d900 Add locate command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 624
diff changeset
665
4525
78b6add1f966 Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4516
diff changeset
666 def pathto(self, f, cwd=None):
78b6add1f966 Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4516
diff changeset
667 return self.dirstate.pathto(f, cwd)
78b6add1f966 Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4516
diff changeset
668
291
2c4f2be05587 Add wopener for opening files in the working directory
mpm@selenic.com
parents: 288
diff changeset
669 def wfile(self, f, mode='r'):
2c4f2be05587 Add wopener for opening files in the working directory
mpm@selenic.com
parents: 288
diff changeset
670 return self.wopener(f, mode)
2c4f2be05587 Add wopener for opening files in the working directory
mpm@selenic.com
parents: 288
diff changeset
671
4275
81402b2b294d use os.path.islink instead of util.is_link; remove util.is_link
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4273
diff changeset
672 def _link(self, f):
81402b2b294d use os.path.islink instead of util.is_link; remove util.is_link
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4273
diff changeset
673 return os.path.islink(self.wjoin(f))
81402b2b294d use os.path.islink instead of util.is_link; remove util.is_link
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4273
diff changeset
674
11698
9df481f8036d localrepo: refactor filter computation
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11669
diff changeset
675 def _loadfilter(self, filter):
4004
c83c35f2f4e2 unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents: 4003
diff changeset
676 if filter not in self.filterpats:
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
677 l = []
4004
c83c35f2f4e2 unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents: 4003
diff changeset
678 for pat, cmd in self.ui.configitems(filter):
7226
b71a52f101dc Make it possible to disable filtering for a pattern.
Mads Kiilerich <mads@kiilerich.com>
parents: 7208
diff changeset
679 if cmd == '!':
b71a52f101dc Make it possible to disable filtering for a pattern.
Mads Kiilerich <mads@kiilerich.com>
parents: 7208
diff changeset
680 continue
10651
5f091fc1bab7 style: use consistent variable names (*mod) with imports which would shadow
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10547
diff changeset
681 mf = matchmod.match(self.root, '', [pat])
5966
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
682 fn = None
6066
f3a8b5360100 Strip filter name from command before passing to filter function.
Jesse Glick <jesse.glick@sun.com>
parents: 6065
diff changeset
683 params = cmd
5966
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
684 for name, filterfn in self._datafilters.iteritems():
6210
942287cb1f57 Removed trailing spaces from everything except test output
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6201
diff changeset
685 if cmd.startswith(name):
5966
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
686 fn = filterfn
6066
f3a8b5360100 Strip filter name from command before passing to filter function.
Jesse Glick <jesse.glick@sun.com>
parents: 6065
diff changeset
687 params = cmd[len(name):].lstrip()
5966
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
688 break
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
689 if not fn:
5967
f8ad3b76e923 Provide better context for custom Python encode/decode filters.
Jesse Glick <jesse.glick@sun.com>
parents: 5966
diff changeset
690 fn = lambda s, c, **kwargs: util.filter(s, c)
f8ad3b76e923 Provide better context for custom Python encode/decode filters.
Jesse Glick <jesse.glick@sun.com>
parents: 5966
diff changeset
691 # Wrap old filters not supporting keyword arguments
f8ad3b76e923 Provide better context for custom Python encode/decode filters.
Jesse Glick <jesse.glick@sun.com>
parents: 5966
diff changeset
692 if not inspect.getargspec(fn)[2]:
f8ad3b76e923 Provide better context for custom Python encode/decode filters.
Jesse Glick <jesse.glick@sun.com>
parents: 5966
diff changeset
693 oldfn = fn
f8ad3b76e923 Provide better context for custom Python encode/decode filters.
Jesse Glick <jesse.glick@sun.com>
parents: 5966
diff changeset
694 fn = lambda s, c, **kwargs: oldfn(s, c)
6066
f3a8b5360100 Strip filter name from command before passing to filter function.
Jesse Glick <jesse.glick@sun.com>
parents: 6065
diff changeset
695 l.append((mf, fn, params))
4004
c83c35f2f4e2 unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents: 4003
diff changeset
696 self.filterpats[filter] = l
12706
9ca08fbb750a localrepo: have _loadfilter return the loaded filter patterns
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12687
diff changeset
697 return self.filterpats[filter]
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
698
12707
2216ab103ea8 localrepo: load filter patterns outside of _filter
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12706
diff changeset
699 def _filter(self, filterpats, filename, data):
2216ab103ea8 localrepo: load filter patterns outside of _filter
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12706
diff changeset
700 for mf, fn, cmd in filterpats:
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
701 if mf(filename):
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9437
diff changeset
702 self.ui.debug("filtering %s through %s\n" % (filename, cmd))
5967
f8ad3b76e923 Provide better context for custom Python encode/decode filters.
Jesse Glick <jesse.glick@sun.com>
parents: 5966
diff changeset
703 data = fn(data, cmd, ui=self.ui, repo=self, filename=filename)
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
704 break
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
705
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
706 return data
1019
a9cca981c423 Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents: 1013
diff changeset
707
12708
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
708 @propertycache
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
709 def _encodefilterpats(self):
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
710 return self._loadfilter('encode')
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
711
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
712 @propertycache
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
713 def _decodefilterpats(self):
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
714 return self._loadfilter('decode')
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
715
5966
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
716 def adddatafilter(self, name, filter):
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
717 self._datafilters[name] = filter
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
718
4004
c83c35f2f4e2 unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents: 4003
diff changeset
719 def wread(self, filename):
c83c35f2f4e2 unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents: 4003
diff changeset
720 if self._link(filename):
c83c35f2f4e2 unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents: 4003
diff changeset
721 data = os.readlink(self.wjoin(filename))
c83c35f2f4e2 unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents: 4003
diff changeset
722 else:
14168
135e244776f0 prevent transient leaks of file handle by using new helper functions
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 14162
diff changeset
723 data = self.wopener.read(filename)
12708
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
724 return self._filter(self._encodefilterpats, filename, data)
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
725
4006
67982d3ee76c symlinks: add flags param to wwrite
Matt Mackall <mpm@selenic.com>
parents: 4005
diff changeset
726 def wwrite(self, filename, data, flags):
12708
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
727 data = self._filter(self._decodefilterpats, filename, data)
6877
1d38f3605b20 util: set_flags shouldn't know about repo flag formats
Matt Mackall <mpm@selenic.com>
parents: 6875
diff changeset
728 if 'l' in flags:
1d38f3605b20 util: set_flags shouldn't know about repo flag formats
Matt Mackall <mpm@selenic.com>
parents: 6875
diff changeset
729 self.wopener.symlink(data, filename)
1d38f3605b20 util: set_flags shouldn't know about repo flag formats
Matt Mackall <mpm@selenic.com>
parents: 6875
diff changeset
730 else:
14184
4ab6e2d597cc fix errors reported by pyflakes test
Sune Foldager <cryo@cyanite.org>
parents: 14168
diff changeset
731 self.wopener.write(filename, data)
6877
1d38f3605b20 util: set_flags shouldn't know about repo flag formats
Matt Mackall <mpm@selenic.com>
parents: 6875
diff changeset
732 if 'x' in flags:
14232
df2399663392 rename util.set_flags to setflags
Adrian Buehlmann <adrian@cadifra.com>
parents: 14220
diff changeset
733 util.setflags(self.wjoin(filename), False, True)
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
734
4005
656e06eebda7 replace filehandle version of wwrite with wwritedata
Matt Mackall <mpm@selenic.com>
parents: 4004
diff changeset
735 def wwritedata(self, filename, data):
12708
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
736 return self._filter(self._decodefilterpats, filename, data)
1019
a9cca981c423 Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents: 1013
diff changeset
737
10881
a685011ed38e localrepo: add desc parameter to transaction
Steve Borho <steve@borho.org>
parents: 10877
diff changeset
738 def transaction(self, desc):
8072
ecf7795479d5 transaction: support multiple, separate transactions
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 7948
diff changeset
739 tr = self._transref and self._transref() or None
ecf7795479d5 transaction: support multiple, separate transactions
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 7948
diff changeset
740 if tr and tr.running():
ecf7795479d5 transaction: support multiple, separate transactions
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 7948
diff changeset
741 return tr.nest()
1806
a2c69737e65e Automatic nesting into running transactions in the same repository.
mason@suse.com
parents: 1802
diff changeset
742
5865
e7127f669edb transactions: don't show a backtrace when journal exists
Matt Mackall <mpm@selenic.com>
parents: 5814
diff changeset
743 # abort here if the journal already exists
e7127f669edb transactions: don't show a backtrace when journal exists
Matt Mackall <mpm@selenic.com>
parents: 5814
diff changeset
744 if os.path.exists(self.sjoin("journal")):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
745 raise error.RepoError(
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
746 _("abandoned transaction found - run hg recover"))
5865
e7127f669edb transactions: don't show a backtrace when journal exists
Matt Mackall <mpm@selenic.com>
parents: 5814
diff changeset
747
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
748 journalfiles = self._writejournal(desc)
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
749 renames = [(x, undoname(x)) for x in journalfiles]
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
750
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
751 tr = transaction.transaction(self.ui.warn, self.sopener,
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
752 self.sjoin("journal"),
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
753 aftertrans(renames),
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
754 self.store.createmode)
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
755 self._transref = weakref.ref(tr)
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
756 return tr
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
757
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
758 def _writejournal(self, desc):
2362
482d3fb47d80 Renamed localrepo.undo() to rollback() and talk about "rollback information".
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2354
diff changeset
759 # save dirstate for rollback
263
e8eb427c6d71 Fix empty repository transaction bug
mpm@selenic.com
parents: 262
diff changeset
760 try:
14168
135e244776f0 prevent transient leaks of file handle by using new helper functions
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 14162
diff changeset
761 ds = self.opener.read("dirstate")
263
e8eb427c6d71 Fix empty repository transaction bug
mpm@selenic.com
parents: 262
diff changeset
762 except IOError:
e8eb427c6d71 Fix empty repository transaction bug
mpm@selenic.com
parents: 262
diff changeset
763 ds = ""
14168
135e244776f0 prevent transient leaks of file handle by using new helper functions
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 14162
diff changeset
764 self.opener.write("journal.dirstate", ds)
135e244776f0 prevent transient leaks of file handle by using new helper functions
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 14162
diff changeset
765 self.opener.write("journal.branch",
135e244776f0 prevent transient leaks of file handle by using new helper functions
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 14162
diff changeset
766 encoding.fromlocal(self.dirstate.branch()))
135e244776f0 prevent transient leaks of file handle by using new helper functions
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 14162
diff changeset
767 self.opener.write("journal.desc",
135e244776f0 prevent transient leaks of file handle by using new helper functions
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 14162
diff changeset
768 "%d\n%s\n" % (len(self), desc))
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 514
diff changeset
769
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
770 bkname = self.join('bookmarks')
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
771 if os.path.exists(bkname):
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
772 util.copyfile(bkname, self.join('journal.bookmarks'))
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
773 else:
14274
01472f8f5429 merge with crew
Matt Mackall <mpm@selenic.com>
parents: 14268 14270
diff changeset
774 self.opener.write('journal.bookmarks', '')
15455
c6f87bdab2a1 phases: add rollback support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15454
diff changeset
775 phasesname = self.sjoin('phaseroots')
c6f87bdab2a1 phases: add rollback support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15454
diff changeset
776 if os.path.exists(phasesname):
c6f87bdab2a1 phases: add rollback support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15454
diff changeset
777 util.copyfile(phasesname, self.sjoin('journal.phaseroots'))
c6f87bdab2a1 phases: add rollback support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15454
diff changeset
778 else:
c6f87bdab2a1 phases: add rollback support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15454
diff changeset
779 self.sopener.write('journal.phaseroots', '')
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
780
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
781 return (self.sjoin('journal'), self.join('journal.dirstate'),
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
782 self.join('journal.branch'), self.join('journal.desc'),
15455
c6f87bdab2a1 phases: add rollback support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15454
diff changeset
783 self.join('journal.bookmarks'),
c6f87bdab2a1 phases: add rollback support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15454
diff changeset
784 self.sjoin('journal.phaseroots'))
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
785
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
786 def recover(self):
8109
496ae1ea4698 switch lock releasing in the core from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8108
diff changeset
787 lock = self.lock()
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
788 try:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
789 if os.path.exists(self.sjoin("journal")):
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
790 self.ui.status(_("rolling back interrupted transaction\n"))
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
791 transaction.rollback(self.sopener, self.sjoin("journal"),
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
792 self.ui.warn)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
793 self.invalidate()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
794 return True
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
795 else:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
796 self.ui.warn(_("no interrupted transaction available\n"))
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
797 return False
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
798 finally:
8109
496ae1ea4698 switch lock releasing in the core from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8108
diff changeset
799 lock.release()
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
800
15183
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
801 def rollback(self, dryrun=False, force=False):
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4916
diff changeset
802 wlock = lock = None
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
803 try:
1712
21dcf38e5d7d Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents: 1709
diff changeset
804 wlock = self.wlock()
4438
3900f684a150 Fix hg import --exact bug that hangs hg on failure.
Eric Hopper <hopper@omnifarious.org>
parents: 4417
diff changeset
805 lock = self.lock()
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
806 if os.path.exists(self.sjoin("undo")):
15183
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
807 return self._rollback(dryrun, force)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
808 else:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
809 self.ui.warn(_("no rollback information available\n"))
11177
6a64813276ed commands: initial audit of exit codes
Matt Mackall <mpm@selenic.com>
parents: 11174
diff changeset
810 return 1
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
811 finally:
8109
496ae1ea4698 switch lock releasing in the core from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8108
diff changeset
812 release(lock, wlock)
162
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 161
diff changeset
813
15183
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
814 def _rollback(self, dryrun, force):
15130
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
815 ui = self.ui
15097
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
816 try:
15130
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
817 args = self.opener.read('undo.desc').splitlines()
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
818 (oldlen, desc, detail) = (int(args[0]), args[1], None)
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
819 if len(args) >= 3:
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
820 detail = args[2]
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
821 oldtip = oldlen - 1
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
822
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
823 if detail and ui.verbose:
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
824 msg = (_('repository tip rolled back to revision %s'
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
825 ' (undo %s: %s)\n')
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
826 % (oldtip, desc, detail))
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
827 else:
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
828 msg = (_('repository tip rolled back to revision %s'
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
829 ' (undo %s)\n')
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
830 % (oldtip, desc))
15097
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
831 except IOError:
15130
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
832 msg = _('rolling back unknown transaction\n')
15183
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
833 desc = None
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
834
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
835 if not force and self['.'] != self['tip'] and desc == 'commit':
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
836 raise util.Abort(
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
837 _('rollback of last commit while not checked out '
15187
0292f88d3b86 rollback: use a hint for force
Matt Mackall <mpm@selenic.com>
parents: 15183
diff changeset
838 'may lose data'), hint=_('use -f to force'))
15183
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
839
15130
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
840 ui.status(msg)
15097
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
841 if dryrun:
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
842 return 0
15131
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
843
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
844 parents = self.dirstate.parents()
15130
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
845 transaction.rollback(self.sopener, self.sjoin('undo'), ui.warn)
15097
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
846 if os.path.exists(self.join('undo.bookmarks')):
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
847 util.rename(self.join('undo.bookmarks'),
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
848 self.join('bookmarks'))
15455
c6f87bdab2a1 phases: add rollback support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15454
diff changeset
849 if os.path.exists(self.sjoin('undo.phaseroots')):
c6f87bdab2a1 phases: add rollback support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15454
diff changeset
850 util.rename(self.sjoin('undo.phaseroots'),
c6f87bdab2a1 phases: add rollback support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15454
diff changeset
851 self.sjoin('phaseroots'))
15097
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
852 self.invalidate()
15131
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
853
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
854 parentgone = (parents[0] not in self.changelog.nodemap or
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
855 parents[1] not in self.changelog.nodemap)
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
856 if parentgone:
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
857 util.rename(self.join('undo.dirstate'), self.join('dirstate'))
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
858 try:
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
859 branch = self.opener.read('undo.branch')
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
860 self.dirstate.setbranch(branch)
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
861 except IOError:
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
862 ui.warn(_('named branch could not be reset: '
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
863 'current branch is still \'%s\'\n')
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
864 % self.dirstate.branch())
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
865
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
866 self.dirstate.invalidate()
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
867 parents = tuple([p.rev() for p in self.parents()])
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
868 if len(parents) > 1:
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
869 ui.status(_('working directory now based on '
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
870 'revisions %d and %d\n') % parents)
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
871 else:
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
872 ui.status(_('working directory now based on '
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
873 'revision %d\n') % parents)
15604
b8d8599410da rollback: always call destroyed() (regression from 1.9)
Greg Ward <greg-hg@gerg.ca>
parents: 15381
diff changeset
874 self.destroyed()
15097
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
875 return 0
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
876
10547
bae9bb09166b strip: invalidate all caches after stripping (fixes issue1951)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10522
diff changeset
877 def invalidatecaches(self):
15988
827e0126738d localrepo: delete _phaserev when invalidating caches
Idan Kamara <idankk86@gmail.com>
parents: 15987
diff changeset
878 def delcache(name):
827e0126738d localrepo: delete _phaserev when invalidating caches
Idan Kamara <idankk86@gmail.com>
parents: 15987
diff changeset
879 try:
827e0126738d localrepo: delete _phaserev when invalidating caches
Idan Kamara <idankk86@gmail.com>
parents: 15987
diff changeset
880 delattr(self, name)
827e0126738d localrepo: delete _phaserev when invalidating caches
Idan Kamara <idankk86@gmail.com>
parents: 15987
diff changeset
881 except AttributeError:
827e0126738d localrepo: delete _phaserev when invalidating caches
Idan Kamara <idankk86@gmail.com>
parents: 15987
diff changeset
882 pass
827e0126738d localrepo: delete _phaserev when invalidating caches
Idan Kamara <idankk86@gmail.com>
parents: 15987
diff changeset
883
827e0126738d localrepo: delete _phaserev when invalidating caches
Idan Kamara <idankk86@gmail.com>
parents: 15987
diff changeset
884 delcache('_tagscache')
827e0126738d localrepo: delete _phaserev when invalidating caches
Idan Kamara <idankk86@gmail.com>
parents: 15987
diff changeset
885 delcache('_phaserev')
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
886
9674
603b23c6967b localrepo/branchcache: kill unused localrepo.branchcache
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9673
diff changeset
887 self._branchcache = None # in UTF-8
6121
7336aeff1a1d automatically update the branch cache when tip changes
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6120
diff changeset
888 self._branchcachetip = None
1784
2e0a288ca93e revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1782
diff changeset
889
14930
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
890 def invalidatedirstate(self):
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
891 '''Invalidates the dirstate, causing the next call to dirstate
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
892 to check if it was modified since the last time it was read,
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
893 rereading it if it has.
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
894
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
895 This is different to dirstate.invalidate() that it doesn't always
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
896 rereads the dirstate. Use dirstate.invalidate() if you want to
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
897 explicitly read the dirstate again (i.e. restoring it to a previous
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
898 known good state).'''
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
899 try:
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
900 delattr(self, 'dirstate')
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
901 except AttributeError:
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
902 pass
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
903
10547
bae9bb09166b strip: invalidate all caches after stripping (fixes issue1951)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10522
diff changeset
904 def invalidate(self):
14935
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
905 for k in self._filecache:
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
906 # dirstate is invalidated separately in invalidatedirstate()
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
907 if k == 'dirstate':
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
908 continue
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
909
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
910 try:
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
911 delattr(self, k)
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
912 except AttributeError:
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
913 pass
10547
bae9bb09166b strip: invalidate all caches after stripping (fixes issue1951)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10522
diff changeset
914 self.invalidatecaches()
bae9bb09166b strip: invalidate all caches after stripping (fixes issue1951)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10522
diff changeset
915
4913
46e39935ce33 rename and simplify do_lock
Matt Mackall <mpm@selenic.com>
parents: 4912
diff changeset
916 def _lock(self, lockname, wait, releasefn, acquirefn, desc):
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
917 try:
3457
ff06fe0703ef localrepo: add separate methods for manipulating repository data
Matt Mackall <mpm@selenic.com>
parents: 3456
diff changeset
918 l = lock.lock(lockname, 0, releasefn, desc=desc)
7640
7197812e8d44 error: move lock errors
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
919 except error.LockHeld, inst:
1531
2ba8bf7defda add localrepo.wlock for protecting the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1516
diff changeset
920 if not wait:
2016
ff5c9a92f556 fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1998
diff changeset
921 raise
3688
d92dad355000 Corrected "waiting for lock on repository FOO held by BAR" message.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3687
diff changeset
922 self.ui.warn(_("waiting for lock on %s held by %r\n") %
d92dad355000 Corrected "waiting for lock on repository FOO held by BAR" message.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3687
diff changeset
923 (desc, inst.locker))
2016
ff5c9a92f556 fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1998
diff changeset
924 # default to 600 seconds timeout
3457
ff06fe0703ef localrepo: add separate methods for manipulating repository data
Matt Mackall <mpm@selenic.com>
parents: 3456
diff changeset
925 l = lock.lock(lockname, int(self.ui.config("ui", "timeout", "600")),
2016
ff5c9a92f556 fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1998
diff changeset
926 releasefn, desc=desc)
1751
e9bf415a8ecb localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1747
diff changeset
927 if acquirefn:
e9bf415a8ecb localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1747
diff changeset
928 acquirefn()
e9bf415a8ecb localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1747
diff changeset
929 return l
e9bf415a8ecb localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1747
diff changeset
930
15587
809d5d30e377 localrepo: rename _postrelease to _afterlock
Matt Mackall <mpm@selenic.com>
parents: 15586
diff changeset
931 def _afterlock(self, callback):
15583
926a06f7a353 lock: add mechanism to register post release callback
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15486
diff changeset
932 """add a callback to the current repository lock.
926a06f7a353 lock: add mechanism to register post release callback
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15486
diff changeset
933
926a06f7a353 lock: add mechanism to register post release callback
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15486
diff changeset
934 The callback will be executed on lock release."""
926a06f7a353 lock: add mechanism to register post release callback
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15486
diff changeset
935 l = self._lockref and self._lockref()
15588
632f4be4d1f3 localrepo: remove asserts in _afterlock
Matt Mackall <mpm@selenic.com>
parents: 15587
diff changeset
936 if l:
15589
cc24e4ed3e0c lock: change name of release chain
Matt Mackall <mpm@selenic.com>
parents: 15588
diff changeset
937 l.postrelease.append(callback)
15583
926a06f7a353 lock: add mechanism to register post release callback
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15486
diff changeset
938
4914
9a2a73ea6135 repo locks: use True/False
Matt Mackall <mpm@selenic.com>
parents: 4913
diff changeset
939 def lock(self, wait=True):
9309
cfdcb7a465af localrepo: document the locking scheme a little better
Greg Ward <greg-hg@gerg.ca>
parents: 9152
diff changeset
940 '''Lock the repository store (.hg/store) and return a weak reference
cfdcb7a465af localrepo: document the locking scheme a little better
Greg Ward <greg-hg@gerg.ca>
parents: 9152
diff changeset
941 to the lock. Use this before modifying the store (e.g. committing or
cfdcb7a465af localrepo: document the locking scheme a little better
Greg Ward <greg-hg@gerg.ca>
parents: 9152
diff changeset
942 stripping). If you are opening a transaction, get a lock as well.)'''
8108
a26d33749bd8 made repo locks recursive and deprecate refcounting based lock releasing
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8072
diff changeset
943 l = self._lockref and self._lockref()
a26d33749bd8 made repo locks recursive and deprecate refcounting based lock releasing
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8072
diff changeset
944 if l is not None and l.held:
a26d33749bd8 made repo locks recursive and deprecate refcounting based lock releasing
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8072
diff changeset
945 l.lock()
a26d33749bd8 made repo locks recursive and deprecate refcounting based lock releasing
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8072
diff changeset
946 return l
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4916
diff changeset
947
14931
a710936c3037 localrepo: refresh filecache entries after releasing a repo.lock()
Idan Kamara <idankk86@gmail.com>
parents: 14930
diff changeset
948 def unlock():
a710936c3037 localrepo: refresh filecache entries after releasing a repo.lock()
Idan Kamara <idankk86@gmail.com>
parents: 14930
diff changeset
949 self.store.write()
15454
5a7dde5adec8 phases: add a moveboundary function to move phases boundaries
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15420
diff changeset
950 if self._dirtyphases:
5a7dde5adec8 phases: add a moveboundary function to move phases boundaries
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15420
diff changeset
951 phases.writeroots(self)
14931
a710936c3037 localrepo: refresh filecache entries after releasing a repo.lock()
Idan Kamara <idankk86@gmail.com>
parents: 14930
diff changeset
952 for k, ce in self._filecache.items():
a710936c3037 localrepo: refresh filecache entries after releasing a repo.lock()
Idan Kamara <idankk86@gmail.com>
parents: 14930
diff changeset
953 if k == 'dirstate':
a710936c3037 localrepo: refresh filecache entries after releasing a repo.lock()
Idan Kamara <idankk86@gmail.com>
parents: 14930
diff changeset
954 continue
a710936c3037 localrepo: refresh filecache entries after releasing a repo.lock()
Idan Kamara <idankk86@gmail.com>
parents: 14930
diff changeset
955 ce.refresh()
a710936c3037 localrepo: refresh filecache entries after releasing a repo.lock()
Idan Kamara <idankk86@gmail.com>
parents: 14930
diff changeset
956
a710936c3037 localrepo: refresh filecache entries after releasing a repo.lock()
Idan Kamara <idankk86@gmail.com>
parents: 14930
diff changeset
957 l = self._lock(self.sjoin("lock"), wait, unlock,
13391
d00bbff8600e fncachestore: defer updating the fncache file to a single file open
Adrian Buehlmann <adrian@cadifra.com>
parents: 13390
diff changeset
958 self.invalidate, _('repository %s') % self.origroot)
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4916
diff changeset
959 self._lockref = weakref.ref(l)
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4916
diff changeset
960 return l
1751
e9bf415a8ecb localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1747
diff changeset
961
4914
9a2a73ea6135 repo locks: use True/False
Matt Mackall <mpm@selenic.com>
parents: 4913
diff changeset
962 def wlock(self, wait=True):
9309
cfdcb7a465af localrepo: document the locking scheme a little better
Greg Ward <greg-hg@gerg.ca>
parents: 9152
diff changeset
963 '''Lock the non-store parts of the repository (everything under
cfdcb7a465af localrepo: document the locking scheme a little better
Greg Ward <greg-hg@gerg.ca>
parents: 9152
diff changeset
964 .hg except .hg/store) and return a weak reference to the lock.
cfdcb7a465af localrepo: document the locking scheme a little better
Greg Ward <greg-hg@gerg.ca>
parents: 9152
diff changeset
965 Use this before modifying files in .hg.'''
8108
a26d33749bd8 made repo locks recursive and deprecate refcounting based lock releasing
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8072
diff changeset
966 l = self._wlockref and self._wlockref()
a26d33749bd8 made repo locks recursive and deprecate refcounting based lock releasing
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8072
diff changeset
967 if l is not None and l.held:
a26d33749bd8 made repo locks recursive and deprecate refcounting based lock releasing
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8072
diff changeset
968 l.lock()
a26d33749bd8 made repo locks recursive and deprecate refcounting based lock releasing
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8072
diff changeset
969 return l
1531
2ba8bf7defda add localrepo.wlock for protecting the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1516
diff changeset
970
14930
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
971 def unlock():
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
972 self.dirstate.write()
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
973 ce = self._filecache.get('dirstate')
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
974 if ce:
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
975 ce.refresh()
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
976
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
977 l = self._lock(self.join("wlock"), wait, unlock,
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
978 self.invalidatedirstate, _('working directory of %s') %
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4916
diff changeset
979 self.origroot)
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4916
diff changeset
980 self._wlockref = weakref.ref(l)
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4916
diff changeset
981 return l
1531
2ba8bf7defda add localrepo.wlock for protecting the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1516
diff changeset
982
8401
ca7dc47eecc6 filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents: 8400
diff changeset
983 def _filecommit(self, fctx, manifest1, manifest2, linkrev, tr, changelist):
3292
764688cf51e5 merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents: 3241
diff changeset
984 """
3294
a2d93b186a0e commit: unify file-level commit code
Matt Mackall <mpm@selenic.com>
parents: 3293
diff changeset
985 commit an individual file as part of a larger transaction
a2d93b186a0e commit: unify file-level commit code
Matt Mackall <mpm@selenic.com>
parents: 3293
diff changeset
986 """
3292
764688cf51e5 merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents: 3241
diff changeset
987
8244
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
988 fname = fctx.path()
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
989 text = fctx.data()
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
990 flog = self.file(fname)
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
991 fparent1 = manifest1.get(fname, nullid)
8401
ca7dc47eecc6 filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents: 8400
diff changeset
992 fparent2 = fparent2o = manifest2.get(fname, nullid)
1716
ef8cd889a78b Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents: 1713
diff changeset
993
3292
764688cf51e5 merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents: 3241
diff changeset
994 meta = {}
8244
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
995 copy = fctx.renamed()
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
996 if copy and copy[0] != fname:
4058
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
997 # Mark the new revision of this file as a copy of another
4516
96d8a56d4ef9 Removed trailing whitespace and tabs from python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4510
diff changeset
998 # file. This copy data will effectively act as a parent
96d8a56d4ef9 Removed trailing whitespace and tabs from python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4510
diff changeset
999 # of this new revision. If this is a merge, the first
4058
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
1000 # parent will be the nullid (meaning "look up the copy data")
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
1001 # and the second one will be the other parent. For example:
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
1002 #
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
1003 # 0 --- 1 --- 3 rev1 changes file foo
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
1004 # \ / rev2 renames foo to bar and changes it
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
1005 # \- 2 -/ rev3 should have bar with all changes and
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
1006 # should record that bar descends from
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
1007 # bar in rev2 and foo in rev1
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
1008 #
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
1009 # this allows this merge to succeed:
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
1010 #
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
1011 # 0 --- 1 --- 3 rev4 reverts the content change from rev2
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
1012 # \ / merging rev3 and rev4 should use bar@rev2
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
1013 # \- 2 --- 4 as the merge base
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
1014 #
6874
8dc21876261e commit: simplify file copy logic
Matt Mackall <mpm@selenic.com>
parents: 6680
diff changeset
1015
8244
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
1016 cfname = copy[0]
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
1017 crev = manifest1.get(cfname)
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
1018 newfparent = fparent2
6874
8dc21876261e commit: simplify file copy logic
Matt Mackall <mpm@selenic.com>
parents: 6680
diff changeset
1019
8dc21876261e commit: simplify file copy logic
Matt Mackall <mpm@selenic.com>
parents: 6680
diff changeset
1020 if manifest2: # branch merge
8244
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
1021 if fparent2 == nullid or crev is None: # copied on remote side
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
1022 if cfname in manifest2:
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
1023 crev = manifest2[cfname]
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
1024 newfparent = fparent1
6874
8dc21876261e commit: simplify file copy logic
Matt Mackall <mpm@selenic.com>
parents: 6680
diff changeset
1025
6875
0d714a48ab53 add a fix for issue 1175
Matt Mackall <mpm@selenic.com>
parents: 6874
diff changeset
1026 # find source in nearest ancestor if we've lost track
8244
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
1027 if not crev:
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9437
diff changeset
1028 self.ui.debug(" %s: searching for copy revision for %s\n" %
8244
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
1029 (fname, cfname))
13000
417f3c27983b commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents: 12899
diff changeset
1030 for ancestor in self[None].ancestors():
8244
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
1031 if cfname in ancestor:
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
1032 crev = ancestor[cfname].filenode()
6876
077f1e637cd8 Merge with stable
Matt Mackall <mpm@selenic.com>
parents: 6875 6840
diff changeset
1033 break
6875
0d714a48ab53 add a fix for issue 1175
Matt Mackall <mpm@selenic.com>
parents: 6874
diff changeset
1034
13000
417f3c27983b commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents: 12899
diff changeset
1035 if crev:
417f3c27983b commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents: 12899
diff changeset
1036 self.ui.debug(" %s: copy %s:%s\n" % (fname, cfname, hex(crev)))
417f3c27983b commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents: 12899
diff changeset
1037 meta["copy"] = cfname
417f3c27983b commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents: 12899
diff changeset
1038 meta["copyrev"] = hex(crev)
417f3c27983b commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents: 12899
diff changeset
1039 fparent1, fparent2 = nullid, newfparent
417f3c27983b commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents: 12899
diff changeset
1040 else:
417f3c27983b commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents: 12899
diff changeset
1041 self.ui.warn(_("warning: can't find ancestor for '%s' "
417f3c27983b commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents: 12899
diff changeset
1042 "copied from '%s'!\n") % (fname, cfname))
417f3c27983b commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents: 12899
diff changeset
1043
8244
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
1044 elif fparent2 != nullid:
1716
ef8cd889a78b Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents: 1713
diff changeset
1045 # is one parent an ancestor of the other?
8244
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
1046 fparentancestor = flog.ancestor(fparent1, fparent2)
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
1047 if fparentancestor == fparent1:
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
1048 fparent1, fparent2 = fparent2, nullid
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
1049 elif fparentancestor == fparent2:
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
1050 fparent2 = nullid
1716
ef8cd889a78b Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents: 1713
diff changeset
1051
8401
ca7dc47eecc6 filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents: 8400
diff changeset
1052 # is the file changed?
ca7dc47eecc6 filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents: 8400
diff changeset
1053 if fparent2 != nullid or flog.cmp(fparent1, text) or meta:
ca7dc47eecc6 filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents: 8400
diff changeset
1054 changelist.append(fname)
ca7dc47eecc6 filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents: 8400
diff changeset
1055 return flog.add(text, meta, tr, linkrev, fparent1, fparent2)
1716
ef8cd889a78b Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents: 1713
diff changeset
1056
8401
ca7dc47eecc6 filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents: 8400
diff changeset
1057 # are just the flags changed during merge?
10320
808c187fc556 localrepo: minor formatting - remove double space
Henri Wiechers <hwiechers@gmail.com>
parents: 10282
diff changeset
1058 if fparent1 != fparent2o and manifest1.flags(fname) != fctx.flags():
8401
ca7dc47eecc6 filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents: 8400
diff changeset
1059 changelist.append(fname)
ca7dc47eecc6 filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents: 8400
diff changeset
1060
ca7dc47eecc6 filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents: 8400
diff changeset
1061 return fparent1
1716
ef8cd889a78b Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents: 1713
diff changeset
1062
8706
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8705
diff changeset
1063 def commit(self, text="", user=None, date=None, match=None, force=False,
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8705
diff changeset
1064 editor=False, extra={}):
8515
865e08a7d6b0 localrepo: update commit*() docstrings
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8503
diff changeset
1065 """Add a new revision to current repository.
865e08a7d6b0 localrepo: update commit*() docstrings
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8503
diff changeset
1066
8706
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8705
diff changeset
1067 Revision information is gathered from the working directory,
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8705
diff changeset
1068 match can be used to filter the committed files. If editor is
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8705
diff changeset
1069 supplied, it is called to get a commit message.
8515
865e08a7d6b0 localrepo: update commit*() docstrings
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8503
diff changeset
1070 """
8709
b9e0ddb04c5c commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents: 8707
diff changeset
1071
8715
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
1072 def fail(f, msg):
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
1073 raise util.Abort('%s: %s' % (f, msg))
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
1074
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
1075 if not match:
10651
5f091fc1bab7 style: use consistent variable names (*mod) with imports which would shadow
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10547
diff changeset
1076 match = matchmod.always(self.root, '')
8715
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
1077
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
1078 if not force:
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
1079 vdirs = []
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
1080 match.dir = vdirs.append
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
1081 match.bad = fail
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
1082
8405
7cbf8fcd2453 commit: push repo lock down into _commitctx
Matt Mackall <mpm@selenic.com>
parents: 8404
diff changeset
1083 wlock = self.wlock()
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
1084 try:
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
1085 wctx = self[None]
10970
3213e8947975 localrepo.commit: use explicit variables, avoid creating new contexts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10969
diff changeset
1086 merge = len(wctx.parents()) > 1
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1087
10970
3213e8947975 localrepo.commit: use explicit variables, avoid creating new contexts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10969
diff changeset
1088 if (not force and merge and match and
8501
ab0e3f7ea315 commit: some tidying
Matt Mackall <mpm@selenic.com>
parents: 8500
diff changeset
1089 (match.files() or match.anypats())):
8397
613ac2856535 remove deprecated rawcommit
Matt Mackall <mpm@selenic.com>
parents: 8395
diff changeset
1090 raise util.Abort(_('cannot partially commit a merge '
613ac2856535 remove deprecated rawcommit
Matt Mackall <mpm@selenic.com>
parents: 8395
diff changeset
1091 '(do not specify files or patterns)'))
6706
716a1296e182 localrepo: replace dirstate by workingfilectx in filecommit()
Patrick Mezard <pmezard@gmail.com>
parents: 6705
diff changeset
1092
8706
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8705
diff changeset
1093 changes = self.status(match=match, clean=force)
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8705
diff changeset
1094 if force:
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8705
diff changeset
1095 changes[0].extend(changes[6]) # mq may commit unchanged files
3621
7d3d603e7df9 localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3620
diff changeset
1096
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
1097 # check subrepos
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
1098 subs = []
10522
b07d487009b2 subrepo: Update .hgsubstate in case of deleted subrepo
Saint Germain <saintger@gmail.com>
parents: 10519
diff changeset
1099 removedsubs = set()
14536
52cbeb5a651b subrepo: be more careful with deletions of .hgsub and .hgsubstate (issue2844)
Matt Mackall <mpm@selenic.com>
parents: 14529
diff changeset
1100 if '.hgsub' in wctx:
52cbeb5a651b subrepo: be more careful with deletions of .hgsub and .hgsubstate (issue2844)
Matt Mackall <mpm@selenic.com>
parents: 14529
diff changeset
1101 # only manage subrepos and .hgsubstate if .hgsub is present
52cbeb5a651b subrepo: be more careful with deletions of .hgsub and .hgsubstate (issue2844)
Matt Mackall <mpm@selenic.com>
parents: 14529
diff changeset
1102 for p in wctx.parents():
52cbeb5a651b subrepo: be more careful with deletions of .hgsub and .hgsubstate (issue2844)
Matt Mackall <mpm@selenic.com>
parents: 14529
diff changeset
1103 removedsubs.update(s for s in p.substate if match(s))
52cbeb5a651b subrepo: be more careful with deletions of .hgsub and .hgsubstate (issue2844)
Matt Mackall <mpm@selenic.com>
parents: 14529
diff changeset
1104 for s in wctx.substate:
52cbeb5a651b subrepo: be more careful with deletions of .hgsub and .hgsubstate (issue2844)
Matt Mackall <mpm@selenic.com>
parents: 14529
diff changeset
1105 removedsubs.discard(s)
52cbeb5a651b subrepo: be more careful with deletions of .hgsub and .hgsubstate (issue2844)
Matt Mackall <mpm@selenic.com>
parents: 14529
diff changeset
1106 if match(s) and wctx.sub(s).dirty():
52cbeb5a651b subrepo: be more careful with deletions of .hgsub and .hgsubstate (issue2844)
Matt Mackall <mpm@selenic.com>
parents: 14529
diff changeset
1107 subs.append(s)
52cbeb5a651b subrepo: be more careful with deletions of .hgsub and .hgsubstate (issue2844)
Matt Mackall <mpm@selenic.com>
parents: 14529
diff changeset
1108 if (subs or removedsubs):
52cbeb5a651b subrepo: be more careful with deletions of .hgsub and .hgsubstate (issue2844)
Matt Mackall <mpm@selenic.com>
parents: 14529
diff changeset
1109 if (not match('.hgsub') and
52cbeb5a651b subrepo: be more careful with deletions of .hgsub and .hgsubstate (issue2844)
Matt Mackall <mpm@selenic.com>
parents: 14529
diff changeset
1110 '.hgsub' in (wctx.modified() + wctx.added())):
52cbeb5a651b subrepo: be more careful with deletions of .hgsub and .hgsubstate (issue2844)
Matt Mackall <mpm@selenic.com>
parents: 14529
diff changeset
1111 raise util.Abort(
52cbeb5a651b subrepo: be more careful with deletions of .hgsub and .hgsubstate (issue2844)
Matt Mackall <mpm@selenic.com>
parents: 14529
diff changeset
1112 _("can't commit subrepos without .hgsub"))
52cbeb5a651b subrepo: be more careful with deletions of .hgsub and .hgsubstate (issue2844)
Matt Mackall <mpm@selenic.com>
parents: 14529
diff changeset
1113 if '.hgsubstate' not in changes[0]:
52cbeb5a651b subrepo: be more careful with deletions of .hgsub and .hgsubstate (issue2844)
Matt Mackall <mpm@selenic.com>
parents: 14529
diff changeset
1114 changes[0].insert(0, '.hgsubstate')
52cbeb5a651b subrepo: be more careful with deletions of .hgsub and .hgsubstate (issue2844)
Matt Mackall <mpm@selenic.com>
parents: 14529
diff changeset
1115 if '.hgsubstate' in changes[2]:
52cbeb5a651b subrepo: be more careful with deletions of .hgsub and .hgsubstate (issue2844)
Matt Mackall <mpm@selenic.com>
parents: 14529
diff changeset
1116 changes[2].remove('.hgsubstate')
52cbeb5a651b subrepo: be more careful with deletions of .hgsub and .hgsubstate (issue2844)
Matt Mackall <mpm@selenic.com>
parents: 14529
diff changeset
1117 elif '.hgsub' in changes[2]:
52cbeb5a651b subrepo: be more careful with deletions of .hgsub and .hgsubstate (issue2844)
Matt Mackall <mpm@selenic.com>
parents: 14529
diff changeset
1118 # clean up .hgsubstate when .hgsub is removed
52cbeb5a651b subrepo: be more careful with deletions of .hgsub and .hgsubstate (issue2844)
Matt Mackall <mpm@selenic.com>
parents: 14529
diff changeset
1119 if ('.hgsubstate' in wctx and
52cbeb5a651b subrepo: be more careful with deletions of .hgsub and .hgsubstate (issue2844)
Matt Mackall <mpm@selenic.com>
parents: 14529
diff changeset
1120 '.hgsubstate' not in changes[0] + changes[1] + changes[2]):
52cbeb5a651b subrepo: be more careful with deletions of .hgsub and .hgsubstate (issue2844)
Matt Mackall <mpm@selenic.com>
parents: 14529
diff changeset
1121 changes[2].insert(0, '.hgsubstate')
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
1122
15321
e174353e8cda subrepos: abort commit by default if a subrepo is dirty (BC)
Martin Geisler <mg@lazybytes.net>
parents: 15237
diff changeset
1123 if subs and not self.ui.configbool('ui', 'commitsubrepos', False):
13411
d4de90a612f7 commit: abort if a subrepo is modified and ui.commitsubrepos=no
Patrick Mezard <pmezard@gmail.com>
parents: 13400
diff changeset
1124 changedsubs = [s for s in subs if wctx.sub(s).dirty(True)]
d4de90a612f7 commit: abort if a subrepo is modified and ui.commitsubrepos=no
Patrick Mezard <pmezard@gmail.com>
parents: 13400
diff changeset
1125 if changedsubs:
d4de90a612f7 commit: abort if a subrepo is modified and ui.commitsubrepos=no
Patrick Mezard <pmezard@gmail.com>
parents: 13400
diff changeset
1126 raise util.Abort(_("uncommitted changes in subrepo %s")
15321
e174353e8cda subrepos: abort commit by default if a subrepo is dirty (BC)
Martin Geisler <mg@lazybytes.net>
parents: 15237
diff changeset
1127 % changedsubs[0],
e174353e8cda subrepos: abort commit by default if a subrepo is dirty (BC)
Martin Geisler <mg@lazybytes.net>
parents: 15237
diff changeset
1128 hint=_("use --subrepos for recursive commit"))
13411
d4de90a612f7 commit: abort if a subrepo is modified and ui.commitsubrepos=no
Patrick Mezard <pmezard@gmail.com>
parents: 13400
diff changeset
1129
8709
b9e0ddb04c5c commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents: 8707
diff changeset
1130 # make sure all explicit patterns are matched
b9e0ddb04c5c commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents: 8707
diff changeset
1131 if not force and match.files():
8710
bcb6e5bebd93 commit: trade O(n^2) file checks for O(n^2) dir checks
Matt Mackall <mpm@selenic.com>
parents: 8709
diff changeset
1132 matched = set(changes[0] + changes[1] + changes[2])
8709
b9e0ddb04c5c commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents: 8707
diff changeset
1133
b9e0ddb04c5c commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents: 8707
diff changeset
1134 for f in match.files():
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
1135 if f == '.' or f in matched or f in wctx.substate:
8709
b9e0ddb04c5c commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents: 8707
diff changeset
1136 continue
b9e0ddb04c5c commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents: 8707
diff changeset
1137 if f in changes[3]: # missing
b9e0ddb04c5c commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents: 8707
diff changeset
1138 fail(f, _('file not found!'))
b9e0ddb04c5c commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents: 8707
diff changeset
1139 if f in vdirs: # visited directory
b9e0ddb04c5c commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents: 8707
diff changeset
1140 d = f + '/'
8710
bcb6e5bebd93 commit: trade O(n^2) file checks for O(n^2) dir checks
Matt Mackall <mpm@selenic.com>
parents: 8709
diff changeset
1141 for mf in matched:
bcb6e5bebd93 commit: trade O(n^2) file checks for O(n^2) dir checks
Matt Mackall <mpm@selenic.com>
parents: 8709
diff changeset
1142 if mf.startswith(d):
bcb6e5bebd93 commit: trade O(n^2) file checks for O(n^2) dir checks
Matt Mackall <mpm@selenic.com>
parents: 8709
diff changeset
1143 break
bcb6e5bebd93 commit: trade O(n^2) file checks for O(n^2) dir checks
Matt Mackall <mpm@selenic.com>
parents: 8709
diff changeset
1144 else:
8709
b9e0ddb04c5c commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents: 8707
diff changeset
1145 fail(f, _("no match under directory!"))
b9e0ddb04c5c commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents: 8707
diff changeset
1146 elif f not in self.dirstate:
b9e0ddb04c5c commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents: 8707
diff changeset
1147 fail(f, _("file not tracked!"))
b9e0ddb04c5c commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents: 8707
diff changeset
1148
10970
3213e8947975 localrepo.commit: use explicit variables, avoid creating new contexts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10969
diff changeset
1149 if (not force and not extra.get("close") and not merge
8501
ab0e3f7ea315 commit: some tidying
Matt Mackall <mpm@selenic.com>
parents: 8500
diff changeset
1150 and not (changes[0] or changes[1] or changes[2])
10970
3213e8947975 localrepo.commit: use explicit variables, avoid creating new contexts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10969
diff changeset
1151 and wctx.branch() == wctx.p1().branch()):
8404
a2bc39ade36b commit: move 'nothing changed' test into commit()
Matt Mackall <mpm@selenic.com>
parents: 8403
diff changeset
1152 return None
a2bc39ade36b commit: move 'nothing changed' test into commit()
Matt Mackall <mpm@selenic.com>
parents: 8403
diff changeset
1153
10651
5f091fc1bab7 style: use consistent variable names (*mod) with imports which would shadow
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10547
diff changeset
1154 ms = mergemod.mergestate(self)
6888
7c36a4fb05a3 make commit fail when committing unresolved files
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 6884
diff changeset
1155 for f in changes[0]:
7c36a4fb05a3 make commit fail when committing unresolved files
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 6884
diff changeset
1156 if f in ms and ms[f] == 'u':
7c36a4fb05a3 make commit fail when committing unresolved files
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 6884
diff changeset
1157 raise util.Abort(_("unresolved merge conflicts "
13541
919174c0aaff Improve unresolved merge conflicts warning (issue2681)
Patrick Mezard <pmezard@gmail.com>
parents: 13526
diff changeset
1158 "(see hg help resolve)"))
8496
a21605de1509 commit: move editor outside transaction
Matt Mackall <mpm@selenic.com>
parents: 8481
diff changeset
1159
10969
ca052b484e56 context: remove parents parameter to workingctx
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10960
diff changeset
1160 cctx = context.workingctx(self, text, user, date, extra, changes)
8496
a21605de1509 commit: move editor outside transaction
Matt Mackall <mpm@selenic.com>
parents: 8481
diff changeset
1161 if editor:
8994
4a1187d3cb00 commit: report modified subrepos in commit editor
Matt Mackall <mpm@selenic.com>
parents: 8954
diff changeset
1162 cctx._text = editor(self, cctx, subs)
9935
48b81d9bca8d commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents: 9934
diff changeset
1163 edited = (text != cctx._text)
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
1164
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
1165 # commit subs
10522
b07d487009b2 subrepo: Update .hgsubstate in case of deleted subrepo
Saint Germain <saintger@gmail.com>
parents: 10519
diff changeset
1166 if subs or removedsubs:
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
1167 state = wctx.substate.copy()
12127
36a65283c3af commit: sort subrepos before committing for stable test output
Martin Geisler <mg@lazybytes.net>
parents: 12070
diff changeset
1168 for s in sorted(subs):
11112
4a9bee613737 subrepo: print paths relative to upper repo root for push/pull/commit
Edouard Gomez <ed.gomez@free.fr>
parents: 11063
diff changeset
1169 sub = wctx.sub(s)
4a9bee613737 subrepo: print paths relative to upper repo root for push/pull/commit
Edouard Gomez <ed.gomez@free.fr>
parents: 11063
diff changeset
1170 self.ui.status(_('committing subrepository %s\n') %
12752
18b5b6392fcf subrepo: rename relpath to subrelpath and introduce reporelpath
Mads Kiilerich <mads@kiilerich.com>
parents: 12708
diff changeset
1171 subrepo.subrelpath(sub))
11112
4a9bee613737 subrepo: print paths relative to upper repo root for push/pull/commit
Edouard Gomez <ed.gomez@free.fr>
parents: 11063
diff changeset
1172 sr = sub.commit(cctx._text, user, date)
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
1173 state[s] = (state[s][0], sr)
13172
84cec5895d01 subrepo: backout f02d7a562a21
Erik Zielke <ez@aragost.com>
parents: 13155
diff changeset
1174 subrepo.writestate(self, state)
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
1175
9934
720f70b720d3 commit: save commit message so it's not destroyed by rollback.
Greg Ward <greg-hg@gerg.ca>
parents: 9924
diff changeset
1176 # Save commit message in case this transaction gets rolled back
9949
bc3f762af82e commit: write last-message.txt with no content modifications.
Greg Ward <greg-hg@gerg.ca>
parents: 9935
diff changeset
1177 # (e.g. by a pretxncommit hook). Leave the content alone on
bc3f762af82e commit: write last-message.txt with no content modifications.
Greg Ward <greg-hg@gerg.ca>
parents: 9935
diff changeset
1178 # the assumption that the user will use the same editor again.
14529
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
1179 msgfn = self.savecommitmessage(cctx._text)
9934
720f70b720d3 commit: save commit message so it's not destroyed by rollback.
Greg Ward <greg-hg@gerg.ca>
parents: 9924
diff changeset
1180
10970
3213e8947975 localrepo.commit: use explicit variables, avoid creating new contexts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10969
diff changeset
1181 p1, p2 = self.dirstate.parents()
3213e8947975 localrepo.commit: use explicit variables, avoid creating new contexts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10969
diff changeset
1182 hookp1, hookp2 = hex(p1), (p2 != nullid and hex(p2) or '')
9935
48b81d9bca8d commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents: 9934
diff changeset
1183 try:
10492
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10435
diff changeset
1184 self.hook("precommit", throw=True, parent1=hookp1, parent2=hookp2)
9935
48b81d9bca8d commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents: 9934
diff changeset
1185 ret = self.commitctx(cctx, True)
48b81d9bca8d commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents: 9934
diff changeset
1186 except:
48b81d9bca8d commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents: 9934
diff changeset
1187 if edited:
48b81d9bca8d commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents: 9934
diff changeset
1188 self.ui.write(
48b81d9bca8d commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents: 9934
diff changeset
1189 _('note: commit message saved in %s\n') % msgfn)
48b81d9bca8d commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents: 9934
diff changeset
1190 raise
8496
a21605de1509 commit: move editor outside transaction
Matt Mackall <mpm@selenic.com>
parents: 8481
diff changeset
1191
13357
b67867940bd1 bookmarks: move commit action into core
Matt Mackall <mpm@selenic.com>
parents: 13356
diff changeset
1192 # update bookmarks, dirstate and mergestate
14498
4d958d1bb072 bookmarks: do not forward merged bookmark (issue1877)
David Soria Parra <dsp@php.net>
parents: 14266
diff changeset
1193 bookmarks.update(self, p1, ret)
8416
9dfee83c93c8 commit: hoist the rest of the dirstate manipulation out of commitctx
Matt Mackall <mpm@selenic.com>
parents: 8415
diff changeset
1194 for f in changes[0] + changes[1]:
9dfee83c93c8 commit: hoist the rest of the dirstate manipulation out of commitctx
Matt Mackall <mpm@selenic.com>
parents: 8415
diff changeset
1195 self.dirstate.normal(f)
9dfee83c93c8 commit: hoist the rest of the dirstate manipulation out of commitctx
Matt Mackall <mpm@selenic.com>
parents: 8415
diff changeset
1196 for f in changes[2]:
14434
cc8c09855d19 dirstate: rename forget to drop
Matt Mackall <mpm@selenic.com>
parents: 14365
diff changeset
1197 self.dirstate.drop(f)
8416
9dfee83c93c8 commit: hoist the rest of the dirstate manipulation out of commitctx
Matt Mackall <mpm@selenic.com>
parents: 8415
diff changeset
1198 self.dirstate.setparents(ret)
8503
90f86a5330bb commit: tidy up mergestate slightly
Matt Mackall <mpm@selenic.com>
parents: 8502
diff changeset
1199 ms.reset()
6710
0aa91f69a4c4 localrepo: extract _commitctx() from commit()
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
1200 finally:
8405
7cbf8fcd2453 commit: push repo lock down into _commitctx
Matt Mackall <mpm@selenic.com>
parents: 8404
diff changeset
1201 wlock.release()
6710
0aa91f69a4c4 localrepo: extract _commitctx() from commit()
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
1202
10492
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10435
diff changeset
1203 self.hook("commit", node=hex(ret), parent1=hookp1, parent2=hookp2)
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10435
diff changeset
1204 return ret
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10435
diff changeset
1205
8496
a21605de1509 commit: move editor outside transaction
Matt Mackall <mpm@selenic.com>
parents: 8481
diff changeset
1206 def commitctx(self, ctx, error=False):
7077
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7072
diff changeset
1207 """Add a new revision to current repository.
8410
1d11d985c179 commit: combine _commitctx and commitctx, drop unused force argument
Matt Mackall <mpm@selenic.com>
parents: 8407
diff changeset
1208 Revision information is passed via the context argument.
7077
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7072
diff changeset
1209 """
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6712
diff changeset
1210
8412
2bf4f380f6ab commitctx: eliminate some variables
Matt Mackall <mpm@selenic.com>
parents: 8411
diff changeset
1211 tr = lock = None
12899
fabe61418a53 localrepo: do not modify ctx.remove() list in-place
Patrick Mezard <pmezard@gmail.com>
parents: 12847
diff changeset
1212 removed = list(ctx.removed())
8414
2348ce25849b commitctx: use contexts more fully
Matt Mackall <mpm@selenic.com>
parents: 8412
diff changeset
1213 p1, p2 = ctx.p1(), ctx.p2()
8412
2bf4f380f6ab commitctx: eliminate some variables
Matt Mackall <mpm@selenic.com>
parents: 8411
diff changeset
1214 user = ctx.user()
990
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
1215
8411
4d5916358abd commit: move lots of commitctx outside of the repo lock
Matt Mackall <mpm@selenic.com>
parents: 8410
diff changeset
1216 lock = self.lock()
4d5916358abd commit: move lots of commitctx outside of the repo lock
Matt Mackall <mpm@selenic.com>
parents: 8410
diff changeset
1217 try:
10881
a685011ed38e localrepo: add desc parameter to transaction
Steve Borho <steve@borho.org>
parents: 10877
diff changeset
1218 tr = self.transaction("commit")
4970
30d4d8985dd8 transactions: avoid late tear-down (issue641)
Matt Mackall <mpm@selenic.com>
parents: 4917
diff changeset
1219 trp = weakref.proxy(tr)
151
1f6c61a60586 Bail on attempts to do an empty commit
mpm@selenic.com
parents: 149
diff changeset
1220
14162
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1221 if ctx.files():
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1222 m1 = p1.manifest().copy()
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1223 m2 = p2.manifest()
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1224
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1225 # check in files
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1226 new = {}
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1227 changed = []
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1228 linkrev = len(self)
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1229 for f in sorted(ctx.modified() + ctx.added()):
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1230 self.ui.note(f + "\n")
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1231 try:
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1232 fctx = ctx[f]
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1233 new[f] = self._filecommit(fctx, m1, m2, linkrev, trp,
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1234 changed)
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1235 m1.set(f, fctx.flags())
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1236 except OSError, inst:
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
1237 self.ui.warn(_("trouble committing %s!\n") % f)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
1238 raise
14162
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1239 except IOError, inst:
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1240 errcode = getattr(inst, 'errno', errno.ENOENT)
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1241 if error or errcode and errcode != errno.ENOENT:
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1242 self.ui.warn(_("trouble committing %s!\n") % f)
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1243 raise
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1244 else:
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1245 removed.append(f)
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
1246
14162
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1247 # update manifest
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1248 m1.update(new)
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1249 removed = [f for f in sorted(removed) if f in m1 or f in m2]
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1250 drop = [f for f in removed if f in m1]
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1251 for f in drop:
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1252 del m1[f]
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1253 mn = self.manifest.add(m1, trp, linkrev, p1.manifestnode(),
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1254 p2.manifestnode(), (new, drop))
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1255 files = changed + removed
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1256 else:
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1257 mn = p1.manifestnode()
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1258 files = []
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1259
8499
fb9b83df45f3 commit: move description trimming into changelog
Matt Mackall <mpm@selenic.com>
parents: 8498
diff changeset
1260 # update changelog
7787
b8d750daadde Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents: 7728
diff changeset
1261 self.changelog.delayupdate()
14162
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
1262 n = self.changelog.add(mn, files, ctx.description(),
8499
fb9b83df45f3 commit: move description trimming into changelog
Matt Mackall <mpm@selenic.com>
parents: 8498
diff changeset
1263 trp, p1.node(), p2.node(),
8412
2bf4f380f6ab commitctx: eliminate some variables
Matt Mackall <mpm@selenic.com>
parents: 8411
diff changeset
1264 user, ctx.date(), ctx.extra().copy())
7787
b8d750daadde Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents: 7728
diff changeset
1265 p = lambda: self.changelog.writepending() and self.root or ""
10492
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10435
diff changeset
1266 xp1, xp2 = p1.hex(), p2 and p2.hex() or ''
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
1267 self.hook('pretxncommit', throw=True, node=hex(n), parent1=xp1,
7787
b8d750daadde Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents: 7728
diff changeset
1268 parent2=xp2, pending=p)
b8d750daadde Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents: 7728
diff changeset
1269 self.changelog.finalize(trp)
15706
ebaefd8c6028 Add a phases.new-commit option to control minimal phase of new commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15659
diff changeset
1270 # set the new commit is proper phase
16030
308406677e9d phases: allow phase name in phases.new-commit settings
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16023
diff changeset
1271 targetphase = phases.newcommitphase(self.ui)
15706
ebaefd8c6028 Add a phases.new-commit option to control minimal phase of new commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15659
diff changeset
1272 if targetphase:
ebaefd8c6028 Add a phases.new-commit option to control minimal phase of new commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15659
diff changeset
1273 # retract boundary do not alter parent changeset.
ebaefd8c6028 Add a phases.new-commit option to control minimal phase of new commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15659
diff changeset
1274 # if a parent have higher the resulting phase will
ebaefd8c6028 Add a phases.new-commit option to control minimal phase of new commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15659
diff changeset
1275 # be compliant anyway
ebaefd8c6028 Add a phases.new-commit option to control minimal phase of new commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15659
diff changeset
1276 #
ebaefd8c6028 Add a phases.new-commit option to control minimal phase of new commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15659
diff changeset
1277 # if minimal phase was 0 we don't need to retract anything
ebaefd8c6028 Add a phases.new-commit option to control minimal phase of new commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15659
diff changeset
1278 phases.retractboundary(self, targetphase, [n])
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
1279 tr.close()
15886
a5917346c72e localrepo: update branchcache in a more reliable way
Mads Kiilerich <mads@kiilerich.com>
parents: 15884
diff changeset
1280 self.updatebranchcache()
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
1281 return n
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
1282 finally:
11230
5116a077c3da make transactions work on non-refcounted python implementations
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 11228
diff changeset
1283 if tr:
5116a077c3da make transactions work on non-refcounted python implementations
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 11228
diff changeset
1284 tr.release()
8405
7cbf8fcd2453 commit: push repo lock down into _commitctx
Matt Mackall <mpm@selenic.com>
parents: 8404
diff changeset
1285 lock.release()
660
2c83350784c3 Move commit hook after commit completes
Matt Mackall <mpm@selenic.com>
parents: 659
diff changeset
1286
9150
09a1ee498756 localrepo: add destroyed() method for strip/rollback to use (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9149
diff changeset
1287 def destroyed(self):
09a1ee498756 localrepo: add destroyed() method for strip/rollback to use (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9149
diff changeset
1288 '''Inform the repository that nodes have been destroyed.
09a1ee498756 localrepo: add destroyed() method for strip/rollback to use (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9149
diff changeset
1289 Intended for use by strip and rollback, so there's a common
09a1ee498756 localrepo: add destroyed() method for strip/rollback to use (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9149
diff changeset
1290 place for anything that has to be done after destroying history.'''
09a1ee498756 localrepo: add destroyed() method for strip/rollback to use (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9149
diff changeset
1291 # XXX it might be nice if we could take the list of destroyed
09a1ee498756 localrepo: add destroyed() method for strip/rollback to use (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9149
diff changeset
1292 # nodes, but I don't see an easy way for rollback() to do that
9151
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
1293
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
1294 # Ensure the persistent tag cache is updated. Doing it now
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
1295 # means that the tag cache only has to worry about destroyed
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
1296 # heads immediately after a strip/rollback. That in turn
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
1297 # guarantees that "cachetip == currenttip" (comparing both rev
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
1298 # and node) always means no nodes have been added or destroyed.
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
1299
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
1300 # XXX this is suboptimal when qrefresh'ing: we strip the current
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
1301 # head, refresh the tag cache, then immediately add a new head.
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
1302 # But I think doing it this way is necessary for the "instant
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
1303 # tag cache retrieval" case to work.
10547
bae9bb09166b strip: invalidate all caches after stripping (fixes issue1951)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10522
diff changeset
1304 self.invalidatecaches()
9150
09a1ee498756 localrepo: add destroyed() method for strip/rollback to use (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9149
diff changeset
1305
6585
d3d1d39da2fa walk: remove cmdutil.walk
Matt Mackall <mpm@selenic.com>
parents: 6583
diff changeset
1306 def walk(self, match, node=None):
3532
26b556c1d01d improve walk docstrings
Matt Mackall <mpm@selenic.com>
parents: 3513
diff changeset
1307 '''
26b556c1d01d improve walk docstrings
Matt Mackall <mpm@selenic.com>
parents: 3513
diff changeset
1308 walk recursively through the directory tree or a given
26b556c1d01d improve walk docstrings
Matt Mackall <mpm@selenic.com>
parents: 3513
diff changeset
1309 changeset, finding all files matched by the match
26b556c1d01d improve walk docstrings
Matt Mackall <mpm@selenic.com>
parents: 3513
diff changeset
1310 function
26b556c1d01d improve walk docstrings
Matt Mackall <mpm@selenic.com>
parents: 3513
diff changeset
1311 '''
6764
8db64464d136 context: add walk method
Matt Mackall <mpm@selenic.com>
parents: 6762
diff changeset
1312 return self[node].walk(match)
3532
26b556c1d01d improve walk docstrings
Matt Mackall <mpm@selenic.com>
parents: 3513
diff changeset
1313
6769
97c12b1ed1e0 status: use contexts
Matt Mackall <mpm@selenic.com>
parents: 6764
diff changeset
1314 def status(self, node1='.', node2=None, match=None,
12166
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
1315 ignored=False, clean=False, unknown=False,
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
1316 listsubrepos=False):
2661
5c10b7ed3411 status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2621
diff changeset
1317 """return status of files between two nodes or node and working directory
1616
f0f9e84849e7 Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1615
diff changeset
1318
f0f9e84849e7 Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1615
diff changeset
1319 If node1 is None, use the first dirstate parent instead.
f0f9e84849e7 Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1615
diff changeset
1320 If node2 is None, compare node1 with working directory.
f0f9e84849e7 Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1615
diff changeset
1321 """
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1322
6769
97c12b1ed1e0 status: use contexts
Matt Mackall <mpm@selenic.com>
parents: 6764
diff changeset
1323 def mfmatches(ctx):
97c12b1ed1e0 status: use contexts
Matt Mackall <mpm@selenic.com>
parents: 6764
diff changeset
1324 mf = ctx.manifest().copy()
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
1325 for fn in mf.keys():
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
1326 if not match(fn):
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
1327 del mf[fn]
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
1328 return mf
741
156dc2f3be7f Fix some line wrapping
mpm@selenic.com
parents: 740
diff changeset
1329
7090
7b5c063b0b94 diff: pass contexts to status
Matt Mackall <mpm@selenic.com>
parents: 7077
diff changeset
1330 if isinstance(node1, context.changectx):
7b5c063b0b94 diff: pass contexts to status
Matt Mackall <mpm@selenic.com>
parents: 7077
diff changeset
1331 ctx1 = node1
7b5c063b0b94 diff: pass contexts to status
Matt Mackall <mpm@selenic.com>
parents: 7077
diff changeset
1332 else:
7b5c063b0b94 diff: pass contexts to status
Matt Mackall <mpm@selenic.com>
parents: 7077
diff changeset
1333 ctx1 = self[node1]
7b5c063b0b94 diff: pass contexts to status
Matt Mackall <mpm@selenic.com>
parents: 7077
diff changeset
1334 if isinstance(node2, context.changectx):
7b5c063b0b94 diff: pass contexts to status
Matt Mackall <mpm@selenic.com>
parents: 7077
diff changeset
1335 ctx2 = node2
7b5c063b0b94 diff: pass contexts to status
Matt Mackall <mpm@selenic.com>
parents: 7077
diff changeset
1336 else:
7b5c063b0b94 diff: pass contexts to status
Matt Mackall <mpm@selenic.com>
parents: 7077
diff changeset
1337 ctx2 = self[node2]
7b5c063b0b94 diff: pass contexts to status
Matt Mackall <mpm@selenic.com>
parents: 7077
diff changeset
1338
7435
5e13df32fb74 bundlerepo doesn't really have a dirstate, throw AttributeError if requested
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7415
diff changeset
1339 working = ctx2.rev() is None
6769
97c12b1ed1e0 status: use contexts
Matt Mackall <mpm@selenic.com>
parents: 6764
diff changeset
1340 parentworking = working and ctx1 == self['.']
10651
5f091fc1bab7 style: use consistent variable names (*mod) with imports which would shadow
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10547
diff changeset
1341 match = match or matchmod.always(self.root, self.getcwd())
6753
ed5ffb2c12f3 repo.status: eliminate list_
Matt Mackall <mpm@selenic.com>
parents: 6750
diff changeset
1342 listignored, listclean, listunknown = ignored, clean, unknown
2474
1e32e2fe8a67 Fix cold cache diff performance
Chris Mason <mason@suse.com>
parents: 2463
diff changeset
1343
7090
7b5c063b0b94 diff: pass contexts to status
Matt Mackall <mpm@selenic.com>
parents: 7077
diff changeset
1344 # load earliest manifest first for caching reasons
7b5c063b0b94 diff: pass contexts to status
Matt Mackall <mpm@selenic.com>
parents: 7077
diff changeset
1345 if not working and ctx2.rev() < ctx1.rev():
7b5c063b0b94 diff: pass contexts to status
Matt Mackall <mpm@selenic.com>
parents: 7077
diff changeset
1346 ctx2.manifest()
7b5c063b0b94 diff: pass contexts to status
Matt Mackall <mpm@selenic.com>
parents: 7077
diff changeset
1347
7067
40d105a12cac status: don't warn about missing files present in base revision (issue1323)
Matt Mackall <mpm@selenic.com>
parents: 7064
diff changeset
1348 if not parentworking:
40d105a12cac status: don't warn about missing files present in base revision (issue1323)
Matt Mackall <mpm@selenic.com>
parents: 7064
diff changeset
1349 def bad(f, msg):
40d105a12cac status: don't warn about missing files present in base revision (issue1323)
Matt Mackall <mpm@selenic.com>
parents: 7064
diff changeset
1350 if f not in ctx1:
40d105a12cac status: don't warn about missing files present in base revision (issue1323)
Matt Mackall <mpm@selenic.com>
parents: 7064
diff changeset
1351 self.ui.warn('%s: %s\n' % (self.dirstate.pathto(f), msg))
40d105a12cac status: don't warn about missing files present in base revision (issue1323)
Matt Mackall <mpm@selenic.com>
parents: 7064
diff changeset
1352 match.bad = bad
40d105a12cac status: don't warn about missing files present in base revision (issue1323)
Matt Mackall <mpm@selenic.com>
parents: 7064
diff changeset
1353
6770
854b907527e5 status: various cleanups
Matt Mackall <mpm@selenic.com>
parents: 6769
diff changeset
1354 if working: # we need to scan the working dir
11227
054549ccb680 status: avoid performance regression when no .hgsub is present
Matt Mackall <mpm@selenic.com>
parents: 11154
diff changeset
1355 subrepos = []
054549ccb680 status: avoid performance regression when no .hgsub is present
Matt Mackall <mpm@selenic.com>
parents: 11154
diff changeset
1356 if '.hgsub' in self.dirstate:
14870
f73c7b70df68 subrepo: use working copy of .hgsub to filter status (issue2901)
Matt Mackall <mpm@selenic.com>
parents: 14825
diff changeset
1357 subrepos = ctx2.substate.keys()
10176
24ce8f0c0a39 dirstate: don't check state of subrepo directories
Augie Fackler <durin42@gmail.com>
parents: 10011
diff changeset
1358 s = self.dirstate.status(match, subrepos, listignored,
24ce8f0c0a39 dirstate: don't check state of subrepo directories
Augie Fackler <durin42@gmail.com>
parents: 10011
diff changeset
1359 listclean, listunknown)
6770
854b907527e5 status: various cleanups
Matt Mackall <mpm@selenic.com>
parents: 6769
diff changeset
1360 cmp, modified, added, removed, deleted, unknown, ignored, clean = s
536
c15b4bc0a11c Refactor diffrevs/diffdir into changes
mpm@selenic.com
parents: 529
diff changeset
1361
6770
854b907527e5 status: various cleanups
Matt Mackall <mpm@selenic.com>
parents: 6769
diff changeset
1362 # check for any possibly clean files
854b907527e5 status: various cleanups
Matt Mackall <mpm@selenic.com>
parents: 6769
diff changeset
1363 if parentworking and cmp:
854b907527e5 status: various cleanups
Matt Mackall <mpm@selenic.com>
parents: 6769
diff changeset
1364 fixup = []
854b907527e5 status: various cleanups
Matt Mackall <mpm@selenic.com>
parents: 6769
diff changeset
1365 # do a full compare of any files that might have changed
8395
475552c03496 status: check cmp list in order
Matt Mackall <mpm@selenic.com>
parents: 8393
diff changeset
1366 for f in sorted(cmp):
6770
854b907527e5 status: various cleanups
Matt Mackall <mpm@selenic.com>
parents: 6769
diff changeset
1367 if (f not in ctx1 or ctx2.flags(f) != ctx1.flags(f)
11702
eb07fbc21e9c filectx: use cmp(self, fctx) instead of cmp(self, text)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11698
diff changeset
1368 or ctx1[f].cmp(ctx2[f])):
6770
854b907527e5 status: various cleanups
Matt Mackall <mpm@selenic.com>
parents: 6769
diff changeset
1369 modified.append(f)
854b907527e5 status: various cleanups
Matt Mackall <mpm@selenic.com>
parents: 6769
diff changeset
1370 else:
854b907527e5 status: various cleanups
Matt Mackall <mpm@selenic.com>
parents: 6769
diff changeset
1371 fixup.append(f)
854b907527e5 status: various cleanups
Matt Mackall <mpm@selenic.com>
parents: 6769
diff changeset
1372
854b907527e5 status: various cleanups
Matt Mackall <mpm@selenic.com>
parents: 6769
diff changeset
1373 # update dirstate for files that are actually clean
854b907527e5 status: various cleanups
Matt Mackall <mpm@selenic.com>
parents: 6769
diff changeset
1374 if fixup:
11669
c47cb3193c53 localrepo.status: move fixup concatenation inside if block for clarity
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11665
diff changeset
1375 if listclean:
c47cb3193c53 localrepo.status: move fixup concatenation inside if block for clarity
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11665
diff changeset
1376 clean += fixup
c47cb3193c53 localrepo.status: move fixup concatenation inside if block for clarity
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11665
diff changeset
1377
6770
854b907527e5 status: various cleanups
Matt Mackall <mpm@selenic.com>
parents: 6769
diff changeset
1378 try:
8647
cb74433f9b41 localrepo: move comment
Adrian Buehlmann <adrian@cadifra.com>
parents: 8646
diff changeset
1379 # updating the dirstate is optional
cb74433f9b41 localrepo: move comment
Adrian Buehlmann <adrian@cadifra.com>
parents: 8646
diff changeset
1380 # so we don't wait on the lock
8646
60f9e574b6eb localrepo: use lock.release for single lock
Simon Heimberg <simohe@besonet.ch>
parents: 8639
diff changeset
1381 wlock = self.wlock(False)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
1382 try:
6770
854b907527e5 status: various cleanups
Matt Mackall <mpm@selenic.com>
parents: 6769
diff changeset
1383 for f in fixup:
854b907527e5 status: various cleanups
Matt Mackall <mpm@selenic.com>
parents: 6769
diff changeset
1384 self.dirstate.normal(f)
8646
60f9e574b6eb localrepo: use lock.release for single lock
Simon Heimberg <simohe@besonet.ch>
parents: 8639
diff changeset
1385 finally:
60f9e574b6eb localrepo: use lock.release for single lock
Simon Heimberg <simohe@besonet.ch>
parents: 8639
diff changeset
1386 wlock.release()
60f9e574b6eb localrepo: use lock.release for single lock
Simon Heimberg <simohe@besonet.ch>
parents: 8639
diff changeset
1387 except error.LockError:
60f9e574b6eb localrepo: use lock.release for single lock
Simon Heimberg <simohe@besonet.ch>
parents: 8639
diff changeset
1388 pass
2661
5c10b7ed3411 status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2621
diff changeset
1389
6769
97c12b1ed1e0 status: use contexts
Matt Mackall <mpm@selenic.com>
parents: 6764
diff changeset
1390 if not parentworking:
97c12b1ed1e0 status: use contexts
Matt Mackall <mpm@selenic.com>
parents: 6764
diff changeset
1391 mf1 = mfmatches(ctx1)
6770
854b907527e5 status: various cleanups
Matt Mackall <mpm@selenic.com>
parents: 6769
diff changeset
1392 if working:
1616
f0f9e84849e7 Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1615
diff changeset
1393 # we are comparing working dir against non-parent
f0f9e84849e7 Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1615
diff changeset
1394 # generate a pseudo-manifest for the working dir
6769
97c12b1ed1e0 status: use contexts
Matt Mackall <mpm@selenic.com>
parents: 6764
diff changeset
1395 mf2 = mfmatches(self['.'])
6770
854b907527e5 status: various cleanups
Matt Mackall <mpm@selenic.com>
parents: 6769
diff changeset
1396 for f in cmp + modified + added:
6769
97c12b1ed1e0 status: use contexts
Matt Mackall <mpm@selenic.com>
parents: 6764
diff changeset
1397 mf2[f] = None
6817
cf319797d61c minor status fixups
Matt Mackall <mpm@selenic.com>
parents: 6810
diff changeset
1398 mf2.set(f, ctx2.flags(f))
1617
ece5d785e87a Make localrepo.changes() internally distinguish between removed and deleted.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1616
diff changeset
1399 for f in removed:
1616
f0f9e84849e7 Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1615
diff changeset
1400 if f in mf2:
f0f9e84849e7 Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1615
diff changeset
1401 del mf2[f]
6770
854b907527e5 status: various cleanups
Matt Mackall <mpm@selenic.com>
parents: 6769
diff changeset
1402 else:
854b907527e5 status: various cleanups
Matt Mackall <mpm@selenic.com>
parents: 6769
diff changeset
1403 # we are comparing two revisions
854b907527e5 status: various cleanups
Matt Mackall <mpm@selenic.com>
parents: 6769
diff changeset
1404 deleted, unknown, ignored = [], [], []
854b907527e5 status: various cleanups
Matt Mackall <mpm@selenic.com>
parents: 6769
diff changeset
1405 mf2 = mfmatches(ctx2)
4372
4ddc6d374265 localrepository.status: only acquire wlock if actually needed.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4335
diff changeset
1406
2661
5c10b7ed3411 status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2621
diff changeset
1407 modified, added, clean = [], [], []
6827
c978d6752dbb dirstate.walk: push sorting up
Matt Mackall <mpm@selenic.com>
parents: 6817
diff changeset
1408 for fn in mf2:
5915
d0576d065993 Prefer i in d over d.has_key(i)
Christian Ebert <blacktrash@gmx.net>
parents: 5913
diff changeset
1409 if fn in mf1:
14500
e880433a2e00 localrepo: don't add deleted files to list of modified/added files (issue2761)
Idan Kamara <idankk86@gmail.com>
parents: 14499
diff changeset
1410 if (fn not in deleted and
e880433a2e00 localrepo: don't add deleted files to list of modified/added files (issue2761)
Idan Kamara <idankk86@gmail.com>
parents: 14499
diff changeset
1411 (mf1.flags(fn) != mf2.flags(fn) or
e880433a2e00 localrepo: don't add deleted files to list of modified/added files (issue2761)
Idan Kamara <idankk86@gmail.com>
parents: 14499
diff changeset
1412 (mf1[fn] != mf2[fn] and
e880433a2e00 localrepo: don't add deleted files to list of modified/added files (issue2761)
Idan Kamara <idankk86@gmail.com>
parents: 14499
diff changeset
1413 (mf2[fn] or ctx1[fn].cmp(ctx2[fn]))))):
1616
f0f9e84849e7 Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1615
diff changeset
1414 modified.append(fn)
6753
ed5ffb2c12f3 repo.status: eliminate list_
Matt Mackall <mpm@selenic.com>
parents: 6750
diff changeset
1415 elif listclean:
2661
5c10b7ed3411 status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2621
diff changeset
1416 clean.append(fn)
1616
f0f9e84849e7 Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1615
diff changeset
1417 del mf1[fn]
14500
e880433a2e00 localrepo: don't add deleted files to list of modified/added files (issue2761)
Idan Kamara <idankk86@gmail.com>
parents: 14499
diff changeset
1418 elif fn not in deleted:
1616
f0f9e84849e7 Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1615
diff changeset
1419 added.append(fn)
1617
ece5d785e87a Make localrepo.changes() internally distinguish between removed and deleted.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1616
diff changeset
1420 removed = mf1.keys()
ece5d785e87a Make localrepo.changes() internally distinguish between removed and deleted.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1616
diff changeset
1421
15348
c681e478c429 windows: sanity-check symlink placeholders
Matt Mackall <mpm@selenic.com>
parents: 15321
diff changeset
1422 if working and modified and not self.dirstate._checklink:
c681e478c429 windows: sanity-check symlink placeholders
Matt Mackall <mpm@selenic.com>
parents: 15321
diff changeset
1423 # Symlink placeholders may get non-symlink-like contents
c681e478c429 windows: sanity-check symlink placeholders
Matt Mackall <mpm@selenic.com>
parents: 15321
diff changeset
1424 # via user error or dereferencing by NFS or Samba servers,
c681e478c429 windows: sanity-check symlink placeholders
Matt Mackall <mpm@selenic.com>
parents: 15321
diff changeset
1425 # so we filter out any placeholders that don't look like a
c681e478c429 windows: sanity-check symlink placeholders
Matt Mackall <mpm@selenic.com>
parents: 15321
diff changeset
1426 # symlink
c681e478c429 windows: sanity-check symlink placeholders
Matt Mackall <mpm@selenic.com>
parents: 15321
diff changeset
1427 sane = []
c681e478c429 windows: sanity-check symlink placeholders
Matt Mackall <mpm@selenic.com>
parents: 15321
diff changeset
1428 for f in modified:
c681e478c429 windows: sanity-check symlink placeholders
Matt Mackall <mpm@selenic.com>
parents: 15321
diff changeset
1429 if ctx2.flags(f) == 'l':
c681e478c429 windows: sanity-check symlink placeholders
Matt Mackall <mpm@selenic.com>
parents: 15321
diff changeset
1430 d = ctx2[f].data()
c681e478c429 windows: sanity-check symlink placeholders
Matt Mackall <mpm@selenic.com>
parents: 15321
diff changeset
1431 if len(d) >= 1024 or '\n' in d or util.binary(d):
c681e478c429 windows: sanity-check symlink placeholders
Matt Mackall <mpm@selenic.com>
parents: 15321
diff changeset
1432 self.ui.debug('ignoring suspect symlink placeholder'
c681e478c429 windows: sanity-check symlink placeholders
Matt Mackall <mpm@selenic.com>
parents: 15321
diff changeset
1433 ' "%s"\n' % f)
c681e478c429 windows: sanity-check symlink placeholders
Matt Mackall <mpm@selenic.com>
parents: 15321
diff changeset
1434 continue
c681e478c429 windows: sanity-check symlink placeholders
Matt Mackall <mpm@selenic.com>
parents: 15321
diff changeset
1435 sane.append(f)
c681e478c429 windows: sanity-check symlink placeholders
Matt Mackall <mpm@selenic.com>
parents: 15321
diff changeset
1436 modified = sane
c681e478c429 windows: sanity-check symlink placeholders
Matt Mackall <mpm@selenic.com>
parents: 15321
diff changeset
1437
6827
c978d6752dbb dirstate.walk: push sorting up
Matt Mackall <mpm@selenic.com>
parents: 6817
diff changeset
1438 r = modified, added, removed, deleted, unknown, ignored, clean
12166
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
1439
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
1440 if listsubrepos:
12176
ecab10820983 subrepos: add function for iterating over ctx subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12175
diff changeset
1441 for subpath, sub in subrepo.itersubrepos(ctx1, ctx2):
12166
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
1442 if working:
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
1443 rev2 = None
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
1444 else:
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
1445 rev2 = ctx2.substate[subpath][1]
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
1446 try:
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
1447 submatch = matchmod.narrowmatcher(subpath, match)
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
1448 s = sub.status(rev2, match=submatch, ignored=listignored,
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
1449 clean=listclean, unknown=listunknown,
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
1450 listsubrepos=True)
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
1451 for rfiles, sfiles in zip(r, s):
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
1452 rfiles.extend("%s/%s" % (subpath, f) for f in sfiles)
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
1453 except error.LookupError:
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
1454 self.ui.status(_("skipping missing subrepository: %s\n")
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
1455 % subpath)
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
1456
13412
58c497d0e44d remove unnecessary list comprehensions
Martin Geisler <mg@aragost.com>
parents: 13411
diff changeset
1457 for l in r:
58c497d0e44d remove unnecessary list comprehensions
Martin Geisler <mg@aragost.com>
parents: 13411
diff changeset
1458 l.sort()
6827
c978d6752dbb dirstate.walk: push sorting up
Matt Mackall <mpm@selenic.com>
parents: 6817
diff changeset
1459 return r
2661
5c10b7ed3411 status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2621
diff changeset
1460
8796
2bcef677a6c3 localrepo: remove 'closed' argument to heads(...) function
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 8731
diff changeset
1461 def heads(self, start=None):
1550
ccb9b62de892 add a -r/--rev option to heads to show only heads descendant from rev
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1532
diff changeset
1462 heads = self.changelog.heads(start)
ccb9b62de892 add a -r/--rev option to heads to show only heads descendant from rev
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1532
diff changeset
1463 # sort the output in rev descending order
13075
d73c3034deee coding style: fix gratuitous whitespace after Python keywords
Thomas Arendsen Hein <thomas@jtah.de>
parents: 13047
diff changeset
1464 return sorted(heads, key=self.changelog.rev, reverse=True)
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
1465
8694
ca8d05e1f1d1 localrepo: set heads and branchheads to be closed=False by default
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 8680
diff changeset
1466 def branchheads(self, branch=None, start=None, closed=False):
9475
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
1467 '''return a (possibly filtered) list of heads for the given branch
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
1468
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
1469 Heads are returned in topological order, from newest to oldest.
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
1470 If branch is None, use the dirstate branch.
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
1471 If start is not None, return only heads reachable from start.
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
1472 If closed is True, return heads that are marked as closed as well.
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
1473 '''
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
1474 if branch is None:
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
1475 branch = self[None].branch()
9675
ee913987e4b0 localrepo/branchcache: remove lbranchmap(), convert users to use utf-8 names
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9674
diff changeset
1476 branches = self.branchmap()
4648
8e503fa54d2d Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents: 4635
diff changeset
1477 if branch not in branches:
8e503fa54d2d Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents: 4635
diff changeset
1478 return []
7654
816b708f23af store all heads of a branch in the branch cache
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7644
diff changeset
1479 # the cache returns heads ordered lowest to highest
9475
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
1480 bheads = list(reversed(branches[branch]))
4648
8e503fa54d2d Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents: 4635
diff changeset
1481 if start is not None:
7654
816b708f23af store all heads of a branch in the branch cache
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7644
diff changeset
1482 # filter out the heads that cannot be reached from startrev
9475
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
1483 fbheads = set(self.changelog.nodesbetween([start], bheads)[2])
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
1484 bheads = [h for h in bheads if h in fbheads]
7656
6a24fb994701 branch closing: referencing open and closed branches/heads
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7655
diff changeset
1485 if not closed:
7670
e5f445c94226 kill some trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7656
diff changeset
1486 bheads = [h for h in bheads if
7656
6a24fb994701 branch closing: referencing open and closed branches/heads
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7655
diff changeset
1487 ('close' not in self.changelog.read(h)[5])]
7654
816b708f23af store all heads of a branch in the branch cache
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7644
diff changeset
1488 return bheads
4648
8e503fa54d2d Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents: 4635
diff changeset
1489
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1490 def branches(self, nodes):
1615
83238c1db6de Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1597
diff changeset
1491 if not nodes:
83238c1db6de Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1597
diff changeset
1492 nodes = [self.changelog.tip()]
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1493 b = []
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1494 for n in nodes:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1495 t = n
14494
1ffeeb91c55d check-code: flag 0/1 used as constant Boolean expression
Martin Geisler <mg@lazybytes.net>
parents: 14482
diff changeset
1496 while True:
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1497 p = self.changelog.parents(n)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1498 if p[1] != nullid or p[0] == nullid:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1499 b.append((t, n, p[0], p[1]))
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1500 break
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1501 n = p[0]
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1502 return b
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1503
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1504 def between(self, pairs):
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1505 r = []
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1506
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1507 for top, bottom in pairs:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1508 n, l, i = top, [], 0
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1509 f = 1
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1510
7708
a32847fa0df0 wire protocol: avoid infinite loop (issue1483)
Matt Mackall <mpm@selenic.com>
parents: 7564
diff changeset
1511 while n != bottom and n != nullid:
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1512 p = self.changelog.parents(n)[0]
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1513 if i == f:
575
7f5ce4bbdd7b More whitespace cleanups
mpm@selenic.com
parents: 566
diff changeset
1514 l.append(n)
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1515 f = f * 2
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1516 n = p
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1517 i += 1
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1518
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1519 r.append(l)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1520
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1521 return r
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
1522
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4916
diff changeset
1523 def pull(self, remote, heads=None, force=False):
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4916
diff changeset
1524 lock = self.lock()
2827
2a0c599f7bb0 fetch: hold lock and wlock across all operations
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2803
diff changeset
1525 try:
11301
3d0591a66118 move discovery methods from localrepo into new discovery module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11230
diff changeset
1526 tmp = discovery.findcommonincoming(self, remote, heads=heads,
3d0591a66118 move discovery methods from localrepo into new discovery module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11230
diff changeset
1527 force=force)
3d0591a66118 move discovery methods from localrepo into new discovery module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11230
diff changeset
1528 common, fetch, rheads = tmp
2827
2a0c599f7bb0 fetch: hold lock and wlock across all operations
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2803
diff changeset
1529 if not fetch:
2a0c599f7bb0 fetch: hold lock and wlock across all operations
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2803
diff changeset
1530 self.ui.status(_("no changes found\n"))
15650
5b26667fc4d3 phases: exchange phase boundaries on pull
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15646
diff changeset
1531 added = []
13364
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1532 result = 0
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1533 else:
13742
7abab875e647 discovery: avoid discovery when local graph is a subset of remote
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13741
diff changeset
1534 if heads is None and list(common) == [nullid]:
13364
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1535 self.ui.status(_("requesting all changes\n"))
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1536 elif heads is None and remote.capable('changegroupsubset'):
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1537 # issue1320, avoid a race if remote changed after discovery
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1538 heads = rheads
7415
6163ef936a00 protocol: use changegroupsubset() if possible (issue1389)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7377
diff changeset
1539
14073
72c84f24b420 discovery: drop findoutgoing and simplify findcommonincoming's api
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14064
diff changeset
1540 if remote.capable('getbundle'):
13742
7abab875e647 discovery: avoid discovery when local graph is a subset of remote
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13741
diff changeset
1541 cg = remote.getbundle('pull', common=common,
7abab875e647 discovery: avoid discovery when local graph is a subset of remote
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13741
diff changeset
1542 heads=heads or rheads)
7abab875e647 discovery: avoid discovery when local graph is a subset of remote
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13741
diff changeset
1543 elif heads is None:
13364
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1544 cg = remote.changegroup(fetch, 'pull')
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1545 elif not remote.capable('changegroupsubset'):
12067
a4fbbe0fbc38 Lowercase error messages
Martin Geisler <mg@lazybytes.net>
parents: 11640
diff changeset
1546 raise util.Abort(_("partial pull cannot be done because "
13364
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1547 "other repository doesn't support "
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1548 "changegroupsubset."))
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1549 else:
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1550 cg = remote.changegroupsubset(fetch, heads, 'pull')
15650
5b26667fc4d3 phases: exchange phase boundaries on pull
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15646
diff changeset
1551 clstart = len(self.changelog)
15585
a348739da8f0 addchangegroup: remove the lock argument on the addchangegroup methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15584
diff changeset
1552 result = self.addchangegroup(cg, 'pull', remote.url())
15650
5b26667fc4d3 phases: exchange phase boundaries on pull
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15646
diff changeset
1553 clend = len(self.changelog)
5b26667fc4d3 phases: exchange phase boundaries on pull
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15646
diff changeset
1554 added = [self.changelog.node(r) for r in xrange(clstart, clend)]
5b26667fc4d3 phases: exchange phase boundaries on pull
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15646
diff changeset
1555
15956
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1556 # compute target subset
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1557 if heads is None:
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1558 # We pulled every thing possible
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1559 # sync on everything common
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1560 subset = common + added
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1561 else:
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1562 # We pulled a specific subset
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1563 # sync on this subset
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1564 subset = heads
15650
5b26667fc4d3 phases: exchange phase boundaries on pull
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15646
diff changeset
1565
5b26667fc4d3 phases: exchange phase boundaries on pull
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15646
diff changeset
1566 # Get remote phases data from remote
5b26667fc4d3 phases: exchange phase boundaries on pull
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15646
diff changeset
1567 remotephases = remote.listkeys('phases')
5b26667fc4d3 phases: exchange phase boundaries on pull
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15646
diff changeset
1568 publishing = bool(remotephases.get('publishing', False))
5b26667fc4d3 phases: exchange phase boundaries on pull
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15646
diff changeset
1569 if remotephases and not publishing:
5b26667fc4d3 phases: exchange phase boundaries on pull
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15646
diff changeset
1570 # remote is new and unpublishing
15892
592b3d1742a1 phases: simplify phase exchange and movement over pushkey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15891
diff changeset
1571 pheads, _dr = phases.analyzeremotephases(self, subset,
592b3d1742a1 phases: simplify phase exchange and movement over pushkey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15891
diff changeset
1572 remotephases)
592b3d1742a1 phases: simplify phase exchange and movement over pushkey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15891
diff changeset
1573 phases.advanceboundary(self, phases.public, pheads)
15956
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1574 phases.advanceboundary(self, phases.draft, subset)
15650
5b26667fc4d3 phases: exchange phase boundaries on pull
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15646
diff changeset
1575 else:
5b26667fc4d3 phases: exchange phase boundaries on pull
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15646
diff changeset
1576 # Remote is old or publishing all common changesets
5b26667fc4d3 phases: exchange phase boundaries on pull
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15646
diff changeset
1577 # should be seen as public
15956
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1578 phases.advanceboundary(self, phases.public, subset)
2827
2a0c599f7bb0 fetch: hold lock and wlock across all operations
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2803
diff changeset
1579 finally:
8109
496ae1ea4698 switch lock releasing in the core from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8108
diff changeset
1580 lock.release()
622
e9fe5d5e67f7 Add generic repo commands for pull and push
Matt Mackall <mpm@selenic.com>
parents: 621
diff changeset
1581
13364
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1582 return result
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1583
13327
dc11e30b48a3 mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents: 13272
diff changeset
1584 def checkpush(self, force, revs):
dc11e30b48a3 mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents: 13272
diff changeset
1585 """Extensions can override this function if additional checks have
dc11e30b48a3 mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents: 13272
diff changeset
1586 to be performed before pushing, or call it if they override push
dc11e30b48a3 mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents: 13272
diff changeset
1587 command.
dc11e30b48a3 mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents: 13272
diff changeset
1588 """
dc11e30b48a3 mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents: 13272
diff changeset
1589 pass
dc11e30b48a3 mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents: 13272
diff changeset
1590
11211
e43c23d189a5 push: add --new-branch option to allow intial push of new branches
Sune Foldager <cryo@cyanite.org>
parents: 11177
diff changeset
1591 def push(self, remote, force=False, revs=None, newbranch=False):
11153
9936ed1d04f4 push: document return values between various repo methods.
Greg Ward <greg-hg@gerg.ca>
parents: 11112
diff changeset
1592 '''Push outgoing changesets (limited by revs) from the current
9936ed1d04f4 push: document return values between various repo methods.
Greg Ward <greg-hg@gerg.ca>
parents: 11112
diff changeset
1593 repository to remote. Return an integer:
16023
90f8b8dd0326 push: return 1 if no changes found (issue3228)
Matt Mackall <mpm@selenic.com>
parents: 16020
diff changeset
1594 - None means nothing to push
90f8b8dd0326 push: return 1 if no changes found (issue3228)
Matt Mackall <mpm@selenic.com>
parents: 16020
diff changeset
1595 - 0 means HTTP error
11153
9936ed1d04f4 push: document return values between various repo methods.
Greg Ward <greg-hg@gerg.ca>
parents: 11112
diff changeset
1596 - 1 means we pushed and remote head count is unchanged *or*
9936ed1d04f4 push: document return values between various repo methods.
Greg Ward <greg-hg@gerg.ca>
parents: 11112
diff changeset
1597 we have outgoing changesets but refused to push
9936ed1d04f4 push: document return values between various repo methods.
Greg Ward <greg-hg@gerg.ca>
parents: 11112
diff changeset
1598 - other values as described by addchangegroup()
9936ed1d04f4 push: document return values between various repo methods.
Greg Ward <greg-hg@gerg.ca>
parents: 11112
diff changeset
1599 '''
2439
e8c4f3d3df8c extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2424
diff changeset
1600 # there are two ways to push to remote repo:
e8c4f3d3df8c extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2424
diff changeset
1601 #
e8c4f3d3df8c extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2424
diff changeset
1602 # addchangegroup assumes local user can lock remote
e8c4f3d3df8c extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2424
diff changeset
1603 # repo (local filesystem, old ssh servers).
e8c4f3d3df8c extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2424
diff changeset
1604 #
e8c4f3d3df8c extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2424
diff changeset
1605 # unbundle assumes local user cannot lock remote repo (new ssh
e8c4f3d3df8c extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2424
diff changeset
1606 # servers, http servers).
816
8674b7803714 Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents: 814
diff changeset
1607
15952
ec8a9e06cf05 mq-safety: don't apply safety on non-outgoing changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15933
diff changeset
1608 # get local lock as we might write phase data
ec8a9e06cf05 mq-safety: don't apply safety on non-outgoing changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15933
diff changeset
1609 locallock = self.lock()
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
1610 try:
15952
ec8a9e06cf05 mq-safety: don't apply safety on non-outgoing changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15933
diff changeset
1611 self.checkpush(force, revs)
ec8a9e06cf05 mq-safety: don't apply safety on non-outgoing changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15933
diff changeset
1612 lock = None
ec8a9e06cf05 mq-safety: don't apply safety on non-outgoing changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15933
diff changeset
1613 unbundle = remote.capable('unbundle')
ec8a9e06cf05 mq-safety: don't apply safety on non-outgoing changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15933
diff changeset
1614 if not unbundle:
ec8a9e06cf05 mq-safety: don't apply safety on non-outgoing changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15933
diff changeset
1615 lock = remote.lock()
15485
fa47291b3f1f phases: mark content pushed as public in local repo on push
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15484
diff changeset
1616 try:
15932
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1617 # discovery
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1618 fci = discovery.findcommonincoming
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1619 commoninc = fci(self, remote, force=force)
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1620 common, inc, remoteheads = commoninc
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1621 fco = discovery.findcommonoutgoing
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1622 outgoing = fco(self, remote, onlyheads=revs,
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1623 commoninc=commoninc, force=force)
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1624
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1625
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1626 if not outgoing.missing:
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1627 # nothing to push
15993
0b05e0bfdc1c scmutil: unify some 'no changes found' messages
Matt Mackall <mpm@selenic.com>
parents: 15988
diff changeset
1628 scmutil.nochangesfound(self.ui, outgoing.excluded)
16023
90f8b8dd0326 push: return 1 if no changes found (issue3228)
Matt Mackall <mpm@selenic.com>
parents: 16020
diff changeset
1629 ret = None
15932
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1630 else:
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1631 # something to push
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1632 if not force:
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1633 discovery.checkheads(self, remote, outgoing,
15986
ba959f6e10f8 discovery: fix regression when checking heads for pre 1.4 client (issue3218)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15956
diff changeset
1634 remoteheads, newbranch,
ba959f6e10f8 discovery: fix regression when checking heads for pre 1.4 client (issue3218)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15956
diff changeset
1635 bool(inc))
15932
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1636
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1637 # create a changegroup from local
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1638 if revs is None and not outgoing.excluded:
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1639 # push everything,
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1640 # use the fast path, no race possible on push
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1641 cg = self._changegroup(outgoing.missing, 'push')
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1642 else:
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1643 cg = self.getlocalbundle('push', outgoing)
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1644
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1645 # apply changegroup to remote
15485
fa47291b3f1f phases: mark content pushed as public in local repo on push
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15484
diff changeset
1646 if unbundle:
fa47291b3f1f phases: mark content pushed as public in local repo on push
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15484
diff changeset
1647 # local repo finds heads on server, finds out what
fa47291b3f1f phases: mark content pushed as public in local repo on push
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15484
diff changeset
1648 # revs it must push. once revs transferred, if server
fa47291b3f1f phases: mark content pushed as public in local repo on push
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15484
diff changeset
1649 # finds it has different heads (someone else won
fa47291b3f1f phases: mark content pushed as public in local repo on push
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15484
diff changeset
1650 # commit/push race), server aborts.
fa47291b3f1f phases: mark content pushed as public in local repo on push
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15484
diff changeset
1651 if force:
15932
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1652 remoteheads = ['force']
15485
fa47291b3f1f phases: mark content pushed as public in local repo on push
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15484
diff changeset
1653 # ssh: return remote's addchangegroup()
fa47291b3f1f phases: mark content pushed as public in local repo on push
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15484
diff changeset
1654 # http: return remote's addchangegroup() or 0 for error
15932
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15929
diff changeset
1655 ret = remote.unbundle(cg, remoteheads, 'push')
15485
fa47291b3f1f phases: mark content pushed as public in local repo on push
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15484
diff changeset
1656 else:
fa47291b3f1f phases: mark content pushed as public in local repo on push
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15484
diff changeset
1657 # we return an integer indicating remote head count change
15585
a348739da8f0 addchangegroup: remove the lock argument on the addchangegroup methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15584
diff changeset
1658 ret = remote.addchangegroup(cg, 'push', self.url())
15651
e69a3cdad37e phases: exchange phase boundaries on push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15650
diff changeset
1659
15933
b8696a6676be phases: only synchronize on common changeset when push fails
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15932
diff changeset
1660 if ret:
15956
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1661 # push succeed, synchonize target of the push
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1662 cheads = outgoing.missingheads
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1663 elif revs is None:
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1664 # All out push fails. synchronize all common
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1665 cheads = outgoing.commonheads
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1666 else:
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1667 # I want cheads = heads(::missingheads and ::commonheads)
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1668 # (missingheads is revs with secret changeset filtered out)
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1669 #
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1670 # This can be expressed as:
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1671 # cheads = ( (missingheads and ::commonheads)
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1672 # + (commonheads and ::missingheads))"
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1673 # )
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1674 #
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1675 # while trying to push we already computed the following:
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1676 # common = (::commonheads)
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1677 # missing = ((commonheads::missingheads) - commonheads)
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1678 #
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1679 # We can pick:
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1680 # * missingheads part of comon (::commonheads)
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1681 common = set(outgoing.common)
16020
7460f3a1fd6c push: fix coding errors in unused branch
Matt Mackall <mpm@selenic.com>
parents: 16018
diff changeset
1682 cheads = [node for node in revs if node in common]
15956
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1683 # and
5653f2d166ea push: prevent moving phases outside of the pushed subset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15952
diff changeset
1684 # * commonheads parents on missing
16020
7460f3a1fd6c push: fix coding errors in unused branch
Matt Mackall <mpm@selenic.com>
parents: 16018
diff changeset
1685 revset = self.set('%ln and parents(roots(%ln))',
7460f3a1fd6c push: fix coding errors in unused branch
Matt Mackall <mpm@selenic.com>
parents: 16018
diff changeset
1686 outgoing.commonheads,
7460f3a1fd6c push: fix coding errors in unused branch
Matt Mackall <mpm@selenic.com>
parents: 16018
diff changeset
1687 outgoing.missing)
7460f3a1fd6c push: fix coding errors in unused branch
Matt Mackall <mpm@selenic.com>
parents: 16018
diff changeset
1688 cheads.extend(c.node() for c in revset)
15651
e69a3cdad37e phases: exchange phase boundaries on push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15650
diff changeset
1689 # even when we don't push, exchanging phase data is useful
e69a3cdad37e phases: exchange phase boundaries on push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15650
diff changeset
1690 remotephases = remote.listkeys('phases')
e69a3cdad37e phases: exchange phase boundaries on push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15650
diff changeset
1691 if not remotephases: # old server or public only repo
15933
b8696a6676be phases: only synchronize on common changeset when push fails
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15932
diff changeset
1692 phases.advanceboundary(self, phases.public, cheads)
15651
e69a3cdad37e phases: exchange phase boundaries on push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15650
diff changeset
1693 # don't push any phase data as there is nothing to push
13364
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1694 else:
15933
b8696a6676be phases: only synchronize on common changeset when push fails
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15932
diff changeset
1695 ana = phases.analyzeremotephases(self, cheads, remotephases)
15892
592b3d1742a1 phases: simplify phase exchange and movement over pushkey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15891
diff changeset
1696 pheads, droots = ana
15651
e69a3cdad37e phases: exchange phase boundaries on push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15650
diff changeset
1697 ### Apply remote phase on local
e69a3cdad37e phases: exchange phase boundaries on push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15650
diff changeset
1698 if remotephases.get('publishing', False):
15933
b8696a6676be phases: only synchronize on common changeset when push fails
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15932
diff changeset
1699 phases.advanceboundary(self, phases.public, cheads)
15651
e69a3cdad37e phases: exchange phase boundaries on push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15650
diff changeset
1700 else: # publish = False
15892
592b3d1742a1 phases: simplify phase exchange and movement over pushkey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15891
diff changeset
1701 phases.advanceboundary(self, phases.public, pheads)
15933
b8696a6676be phases: only synchronize on common changeset when push fails
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15932
diff changeset
1702 phases.advanceboundary(self, phases.draft, cheads)
15651
e69a3cdad37e phases: exchange phase boundaries on push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15650
diff changeset
1703 ### Apply local phase on remote
15820
2673006f7989 phases: fix phase synchronization on push
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15818
diff changeset
1704
15892
592b3d1742a1 phases: simplify phase exchange and movement over pushkey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15891
diff changeset
1705 # Get the list of all revs draft on remote by public here.
592b3d1742a1 phases: simplify phase exchange and movement over pushkey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15891
diff changeset
1706 # XXX Beware that revset break if droots is not strictly
592b3d1742a1 phases: simplify phase exchange and movement over pushkey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15891
diff changeset
1707 # XXX root we may want to ensure it is but it is costly
592b3d1742a1 phases: simplify phase exchange and movement over pushkey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15891
diff changeset
1708 outdated = self.set('heads((%ln::%ln) and public())',
15933
b8696a6676be phases: only synchronize on common changeset when push fails
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15932
diff changeset
1709 droots, cheads)
15892
592b3d1742a1 phases: simplify phase exchange and movement over pushkey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15891
diff changeset
1710 for newremotehead in outdated:
15820
2673006f7989 phases: fix phase synchronization on push
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15818
diff changeset
1711 r = remote.pushkey('phases',
2673006f7989 phases: fix phase synchronization on push
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15818
diff changeset
1712 newremotehead.hex(),
15892
592b3d1742a1 phases: simplify phase exchange and movement over pushkey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15891
diff changeset
1713 str(phases.draft),
592b3d1742a1 phases: simplify phase exchange and movement over pushkey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15891
diff changeset
1714 str(phases.public))
15820
2673006f7989 phases: fix phase synchronization on push
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15818
diff changeset
1715 if not r:
15892
592b3d1742a1 phases: simplify phase exchange and movement over pushkey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15891
diff changeset
1716 self.ui.warn(_('updating %s to public failed!\n')
592b3d1742a1 phases: simplify phase exchange and movement over pushkey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15891
diff changeset
1717 % newremotehead)
15485
fa47291b3f1f phases: mark content pushed as public in local repo on push
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15484
diff changeset
1718 finally:
15952
ec8a9e06cf05 mq-safety: don't apply safety on non-outgoing changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15933
diff changeset
1719 if lock is not None:
ec8a9e06cf05 mq-safety: don't apply safety on non-outgoing changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15933
diff changeset
1720 lock.release()
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
1721 finally:
15952
ec8a9e06cf05 mq-safety: don't apply safety on non-outgoing changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15933
diff changeset
1722 locallock.release()
622
e9fe5d5e67f7 Add generic repo commands for pull and push
Matt Mackall <mpm@selenic.com>
parents: 621
diff changeset
1723
13364
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1724 self.ui.debug("checking for updated bookmarks\n")
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1725 rb = remote.listkeys('bookmarks')
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1726 for k in rb.keys():
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1727 if k in self._bookmarks:
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1728 nr, nl = rb[k], hex(self._bookmarks[k])
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1729 if nr in self:
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1730 cr = self[nr]
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1731 cl = self[nl]
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1732 if cl in cr.descendants():
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1733 r = remote.pushkey('bookmarks', k, nr, nl)
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1734 if r:
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1735 self.ui.status(_("updating bookmark %s\n") % k)
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1736 else:
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1737 self.ui.warn(_('updating bookmark %s'
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1738 ' failed!\n') % k)
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1739
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1740 return ret
ddddb76f2da3 bookmarks: merge low-level push/pull support into core
Matt Mackall <mpm@selenic.com>
parents: 13363
diff changeset
1741
5763
e20de0caf8e7 Show number of changesets written to bundle files by default (issue569)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5760
diff changeset
1742 def changegroupinfo(self, nodes, source):
e20de0caf8e7 Show number of changesets written to bundle files by default (issue569)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5760
diff changeset
1743 if self.ui.verbose or source == 'bundle':
e20de0caf8e7 Show number of changesets written to bundle files by default (issue569)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5760
diff changeset
1744 self.ui.status(_("%d changesets found\n") % len(nodes))
3513
9383af6f236d Show number (-v) and list (--debug) of changesets with bundle/pull/push etc.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3500
diff changeset
1745 if self.ui.debugflag:
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9437
diff changeset
1746 self.ui.debug("list of changesets:\n")
3513
9383af6f236d Show number (-v) and list (--debug) of changesets with bundle/pull/push etc.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3500
diff changeset
1747 for node in nodes:
9383af6f236d Show number (-v) and list (--debug) of changesets with bundle/pull/push etc.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3500
diff changeset
1748 self.ui.debug("%s\n" % hex(node))
9383af6f236d Show number (-v) and list (--debug) of changesets with bundle/pull/push etc.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3500
diff changeset
1749
13703
48d606d7192b changegroupsubset: extranodes are no longer needed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13662
diff changeset
1750 def changegroupsubset(self, bases, heads, source):
9437
1c4e4004f3a6 Improve some docstrings relating to changegroups and prepush().
Greg Ward <greg-hg@gerg.ca>
parents: 9425
diff changeset
1751 """Compute a changegroup consisting of all the nodes that are
14549
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14536
diff changeset
1752 descendants of any of the bases and ancestors of any of the heads.
9437
1c4e4004f3a6 Improve some docstrings relating to changegroups and prepush().
Greg Ward <greg-hg@gerg.ca>
parents: 9425
diff changeset
1753 Return a chunkbuffer object whose read() method will return
1c4e4004f3a6 Improve some docstrings relating to changegroups and prepush().
Greg Ward <greg-hg@gerg.ca>
parents: 9425
diff changeset
1754 successive changegroup chunks.
1466
b6d9ea0bc107 Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents: 1464
diff changeset
1755
b6d9ea0bc107 Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents: 1464
diff changeset
1756 It is fairly complex as determining which filenodes and which
b6d9ea0bc107 Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents: 1464
diff changeset
1757 manifest nodes need to be included for the changeset to be complete
b6d9ea0bc107 Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents: 1464
diff changeset
1758 is non-trivial.
b6d9ea0bc107 Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents: 1464
diff changeset
1759
b6d9ea0bc107 Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents: 1464
diff changeset
1760 Another wrinkle is doing the reverse, figuring out which changeset in
5908
afa1e6122be7 changegroupsubset: accept list of per-revlog nodes to include
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5907
diff changeset
1761 the changegroup a particular filenode or manifestnode belongs to.
afa1e6122be7 changegroupsubset: accept list of per-revlog nodes to include
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5907
diff changeset
1762 """
9820
0b999aec64e8 bundle: don't send too many changesets (Issue1704)
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9691
diff changeset
1763 cl = self.changelog
0b999aec64e8 bundle: don't send too many changesets (Issue1704)
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9691
diff changeset
1764 if not bases:
0b999aec64e8 bundle: don't send too many changesets (Issue1704)
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9691
diff changeset
1765 bases = [nullid]
13741
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13723
diff changeset
1766 csets, bases, heads = cl.nodesbetween(bases, heads)
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13723
diff changeset
1767 # We assume that all ancestors of bases are known
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13723
diff changeset
1768 common = set(cl.ancestors(*[cl.rev(n) for n in bases]))
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13723
diff changeset
1769 return self._changegroupsubset(common, csets, heads, source)
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13723
diff changeset
1770
15837
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15820
diff changeset
1771 def getlocalbundle(self, source, outgoing):
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15820
diff changeset
1772 """Like getbundle, but taking a discovery.outgoing as an argument.
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15820
diff changeset
1773
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15820
diff changeset
1774 This is only implemented for local repos and reuses potentially
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15820
diff changeset
1775 precomputed sets in outgoing."""
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15820
diff changeset
1776 if not outgoing.missing:
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15820
diff changeset
1777 return None
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15820
diff changeset
1778 return self._changegroupsubset(outgoing.common,
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15820
diff changeset
1779 outgoing.missing,
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15820
diff changeset
1780 outgoing.missingheads,
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15820
diff changeset
1781 source)
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15820
diff changeset
1782
13741
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13723
diff changeset
1783 def getbundle(self, source, heads=None, common=None):
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13723
diff changeset
1784 """Like changegroupsubset, but returns the set difference between the
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13723
diff changeset
1785 ancestors of heads and the ancestors common.
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13723
diff changeset
1786
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13723
diff changeset
1787 If heads is None, use the local heads. If common is None, use [nullid].
9820
0b999aec64e8 bundle: don't send too many changesets (Issue1704)
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9691
diff changeset
1788
13741
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13723
diff changeset
1789 The nodes in common might not all be known locally due to the way the
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13723
diff changeset
1790 current discovery protocol works.
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13723
diff changeset
1791 """
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13723
diff changeset
1792 cl = self.changelog
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13723
diff changeset
1793 if common:
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13723
diff changeset
1794 nm = cl.nodemap
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13723
diff changeset
1795 common = [n for n in common if n in nm]
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13723
diff changeset
1796 else:
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13723
diff changeset
1797 common = [nullid]
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13723
diff changeset
1798 if not heads:
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13723
diff changeset
1799 heads = cl.heads()
15837
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15820
diff changeset
1800 return self.getlocalbundle(source,
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15820
diff changeset
1801 discovery.outgoing(cl, common, heads))
13741
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13723
diff changeset
1802
b51bf961b3cb wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13723
diff changeset
1803 def _changegroupsubset(self, commonrevs, csets, heads, source):
1466
b6d9ea0bc107 Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents: 1464
diff changeset
1804
9820
0b999aec64e8 bundle: don't send too many changesets (Issue1704)
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9691
diff changeset
1805 cl = self.changelog
13706
7beb9834d185 changegroupsubset: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 13703
diff changeset
1806 mf = self.manifest
7beb9834d185 changegroupsubset: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 13703
diff changeset
1807 mfs = {} # needed manifests
7beb9834d185 changegroupsubset: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 13703
diff changeset
1808 fnodes = {} # needed file nodes
13812
2b70683888b9 changegroup: minor ordering and renaming changes for similarity
Matt Mackall <mpm@selenic.com>
parents: 13811
diff changeset
1809 changedfiles = set()
13829
7b7c1d9d08ab changegroup: unnest flookup
Matt Mackall <mpm@selenic.com>
parents: 13826
diff changeset
1810 fstate = ['', {}]
13813
76593ef397ef changegroup: unnest some lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13812
diff changeset
1811 count = [0]
13706
7beb9834d185 changegroupsubset: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 13703
diff changeset
1812
13703
48d606d7192b changegroupsubset: extranodes are no longer needed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13662
diff changeset
1813 # can we go through the fast path ?
48d606d7192b changegroupsubset: extranodes are no longer needed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13662
diff changeset
1814 heads.sort()
13707
296e78744d32 changegroupsubset: more minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 13706
diff changeset
1815 if heads == sorted(self.heads()):
13706
7beb9834d185 changegroupsubset: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 13703
diff changeset
1816 return self._changegroup(csets, source)
7233
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7229
diff changeset
1817
9820
0b999aec64e8 bundle: don't send too many changesets (Issue1704)
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9691
diff changeset
1818 # slow path
1736
50de0887bbcd add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1732
diff changeset
1819 self.hook('preoutgoing', throw=True, source=source)
13706
7beb9834d185 changegroupsubset: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 13703
diff changeset
1820 self.changegroupinfo(csets, source)
1458
1033892bbb87 This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents: 1457
diff changeset
1821
13810
0252abaafb8a changegroup: refactor prune as a filter
Matt Mackall <mpm@selenic.com>
parents: 13809
diff changeset
1822 # filter any nodes that claim to be part of the known set
0252abaafb8a changegroup: refactor prune as a filter
Matt Mackall <mpm@selenic.com>
parents: 13809
diff changeset
1823 def prune(revlog, missing):
14521
d27f669bad7c localrepo: use list comprehension instead of generators
Sune Foldager <cryo@cyanite.org>
parents: 14520
diff changeset
1824 return [n for n in missing
d27f669bad7c localrepo: use list comprehension instead of generators
Sune Foldager <cryo@cyanite.org>
parents: 14520
diff changeset
1825 if revlog.linkrev(revlog.rev(n)) not in commonrevs]
1458
1033892bbb87 This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents: 1457
diff changeset
1826
13830
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1827 def lookup(revlog, x):
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1828 if revlog == cl:
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1829 c = cl.read(x)
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1830 changedfiles.update(c[3])
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1831 mfs.setdefault(c[0], x)
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1832 count[0] += 1
14520
9d8d2fecb72e localrepo: add total to changeset progress in bundle/push
Sune Foldager <cryo@cyanite.org>
parents: 14509
diff changeset
1833 self.ui.progress(_('bundling'), count[0],
9d8d2fecb72e localrepo: add total to changeset progress in bundle/push
Sune Foldager <cryo@cyanite.org>
parents: 14509
diff changeset
1834 unit=_('changesets'), total=len(csets))
13830
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1835 return x
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1836 elif revlog == mf:
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1837 clnode = mfs[x]
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1838 mdata = mf.readfast(x)
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1839 for f in changedfiles:
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1840 if f in mdata:
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1841 fnodes.setdefault(f, {}).setdefault(mdata[f], clnode)
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1842 count[0] += 1
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1843 self.ui.progress(_('bundling'), count[0],
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1844 unit=_('manifests'), total=len(mfs))
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1845 return mfs[x]
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1846 else:
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1847 self.ui.progress(
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1848 _('bundling'), count[0], item=fstate[0],
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1849 unit=_('files'), total=len(changedfiles))
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1850 return fstate[1][x]
1458
1033892bbb87 This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents: 1457
diff changeset
1851
13831
d69c9510d648 changegroup: introduce bundler objects
Matt Mackall <mpm@selenic.com>
parents: 13830
diff changeset
1852 bundler = changegroup.bundle10(lookup)
14365
a8e3931e3fb5 revlog: linearize created changegroups in generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14363
diff changeset
1853 reorder = self.ui.config('bundle', 'reorder', 'auto')
a8e3931e3fb5 revlog: linearize created changegroups in generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14363
diff changeset
1854 if reorder == 'auto':
a8e3931e3fb5 revlog: linearize created changegroups in generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14363
diff changeset
1855 reorder = None
a8e3931e3fb5 revlog: linearize created changegroups in generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14363
diff changeset
1856 else:
a8e3931e3fb5 revlog: linearize created changegroups in generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14363
diff changeset
1857 reorder = util.parsebool(reorder)
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 514
diff changeset
1858
635
85e2209d401c Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents: 634
diff changeset
1859 def gengroup():
1466
b6d9ea0bc107 Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents: 1464
diff changeset
1860 # Create a changenode group generator that will call our functions
b6d9ea0bc107 Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents: 1464
diff changeset
1861 # back to lookup the owning changenode and collect information.
14365
a8e3931e3fb5 revlog: linearize created changegroups in generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14363
diff changeset
1862 for chunk in cl.group(csets, bundler, reorder=reorder):
13709
53826e7a1d22 changegroupsubset: more renaming
Matt Mackall <mpm@selenic.com>
parents: 13708
diff changeset
1863 yield chunk
13116
c36dad4f6e54 bundle progress: offer best-guess deterministic progress information
Augie Fackler <durin42@gmail.com>
parents: 13113
diff changeset
1864 self.ui.progress(_('bundling'), None)
10432
8a8030fc57d6 localrepo: provide indeterminate progress information while bundling
Augie Fackler <durin42@gmail.com>
parents: 10430
diff changeset
1865
1466
b6d9ea0bc107 Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents: 1464
diff changeset
1866 # Create a generator for the manifestnodes that calls our lookup
b6d9ea0bc107 Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents: 1464
diff changeset
1867 # and data collection functions back.
13813
76593ef397ef changegroup: unnest some lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13812
diff changeset
1868 count[0] = 0
14365
a8e3931e3fb5 revlog: linearize created changegroups in generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14363
diff changeset
1869 for chunk in mf.group(prune(mf, mfs), bundler, reorder=reorder):
13709
53826e7a1d22 changegroupsubset: more renaming
Matt Mackall <mpm@selenic.com>
parents: 13708
diff changeset
1870 yield chunk
13116
c36dad4f6e54 bundle progress: offer best-guess deterministic progress information
Augie Fackler <durin42@gmail.com>
parents: 13113
diff changeset
1871 self.ui.progress(_('bundling'), None)
1466
b6d9ea0bc107 Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents: 1464
diff changeset
1872
13706
7beb9834d185 changegroupsubset: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 13703
diff changeset
1873 mfs.clear()
1466
b6d9ea0bc107 Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents: 1464
diff changeset
1874
b6d9ea0bc107 Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents: 1464
diff changeset
1875 # Go through all our files in order sorted by name.
13829
7b7c1d9d08ab changegroup: unnest flookup
Matt Mackall <mpm@selenic.com>
parents: 13826
diff changeset
1876 count[0] = 0
7b7c1d9d08ab changegroup: unnest flookup
Matt Mackall <mpm@selenic.com>
parents: 13826
diff changeset
1877 for fname in sorted(changedfiles):
1458
1033892bbb87 This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents: 1457
diff changeset
1878 filerevlog = self.file(fname)
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
1879 if not len(filerevlog):
5666
9d6ad26fab10 fix spelling error
Matt Mackall <mpm@selenic.com>
parents: 5657
diff changeset
1880 raise util.Abort(_("empty or missing revlog for %s") % fname)
13829
7b7c1d9d08ab changegroup: unnest flookup
Matt Mackall <mpm@selenic.com>
parents: 13826
diff changeset
1881 fstate[0] = fname
7b7c1d9d08ab changegroup: unnest flookup
Matt Mackall <mpm@selenic.com>
parents: 13826
diff changeset
1882 fstate[1] = fnodes.pop(fname, {})
13783
c196352d935b changegroup: fold progress meter into callbacks
Matt Mackall <mpm@selenic.com>
parents: 13782
diff changeset
1883
14522
5ca61ef6ff00 localrepo: simplify file bundling code and fix progress bug
Sune Foldager <cryo@cyanite.org>
parents: 14521
diff changeset
1884 nodelist = prune(filerevlog, fstate[1])
5ca61ef6ff00 localrepo: simplify file bundling code and fix progress bug
Sune Foldager <cryo@cyanite.org>
parents: 14521
diff changeset
1885 if nodelist:
5ca61ef6ff00 localrepo: simplify file bundling code and fix progress bug
Sune Foldager <cryo@cyanite.org>
parents: 14521
diff changeset
1886 count[0] += 1
5ca61ef6ff00 localrepo: simplify file bundling code and fix progress bug
Sune Foldager <cryo@cyanite.org>
parents: 14521
diff changeset
1887 yield bundler.fileheader(fname)
5ca61ef6ff00 localrepo: simplify file bundling code and fix progress bug
Sune Foldager <cryo@cyanite.org>
parents: 14521
diff changeset
1888 for chunk in filerevlog.group(nodelist, bundler, reorder):
5ca61ef6ff00 localrepo: simplify file bundling code and fix progress bug
Sune Foldager <cryo@cyanite.org>
parents: 14521
diff changeset
1889 yield chunk
5ca61ef6ff00 localrepo: simplify file bundling code and fix progress bug
Sune Foldager <cryo@cyanite.org>
parents: 14521
diff changeset
1890
1466
b6d9ea0bc107 Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents: 1464
diff changeset
1891 # Signal that no more groups are left.
13831
d69c9510d648 changegroup: introduce bundler objects
Matt Mackall <mpm@selenic.com>
parents: 13830
diff changeset
1892 yield bundler.close()
13116
c36dad4f6e54 bundle progress: offer best-guess deterministic progress information
Augie Fackler <durin42@gmail.com>
parents: 13113
diff changeset
1893 self.ui.progress(_('bundling'), None)
635
85e2209d401c Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents: 634
diff changeset
1894
13706
7beb9834d185 changegroupsubset: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 13703
diff changeset
1895 if csets:
7beb9834d185 changegroupsubset: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 13703
diff changeset
1896 self.hook('outgoing', node=hex(csets[0]), source=source)
1736
50de0887bbcd add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1732
diff changeset
1897
12337
6a6149487817 bundle: encapsulate all bundle streams in unbundle class
Matt Mackall <mpm@selenic.com>
parents: 12335
diff changeset
1898 return changegroup.unbundle10(util.chunkbuffer(gengroup()), 'UN')
1458
1033892bbb87 This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents: 1457
diff changeset
1899
1736
50de0887bbcd add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1732
diff changeset
1900 def changegroup(self, basenodes, source):
7233
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7229
diff changeset
1901 # to avoid a race we use changegroupsubset() (issue1320)
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7229
diff changeset
1902 return self.changegroupsubset(basenodes, self.heads(), source)
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7229
diff changeset
1903
9820
0b999aec64e8 bundle: don't send too many changesets (Issue1704)
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9691
diff changeset
1904 def _changegroup(self, nodes, source):
9437
1c4e4004f3a6 Improve some docstrings relating to changegroups and prepush().
Greg Ward <greg-hg@gerg.ca>
parents: 9425
diff changeset
1905 """Compute the changegroup of all nodes that we have that a recipient
1c4e4004f3a6 Improve some docstrings relating to changegroups and prepush().
Greg Ward <greg-hg@gerg.ca>
parents: 9425
diff changeset
1906 doesn't. Return a chunkbuffer object whose read() method will return
1c4e4004f3a6 Improve some docstrings relating to changegroups and prepush().
Greg Ward <greg-hg@gerg.ca>
parents: 9425
diff changeset
1907 successive changegroup chunks.
1466
b6d9ea0bc107 Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents: 1464
diff changeset
1908
b6d9ea0bc107 Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents: 1464
diff changeset
1909 This is much easier than the previous function as we can assume that
7233
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7229
diff changeset
1910 the recipient has any changenode we aren't sending them.
9f0e52e1df77 fix pull racing with push/commit (issue1320)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7229
diff changeset
1911
9820
0b999aec64e8 bundle: don't send too many changesets (Issue1704)
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9691
diff changeset
1912 nodes is the set of nodes to send"""
1736
50de0887bbcd add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1732
diff changeset
1913
13812
2b70683888b9 changegroup: minor ordering and renaming changes for similarity
Matt Mackall <mpm@selenic.com>
parents: 13811
diff changeset
1914 cl = self.changelog
2b70683888b9 changegroup: minor ordering and renaming changes for similarity
Matt Mackall <mpm@selenic.com>
parents: 13811
diff changeset
1915 mf = self.manifest
2b70683888b9 changegroup: minor ordering and renaming changes for similarity
Matt Mackall <mpm@selenic.com>
parents: 13811
diff changeset
1916 mfs = {}
2b70683888b9 changegroup: minor ordering and renaming changes for similarity
Matt Mackall <mpm@selenic.com>
parents: 13811
diff changeset
1917 changedfiles = set()
13829
7b7c1d9d08ab changegroup: unnest flookup
Matt Mackall <mpm@selenic.com>
parents: 13826
diff changeset
1918 fstate = ['']
7b7c1d9d08ab changegroup: unnest flookup
Matt Mackall <mpm@selenic.com>
parents: 13826
diff changeset
1919 count = [0]
1736
50de0887bbcd add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1732
diff changeset
1920
13812
2b70683888b9 changegroup: minor ordering and renaming changes for similarity
Matt Mackall <mpm@selenic.com>
parents: 13811
diff changeset
1921 self.hook('preoutgoing', throw=True, source=source)
5763
e20de0caf8e7 Show number of changesets written to bundle files by default (issue569)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5760
diff changeset
1922 self.changegroupinfo(nodes, source)
1458
1033892bbb87 This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents: 1457
diff changeset
1923
8152
08e1baf924ca replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents: 8151
diff changeset
1924 revset = set([cl.rev(n) for n in nodes])
635
85e2209d401c Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents: 634
diff changeset
1925
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
1926 def gennodelst(log):
14521
d27f669bad7c localrepo: use list comprehension instead of generators
Sune Foldager <cryo@cyanite.org>
parents: 14520
diff changeset
1927 return [log.node(r) for r in log if log.linkrev(r) in revset]
1458
1033892bbb87 This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents: 1457
diff changeset
1928
13830
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1929 def lookup(revlog, x):
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1930 if revlog == cl:
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1931 c = cl.read(x)
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1932 changedfiles.update(c[3])
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1933 mfs.setdefault(c[0], x)
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1934 count[0] += 1
14520
9d8d2fecb72e localrepo: add total to changeset progress in bundle/push
Sune Foldager <cryo@cyanite.org>
parents: 14509
diff changeset
1935 self.ui.progress(_('bundling'), count[0],
9d8d2fecb72e localrepo: add total to changeset progress in bundle/push
Sune Foldager <cryo@cyanite.org>
parents: 14509
diff changeset
1936 unit=_('changesets'), total=len(nodes))
13830
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1937 return x
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1938 elif revlog == mf:
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1939 count[0] += 1
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1940 self.ui.progress(_('bundling'), count[0],
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1941 unit=_('manifests'), total=len(mfs))
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1942 return cl.node(revlog.linkrev(revlog.rev(x)))
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1943 else:
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1944 self.ui.progress(
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1945 _('bundling'), count[0], item=fstate[0],
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1946 total=len(changedfiles), unit=_('files'))
2dc6e09f2a7d changegroup: combine lookup functions
Matt Mackall <mpm@selenic.com>
parents: 13829
diff changeset
1947 return cl.node(revlog.linkrev(revlog.rev(x)))
13829
7b7c1d9d08ab changegroup: unnest flookup
Matt Mackall <mpm@selenic.com>
parents: 13826
diff changeset
1948
13831
d69c9510d648 changegroup: introduce bundler objects
Matt Mackall <mpm@selenic.com>
parents: 13830
diff changeset
1949 bundler = changegroup.bundle10(lookup)
14365
a8e3931e3fb5 revlog: linearize created changegroups in generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14363
diff changeset
1950 reorder = self.ui.config('bundle', 'reorder', 'auto')
a8e3931e3fb5 revlog: linearize created changegroups in generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14363
diff changeset
1951 if reorder == 'auto':
a8e3931e3fb5 revlog: linearize created changegroups in generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14363
diff changeset
1952 reorder = None
a8e3931e3fb5 revlog: linearize created changegroups in generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14363
diff changeset
1953 else:
a8e3931e3fb5 revlog: linearize created changegroups in generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14363
diff changeset
1954 reorder = util.parsebool(reorder)
1458
1033892bbb87 This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents: 1457
diff changeset
1955
1033892bbb87 This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents: 1457
diff changeset
1956 def gengroup():
9437
1c4e4004f3a6 Improve some docstrings relating to changegroups and prepush().
Greg Ward <greg-hg@gerg.ca>
parents: 9425
diff changeset
1957 '''yield a sequence of changegroup chunks (strings)'''
635
85e2209d401c Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents: 634
diff changeset
1958 # construct a list of all changed files
1458
1033892bbb87 This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents: 1457
diff changeset
1959
14365
a8e3931e3fb5 revlog: linearize created changegroups in generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14363
diff changeset
1960 for chunk in cl.group(nodes, bundler, reorder=reorder):
13716
6d7338f5320a changegroup: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 13714
diff changeset
1961 yield chunk
13116
c36dad4f6e54 bundle progress: offer best-guess deterministic progress information
Augie Fackler <durin42@gmail.com>
parents: 13113
diff changeset
1962 self.ui.progress(_('bundling'), None)
635
85e2209d401c Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents: 634
diff changeset
1963
13829
7b7c1d9d08ab changegroup: unnest flookup
Matt Mackall <mpm@selenic.com>
parents: 13826
diff changeset
1964 count[0] = 0
14365
a8e3931e3fb5 revlog: linearize created changegroups in generaldelta revlogs
Sune Foldager <cryo@cyanite.org>
parents: 14363
diff changeset
1965 for chunk in mf.group(gennodelst(mf), bundler, reorder=reorder):
13716
6d7338f5320a changegroup: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 13714
diff changeset
1966 yield chunk
13116
c36dad4f6e54 bundle progress: offer best-guess deterministic progress information
Augie Fackler <durin42@gmail.com>
parents: 13113
diff changeset
1967 self.ui.progress(_('bundling'), None)
635
85e2209d401c Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents: 634
diff changeset
1968
13829
7b7c1d9d08ab changegroup: unnest flookup
Matt Mackall <mpm@selenic.com>
parents: 13826
diff changeset
1969 count[0] = 0
7b7c1d9d08ab changegroup: unnest flookup
Matt Mackall <mpm@selenic.com>
parents: 13826
diff changeset
1970 for fname in sorted(changedfiles):
1458
1033892bbb87 This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents: 1457
diff changeset
1971 filerevlog = self.file(fname)
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
1972 if not len(filerevlog):
5666
9d6ad26fab10 fix spelling error
Matt Mackall <mpm@selenic.com>
parents: 5657
diff changeset
1973 raise util.Abort(_("empty or missing revlog for %s") % fname)
13829
7b7c1d9d08ab changegroup: unnest flookup
Matt Mackall <mpm@selenic.com>
parents: 13826
diff changeset
1974 fstate[0] = fname
14522
5ca61ef6ff00 localrepo: simplify file bundling code and fix progress bug
Sune Foldager <cryo@cyanite.org>
parents: 14521
diff changeset
1975 nodelist = gennodelst(filerevlog)
5ca61ef6ff00 localrepo: simplify file bundling code and fix progress bug
Sune Foldager <cryo@cyanite.org>
parents: 14521
diff changeset
1976 if nodelist:
5ca61ef6ff00 localrepo: simplify file bundling code and fix progress bug
Sune Foldager <cryo@cyanite.org>
parents: 14521
diff changeset
1977 count[0] += 1
5ca61ef6ff00 localrepo: simplify file bundling code and fix progress bug
Sune Foldager <cryo@cyanite.org>
parents: 14521
diff changeset
1978 yield bundler.fileheader(fname)
5ca61ef6ff00 localrepo: simplify file bundling code and fix progress bug
Sune Foldager <cryo@cyanite.org>
parents: 14521
diff changeset
1979 for chunk in filerevlog.group(nodelist, bundler, reorder):
5ca61ef6ff00 localrepo: simplify file bundling code and fix progress bug
Sune Foldager <cryo@cyanite.org>
parents: 14521
diff changeset
1980 yield chunk
13831
d69c9510d648 changegroup: introduce bundler objects
Matt Mackall <mpm@selenic.com>
parents: 13830
diff changeset
1981 yield bundler.close()
13116
c36dad4f6e54 bundle progress: offer best-guess deterministic progress information
Augie Fackler <durin42@gmail.com>
parents: 13113
diff changeset
1982 self.ui.progress(_('bundling'), None)
635
85e2209d401c Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents: 634
diff changeset
1983
2107
7ff92c04f8e5 Don't die calling outgoing hook if we have no changesets
Matt Mackall <mpm@selenic.com>
parents: 2098
diff changeset
1984 if nodes:
7ff92c04f8e5 Don't die calling outgoing hook if we have no changesets
Matt Mackall <mpm@selenic.com>
parents: 2098
diff changeset
1985 self.hook('outgoing', node=hex(nodes[0]), source=source)
635
85e2209d401c Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents: 634
diff changeset
1986
12337
6a6149487817 bundle: encapsulate all bundle streams in unbundle class
Matt Mackall <mpm@selenic.com>
parents: 12335
diff changeset
1987 return changegroup.unbundle10(util.chunkbuffer(gengroup()), 'UN')
635
85e2209d401c Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents: 634
diff changeset
1988
15585
a348739da8f0 addchangegroup: remove the lock argument on the addchangegroup methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15584
diff changeset
1989 def addchangegroup(self, source, srctype, url, emptyok=False):
11153
9936ed1d04f4 push: document return values between various repo methods.
Greg Ward <greg-hg@gerg.ca>
parents: 11112
diff changeset
1990 """Add the changegroup returned by source.read() to this repo.
9936ed1d04f4 push: document return values between various repo methods.
Greg Ward <greg-hg@gerg.ca>
parents: 11112
diff changeset
1991 srctype is a string like 'push', 'pull', or 'unbundle'. url is
9936ed1d04f4 push: document return values between various repo methods.
Greg Ward <greg-hg@gerg.ca>
parents: 11112
diff changeset
1992 the URL of the repo where this changegroup is coming from.
635
85e2209d401c Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents: 634
diff changeset
1993
11153
9936ed1d04f4 push: document return values between various repo methods.
Greg Ward <greg-hg@gerg.ca>
parents: 11112
diff changeset
1994 Return an integer summarizing the change to this repo:
3803
2aef481ac73c Don't report an error when closing heads during local push (issue387)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3801
diff changeset
1995 - nothing changed or no source: 0
2aef481ac73c Don't report an error when closing heads during local push (issue387)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3801
diff changeset
1996 - more heads than before: 1+added heads (2..n)
11153
9936ed1d04f4 push: document return values between various repo methods.
Greg Ward <greg-hg@gerg.ca>
parents: 11112
diff changeset
1997 - fewer heads than before: -1-removed heads (-2..-n)
3803
2aef481ac73c Don't report an error when closing heads during local push (issue387)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3801
diff changeset
1998 - number of heads stays the same: 1
2aef481ac73c Don't report an error when closing heads during local push (issue387)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3801
diff changeset
1999 """
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
2000 def csmap(x):
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9437
diff changeset
2001 self.ui.debug("add changeset %s\n" % short(x))
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
2002 return len(cl)
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
2003
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
2004 def revmap(x):
1998
65cc17ae9649 fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1995
diff changeset
2005 return cl.rev(x)
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
2006
1615
83238c1db6de Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1597
diff changeset
2007 if not source:
2019
ced2d3620f95 add merge command. means same thing as "update -m".
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1998
diff changeset
2008 return 0
1730
0f1d2c75db5e add prechangegroup and pretxnchangegroup hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1721
diff changeset
2009
2673
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2661
diff changeset
2010 self.hook('prechangegroup', throw=True, source=srctype, url=url)
1730
0f1d2c75db5e add prechangegroup and pretxnchangegroup hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1721
diff changeset
2011
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
2012 changesets = files = revisions = 0
10888
5e18023820a9 progress: show approximate progress info for pull
Matt Mackall <mpm@selenic.com>
parents: 10886
diff changeset
2013 efiles = set()
225
1651a3e61925 fix repo locking
mpm@selenic.com
parents: 224
diff changeset
2014
2395
8ed45fb1053a remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2362
diff changeset
2015 # write changelog data to temp files so concurrent readers will not see
8ed45fb1053a remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2362
diff changeset
2016 # inconsistent view
4261
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
2017 cl = self.changelog
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
2018 cl.delayupdate()
14036
90d997a812dc changegroup: do not count closed new heads (issue2697)
Adrian Buehlmann <adrian@cadifra.com>
parents: 14004
diff changeset
2019 oldheads = cl.heads()
1998
65cc17ae9649 fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1995
diff changeset
2020
14076
924c82157d46 url: move URL parsing functions into util to improve startup time
Brodie Rao <brodie@bitheap.org>
parents: 14073
diff changeset
2021 tr = self.transaction("\n".join([srctype, util.hidepassword(url)]))
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2022 try:
4970
30d4d8985dd8 transactions: avoid late tear-down (issue641)
Matt Mackall <mpm@selenic.com>
parents: 4917
diff changeset
2023 trp = weakref.proxy(tr)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2024 # pull off the changeset group
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2025 self.ui.status(_("adding changesets\n"))
8393
59160ca338f7 localrepo: use more direct vars in addchangegroup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8392
diff changeset
2026 clstart = len(cl)
10430
5cef810e588f localrepo: show indeterminate progress for incoming data
Augie Fackler <durin42@gmail.com>
parents: 10429
diff changeset
2027 class prog(object):
10496
45734b51c99b progress: mark strings for translation
Martin Geisler <mg@lazybytes.net>
parents: 10492
diff changeset
2028 step = _('changesets')
10430
5cef810e588f localrepo: show indeterminate progress for incoming data
Augie Fackler <durin42@gmail.com>
parents: 10429
diff changeset
2029 count = 1
5cef810e588f localrepo: show indeterminate progress for incoming data
Augie Fackler <durin42@gmail.com>
parents: 10429
diff changeset
2030 ui = self.ui
10888
5e18023820a9 progress: show approximate progress info for pull
Matt Mackall <mpm@selenic.com>
parents: 10886
diff changeset
2031 total = None
10430
5cef810e588f localrepo: show indeterminate progress for incoming data
Augie Fackler <durin42@gmail.com>
parents: 10429
diff changeset
2032 def __call__(self):
10888
5e18023820a9 progress: show approximate progress info for pull
Matt Mackall <mpm@selenic.com>
parents: 10886
diff changeset
2033 self.ui.progress(self.step, self.count, unit=_('chunks'),
5e18023820a9 progress: show approximate progress info for pull
Matt Mackall <mpm@selenic.com>
parents: 10886
diff changeset
2034 total=self.total)
10430
5cef810e588f localrepo: show indeterminate progress for incoming data
Augie Fackler <durin42@gmail.com>
parents: 10429
diff changeset
2035 self.count += 1
5cef810e588f localrepo: show indeterminate progress for incoming data
Augie Fackler <durin42@gmail.com>
parents: 10429
diff changeset
2036 pr = prog()
12334
50946802593d bundle: refactor progress callback
Matt Mackall <mpm@selenic.com>
parents: 12333
diff changeset
2037 source.callback = pr
50946802593d bundle: refactor progress callback
Matt Mackall <mpm@selenic.com>
parents: 12333
diff changeset
2038
14144
3c3c53d8343a unbundler: separate delta and header parsing
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14102
diff changeset
2039 source.changelogheader()
15890
e234eda20984 revlog: make addgroup returns a list of node contained in the added source
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15889
diff changeset
2040 srccontent = cl.addgroup(source, csmap, trp)
e234eda20984 revlog: make addgroup returns a list of node contained in the added source
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15889
diff changeset
2041 if not (srccontent or emptyok):
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2042 raise util.Abort(_("received changelog group is empty"))
8393
59160ca338f7 localrepo: use more direct vars in addchangegroup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8392
diff changeset
2043 clend = len(cl)
59160ca338f7 localrepo: use more direct vars in addchangegroup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8392
diff changeset
2044 changesets = clend - clstart
10888
5e18023820a9 progress: show approximate progress info for pull
Matt Mackall <mpm@selenic.com>
parents: 10886
diff changeset
2045 for c in xrange(clstart, clend):
5e18023820a9 progress: show approximate progress info for pull
Matt Mackall <mpm@selenic.com>
parents: 10886
diff changeset
2046 efiles.update(self[c].files())
5e18023820a9 progress: show approximate progress info for pull
Matt Mackall <mpm@selenic.com>
parents: 10886
diff changeset
2047 efiles = len(efiles)
10496
45734b51c99b progress: mark strings for translation
Martin Geisler <mg@lazybytes.net>
parents: 10492
diff changeset
2048 self.ui.progress(_('changesets'), None)
1040
35e883d1ff9b Show number of new heads when doing a pull
mpm@selenic.com
parents: 1019
diff changeset
2049
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2050 # pull off the manifest group
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2051 self.ui.status(_("adding manifests\n"))
10496
45734b51c99b progress: mark strings for translation
Martin Geisler <mg@lazybytes.net>
parents: 10492
diff changeset
2052 pr.step = _('manifests')
10430
5cef810e588f localrepo: show indeterminate progress for incoming data
Augie Fackler <durin42@gmail.com>
parents: 10429
diff changeset
2053 pr.count = 1
10888
5e18023820a9 progress: show approximate progress info for pull
Matt Mackall <mpm@selenic.com>
parents: 10886
diff changeset
2054 pr.total = changesets # manifests <= changesets
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2055 # no need to check for empty manifest group here:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2056 # if the result of the merge of 1 and 2 is the same in 3 and 4,
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2057 # no new manifest will be created and the manifest group will
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2058 # be empty during the pull
14144
3c3c53d8343a unbundler: separate delta and header parsing
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14102
diff changeset
2059 source.manifestheader()
12335
e21fe9c5fb25 bundle: get rid of chunkiter
Matt Mackall <mpm@selenic.com>
parents: 12334
diff changeset
2060 self.manifest.addgroup(source, revmap, trp)
10496
45734b51c99b progress: mark strings for translation
Martin Geisler <mg@lazybytes.net>
parents: 10492
diff changeset
2061 self.ui.progress(_('manifests'), None)
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
2062
10418
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2063 needfiles = {}
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2064 if self.ui.configbool('server', 'validate', default=False):
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2065 # validate incoming csets have their manifests
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2066 for cset in xrange(clstart, clend):
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2067 mfest = self.changelog.read(self.changelog.node(cset))[0]
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2068 mfest = self.manifest.readdelta(mfest)
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2069 # store file nodes we must see
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2070 for f, n in mfest.iteritems():
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2071 needfiles.setdefault(f, set()).add(n)
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2072
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2073 # process the files
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2074 self.ui.status(_("adding file changes\n"))
14756
fdcf6f09b68d localrepo: mark progress step for translation
Wagner Bruna <wbruna@yahoo.com>
parents: 14646
diff changeset
2075 pr.step = _('files')
10430
5cef810e588f localrepo: show indeterminate progress for incoming data
Augie Fackler <durin42@gmail.com>
parents: 10429
diff changeset
2076 pr.count = 1
10888
5e18023820a9 progress: show approximate progress info for pull
Matt Mackall <mpm@selenic.com>
parents: 10886
diff changeset
2077 pr.total = efiles
12334
50946802593d bundle: refactor progress callback
Matt Mackall <mpm@selenic.com>
parents: 12333
diff changeset
2078 source.callback = None
50946802593d bundle: refactor progress callback
Matt Mackall <mpm@selenic.com>
parents: 12333
diff changeset
2079
14494
1ffeeb91c55d check-code: flag 0/1 used as constant Boolean expression
Martin Geisler <mg@lazybytes.net>
parents: 14482
diff changeset
2080 while True:
14144
3c3c53d8343a unbundler: separate delta and header parsing
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14102
diff changeset
2081 chunkdata = source.filelogheader()
3c3c53d8343a unbundler: separate delta and header parsing
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14102
diff changeset
2082 if not chunkdata:
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2083 break
14144
3c3c53d8343a unbundler: separate delta and header parsing
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14102
diff changeset
2084 f = chunkdata["filename"]
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9437
diff changeset
2085 self.ui.debug("adding %s revisions\n" % f)
10888
5e18023820a9 progress: show approximate progress info for pull
Matt Mackall <mpm@selenic.com>
parents: 10886
diff changeset
2086 pr()
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2087 fl = self.file(f)
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
2088 o = len(fl)
15890
e234eda20984 revlog: make addgroup returns a list of node contained in the added source
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15889
diff changeset
2089 if not fl.addgroup(source, revmap, trp):
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2090 raise util.Abort(_("received file revlog group is empty"))
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
2091 revisions += len(fl) - o
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2092 files += 1
10418
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2093 if f in needfiles:
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2094 needs = needfiles[f]
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2095 for new in xrange(o, len(fl)):
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2096 n = fl.node(new)
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2097 if n in needs:
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2098 needs.remove(n)
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2099 if not needs:
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2100 del needfiles[f]
10496
45734b51c99b progress: mark strings for translation
Martin Geisler <mg@lazybytes.net>
parents: 10492
diff changeset
2101 self.ui.progress(_('files'), None)
10418
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2102
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2103 for f, needs in needfiles.iteritems():
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2104 fl = self.file(f)
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2105 for n in needs:
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2106 try:
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2107 fl.rev(n)
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2108 except error.LookupError:
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2109 raise util.Abort(
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2110 _('missing file data for %s:%s - run hg verify') %
5fc090ba08a6 localrepo: add optional validation (defaults to off) for incoming changes
Augie Fackler <durin42@gmail.com>
parents: 10405
diff changeset
2111 (f, hex(n)))
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2112
14036
90d997a812dc changegroup: do not count closed new heads (issue2697)
Adrian Buehlmann <adrian@cadifra.com>
parents: 14004
diff changeset
2113 dh = 0
90d997a812dc changegroup: do not count closed new heads (issue2697)
Adrian Buehlmann <adrian@cadifra.com>
parents: 14004
diff changeset
2114 if oldheads:
90d997a812dc changegroup: do not count closed new heads (issue2697)
Adrian Buehlmann <adrian@cadifra.com>
parents: 14004
diff changeset
2115 heads = cl.heads()
90d997a812dc changegroup: do not count closed new heads (issue2697)
Adrian Buehlmann <adrian@cadifra.com>
parents: 14004
diff changeset
2116 dh = len(heads) - len(oldheads)
90d997a812dc changegroup: do not count closed new heads (issue2697)
Adrian Buehlmann <adrian@cadifra.com>
parents: 14004
diff changeset
2117 for h in heads:
90d997a812dc changegroup: do not count closed new heads (issue2697)
Adrian Buehlmann <adrian@cadifra.com>
parents: 14004
diff changeset
2118 if h not in oldheads and 'close' in self[h].extra():
90d997a812dc changegroup: do not count closed new heads (issue2697)
Adrian Buehlmann <adrian@cadifra.com>
parents: 14004
diff changeset
2119 dh -= 1
90d997a812dc changegroup: do not count closed new heads (issue2697)
Adrian Buehlmann <adrian@cadifra.com>
parents: 14004
diff changeset
2120 htext = ""
90d997a812dc changegroup: do not count closed new heads (issue2697)
Adrian Buehlmann <adrian@cadifra.com>
parents: 14004
diff changeset
2121 if dh:
90d997a812dc changegroup: do not count closed new heads (issue2697)
Adrian Buehlmann <adrian@cadifra.com>
parents: 14004
diff changeset
2122 htext = _(" (%+d heads)") % dh
1998
65cc17ae9649 fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1995
diff changeset
2123
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2124 self.ui.status(_("added %d changesets"
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2125 " with %d changes to %d files%s\n")
14036
90d997a812dc changegroup: do not count closed new heads (issue2697)
Adrian Buehlmann <adrian@cadifra.com>
parents: 14004
diff changeset
2126 % (changesets, revisions, files, htext))
1040
35e883d1ff9b Show number of new heads when doing a pull
mpm@selenic.com
parents: 1019
diff changeset
2127
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2128 if changesets > 0:
8392
7e5cbb09515b localrepo: use cl throughout in addchangegroup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8390
diff changeset
2129 p = lambda: cl.writepending() and self.root or ""
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2130 self.hook('pretxnchangegroup', throw=True,
8393
59160ca338f7 localrepo: use more direct vars in addchangegroup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8392
diff changeset
2131 node=hex(cl.node(clstart)), source=srctype,
7787
b8d750daadde Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents: 7728
diff changeset
2132 url=url, pending=p)
b8d750daadde Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents: 7728
diff changeset
2133
15484
a44446ff9ad8 phases: marked content of a changegroup as published
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15483
diff changeset
2134 added = [cl.node(r) for r in xrange(clstart, clend)]
15659
7fba5a245acc phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15651
diff changeset
2135 publishing = self.ui.configbool('phases', 'publish', True)
15891
249d3420ec9c phases: move phase according what was pushed not only what was added added
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15890
diff changeset
2136 if srctype == 'push':
15659
7fba5a245acc phases: change publish behavior to only alter behavior when server.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15651
diff changeset
2137 # Old server can not push the boundary themself.
15891
249d3420ec9c phases: move phase according what was pushed not only what was added added
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15890
diff changeset
2138 # New server won't push the boundary if changeset already
249d3420ec9c phases: move phase according what was pushed not only what was added added
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15890
diff changeset
2139 # existed locally as secrete
249d3420ec9c phases: move phase according what was pushed not only what was added added
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15890
diff changeset
2140 #
249d3420ec9c phases: move phase according what was pushed not only what was added added
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15890
diff changeset
2141 # We should not use added here but the list of all change in
249d3420ec9c phases: move phase according what was pushed not only what was added added
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15890
diff changeset
2142 # the bundle
249d3420ec9c phases: move phase according what was pushed not only what was added added
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15890
diff changeset
2143 if publishing:
249d3420ec9c phases: move phase according what was pushed not only what was added added
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15890
diff changeset
2144 phases.advanceboundary(self, phases.public, srccontent)
249d3420ec9c phases: move phase according what was pushed not only what was added added
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15890
diff changeset
2145 else:
249d3420ec9c phases: move phase according what was pushed not only what was added added
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15890
diff changeset
2146 phases.advanceboundary(self, phases.draft, srccontent)
249d3420ec9c phases: move phase according what was pushed not only what was added added
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15890
diff changeset
2147 phases.retractboundary(self, phases.draft, added)
249d3420ec9c phases: move phase according what was pushed not only what was added added
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15890
diff changeset
2148 elif srctype != 'strip':
249d3420ec9c phases: move phase according what was pushed not only what was added added
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15890
diff changeset
2149 # publishing only alter behavior during push
249d3420ec9c phases: move phase according what was pushed not only what was added added
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15890
diff changeset
2150 #
249d3420ec9c phases: move phase according what was pushed not only what was added added
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15890
diff changeset
2151 # strip should not touch boundary at all
15818
57241845a4bb phases: store phase values in constant instead of using raw integer
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15735
diff changeset
2152 phases.retractboundary(self, phases.draft, added)
15646
218ec96c45d7 phases: add a phases.publish option
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15611
diff changeset
2153
7787
b8d750daadde Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents: 7728
diff changeset
2154 # make changelog see real files again
b8d750daadde Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents: 7728
diff changeset
2155 cl.finalize(trp)
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
2156
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2157 tr.close()
15584
9df9444e96ec addchangegroup: use a postrelease callback to call changegroup hook
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15583
diff changeset
2158
15586
98ec09582f72 addchangegroup: ony queue hooks when we have changesets
Matt Mackall <mpm@selenic.com>
parents: 15585
diff changeset
2159 if changesets > 0:
98ec09582f72 addchangegroup: ony queue hooks when we have changesets
Matt Mackall <mpm@selenic.com>
parents: 15585
diff changeset
2160 def runhooks():
15584
9df9444e96ec addchangegroup: use a postrelease callback to call changegroup hook
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15583
diff changeset
2161 # forcefully update the on-disk branch cache
9df9444e96ec addchangegroup: use a postrelease callback to call changegroup hook
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15583
diff changeset
2162 self.ui.debug("updating the branch cache\n")
9df9444e96ec addchangegroup: use a postrelease callback to call changegroup hook
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15583
diff changeset
2163 self.updatebranchcache()
9df9444e96ec addchangegroup: use a postrelease callback to call changegroup hook
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15583
diff changeset
2164 self.hook("changegroup", node=hex(cl.node(clstart)),
9df9444e96ec addchangegroup: use a postrelease callback to call changegroup hook
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15583
diff changeset
2165 source=srctype, url=url)
9df9444e96ec addchangegroup: use a postrelease callback to call changegroup hook
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15583
diff changeset
2166
9df9444e96ec addchangegroup: use a postrelease callback to call changegroup hook
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15583
diff changeset
2167 for n in added:
9df9444e96ec addchangegroup: use a postrelease callback to call changegroup hook
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15583
diff changeset
2168 self.hook("incoming", node=hex(n), source=srctype,
9df9444e96ec addchangegroup: use a postrelease callback to call changegroup hook
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15583
diff changeset
2169 url=url)
15587
809d5d30e377 localrepo: rename _postrelease to _afterlock
Matt Mackall <mpm@selenic.com>
parents: 15586
diff changeset
2170 self._afterlock(runhooks)
15584
9df9444e96ec addchangegroup: use a postrelease callback to call changegroup hook
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15583
diff changeset
2171
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2172 finally:
11230
5116a077c3da make transactions work on non-refcounted python implementations
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 11228
diff changeset
2173 tr.release()
3803
2aef481ac73c Don't report an error when closing heads during local push (issue387)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3801
diff changeset
2174 # never return 0 here:
14036
90d997a812dc changegroup: do not count closed new heads (issue2697)
Adrian Buehlmann <adrian@cadifra.com>
parents: 14004
diff changeset
2175 if dh < 0:
90d997a812dc changegroup: do not count closed new heads (issue2697)
Adrian Buehlmann <adrian@cadifra.com>
parents: 14004
diff changeset
2176 return dh - 1
3803
2aef481ac73c Don't report an error when closing heads during local push (issue387)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3801
diff changeset
2177 else:
14036
90d997a812dc changegroup: do not count closed new heads (issue2697)
Adrian Buehlmann <adrian@cadifra.com>
parents: 14004
diff changeset
2178 return dh + 1
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
2179
12296
d7fff529d85d clone: only use stream when we understand the revlog format
Sune Foldager <cryo@cyanite.org>
parents: 12295
diff changeset
2180 def stream_in(self, remote, requirements):
13390
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2181 lock = self.lock()
3564
eda9e7c9300d New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3513
diff changeset
2182 try:
13390
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2183 fp = remote.stream_out()
3564
eda9e7c9300d New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3513
diff changeset
2184 l = fp.readline()
eda9e7c9300d New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3513
diff changeset
2185 try:
13390
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2186 resp = int(l)
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2187 except ValueError:
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2188 raise error.ResponseError(
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2189 _('Unexpected response from remote server:'), l)
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2190 if resp == 1:
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2191 raise util.Abort(_('operation forbidden by server'))
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2192 elif resp == 2:
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2193 raise util.Abort(_('locking the remote repository failed'))
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2194 elif resp != 0:
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2195 raise util.Abort(_('the server sent an unknown error code'))
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2196 self.ui.status(_('streaming all changes\n'))
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2197 l = fp.readline()
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2198 try:
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2199 total_files, total_bytes = map(int, l.split(' ', 1))
7063
be2daa324ddf Add missing catch of a TypeError
Bernhard Leiner <bleiner@gmail.com>
parents: 6877
diff changeset
2200 except (ValueError, TypeError):
7641
d2f753830f80 error: move UnexpectedOutput (now ResponseError)
Matt Mackall <mpm@selenic.com>
parents: 7640
diff changeset
2201 raise error.ResponseError(
3564
eda9e7c9300d New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3513
diff changeset
2202 _('Unexpected response from remote server:'), l)
13390
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2203 self.ui.status(_('%d files to transfer, %s of data\n') %
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2204 (total_files, util.bytecount(total_bytes)))
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2205 start = time.time()
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2206 for i in xrange(total_files):
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2207 # XXX doesn't support '\n' or '\r' in filenames
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2208 l = fp.readline()
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2209 try:
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2210 name, size = l.split('\0', 1)
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2211 size = int(size)
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2212 except (ValueError, TypeError):
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2213 raise error.ResponseError(
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2214 _('Unexpected response from remote server:'), l)
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2215 self.ui.debug('adding %s (%s)\n' % (name, util.bytecount(size)))
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2216 # for backwards compat, name was partially encoded
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2217 ofp = self.sopener(store.decodedir(name), 'w')
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2218 for chunk in util.filechunkiter(fp, limit=size):
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2219 ofp.write(chunk)
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2220 ofp.close()
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2221 elapsed = time.time() - start
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2222 if elapsed <= 0:
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2223 elapsed = 0.001
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2224 self.ui.status(_('transferred %s in %.1f seconds (%s/sec)\n') %
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2225 (util.bytecount(total_bytes), elapsed,
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2226 util.bytecount(total_bytes / elapsed)))
12296
d7fff529d85d clone: only use stream when we understand the revlog format
Sune Foldager <cryo@cyanite.org>
parents: 12295
diff changeset
2227
13390
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2228 # new requirements = old non-format requirements + new format-related
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2229 # requirements from the streamed-in repository
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2230 requirements.update(set(self.requirements) - self.supportedformats)
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2231 self._applyrequirements(requirements)
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2232 self._writerequirements()
12296
d7fff529d85d clone: only use stream when we understand the revlog format
Sune Foldager <cryo@cyanite.org>
parents: 12295
diff changeset
2233
13390
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2234 self.invalidate()
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2235 return len(self.heads()) + 1
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2236 finally:
327719a44b6a localrepo: acquire lock on stream_in
Adrian Buehlmann <adrian@cadifra.com>
parents: 13385
diff changeset
2237 lock.release()
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 514
diff changeset
2238
2613
479e26afa10f clone: do not make streaming default. add --stream option instead.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2612
diff changeset
2239 def clone(self, remote, heads=[], stream=False):
2612
ffb895f16925 add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2601
diff changeset
2240 '''clone remote repository.
1382
b113e7db06e9 hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents: 1375
diff changeset
2241
2612
ffb895f16925 add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2601
diff changeset
2242 keyword arguments:
ffb895f16925 add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2601
diff changeset
2243 heads: list of revs to clone (forces use of pull)
2621
5a5852a417b1 clone: disable stream support on server side by default.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2613
diff changeset
2244 stream: use streaming clone if possible'''
247
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
2245
2621
5a5852a417b1 clone: disable stream support on server side by default.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2613
diff changeset
2246 # now, all clients that can request uncompressed clones can
5a5852a417b1 clone: disable stream support on server side by default.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2613
diff changeset
2247 # read repo formats supported by all servers that can serve
5a5852a417b1 clone: disable stream support on server side by default.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2613
diff changeset
2248 # them.
247
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
2249
2612
ffb895f16925 add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2601
diff changeset
2250 # if revlog format changes, client will have to check version
2621
5a5852a417b1 clone: disable stream support on server side by default.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2613
diff changeset
2251 # and format flags on "stream" capability, and use
5a5852a417b1 clone: disable stream support on server side by default.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2613
diff changeset
2252 # uncompressed only if compatible.
247
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
2253
12296
d7fff529d85d clone: only use stream when we understand the revlog format
Sune Foldager <cryo@cyanite.org>
parents: 12295
diff changeset
2254 if stream and not heads:
d7fff529d85d clone: only use stream when we understand the revlog format
Sune Foldager <cryo@cyanite.org>
parents: 12295
diff changeset
2255 # 'stream' means remote revlog format is revlogv1 only
d7fff529d85d clone: only use stream when we understand the revlog format
Sune Foldager <cryo@cyanite.org>
parents: 12295
diff changeset
2256 if remote.capable('stream'):
d7fff529d85d clone: only use stream when we understand the revlog format
Sune Foldager <cryo@cyanite.org>
parents: 12295
diff changeset
2257 return self.stream_in(remote, set(('revlogv1',)))
d7fff529d85d clone: only use stream when we understand the revlog format
Sune Foldager <cryo@cyanite.org>
parents: 12295
diff changeset
2258 # otherwise, 'streamreqs' contains the remote revlog format
d7fff529d85d clone: only use stream when we understand the revlog format
Sune Foldager <cryo@cyanite.org>
parents: 12295
diff changeset
2259 streamreqs = remote.capable('streamreqs')
d7fff529d85d clone: only use stream when we understand the revlog format
Sune Foldager <cryo@cyanite.org>
parents: 12295
diff changeset
2260 if streamreqs:
d7fff529d85d clone: only use stream when we understand the revlog format
Sune Foldager <cryo@cyanite.org>
parents: 12295
diff changeset
2261 streamreqs = set(streamreqs.split(','))
d7fff529d85d clone: only use stream when we understand the revlog format
Sune Foldager <cryo@cyanite.org>
parents: 12295
diff changeset
2262 # if we support it, stream in and adjust our requirements
d7fff529d85d clone: only use stream when we understand the revlog format
Sune Foldager <cryo@cyanite.org>
parents: 12295
diff changeset
2263 if not streamreqs - self.supportedformats:
d7fff529d85d clone: only use stream when we understand the revlog format
Sune Foldager <cryo@cyanite.org>
parents: 12295
diff changeset
2264 return self.stream_in(remote, streamreqs)
2612
ffb895f16925 add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2601
diff changeset
2265 return self.pull(remote, heads)
1806
a2c69737e65e Automatic nesting into running transactions in the same repository.
mason@suse.com
parents: 1802
diff changeset
2266
11368
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
2267 def pushkey(self, namespace, key, old, new):
14102
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
2268 self.hook('prepushkey', throw=True, namespace=namespace, key=key,
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
2269 old=old, new=new)
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
2270 ret = pushkey.push(self, namespace, key, old, new)
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
2271 self.hook('pushkey', namespace=namespace, key=key, old=old, new=new,
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
2272 ret=ret)
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
2273 return ret
11368
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
2274
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
2275 def listkeys(self, namespace):
14102
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
2276 self.hook('prelistkeys', throw=True, namespace=namespace)
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
2277 values = pushkey.list(self, namespace)
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
2278 self.hook('listkeys', namespace=namespace, values=values)
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
2279 return values
11368
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
2280
14048
58e58406ed19 wireproto: add test for new optional arg missing on server
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14036
diff changeset
2281 def debugwireargs(self, one, two, three=None, four=None, five=None):
13720
9c4e04fe267e debug: add debugwireargs to test argument passing over the wire
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13716
diff changeset
2282 '''used to test argument passing over the wire'''
14048
58e58406ed19 wireproto: add test for new optional arg missing on server
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14036
diff changeset
2283 return "%s %s %s %s %s" % (one, two, three, four, five)
11368
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
2284
14529
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
2285 def savecommitmessage(self, text):
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
2286 fp = self.opener('last-message.txt', 'wb')
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
2287 try:
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
2288 fp.write(text)
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
2289 finally:
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
2290 fp.close()
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
2291 return self.pathto(fp.name[len(self.root)+1:])
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
2292
1806
a2c69737e65e Automatic nesting into running transactions in the same repository.
mason@suse.com
parents: 1802
diff changeset
2293 # used to avoid circular references so destructors work
3790
f183c18568df localrepo: change aftertrans to be independant of the store path
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3773
diff changeset
2294 def aftertrans(files):
f183c18568df localrepo: change aftertrans to be independant of the store path
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3773
diff changeset
2295 renamefiles = [tuple(t) for t in files]
1806
a2c69737e65e Automatic nesting into running transactions in the same repository.
mason@suse.com
parents: 1802
diff changeset
2296 def a():
3790
f183c18568df localrepo: change aftertrans to be independant of the store path
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3773
diff changeset
2297 for src, dest in renamefiles:
f183c18568df localrepo: change aftertrans to be independant of the store path
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3773
diff changeset
2298 util.rename(src, dest)
1806
a2c69737e65e Automatic nesting into running transactions in the same repository.
mason@suse.com
parents: 1802
diff changeset
2299 return a
a2c69737e65e Automatic nesting into running transactions in the same repository.
mason@suse.com
parents: 1802
diff changeset
2300
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
2301 def undoname(fn):
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
2302 base, name = os.path.split(fn)
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
2303 assert name.startswith('journal')
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
2304 return os.path.join(base, name.replace('journal', 'undo', 1))
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
2305
2740
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
2306 def instance(ui, path, create):
14825
de9eb6b1da4f util: rename the util.localpath that uses url to urllocalpath (issue2875)
Mads Kiilerich <mads@kiilerich.com>
parents: 14756
diff changeset
2307 return localrepository(ui, util.urllocalpath(path), create)
3223
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3164
diff changeset
2308
2740
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
2309 def islocal(path):
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
2310 return True